summaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-isns.c
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 20:34:10 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 20:34:10 +0000
commite4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc (patch)
tree68cb5ef9081156392f1dd62a00c6ccc1451b93df /epan/dissectors/packet-isns.c
parentInitial commit. (diff)
downloadwireshark-e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc.tar.xz
wireshark-e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc.zip
Adding upstream version 4.2.2.upstream/4.2.2
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'epan/dissectors/packet-isns.c')
-rw-r--r--epan/dissectors/packet-isns.c1721
1 files changed, 1721 insertions, 0 deletions
diff --git a/epan/dissectors/packet-isns.c b/epan/dissectors/packet-isns.c
new file mode 100644
index 00000000..ba7b9a16
--- /dev/null
+++ b/epan/dissectors/packet-isns.c
@@ -0,0 +1,1721 @@
+/* XXX fixme can not reassemble multiple isns PDU fragments into one
+ isns PDU
+*/
+
+/* packet-isns.c
+ * Routines for iSNS dissection
+ * Copyright 2003, Elipsan, Gareth Bushell <gbushell@elipsan.com>
+ * (c) 2004 Ronnie Sahlberg updates
+ * (c) 2004 Ming Zhang updates
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "config.h"
+
+#include <epan/packet.h>
+#include <epan/expert.h>
+#include <epan/exceptions.h>
+#include <epan/prefs.h>
+
+#include "packet-tcp.h"
+
+void proto_register_isns(void);
+void proto_reg_handoff_isns(void);
+
+#define ISNS_PROTO_VER 0x1
+#define ISNS_HEADER_SIZE 12
+
+#define ISNS_TCP_PORT 3205
+#define ISNS_UDP_PORT 3205
+
+#define ISNS_OTHER_PORT 0
+#define ISNS_ESI_PORT 1
+#define ISNS_SCN_PORT 2
+
+
+static dissector_handle_t isns_tcp_handle;
+static dissector_handle_t isns_udp_handle;
+
+static gint ett_isns_flags = -1;
+static gint ett_isns_payload = -1;
+static gint ett_isns_attribute = -1;
+static gint ett_isns_port = -1;
+static gint ett_isns_isnt = -1;
+
+static guint AddAttribute(packet_info *pinfo, tvbuff_t *tvb, proto_tree *tree,
+ guint offset, guint16 function_id);
+
+/* Initialize the protocol and registered fields */
+static int proto_isns = -1;
+
+
+/* Header Stuff */
+static int hf_isns_version = -1;
+static int hf_isns_function_id = -1;
+static int hf_isns_pdu_length = -1;
+static int hf_isns_flags = -1;
+static int hf_isns_transaction_id = -1;
+static int hf_isns_sequence_id = -1;
+static int hf_isns_payload = -1;
+static int hf_isns_first_pdu = -1;
+static int hf_isns_last_pdu = -1;
+static int hf_isns_replace = -1;
+static int hf_isns_auth = -1;
+static int hf_isns_server = -1;
+static int hf_isns_client = -1;
+
+/* Payload stuff */
+static int hf_isns_scn_bitmap = -1;
+static int hf_isns_scn_bitmap_initiator_and_self_information_only = -1;
+static int hf_isns_scn_bitmap_target_and_self_information_only = -1;
+static int hf_isns_scn_bitmap_management_registration_scn = -1;
+static int hf_isns_scn_bitmap_object_removed = -1;
+static int hf_isns_scn_bitmap_object_added = -1;
+static int hf_isns_scn_bitmap_object_updated = -1;
+static int hf_isns_scn_bitmap_dd_dds_member_removed = -1;
+static int hf_isns_scn_bitmap_dd_dds_member_added = -1;
+static int hf_isns_isnt_control = -1;
+static int hf_isns_isnt_initiator = -1;
+static int hf_isns_isnt_target = -1;
+
+static int hf_isns_psb = -1;
+static int hf_isns_psb_tunnel_mode = -1;
+static int hf_isns_psb_transport_mode = -1;
+static int hf_isns_psb_pfs = -1;
+static int hf_isns_psb_aggressive_mode = -1;
+static int hf_isns_psb_main_mode = -1;
+static int hf_isns_psb_ike_ipsec = -1;
+static int hf_isns_psb_bitmap = -1;
+
+static int hf_isns_dd_member_portal_port = -1;
+static int hf_isns_portal_port = -1;
+static int hf_isns_esi_port = -1;
+static int hf_isns_scn_port = -1;
+static int hf_isns_port_type = -1;
+
+static int hf_isns_entity_protocol = -1;
+static int hf_isns_iscsi_node_type = -1;
+static int hf_isns_resp_errorcode = -1;
+static int hf_isns_attr_tag = -1;
+static int hf_isns_attr_len = -1;
+static int hf_isns_heartbeat_ipv6_addr = -1;
+static int hf_isns_heartbeat_udp_port = -1;
+static int hf_isns_heartbeat_tcp_port = -1;
+static int hf_isns_heartbeat_interval = -1;
+static int hf_isns_heartbeat_counter = -1;
+
+static int hf_isns_mgmt_ip_addr = -1;
+static int hf_isns_node_ip_addr = -1;
+static int hf_isns_port_ip_addr = -1;
+static int hf_isns_portal_ip_addr = -1;
+static int hf_isns_dd_member_portal_ip_addr = -1;
+static int hf_isns_iscsi_name = -1;
+static int hf_isns_switch_name = -1;
+static int hf_isns_dd_member_iscsi_name = -1;
+static int hf_isns_virtual_fabric_id = -1;
+static int hf_isns_proxy_iscsi_name = -1;
+static int hf_isns_fc4_descriptor = -1;
+static int hf_isns_iscsi_auth_method = -1;
+static int hf_isns_iscsi_alias = -1;
+static int hf_isns_portal_symbolic_name = -1;
+static int hf_isns_dd_set_symbolic_name = -1;
+static int hf_isns_dd_symbolic_name = -1;
+static int hf_isns_symbolic_port_name = -1;
+static int hf_isns_symbolic_node_name = -1;
+static int hf_isns_entity_identifier = -1;
+static int hf_isns_dd_id_next_id = -1;
+static int hf_isns_member_iscsi_index = -1;
+static int hf_isns_member_portal_index = -1;
+static int hf_isns_member_fc_port_name = -1;
+static int hf_isns_vendor_oui = -1;
+static int hf_isns_preferred_id = -1;
+static int hf_isns_assigned_id = -1;
+static int hf_isns_dd_id = -1;
+static int hf_isns_dd_set_id = -1;
+static int hf_isns_dd_set_next_id = -1;
+static int hf_isns_node_index = -1;
+static int hf_isns_node_next_index = -1;
+static int hf_isns_entity_index = -1;
+static int hf_isns_portal_index = -1;
+static int hf_isns_portal_next_index = -1;
+static int hf_isns_entity_next_index = -1;
+static int hf_isns_timestamp = -1;
+static int hf_isns_esi_interval = -1;
+static int hf_isns_registration_period = -1;
+static int hf_isns_port_id = -1;
+static int hf_isns_hard_address = -1;
+static int hf_isns_wwnn_token = -1;
+static int hf_isns_node_ipa = -1;
+static int hf_isns_fc_port_name_wwpn = -1;
+static int hf_isns_fc_node_name_wwnn = -1;
+static int hf_isns_fabric_port_name = -1;
+static int hf_isns_permanent_port_name = -1;
+static int hf_isns_not_decoded_yet = -1;
+static int hf_isns_portal_group_tag = -1;
+static int hf_isns_pg_iscsi_name = -1;
+static int hf_isns_pg_portal_ip_addr = -1;
+static int hf_isns_pg_portal_port = -1;
+static int hf_isns_pg_index = -1;
+static int hf_isns_pg_next_index = -1;
+
+static expert_field ei_isns_not_first_pdu = EI_INIT;
+static expert_field ei_isns_invalid_attr_len = EI_INIT;
+
+/* Desegment iSNS over TCP messages */
+static gboolean isns_desegment = TRUE;
+
+/* Function Id's */
+#define ISNS_FUNC_DEVATTRREG 0x0001
+#define ISNS_FUNC_DEVATTRQRY 0x0002
+#define ISNS_FUNC_DEVGETNEXT 0x0003
+#define ISNS_FUNC_DEREGDEV 0x0004
+#define ISNS_FUNC_SCNREG 0x0005
+#define ISNS_FUNC_SCNDEREG 0x0006
+#define ISNS_FUNC_SCNEVENT 0x0007
+#define ISNS_FUNC_SCN 0x0008
+#define ISNS_FUNC_DDREG 0x0009
+#define ISNS_FUNC_DDDEREG 0x000a
+#define ISNS_FUNC_DDSREG 0x000b
+#define ISNS_FUNC_DDSDEREG 0x000c
+#define ISNS_FUNC_ESI 0x000d
+#define ISNS_FUNC_HEARTBEAT 0x000e
+#define ISNS_FUNC_RQSTDOMID 0x0011
+#define ISNS_FUNC_RLSEDOMID 0x0012
+#define ISNS_FUNC_GETDOMID 0x0013
+
+#define ISNS_FUNC_RSP_DEVATTRREG 0x8001
+#define ISNS_FUNC_RSP_DEVATTRQRY 0x8002
+#define ISNS_FUNC_RSP_DEVGETNEXT 0x8003
+#define ISNS_FUNC_RSP_DEREGDEV 0x8004
+#define ISNS_FUNC_RSP_SCNREG 0x8005
+#define ISNS_FUNC_RSP_SCNDEREG 0x8006
+#define ISNS_FUNC_RSP_SCNEVENT 0x8007
+#define ISNS_FUNC_RSP_SCN 0x8008
+#define ISNS_FUNC_RSP_DDREG 0x8009
+#define ISNS_FUNC_RSP_DDDEREG 0x800a
+#define ISNS_FUNC_RSP_DDSREG 0x800b
+#define ISNS_FUNC_RSP_DDSDEREG 0x800c
+#define ISNS_FUNC_RSP_ESI 0x800d
+#define ISNS_FUNC_RSP_RQSTDOMID 0x8011
+#define ISNS_FUNC_RSP_RLSEDOMID 0x8012
+#define ISNS_FUNC_RSP_GETDOMID 0x8013
+
+static const value_string isns_function_ids[] = {
+/* Requests*/
+ {ISNS_FUNC_DEVATTRREG, "DevAttrReg"},
+ {ISNS_FUNC_DEVATTRQRY, "DevAttrQry"},
+ {ISNS_FUNC_DEVGETNEXT, "DevGetNext"},
+ {ISNS_FUNC_DEREGDEV, "DeregDev"},
+ {ISNS_FUNC_SCNREG, "SCNReg"},
+ {ISNS_FUNC_SCNDEREG, "SCNDereg"},
+ {ISNS_FUNC_SCNEVENT, "SCNEvent"},
+ {ISNS_FUNC_SCN, "SCN"},
+ {ISNS_FUNC_DDREG, "DDReg"},
+ {ISNS_FUNC_DDDEREG, "DDDereg"},
+ {ISNS_FUNC_DDSREG, "DDSReg"},
+ {ISNS_FUNC_DDSDEREG, "DDSDereg"},
+ {ISNS_FUNC_ESI, "ESI"},
+ {ISNS_FUNC_HEARTBEAT, "Heartbeat"},
+ {ISNS_FUNC_RQSTDOMID, "RqstDomId"},
+ {ISNS_FUNC_RLSEDOMID, "RlseDomId"},
+ {ISNS_FUNC_GETDOMID, "GetDomId"},
+
+/* Responses */
+ {ISNS_FUNC_RSP_DEVATTRREG, "DevAttrRegRsp"},
+ {ISNS_FUNC_RSP_DEVATTRQRY, "DevAttrQryRsp"},
+ {ISNS_FUNC_RSP_DEVGETNEXT, "DevGetNextRsp"},
+ {ISNS_FUNC_RSP_DEREGDEV, "DeregDevRsp"},
+ {ISNS_FUNC_RSP_SCNREG, "SCNRegRsp"},
+ {ISNS_FUNC_RSP_SCNDEREG, "SCNDeregRsp"},
+ {ISNS_FUNC_RSP_SCNEVENT, "SCNEventRsp"},
+ {ISNS_FUNC_RSP_SCN, "SCNRsp"},
+ {ISNS_FUNC_RSP_DDREG, "DDRegRsp"},
+ {ISNS_FUNC_RSP_DDDEREG, "DDDeregRsp"},
+ {ISNS_FUNC_RSP_DDSREG, "DDSRegRsp"},
+ {ISNS_FUNC_RSP_DDSDEREG, "DDSDeregRsp"},
+ {ISNS_FUNC_RSP_ESI, "ESIRsp"},
+ {ISNS_FUNC_RSP_RQSTDOMID, "RqstDomIdRsp"},
+ {ISNS_FUNC_RSP_RLSEDOMID, "RlseDomIdRsp"},
+ {ISNS_FUNC_RSP_GETDOMID, "GetDomIdRsp"},
+
+ {0x0,NULL},
+};
+static value_string_ext isns_function_ids_ext = VALUE_STRING_EXT_INIT(isns_function_ids);
+
+#define ISNS_ENTITY_PROTOCOL_NO_PROTOCOL 1
+#define ISNS_ENTITY_PROTOCOL_ISCSI 2
+#define ISNS_ENTITY_PROTOCOL_IFCP 3
+
+
+static const value_string isns_entity_protocol[] = {
+ {ISNS_ENTITY_PROTOCOL_NO_PROTOCOL, "No Protocol"},
+ {ISNS_ENTITY_PROTOCOL_ISCSI, "iSCSI"},
+ {ISNS_ENTITY_PROTOCOL_IFCP, "iFCP"},
+
+ {0x0,NULL},
+};
+
+static const value_string isns_errorcode[] = {
+ { 0,"No Error"},
+ { 1,"Unknown Error"},
+ { 2,"Message Format Error"},
+ { 3,"Invalid Registration"},
+ { 4,"RESERVED"},
+ { 5,"Invalid Query"},
+ { 6,"Source Unknown"},
+ { 7,"Source Absent"},
+ { 8,"Source Unauthorized"},
+ { 9,"No such Entry"},
+ {10,"Version Not Supported"},
+ {11,"Internal Error"},
+ {12,"Busy"},
+ {13,"Option Not Understood"},
+ {14,"Invalid Update"},
+ {15,"Message (FUNCTION_ID) Not supported"},
+ {16,"SCN Event Rejected"},
+ {17,"SCN Registration Rejected"},
+ {18,"Attribute Not Implemented"},
+ {19,"FC_DOMAIN_ID Not available"},
+ {20,"FC_DOMAIN_ID not allocated"},
+ {21,"ESI Not Available"},
+ {22,"Invalid Deregistration"},
+ {23,"Registration Feature Not Supported"},
+
+ {0x0,NULL}
+};
+static value_string_ext isns_errorcode_ext = VALUE_STRING_EXT_INIT(isns_errorcode);
+
+
+#define ISNS_ATTR_TAG_DELIMITER 0
+#define ISNS_ATTR_TAG_ENTITY_IDENTIFIER 1
+#define ISNS_ATTR_TAG_ENTITY_PROTOCOL 2
+#define ISNS_ATTR_TAG_MGMT_IP_ADDRESS 3
+#define ISNS_ATTR_TAG_TIMESTAMP 4
+#define ISNS_ATTR_TAG_PROTOCOL_VERSION_RANGE 5
+#define ISNS_ATTR_TAG_REGISTRATION_PERIOD 6
+#define ISNS_ATTR_TAG_ENTITY_INDEX 7
+#define ISNS_ATTR_TAG_ENTITY_NEXT_INDEX 8
+#define ISNS_ATTR_TAG_ENTITY_ISAKMP_PHASE_1 11
+#define ISNS_ATTR_TAG_ENTITY_CERTIFICATE 12
+#define ISNS_ATTR_TAG_PORTAL_IP_ADDRESS 16
+#define ISNS_ATTR_TAG_PORTAL_PORT 17
+#define ISNS_ATTR_TAG_PORTAL_SYMBOLIC_NAME 18
+#define ISNS_ATTR_TAG_ESI_INTERVAL 19
+#define ISNS_ATTR_TAG_ESI_PORT 20
+#define ISNS_ATTR_TAG_PORTAL_INDEX 22
+#define ISNS_ATTR_TAG_SCN_PORT 23
+#define ISNS_ATTR_TAG_PORTAL_NEXT_INDEX 24
+#define ISNS_ATTR_TAG_PORTAL_SECURITY_BITMAP 27
+#define ISNS_ATTR_TAG_PORTAL_ISAKMP_PHASE_1 28
+#define ISNS_ATTR_TAG_PORTAL_ISAKMP_PHASE_2 29
+#define ISNS_ATTR_TAG_PORTAL_CERTIFICATE 31
+#define ISNS_ATTR_TAG_ISCSI_NAME 32
+#define ISNS_ATTR_TAG_ISCSI_NODE_TYPE 33
+#define ISNS_ATTR_TAG_ISCSI_ALIAS 34
+#define ISNS_ATTR_TAG_ISCSI_SCN_BITMAP 35
+#define ISNS_ATTR_TAG_ISCSI_NODE_INDEX 36
+#define ISNS_ATTR_TAG_WWNN_TOKEN 37
+#define ISNS_ATTR_TAG_ISCSI_NODE_NEXT_INDEX 38
+#define ISNS_ATTR_TAG_ISCSI_AUTH_METHOD 42
+#define ISNS_ATTR_TAG_PG_ISCSI_NAME 48
+#define ISNS_ATTR_TAG_PG_PORTAL_IP_ADDR 49
+#define ISNS_ATTR_TAG_PG_PORTAL_PORT 50
+#define ISNS_ATTR_TAG_PORTAL_GROUP_TAG 51
+#define ISNS_ATTR_TAG_PORTAL_GROUP_INDEX 52
+#define ISNS_ATTR_TAG_PORTAL_GROUP_NEXT_INDEX 53
+#define ISNS_ATTR_TAG_FC_PORT_NAME_WWPN 64
+#define ISNS_ATTR_TAG_PORT_ID 65
+#define ISNS_ATTR_TAG_FC_PORT_TYPE 66
+#define ISNS_ATTR_TAG_SYMBOLIC_PORT_NAME 67
+#define ISNS_ATTR_TAG_FABRIC_PORT_NAME 68
+#define ISNS_ATTR_TAG_HARD_ADDRESS 69
+#define ISNS_ATTR_TAG_PORT_IP_ADDRESS 70
+#define ISNS_ATTR_TAG_CLASS_OF_SERVICE 71
+#define ISNS_ATTR_TAG_FC4_TYPES 72
+#define ISNS_ATTR_TAG_FC4_DESCRIPTOR 73
+#define ISNS_ATTR_TAG_FC4_FEATURES 74
+#define ISNS_ATTR_TAG_IFCP_SCN_BITMAP 75
+#define ISNS_ATTR_TAG_PORT_ROLE 76
+#define ISNS_ATTR_TAG_PERMANENT_PORT_NAME 77
+#define ISNS_ATTR_TAG_FC4_TYPE_CODE 95
+#define ISNS_ATTR_TAG_FC_NODE_NAME_WWNN 96
+#define ISNS_ATTR_TAG_SYMBOLIC_NODE_NAME 97
+#define ISNS_ATTR_TAG_NODE_IP_ADDRESS 98
+#define ISNS_ATTR_TAG_NODE_IPA 99
+#define ISNS_ATTR_TAG_PROXY_ISCSI_NAME 101
+#define ISNS_ATTR_TAG_SWITCH_NAME 128
+#define ISNS_ATTR_TAG_PREFERRED_ID 129
+#define ISNS_ATTR_TAG_ASSIGNED_ID 130
+#define ISNS_ATTR_TAG_VIRTUAL_FABRIC_ID 131
+#define ISNS_ATTR_TAG_VENDOR_OUI 256
+#define ISNS_ATTR_TAG_DD_SET_ID 2049
+#define ISNS_ATTR_TAG_DD_SET_SYMBOLIC_NAME 2050
+#define ISNS_ATTR_TAG_DD_SET_STATUS 2051
+#define ISNS_ATTR_TAG_DD_SET_NEXT_ID 2052
+#define ISNS_ATTR_TAG_DD_ID 2065
+#define ISNS_ATTR_TAG_DD_SYMBOLIC_NAME 2066
+#define ISNS_ATTR_TAG_DD_MEMBER_ISCSI_INDEX 2067
+#define ISNS_ATTR_TAG_DD_MEMBER_ISCSI_NAME 2068
+#define ISNS_ATTR_TAG_DD_MEMBER_FC_PORT_NAME 2069
+#define ISNS_ATTR_TAG_DD_MEMBER_PORTAL_INDEX 2070
+#define ISNS_ATTR_TAG_DD_MEMBER_PORTAL_IP_ADDRESS 2071
+#define ISNS_ATTR_TAG_DD_MEMBER_PORTAL_PORT 2072
+#define ISNS_ATTR_TAG_DD_FEATURES 2078
+#define ISNS_ATTR_TAG_DD_ID_NEXT_ID 2079
+
+
+static const value_string isns_attribute_tags[] = {
+ {ISNS_ATTR_TAG_DELIMITER, "Delimiter"},
+ {ISNS_ATTR_TAG_ENTITY_IDENTIFIER, "Entity Identifier (EID)"},
+ {ISNS_ATTR_TAG_ENTITY_PROTOCOL, "Entity Protocol"},
+ {ISNS_ATTR_TAG_MGMT_IP_ADDRESS, "Management IP Address"},
+ {ISNS_ATTR_TAG_TIMESTAMP, "Timestamp"},
+ {ISNS_ATTR_TAG_PROTOCOL_VERSION_RANGE, "Protocol Version Range"},
+ {ISNS_ATTR_TAG_REGISTRATION_PERIOD, "Registration Period"},
+ {ISNS_ATTR_TAG_ENTITY_INDEX, "Entity Index"},
+ {ISNS_ATTR_TAG_ENTITY_NEXT_INDEX, "Entity Next Index"},
+ {ISNS_ATTR_TAG_ENTITY_ISAKMP_PHASE_1, "Entity ISAKMP Phase-1"},
+ {ISNS_ATTR_TAG_ENTITY_CERTIFICATE, "Entity Certificate"},
+ {ISNS_ATTR_TAG_PORTAL_IP_ADDRESS, "Portal IP Address"},
+ {ISNS_ATTR_TAG_PORTAL_PORT, "Portal TCP/UDP Port"},
+ {ISNS_ATTR_TAG_PORTAL_SYMBOLIC_NAME, "Portal Symbolic Name"},
+ {ISNS_ATTR_TAG_ESI_INTERVAL, "ESI Interval"},
+ {ISNS_ATTR_TAG_ESI_PORT, "ESI Port"},
+ {ISNS_ATTR_TAG_PORTAL_INDEX, "Portal Index"},
+ {ISNS_ATTR_TAG_SCN_PORT, "SCN Port"},
+ {ISNS_ATTR_TAG_PORTAL_NEXT_INDEX, "Portal Next Index"},
+ {ISNS_ATTR_TAG_PORTAL_SECURITY_BITMAP, "Portal Security Bitmap"},
+ {ISNS_ATTR_TAG_PORTAL_ISAKMP_PHASE_1, "Portal ISAKMP Phase-1"},
+ {ISNS_ATTR_TAG_PORTAL_ISAKMP_PHASE_2, "Portal ISAKMP Phase-2"},
+ {ISNS_ATTR_TAG_PORTAL_CERTIFICATE, "Portal Certificate"},
+ {ISNS_ATTR_TAG_ISCSI_NAME, "iSCSI Name"},
+ {ISNS_ATTR_TAG_ISCSI_NODE_TYPE, "iSCSI Node Type"},
+ {ISNS_ATTR_TAG_ISCSI_ALIAS, "iSCSI Alias"},
+ {ISNS_ATTR_TAG_ISCSI_SCN_BITMAP, "iSCSI SCN Bitmap"},
+ {ISNS_ATTR_TAG_ISCSI_NODE_INDEX, "iSCSI Node Index"},
+ {ISNS_ATTR_TAG_WWNN_TOKEN, "WWNN Token"},
+ {ISNS_ATTR_TAG_ISCSI_NODE_NEXT_INDEX, "iSCSI Node Next Index"},
+ {ISNS_ATTR_TAG_ISCSI_AUTH_METHOD, "iSCSI AuthMethod"},
+ {ISNS_ATTR_TAG_PG_ISCSI_NAME, "PG iSCSI Name"},
+ {ISNS_ATTR_TAG_PG_PORTAL_IP_ADDR, "PG Portal IP Addr"},
+ {ISNS_ATTR_TAG_PG_PORTAL_PORT, "PG Portal Port"},
+ {ISNS_ATTR_TAG_PORTAL_GROUP_TAG, "Portal Group Tag"},
+ {ISNS_ATTR_TAG_PORTAL_GROUP_INDEX, "PG Index"},
+ {ISNS_ATTR_TAG_PORTAL_GROUP_NEXT_INDEX, "PG Next Index"},
+ {ISNS_ATTR_TAG_FC_PORT_NAME_WWPN, "FC Port Name WWPN"},
+ {ISNS_ATTR_TAG_PORT_ID, "Port ID"},
+ {ISNS_ATTR_TAG_FC_PORT_TYPE, "FC Port Type"},
+ {ISNS_ATTR_TAG_SYMBOLIC_PORT_NAME, "Symbolic Port Name"},
+ {ISNS_ATTR_TAG_FABRIC_PORT_NAME, "Fabric Port Name"},
+ {ISNS_ATTR_TAG_HARD_ADDRESS, "Hard Address"},
+ {ISNS_ATTR_TAG_PORT_IP_ADDRESS, "Port IP-Address"},
+ {ISNS_ATTR_TAG_CLASS_OF_SERVICE, "Class of Service"},
+ {ISNS_ATTR_TAG_FC4_TYPES, "FC-4 Types"},
+ {ISNS_ATTR_TAG_FC4_DESCRIPTOR, "FC-4 Descriptor"},
+ {ISNS_ATTR_TAG_FC4_FEATURES, "FC-4 Features"},
+ {ISNS_ATTR_TAG_IFCP_SCN_BITMAP, "iFCP SCN bitmap"},
+ {ISNS_ATTR_TAG_PORT_ROLE, "Port Role"},
+ {ISNS_ATTR_TAG_PERMANENT_PORT_NAME, "Permanent Port Name"},
+ {ISNS_ATTR_TAG_FC4_TYPE_CODE, "FC-4 Type Code"},
+ {ISNS_ATTR_TAG_FC_NODE_NAME_WWNN, "FC Node Name WWNN"},
+ {ISNS_ATTR_TAG_SYMBOLIC_NODE_NAME, "Symbolic Node Name"},
+ {ISNS_ATTR_TAG_NODE_IP_ADDRESS, "Node IP-Address"},
+ {ISNS_ATTR_TAG_NODE_IPA, "Node IPA"},
+ {ISNS_ATTR_TAG_PROXY_ISCSI_NAME, "Proxy iSCSI Name"},
+ {ISNS_ATTR_TAG_SWITCH_NAME, "Switch Name"},
+ {ISNS_ATTR_TAG_PREFERRED_ID, "Preferred ID"},
+ {ISNS_ATTR_TAG_ASSIGNED_ID, "Assigned ID"},
+ {ISNS_ATTR_TAG_VIRTUAL_FABRIC_ID, "Virtual_Fabric_ID"},
+ {ISNS_ATTR_TAG_VENDOR_OUI, "iSNS Server Vendor OUI"},
+ {ISNS_ATTR_TAG_DD_SET_ID, "DD_Set ID"},
+ {ISNS_ATTR_TAG_DD_SET_SYMBOLIC_NAME, "DD_Set Sym Name"},
+ {ISNS_ATTR_TAG_DD_SET_STATUS, "DD_Set Status"},
+ {ISNS_ATTR_TAG_DD_SET_NEXT_ID, "DD_Set_Next_ID"},
+ {ISNS_ATTR_TAG_DD_ID, "DD_ID"},
+ {ISNS_ATTR_TAG_DD_SYMBOLIC_NAME, "DD_Symbolic Name"},
+ {ISNS_ATTR_TAG_DD_MEMBER_ISCSI_INDEX, "DD_Member iSCSI Index"},
+ {ISNS_ATTR_TAG_DD_MEMBER_ISCSI_NAME, "DD_Member iSCSI Name"},
+ {ISNS_ATTR_TAG_DD_MEMBER_FC_PORT_NAME, "DD_Member FC Port Name"},
+ {ISNS_ATTR_TAG_DD_MEMBER_PORTAL_INDEX, "DD Member Portal Index"},
+ {ISNS_ATTR_TAG_DD_MEMBER_PORTAL_IP_ADDRESS, "DD_Member Portal IP Addr"},
+ {ISNS_ATTR_TAG_DD_MEMBER_PORTAL_PORT, "DD Member Portal TCP/UDP"},
+ {ISNS_ATTR_TAG_DD_FEATURES, "DD_Features"},
+ {ISNS_ATTR_TAG_DD_ID_NEXT_ID, "DD_ID Next ID"},
+
+ {0,NULL}
+};
+static value_string_ext isns_attribute_tags_ext = VALUE_STRING_EXT_INIT(isns_attribute_tags);
+
+#define ISNS_REQUIRE_ATTR_LEN(x) \
+{ \
+ if(len != x) { \
+ expert_add_info_format(pinfo, len_item, &ei_isns_invalid_attr_len, \
+ "Invalid attribute length (should be %d)", x); \
+ break; \
+ } \
+}
+
+/* iSNS flags */
+#define ISNS_FLAGS_CLIENT 0x8000
+#define ISNS_FLAGS_SERVER 0x4000
+#define ISNS_FLAGS_AUTH 0x2000
+#define ISNS_FLAGS_REPLACE 0x1000
+#define ISNS_FLAGS_LAST_PDU 0x0800
+#define ISNS_FLAGS_FIRST_PDU 0x0400
+
+
+#define tfs_isns_psb_tunnel_mode tfs_preferred_no_preference
+#define tfs_isns_psb_transport_mode tfs_preferred_no_preference
+
+#define tfs_isns_psb_pfs tfs_enabled_disabled
+#define tfs_isns_psb_aggressive_mode tfs_enabled_disabled
+#define tfs_isns_psb_main_mode tfs_enabled_disabled
+#define tfs_isns_psb_ike_ipsec tfs_enabled_disabled
+
+
+#define tfs_isns_isnt_control tfs_yes_no
+#define tfs_isns_isnt_initiator tfs_yes_no
+#define tfs_isns_isnt_target tfs_yes_no
+
+static const true_false_string tfs_isns_port_type = {
+ "UDP",
+ "TCP"
+};
+
+static const true_false_string tfs_isns_flag_first_pdu = {
+ "First PDU of iSNS Message",
+ "Not the first PDU of iSNS Message"
+};
+
+static const true_false_string tfs_isns_flag_last_pdu = {
+ "Last PDU of iSNS Message",
+ "Not the Last PDU of iSNS Message"
+};
+
+static const true_false_string tfs_isns_flag_replace = {
+ "Replace",
+ "Don't replace"
+};
+
+static const true_false_string tfs_isns_flag_auth = {
+ "Authentication Block is PRESENT",
+ "No authentication block"
+};
+
+static const true_false_string tfs_isns_flag_server = {
+ "Sender is iSNS server",
+ "Sender is not iSNS server"
+};
+
+static const true_false_string tfs_isns_flag_client = {
+ "Sender is iSNS client",
+ "Sender is not iSNS client"
+};
+
+
+/* Initialize the subtree pointers */
+static gint ett_isns = -1;
+
+
+/* Code to actually dissect the packets */
+static int
+dissect_isns_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
+{
+ guint offset = 0;
+ guint16 function_id;
+ guint packet_len;
+ proto_item *ti;
+ proto_tree *isns_tree;
+ guint16 flags;
+ proto_tree *tt = NULL;
+ proto_item *tpayload;
+ static int * const isns_flags[] = {
+ &hf_isns_client,
+ &hf_isns_server,
+ &hf_isns_auth,
+ &hf_isns_replace,
+ &hf_isns_last_pdu,
+ &hf_isns_first_pdu,
+ NULL
+ };
+
+ /* Make entries in Protocol column and Info column on summary display */
+ col_set_str(pinfo->cinfo, COL_PROTOCOL, "iSNS");
+ col_clear(pinfo->cinfo, COL_INFO);
+
+ /* Get the function id from the packet */
+ function_id = tvb_get_ntohs(tvb, offset + 2);
+
+ /* Add the function name in the info col */
+ col_add_str(pinfo->cinfo, COL_INFO,
+ val_to_str_ext(function_id, &isns_function_ids_ext,
+ "Unknown function ID 0x%04x"));
+
+ /* create display subtree for the protocol */
+ ti = proto_tree_add_item(tree, proto_isns, tvb, 0, -1, ENC_NA);
+ isns_tree = proto_item_add_subtree(ti, ett_isns);
+
+ /* OK... Sort out the header */
+ proto_tree_add_item(isns_tree, hf_isns_version, tvb, offset, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(isns_tree, hf_isns_function_id, tvb, offset+2, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(isns_tree, hf_isns_pdu_length, tvb, offset+4, 2, ENC_BIG_ENDIAN);
+
+ flags = tvb_get_ntohs(tvb, offset + 6);
+ proto_tree_add_bitmask(isns_tree, tvb, offset+6, hf_isns_flags, ett_isns_flags, isns_flags, ENC_BIG_ENDIAN);
+ proto_tree_add_item(isns_tree, hf_isns_transaction_id, tvb, offset+8, 2, ENC_BIG_ENDIAN);
+ proto_tree_add_item(isns_tree, hf_isns_sequence_id, tvb, offset+10, 2, ENC_BIG_ENDIAN);
+
+ tpayload = proto_tree_add_item(isns_tree, hf_isns_payload, tvb, offset+12, -1, ENC_NA);
+ tt = proto_item_add_subtree(tpayload, ett_isns_payload);
+
+ /* Now set the offset to the start of the payload */
+ offset += ISNS_HEADER_SIZE;
+
+ /* Decode those attributes baby - Yeah!*/
+ switch (function_id)
+ {
+ case ISNS_FUNC_HEARTBEAT:
+ proto_tree_add_item(tt,hf_isns_heartbeat_ipv6_addr, tvb, offset, 16, ENC_NA);
+ offset += 16;
+
+ proto_tree_add_item(tt,hf_isns_heartbeat_tcp_port, tvb, offset, 2, ENC_BIG_ENDIAN);
+ offset += 2;
+
+ proto_tree_add_item(tt,hf_isns_heartbeat_udp_port, tvb, offset, 2, ENC_BIG_ENDIAN);
+ offset += 2;
+
+ proto_tree_add_item(tt,hf_isns_heartbeat_interval, tvb, offset, 4, ENC_BIG_ENDIAN);
+ offset += 4;
+
+ proto_tree_add_item(tt,hf_isns_heartbeat_counter, tvb, offset, 4, ENC_BIG_ENDIAN);
+ /*offset += 4;*/
+ break;
+
+ /* Responses */
+ case ISNS_FUNC_RSP_DEVATTRREG:
+ case ISNS_FUNC_RSP_DEVATTRQRY:
+ case ISNS_FUNC_RSP_DEVGETNEXT:
+ case ISNS_FUNC_RSP_DEREGDEV:
+ case ISNS_FUNC_RSP_SCNREG:
+ case ISNS_FUNC_RSP_SCNDEREG:
+ case ISNS_FUNC_RSP_SCNEVENT:
+ case ISNS_FUNC_RSP_SCN:
+ case ISNS_FUNC_RSP_DDREG:
+ case ISNS_FUNC_RSP_DDDEREG:
+ case ISNS_FUNC_RSP_DDSREG:
+ case ISNS_FUNC_RSP_DDSDEREG:
+ case ISNS_FUNC_RSP_ESI:
+ case ISNS_FUNC_RSP_RQSTDOMID:
+ case ISNS_FUNC_RSP_RLSEDOMID:
+ case ISNS_FUNC_RSP_GETDOMID:
+
+ /* Get the Error message of the response */
+ /* The Error field exists only at the beginning of a message (i.e., in the first PDU */
+ if(flags&ISNS_FLAGS_FIRST_PDU){
+ proto_tree_add_item(tt,hf_isns_resp_errorcode, tvb, offset, 4, ENC_BIG_ENDIAN);
+ offset += 4;
+ }
+
+ /* Fall Thru if there are attributes */
+ if (tvb_reported_length_remaining(tvb, offset) == 0)
+ return tvb_captured_length(tvb);
+ /* FALL THROUGH */
+ /* Messages */
+ case ISNS_FUNC_DEVATTRREG:
+ case ISNS_FUNC_DEVATTRQRY:
+ case ISNS_FUNC_DEVGETNEXT:
+ case ISNS_FUNC_DEREGDEV:
+ case ISNS_FUNC_SCNREG:
+ case ISNS_FUNC_SCNDEREG:
+ case ISNS_FUNC_SCNEVENT:
+ case ISNS_FUNC_SCN:
+ case ISNS_FUNC_DDREG:
+ case ISNS_FUNC_DDDEREG:
+ case ISNS_FUNC_DDSREG:
+ case ISNS_FUNC_DDSDEREG:
+ case ISNS_FUNC_ESI:
+ case ISNS_FUNC_RQSTDOMID:
+ case ISNS_FUNC_RLSEDOMID:
+ case ISNS_FUNC_GETDOMID:
+ default:
+ /* we can only look at the attributes for the first PDU */
+ if(!(flags&ISNS_FLAGS_FIRST_PDU)){
+ proto_tree_add_expert(tt, pinfo, &ei_isns_not_first_pdu, tvb, offset, -1);
+ return tvb_captured_length(tvb);
+ }
+
+ packet_len = tvb_reported_length(tvb);
+ while( offset < packet_len )
+ {
+ offset = AddAttribute(pinfo, tvb, tt, offset, function_id);
+ }
+ }
+
+ return tvb_captured_length(tvb);
+}
+
+static guint
+get_isns_pdu_len(packet_info *pinfo _U_, tvbuff_t *tvb, int offset, void *data _U_)
+{
+ guint16 isns_len;
+
+ isns_len = tvb_get_ntohs(tvb, offset+4);
+ return (isns_len+ISNS_HEADER_SIZE);
+}
+
+static int
+dissect_isns_tcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
+{
+ gint length = tvb_captured_length(tvb);
+ guint16 isns_protocol_version;
+ guint16 function_id;
+
+ if (length < ISNS_HEADER_SIZE) {
+ /*
+ * Not enough room to see if this is valid iSNS.
+ */
+ return 0;
+ }
+
+ /* Get the protocol version - only version one at the moment*/
+ isns_protocol_version = tvb_get_ntohs(tvb, 0);
+ if (isns_protocol_version != ISNS_PROTO_VER)
+ return 0;
+
+ /* Get the function id from the packet */
+ function_id = tvb_get_ntohs(tvb, 2);
+ if (try_val_to_str_ext(function_id, &isns_function_ids_ext) == NULL) {
+ /* Unknown function ID */
+ return 0;
+ }
+
+ tcp_dissect_pdus(tvb, pinfo, tree, isns_desegment, ISNS_HEADER_SIZE, get_isns_pdu_len,
+ dissect_isns_pdu, data);
+ return length;
+}
+
+static int
+dissect_isns_udp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
+{
+ gint length = tvb_captured_length(tvb);
+ guint16 isns_protocol_version;
+ guint16 function_id;
+
+ if (length < ISNS_HEADER_SIZE) {
+ /*
+ * Not enough room to see if this is valid iSNS.
+ */
+ return 0;
+ }
+
+ /* Get the protocol version - only version one at the moment*/
+ isns_protocol_version = tvb_get_ntohs(tvb, 0);
+ if (isns_protocol_version != ISNS_PROTO_VER)
+ return 0;
+
+ /* Get the function id from the packet */
+ function_id = tvb_get_ntohs(tvb, 2);
+ if (try_val_to_str_ext(function_id, &isns_function_ids_ext) == NULL) {
+ /* Unknown function ID */
+ return 0;
+ }
+
+ dissect_isns_pdu(tvb, pinfo, tree, data);
+ return length;
+}
+
+
+static void
+dissect_isns_attr_port(tvbuff_t *tvb, guint offset, proto_tree *tree, int hf_index,
+ guint16 isns_port_type, packet_info *pinfo)
+{
+ guint16 port = tvb_get_ntohs(tvb, offset+2);
+ gboolean is_udp = ((tvb_get_ntohs(tvb, offset) & 0x01) == 0x01);
+ conversation_t *conversation;
+ conversation_type ckt;
+ dissector_handle_t handle;
+
+ proto_tree_add_uint(tree, hf_index, tvb, offset, 4, port);
+ proto_tree_add_boolean(tree, hf_isns_port_type, tvb, offset, 2, is_udp);
+
+ if ((isns_port_type == ISNS_ESI_PORT) || (isns_port_type == ISNS_SCN_PORT)) {
+ if (is_udp) {
+ ckt = CONVERSATION_UDP;
+ handle = isns_udp_handle;
+ }
+ else {
+ ckt = CONVERSATION_TCP;
+ handle = isns_tcp_handle;
+ }
+
+ conversation = find_conversation(pinfo->num,
+ &pinfo->src, &pinfo->dst, ckt, port, 0, NO_PORT_B);
+ if (conversation == NULL) {
+ conversation = conversation_new(pinfo->num,
+ &pinfo->src, &pinfo->dst, ckt, port, 0, NO_PORT2_FORCE);
+ conversation_set_dissector(conversation, handle);
+ }
+ }
+}
+
+
+static void
+dissect_isns_attr_iscsi_node_type(tvbuff_t *tvb, guint offset, proto_tree *tree)
+{
+ static int * const flags[] = {
+ &hf_isns_isnt_control,
+ &hf_isns_isnt_initiator,
+ &hf_isns_isnt_target,
+ NULL
+ };
+
+ proto_tree_add_bitmask(tree, tvb, offset,
+ hf_isns_iscsi_node_type, ett_isns_attribute, flags, ENC_BIG_ENDIAN);
+}
+
+
+
+static void
+dissect_isns_attr_portal_security_bitmap(tvbuff_t *tvb, guint offset, proto_tree *tree)
+{
+ static int * const flags[] = {
+ &hf_isns_psb_tunnel_mode,
+ &hf_isns_psb_transport_mode,
+ &hf_isns_psb_pfs,
+ &hf_isns_psb_aggressive_mode,
+ &hf_isns_psb_main_mode,
+ &hf_isns_psb_ike_ipsec,
+ &hf_isns_psb_bitmap,
+ NULL
+ };
+
+ proto_tree_add_bitmask(tree, tvb, offset, hf_isns_psb, ett_isns_attribute, flags, ENC_BIG_ENDIAN);
+}
+
+
+
+static void
+dissect_isns_attr_scn_bitmap(tvbuff_t *tvb, guint offset, proto_tree *tree)
+{
+ /*
+ 24 INITIATOR AND SELF INFORMATION ONLY
+ 25 TARGET AND SELF INFORMATION ONLY
+ 26 MANAGEMENT REGISTRATION/SCN
+ 27 OBJECT REMOVED
+ 28 OBJECT ADDED
+ 29 OBJECT UPDATED
+ 30 DD/DDS MEMBER REMOVED (Mgmt Reg/SCN only)
+ 31 (Lsb) DD/DDS MEMBER ADDED (Mgmt Reg/SCN only)
+ */
+ static int * const flags[] = {
+ &hf_isns_scn_bitmap_initiator_and_self_information_only,
+ &hf_isns_scn_bitmap_target_and_self_information_only,
+ &hf_isns_scn_bitmap_management_registration_scn,
+ &hf_isns_scn_bitmap_object_removed,
+ &hf_isns_scn_bitmap_object_added,
+ &hf_isns_scn_bitmap_object_updated,
+ &hf_isns_scn_bitmap_dd_dds_member_removed,
+ &hf_isns_scn_bitmap_dd_dds_member_added,
+ NULL
+ };
+
+ proto_tree_add_bitmask(tree, tvb, offset, hf_isns_scn_bitmap, ett_isns_attribute, flags, ENC_BIG_ENDIAN);
+}
+
+
+static guint
+AddAttribute(packet_info *pinfo, tvbuff_t *tvb, proto_tree *tree, guint offset,
+ guint16 function_id)
+{
+ proto_tree *attr_tree;
+ proto_item *attr_item;
+ guint32 tag,len;
+ proto_item *len_item;
+
+ attr_tree = proto_tree_add_subtree(tree, tvb, offset, -1,
+ ett_isns_attribute, &attr_item, "Attribute");
+
+ tag = tvb_get_ntohl(tvb, offset);
+ proto_tree_add_item(attr_tree, hf_isns_attr_tag,
+ tvb, offset, 4, ENC_BIG_ENDIAN);
+ offset +=4;
+
+ len = tvb_get_ntohl(tvb, offset);
+ len_item = proto_tree_add_item(attr_tree, hf_isns_attr_len,
+ tvb, offset, 4, ENC_BIG_ENDIAN);
+ offset +=4;
+
+ proto_item_append_text(attr_item, ": %s", val_to_str_ext_const(tag, &isns_attribute_tags_ext, "Unknown"));
+
+ /* it seems that an empty attribute is always valid, the original code had a similar statement */
+ if (len==0) {
+ if ((tag==ISNS_ATTR_TAG_PORTAL_GROUP_TAG) &&
+ ((function_id==ISNS_FUNC_DEVATTRREG) || (function_id==ISNS_FUNC_RSP_DEVATTRREG))) {
+ /* 5.6.5.1 */
+ proto_tree_add_uint_format_value(tree, hf_isns_portal_group_tag, tvb, offset, 8, 0, "<NULL>");
+ }
+ proto_item_set_len(attr_item, 8+len);
+ return offset;
+ }
+
+ switch( tag )
+ {
+ case ISNS_ATTR_TAG_DELIMITER:
+ /* delimiter has no data */
+ break;
+ case ISNS_ATTR_TAG_ENTITY_IDENTIFIER:
+ proto_tree_add_item(attr_tree, hf_isns_entity_identifier, tvb, offset, len, ENC_ASCII);
+ break;
+ case ISNS_ATTR_TAG_ENTITY_PROTOCOL:
+ ISNS_REQUIRE_ATTR_LEN(4);
+ proto_tree_add_item(attr_tree, hf_isns_entity_protocol, tvb, offset, len, ENC_BIG_ENDIAN);
+ break;
+ case ISNS_ATTR_TAG_MGMT_IP_ADDRESS:
+ ISNS_REQUIRE_ATTR_LEN(16);
+ proto_tree_add_item(attr_tree, hf_isns_mgmt_ip_addr, tvb, offset, len, ENC_NA);
+ break;
+ case ISNS_ATTR_TAG_TIMESTAMP:
+ ISNS_REQUIRE_ATTR_LEN(8);
+ proto_tree_add_item(attr_tree, hf_isns_timestamp, tvb, offset, len, ENC_BIG_ENDIAN);
+ break;
+ case ISNS_ATTR_TAG_REGISTRATION_PERIOD:
+ ISNS_REQUIRE_ATTR_LEN(4);
+ proto_tree_add_item(attr_tree, hf_isns_registration_period, tvb, offset, len, ENC_BIG_ENDIAN);
+ break;
+ case ISNS_ATTR_TAG_ENTITY_INDEX:
+ ISNS_REQUIRE_ATTR_LEN(4);
+ proto_tree_add_item(attr_tree, hf_isns_entity_index, tvb, offset, len, ENC_BIG_ENDIAN);
+ break;
+ case ISNS_ATTR_TAG_ENTITY_NEXT_INDEX:
+ ISNS_REQUIRE_ATTR_LEN(4);
+ proto_tree_add_item(attr_tree, hf_isns_entity_next_index, tvb, offset, len, ENC_BIG_ENDIAN);
+ break;
+ case ISNS_ATTR_TAG_PORTAL_IP_ADDRESS:
+ proto_tree_add_item(attr_tree, hf_isns_portal_ip_addr, tvb, offset, len, ENC_NA);
+ break;
+ case ISNS_ATTR_TAG_PORTAL_PORT:
+ dissect_isns_attr_port(tvb, offset, attr_tree, hf_isns_portal_port, ISNS_OTHER_PORT, pinfo);
+ break;
+ case ISNS_ATTR_TAG_PORTAL_SYMBOLIC_NAME:
+ proto_tree_add_item(attr_tree, hf_isns_portal_symbolic_name, tvb, offset, len, ENC_ASCII);
+ break;
+ case ISNS_ATTR_TAG_ESI_INTERVAL:
+ proto_tree_add_item(attr_tree, hf_isns_esi_interval, tvb, offset, len, ENC_BIG_ENDIAN);
+ break;
+ case ISNS_ATTR_TAG_ESI_PORT:
+ dissect_isns_attr_port(tvb, offset, attr_tree, hf_isns_esi_port, ISNS_ESI_PORT, pinfo);
+ break;
+ case ISNS_ATTR_TAG_PORTAL_INDEX:
+ proto_tree_add_item(attr_tree, hf_isns_portal_index, tvb, offset, len, ENC_BIG_ENDIAN);
+ break;
+ case ISNS_ATTR_TAG_SCN_PORT:
+ dissect_isns_attr_port(tvb, offset, attr_tree, hf_isns_scn_port, ISNS_SCN_PORT, pinfo);
+ break;
+ case ISNS_ATTR_TAG_PORTAL_NEXT_INDEX:
+ proto_tree_add_item(attr_tree, hf_isns_portal_next_index, tvb, offset, len, ENC_BIG_ENDIAN);
+ break;
+ case ISNS_ATTR_TAG_PORTAL_SECURITY_BITMAP:
+ dissect_isns_attr_portal_security_bitmap(tvb, offset, attr_tree);
+ break;
+ case ISNS_ATTR_TAG_ISCSI_NAME:
+ proto_tree_add_item(attr_tree, hf_isns_iscsi_name, tvb, offset, len, ENC_ASCII);
+ break;
+ case ISNS_ATTR_TAG_ISCSI_NODE_TYPE:
+ ISNS_REQUIRE_ATTR_LEN(4);
+ dissect_isns_attr_iscsi_node_type(tvb, offset, attr_tree);
+ break;
+ case ISNS_ATTR_TAG_ISCSI_ALIAS:
+ proto_tree_add_item(attr_tree, hf_isns_iscsi_alias, tvb, offset, len, ENC_ASCII);
+ break;
+ case ISNS_ATTR_TAG_ISCSI_SCN_BITMAP:
+ ISNS_REQUIRE_ATTR_LEN(4);
+ dissect_isns_attr_scn_bitmap(tvb, offset, attr_tree);
+ break;
+ case ISNS_ATTR_TAG_ISCSI_NODE_INDEX:
+ ISNS_REQUIRE_ATTR_LEN(4);
+ proto_tree_add_item(attr_tree, hf_isns_node_index, tvb, offset, len, ENC_BIG_ENDIAN);
+ break;
+ case ISNS_ATTR_TAG_WWNN_TOKEN:
+ ISNS_REQUIRE_ATTR_LEN(8);
+ proto_tree_add_item(attr_tree, hf_isns_wwnn_token, tvb, offset, len, ENC_BIG_ENDIAN);
+ break;
+ case ISNS_ATTR_TAG_ISCSI_NODE_NEXT_INDEX:
+ ISNS_REQUIRE_ATTR_LEN(4);
+ proto_tree_add_item(attr_tree, hf_isns_node_next_index, tvb, offset, len, ENC_BIG_ENDIAN);
+ break;
+ case ISNS_ATTR_TAG_ISCSI_AUTH_METHOD:
+ proto_tree_add_item(attr_tree, hf_isns_iscsi_auth_method, tvb, offset, len, ENC_ASCII);
+ break;
+ case ISNS_ATTR_TAG_PG_ISCSI_NAME:
+ proto_tree_add_item(attr_tree, hf_isns_pg_iscsi_name, tvb, offset, len, ENC_ASCII);
+ break;
+ case ISNS_ATTR_TAG_PG_PORTAL_IP_ADDR:
+ proto_tree_add_item(attr_tree, hf_isns_pg_portal_ip_addr, tvb, offset, len, ENC_NA);
+ break;
+ case ISNS_ATTR_TAG_PG_PORTAL_PORT:
+ ISNS_REQUIRE_ATTR_LEN(4);
+ dissect_isns_attr_port(tvb, offset, attr_tree, hf_isns_pg_portal_port, ISNS_OTHER_PORT, pinfo);
+ break;
+ case ISNS_ATTR_TAG_PORTAL_GROUP_TAG:
+ ISNS_REQUIRE_ATTR_LEN(4);
+ proto_tree_add_item(attr_tree, hf_isns_portal_group_tag, tvb, offset, len, ENC_BIG_ENDIAN);
+ break;
+ case ISNS_ATTR_TAG_PORTAL_GROUP_INDEX:
+ ISNS_REQUIRE_ATTR_LEN(4);
+ proto_tree_add_item(attr_tree, hf_isns_pg_index, tvb, offset, len, ENC_BIG_ENDIAN);
+ break;
+ case ISNS_ATTR_TAG_PORTAL_GROUP_NEXT_INDEX:
+ ISNS_REQUIRE_ATTR_LEN(4);
+ proto_tree_add_item(attr_tree, hf_isns_pg_next_index, tvb, offset, len, ENC_BIG_ENDIAN);
+ break;
+ case ISNS_ATTR_TAG_FC_PORT_NAME_WWPN:
+ ISNS_REQUIRE_ATTR_LEN(8);
+ proto_tree_add_item(attr_tree, hf_isns_fc_port_name_wwpn, tvb, offset, len, ENC_BIG_ENDIAN);
+ break;
+ case ISNS_ATTR_TAG_PORT_ID:
+ ISNS_REQUIRE_ATTR_LEN(3);
+ proto_tree_add_item(attr_tree, hf_isns_port_id, tvb, offset, len, ENC_BIG_ENDIAN);
+ break;
+ /*
+ 0x0000 Unidentified/Null Entry
+ 0x0001 Fibre Channel N_Port
+ 0x0002 Fibre Channel NL_Port
+ 0x0003 Fibre Channel F/NL_Port
+ 0x0081 Fibre Channel F_Port
+ 0x0082 Fibre Channel FL_Port
+ 0x0084 Fibre Channel E_Port
+ 0xFF12 iFCP Port
+ */
+ case ISNS_ATTR_TAG_SYMBOLIC_PORT_NAME:
+ proto_tree_add_item(attr_tree, hf_isns_symbolic_port_name, tvb, offset, len, ENC_ASCII);
+ break;
+ case ISNS_ATTR_TAG_FABRIC_PORT_NAME:
+ ISNS_REQUIRE_ATTR_LEN(8);
+ proto_tree_add_item(attr_tree, hf_isns_fabric_port_name, tvb, offset, len, ENC_BIG_ENDIAN);
+ break;
+ case ISNS_ATTR_TAG_HARD_ADDRESS:
+ ISNS_REQUIRE_ATTR_LEN(3);
+ proto_tree_add_item(attr_tree, hf_isns_hard_address, tvb, offset, len, ENC_BIG_ENDIAN);
+ break;
+ case ISNS_ATTR_TAG_PORT_IP_ADDRESS:
+ ISNS_REQUIRE_ATTR_LEN(16);
+ proto_tree_add_item(attr_tree, hf_isns_port_ip_addr, tvb, offset, len, ENC_NA);
+ break;
+ /*
+ bit 29 Fibre Channel Class 2 Supported
+ bit 28 Fibre Channel Class 3 Supported
+ */
+ case ISNS_ATTR_TAG_FC4_DESCRIPTOR:
+ proto_tree_add_item(attr_tree, hf_isns_fc4_descriptor, tvb, offset, len, ENC_ASCII);
+ break;
+ /*
+ bit 29 Control
+ bit 30 FCP Initiator
+ bit 31 (Lsb) FCP Target
+ */
+ case ISNS_ATTR_TAG_PERMANENT_PORT_NAME:
+ ISNS_REQUIRE_ATTR_LEN(8);
+ proto_tree_add_item(attr_tree, hf_isns_permanent_port_name, tvb, offset, len, ENC_BIG_ENDIAN);
+ break;
+ /* 8bit type code in byte0 */
+ case ISNS_ATTR_TAG_FC_NODE_NAME_WWNN:
+ ISNS_REQUIRE_ATTR_LEN(8);
+ proto_tree_add_item(attr_tree, hf_isns_fc_node_name_wwnn, tvb, offset, len, ENC_BIG_ENDIAN);
+ break;
+ case ISNS_ATTR_TAG_SYMBOLIC_NODE_NAME:
+ proto_tree_add_item(attr_tree, hf_isns_symbolic_node_name, tvb, offset, len, ENC_ASCII);
+ break;
+ case ISNS_ATTR_TAG_NODE_IP_ADDRESS:
+ ISNS_REQUIRE_ATTR_LEN(16);
+ proto_tree_add_item(attr_tree, hf_isns_node_ip_addr, tvb, offset, len, ENC_NA);
+ break;
+ case ISNS_ATTR_TAG_NODE_IPA:
+ ISNS_REQUIRE_ATTR_LEN(8);
+ proto_tree_add_item(attr_tree, hf_isns_node_ipa, tvb, offset, len, ENC_BIG_ENDIAN);
+ break;
+ case ISNS_ATTR_TAG_PROXY_ISCSI_NAME:
+ proto_tree_add_item(attr_tree, hf_isns_proxy_iscsi_name, tvb, offset, len, ENC_ASCII);
+ break;
+ case ISNS_ATTR_TAG_SWITCH_NAME:
+ ISNS_REQUIRE_ATTR_LEN(8);
+ proto_tree_add_item(attr_tree, hf_isns_switch_name, tvb, offset, len, ENC_BIG_ENDIAN);
+ break;
+ case ISNS_ATTR_TAG_PREFERRED_ID:
+ ISNS_REQUIRE_ATTR_LEN(4);
+ proto_tree_add_item(attr_tree, hf_isns_preferred_id, tvb, offset, len, ENC_BIG_ENDIAN);
+ break;
+ case ISNS_ATTR_TAG_ASSIGNED_ID:
+ ISNS_REQUIRE_ATTR_LEN(4);
+ proto_tree_add_item(attr_tree, hf_isns_assigned_id, tvb, offset, len, ENC_BIG_ENDIAN);
+ break;
+ case ISNS_ATTR_TAG_VIRTUAL_FABRIC_ID:
+ proto_tree_add_item(attr_tree, hf_isns_virtual_fabric_id, tvb, offset, len, ENC_ASCII);
+ break;
+ case ISNS_ATTR_TAG_VENDOR_OUI:
+ ISNS_REQUIRE_ATTR_LEN(4);
+ proto_tree_add_item(attr_tree, hf_isns_vendor_oui, tvb, offset, len, ENC_BIG_ENDIAN);
+ break;
+ case ISNS_ATTR_TAG_DD_SET_ID:
+ ISNS_REQUIRE_ATTR_LEN(4);
+ proto_tree_add_item(attr_tree, hf_isns_dd_set_id, tvb, offset, len, ENC_BIG_ENDIAN);
+ break;
+ case ISNS_ATTR_TAG_DD_SET_SYMBOLIC_NAME:
+ proto_tree_add_item(attr_tree, hf_isns_dd_set_symbolic_name, tvb, offset, len, ENC_ASCII);
+ break;
+ case ISNS_ATTR_TAG_DD_SET_NEXT_ID:
+ ISNS_REQUIRE_ATTR_LEN(4);
+ proto_tree_add_item(attr_tree, hf_isns_dd_set_next_id, tvb, offset, len, ENC_BIG_ENDIAN);
+ break;
+ case ISNS_ATTR_TAG_DD_ID:
+ ISNS_REQUIRE_ATTR_LEN(4);
+ proto_tree_add_item(attr_tree, hf_isns_dd_id, tvb, offset, len, ENC_BIG_ENDIAN);
+ break;
+ case ISNS_ATTR_TAG_DD_SYMBOLIC_NAME:
+ proto_tree_add_item(attr_tree, hf_isns_dd_symbolic_name, tvb, offset, len, ENC_ASCII);
+ break;
+ case ISNS_ATTR_TAG_DD_MEMBER_ISCSI_INDEX:
+ ISNS_REQUIRE_ATTR_LEN(4);
+ proto_tree_add_item(attr_tree, hf_isns_member_iscsi_index, tvb, offset, len, ENC_BIG_ENDIAN);
+ break;
+ case ISNS_ATTR_TAG_DD_MEMBER_ISCSI_NAME:
+ proto_tree_add_item(attr_tree, hf_isns_dd_member_iscsi_name, tvb, offset, len, ENC_ASCII);
+ break;
+ case ISNS_ATTR_TAG_DD_MEMBER_FC_PORT_NAME:
+ ISNS_REQUIRE_ATTR_LEN(4);
+ proto_tree_add_item(attr_tree, hf_isns_member_fc_port_name, tvb, offset, len, ENC_BIG_ENDIAN);
+ break;
+ case ISNS_ATTR_TAG_DD_MEMBER_PORTAL_INDEX:
+ ISNS_REQUIRE_ATTR_LEN(4);
+ proto_tree_add_item(attr_tree, hf_isns_member_portal_index, tvb, offset, len, ENC_BIG_ENDIAN);
+ break;
+ case ISNS_ATTR_TAG_DD_MEMBER_PORTAL_IP_ADDRESS:
+ ISNS_REQUIRE_ATTR_LEN(16);
+ proto_tree_add_item(attr_tree, hf_isns_dd_member_portal_ip_addr, tvb, offset, len, ENC_NA);
+ break;
+ case ISNS_ATTR_TAG_DD_MEMBER_PORTAL_PORT:
+ ISNS_REQUIRE_ATTR_LEN(4);
+ dissect_isns_attr_port(tvb, offset, attr_tree, hf_isns_dd_member_portal_port, ISNS_OTHER_PORT, pinfo);
+ break;
+ case ISNS_ATTR_TAG_DD_ID_NEXT_ID:
+ ISNS_REQUIRE_ATTR_LEN(4);
+ proto_tree_add_item(attr_tree, hf_isns_dd_id_next_id, tvb, offset, len, ENC_BIG_ENDIAN);
+ break;
+ default:
+ proto_tree_add_item(attr_tree, hf_isns_not_decoded_yet, tvb, offset, len, ENC_NA);
+ }
+
+ /* Make sure the data is all there - and that the length won't overflow */
+ tvb_ensure_bytes_exist(tvb, offset, len);
+ /* Set the length of the item to cover only the actual item length */
+ proto_item_set_len(attr_item, 8+len);
+
+ offset += len;
+ return offset;
+}
+
+
+
+void proto_register_isns(void)
+{
+ /* Setup list of header fields See Section 1.6.1 for details*/
+ static hf_register_info hf[] = {
+ /* The Header Stuff */
+ { &hf_isns_version,
+ { "iSNSP Version", "isns.PVer",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ NULL, HFILL}
+ },
+ { &hf_isns_function_id,
+ { "Function ID", "isns.functionid",
+ FT_UINT16, BASE_DEC|BASE_EXT_STRING, &isns_function_ids_ext, 0,
+ NULL, HFILL}
+ },
+ { &hf_isns_pdu_length,
+ { "PDU Length", "isns.pdulength",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ NULL, HFILL}
+ },
+
+ { &hf_isns_flags,
+ { "Flags", "isns.flags",
+ FT_UINT16, BASE_HEX, NULL, 0,
+ NULL, HFILL}
+ },
+ { &hf_isns_client,
+ { "Client", "isns.flags.client",
+ FT_BOOLEAN, 16, TFS(&tfs_isns_flag_client), ISNS_FLAGS_CLIENT,
+ NULL, HFILL}
+ },
+ { &hf_isns_server,
+ { "Server", "isns.flags.server",
+ FT_BOOLEAN, 16, TFS(&tfs_isns_flag_server), ISNS_FLAGS_SERVER,
+ NULL, HFILL}
+ },
+ { &hf_isns_auth,
+ { "Auth", "isns.flags.authentication_block",
+ FT_BOOLEAN, 16, TFS(&tfs_isns_flag_auth), ISNS_FLAGS_AUTH,
+ "is iSNS Authentication Block present?", HFILL}
+ },
+ { &hf_isns_replace,
+ { "Replace", "isns.flags.replace",
+ FT_BOOLEAN, 16, TFS(&tfs_isns_flag_replace), ISNS_FLAGS_REPLACE,
+ NULL, HFILL}
+ },
+ { &hf_isns_last_pdu,
+ { "Last PDU", "isns.flags.lastpdu",
+ FT_BOOLEAN, 16, TFS(&tfs_isns_flag_last_pdu), ISNS_FLAGS_LAST_PDU,
+ NULL, HFILL}
+ },
+ { &hf_isns_first_pdu,
+ { "First PDU", "isns.flags.firstpdu",
+ FT_BOOLEAN, 16, TFS(&tfs_isns_flag_first_pdu), ISNS_FLAGS_FIRST_PDU,
+ NULL, HFILL }
+ },
+
+
+ { &hf_isns_transaction_id,
+ { "Transaction ID", "isns.transactionid",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ NULL, HFILL}
+ },
+ { &hf_isns_sequence_id,
+ { "Sequence ID", "isns.sequenceid",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ NULL, HFILL}
+ },
+
+ { &hf_isns_entity_protocol,
+ { "Entity Protocol", "isns.entity_protocol",
+ FT_UINT32, BASE_DEC, VALS(isns_entity_protocol), 0,
+ NULL, HFILL}
+ },
+ /* The Payload stuff */
+
+ { &hf_isns_dd_member_portal_port,
+ { "DD Member Portal Port", "isns.dd_member_portal_port",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ "TCP/UDP DD Member Portal Port", HFILL }
+ },
+
+ { &hf_isns_iscsi_node_type,
+ { "iSCSI Node Type", "isns.iscsi.node_type",
+ FT_UINT32, BASE_HEX, NULL, 0,
+ NULL, HFILL }
+ },
+
+ { &hf_isns_esi_port,
+ { "ESI Port", "isns.esi_port",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ "TCP/UDP ESI Port", HFILL }
+ },
+
+ { &hf_isns_scn_port,
+ { "SCN Port", "isns.scn_port",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ "TCP/UDP SCN Port", HFILL }
+ },
+
+ { &hf_isns_portal_port,
+ { "Portal Port", "isns.portal_port",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ "TCP/UDP Portal Port", HFILL }
+ },
+
+ { &hf_isns_pg_portal_port,
+ { "PG Portal Port", "isns.pg.portal_port",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ "PG Portal TCP/UDP Port", HFILL }
+ },
+
+ { &hf_isns_port_type,
+ { "Port Type", "isns.port.port_type",
+ FT_BOOLEAN, 16, TFS(&tfs_isns_port_type), 0x0001, /* bit 15 (or bit 1 of a 16bit word) */
+ NULL, HFILL }
+ },
+
+ { &hf_isns_psb,
+ { "Portal Security Bitmap", "isns.psb",
+ FT_UINT32, BASE_HEX, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_isns_psb_tunnel_mode,
+ { "Tunnel Mode", "isns.psb.tunnel",
+ FT_BOOLEAN, 32, TFS(&tfs_isns_psb_tunnel_mode), 0x00000040, /* bit 25 */
+ "Tunnel Mode Preferred", HFILL }
+ },
+ { &hf_isns_psb_transport_mode,
+ { "Transport Mode", "isns.psb.transport",
+ FT_BOOLEAN, 32, TFS(&tfs_isns_psb_transport_mode), 0x00000020, /* bit 26 */
+ NULL, HFILL }
+ },
+ { &hf_isns_psb_pfs,
+ { "PFS", "isns.psb.pfs",
+ FT_BOOLEAN, 32, TFS(&tfs_isns_psb_pfs), 0x00000010, /* bit 27 */
+ NULL, HFILL }
+ },
+ { &hf_isns_psb_aggressive_mode,
+ { "Aggressive Mode", "isns.psb.aggressive_mode",
+ FT_BOOLEAN, 32, TFS(&tfs_isns_psb_aggressive_mode), 0x00000008, /* bit 28 */
+ NULL, HFILL }
+ },
+ { &hf_isns_psb_main_mode,
+ { "Main Mode", "isns.psb.main_mode",
+ FT_BOOLEAN, 32, TFS(&tfs_isns_psb_main_mode), 0x00000004, /* bit 29 */
+ NULL, HFILL }
+ },
+ { &hf_isns_psb_ike_ipsec,
+ { "IKE/IPSec", "isns.psb.ike_ipsec",
+ FT_BOOLEAN, 32, TFS(&tfs_isns_psb_ike_ipsec), 0x00000002, /* bit 30 */
+ NULL, HFILL }
+ },
+ { &hf_isns_psb_bitmap,
+ { "Bitmap", "isns.psb.bitmap",
+ FT_BOOLEAN, 32, TFS(&tfs_valid_invalid), 0x00000001, /* bit 31 */
+ NULL, HFILL }
+ },
+
+
+
+ { &hf_isns_scn_bitmap,
+ { "iSCSI SCN Bitmap", "isns.scn_bitmap",
+ FT_UINT32, BASE_HEX, NULL, 0,
+ NULL, HFILL }
+ },
+ { &hf_isns_scn_bitmap_initiator_and_self_information_only,
+ { "Initiator And Self Information Only", "isns.scn_bitmap.initiator_and_self_information_only",
+ FT_BOOLEAN, 32, NULL, 0x00000080, /* bit 24 */
+ NULL, HFILL }
+ },
+ { &hf_isns_scn_bitmap_target_and_self_information_only,
+ { "Target And Self Information Only", "isns.scn_bitmap.target_and_self_information_only",
+ FT_BOOLEAN, 32, NULL, 0x00000040, /* bit 25 */
+ NULL, HFILL }
+ },
+ { &hf_isns_scn_bitmap_management_registration_scn,
+ { "Management Registration/SCN", "isns.scn_bitmap.management_registration_scn",
+ FT_BOOLEAN, 32, NULL, 0x00000020, /* bit 26 */
+ NULL, HFILL }
+ },
+ { &hf_isns_scn_bitmap_object_removed,
+ { "Object Removed", "isns.scn_bitmap.object_removed",
+ FT_BOOLEAN, 32, NULL, 0x00000010, /* bit 27 */
+ NULL, HFILL }
+ },
+ { &hf_isns_scn_bitmap_object_added,
+ { "Object Added", "isns.scn_bitmap.object_added",
+ FT_BOOLEAN, 32, NULL, 0x00000008, /* bit 28 */
+ NULL, HFILL }
+ },
+ { &hf_isns_scn_bitmap_object_updated,
+ { "Object Updated", "isns.scn_bitmap.object_updated",
+ FT_BOOLEAN, 32, NULL, 0x00000004, /* bit 29 */
+ NULL, HFILL }
+ },
+ { &hf_isns_scn_bitmap_dd_dds_member_removed,
+ { "DD/DDS Member Removed (Mgmt Reg/SCN only)", "isns.scn_bitmap.dd_dds_member_removed",
+ FT_BOOLEAN, 32, NULL, 0x00000002, /* bit 30 */
+ NULL, HFILL }
+ },
+ { &hf_isns_scn_bitmap_dd_dds_member_added,
+ { "DD/DDS Member Added (Mgmt Reg/SCN only)", "isns.scn_bitmap.dd_dds_member_added",
+ FT_BOOLEAN, 32, NULL, 0x00000001, /* bit 31 */
+ NULL, HFILL }
+ },
+
+
+ { &hf_isns_isnt_control,
+ { "Control", "isns.isnt.control",
+ FT_BOOLEAN, 32, TFS(&tfs_isns_isnt_control), 0x00000004, /* bit 29 */
+ NULL, HFILL }
+ },
+ { &hf_isns_isnt_initiator,
+ { "Initiator", "isns.isnt.initiator",
+ FT_BOOLEAN, 32, TFS(&tfs_isns_isnt_initiator), 0x00000002, /* bit 30 */
+ NULL, HFILL }
+ },
+ { &hf_isns_isnt_target,
+ { "Target", "isns.isnt.target",
+ FT_BOOLEAN, 32, TFS(&tfs_isns_isnt_target), 0x00000001, /* bit 31 */
+ NULL, HFILL }
+ },
+
+
+ { &hf_isns_resp_errorcode,
+ { "ErrorCode", "isns.errorcode",
+ FT_UINT32, BASE_DEC|BASE_EXT_STRING, &isns_errorcode_ext, 0,
+ "iSNS Response Error Code", HFILL}
+ },
+
+ { &hf_isns_attr_tag,
+ { "Attribute Tag", "isns.attr.tag",
+ FT_UINT32, BASE_DEC|BASE_EXT_STRING, &isns_attribute_tags_ext, 0,
+ NULL, HFILL}
+ },
+
+ { &hf_isns_attr_len,
+ { "Attribute Length", "isns.attr.len",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ NULL, HFILL}
+ },
+
+ { &hf_isns_not_decoded_yet,
+ { "Not Decoded Yet", "isns.not_decoded_yet",
+ FT_NONE, BASE_NONE, NULL, 0,
+ "This tag is not yet decoded by Wireshark", HFILL}
+ },
+
+ { &hf_isns_heartbeat_ipv6_addr,
+ { "Heartbeat Address (ipv6)", "isns.heartbeat.address",
+ FT_IPv6, BASE_NONE, NULL, 0x0,
+ "Server IPv6 Address", HFILL }},
+
+ { &hf_isns_heartbeat_tcp_port,
+ { "Heartbeat TCP Port", "isns.heartbeat.tcpport",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "Server TCP Port", HFILL }},
+
+ { &hf_isns_heartbeat_udp_port,
+ { "Heartbeat UDP Port", "isns.heartbeat.udpport",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "Server UDP Port", HFILL }},
+
+
+ { &hf_isns_heartbeat_interval,
+ { "Heartbeat Interval (secs)", "isns.heartbeat.interval",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "Server Heartbeat interval", HFILL }},
+
+ { &hf_isns_heartbeat_counter,
+ { "Heartbeat counter", "isns.heartbeat.counter",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "Server Heartbeat Counter", HFILL }},
+
+ { &hf_isns_iscsi_name,
+ { "iSCSI Name", "isns.iscsi_name",
+ FT_STRING, BASE_NONE, NULL, 0x0,
+ "iSCSI Name of device", HFILL }},
+
+ { &hf_isns_dd_member_iscsi_name,
+ { "DD Member iSCSI Name", "isns.dd_member.iscsi_name",
+ FT_STRING, BASE_NONE, NULL, 0x0,
+ "DD Member iSCSI Name of device", HFILL }},
+
+ { &hf_isns_virtual_fabric_id,
+ { "Virtual Fabric ID", "isns.virtual_fabric_id",
+ FT_STRING, BASE_NONE, NULL, 0x0,
+ NULL, HFILL }},
+
+ { &hf_isns_proxy_iscsi_name,
+ { "Proxy iSCSI Name", "isns.proxy_iscsi_name",
+ FT_STRING, BASE_NONE, NULL, 0x0,
+ NULL, HFILL }},
+
+ { &hf_isns_fc4_descriptor,
+ { "FC4 Descriptor", "isns.fc4_descriptor",
+ FT_STRING, BASE_NONE, NULL, 0x0,
+ "FC4 Descriptor of this device", HFILL }},
+
+ { &hf_isns_iscsi_auth_method,
+ { "iSCSI Auth Method", "isns.iscsi_auth_method",
+ FT_STRING, BASE_NONE, NULL, 0x0,
+ "Authentication Method required by this device", HFILL }},
+
+ { &hf_isns_iscsi_alias,
+ { "iSCSI Alias", "isns.iscsi_alias",
+ FT_STRING, BASE_NONE, NULL, 0x0,
+ "iSCSI Alias of device", HFILL }},
+
+ { &hf_isns_portal_symbolic_name,
+ { "Portal Symbolic Name", "isns.portal.symbolic_name",
+ FT_STRING, BASE_NONE, NULL, 0x0,
+ "Symbolic name of this portal", HFILL }},
+
+ { &hf_isns_dd_set_symbolic_name,
+ { "DD Set Symbolic Name", "isns.dd_set.symbolic_name",
+ FT_STRING, BASE_NONE, NULL, 0x0,
+ "Symbolic name of this DD Set", HFILL }},
+
+ { &hf_isns_dd_symbolic_name,
+ { "DD Symbolic Name", "isns.dd.symbolic_name",
+ FT_STRING, BASE_NONE, NULL, 0x0,
+ "Symbolic name of this DD", HFILL }},
+
+ { &hf_isns_symbolic_port_name,
+ { "Symbolic Port Name", "isns.port.symbolic_name",
+ FT_STRING, BASE_NONE, NULL, 0x0,
+ "Symbolic name of this port", HFILL }},
+
+ { &hf_isns_symbolic_node_name,
+ { "Symbolic Node Name", "isns.node.symbolic_name",
+ FT_STRING, BASE_NONE, NULL, 0x0,
+ "Symbolic name of this node", HFILL }},
+
+ { &hf_isns_entity_identifier,
+ { "Entity Identifier", "isns.entity_identifier",
+ FT_STRING, BASE_NONE, NULL, 0x0,
+ "Entity Identifier of this object", HFILL }},
+
+ { &hf_isns_mgmt_ip_addr,
+ { "Management IP Address", "isns.mgmt.ip_address",
+ FT_IPv6, BASE_NONE, NULL, 0x0,
+ "Management IPv4/IPv6 Address", HFILL }},
+
+ { &hf_isns_node_ip_addr,
+ { "Node IP Address", "isns.node.ip_address",
+ FT_IPv6, BASE_NONE, NULL, 0x0,
+ "Node IPv4/IPv6 Address", HFILL }},
+
+ { &hf_isns_port_ip_addr,
+ { "Port IP Address", "isns.port.ip_address",
+ FT_IPv6, BASE_NONE, NULL, 0x0,
+ "Port IPv4/IPv6 Address", HFILL }},
+
+ { &hf_isns_portal_ip_addr,
+ { "Portal IP Address", "isns.portal.ip_address",
+ FT_IPv6, BASE_NONE, NULL, 0x0,
+ "Portal IPv4/IPv6 Address", HFILL }},
+
+ { &hf_isns_dd_member_portal_ip_addr,
+ { "DD Member Portal IP Address", "isns.dd.member_portal.ip_address",
+ FT_IPv6, BASE_NONE, NULL, 0x0,
+ "DD Member Portal IPv4/IPv6 Address", HFILL }},
+
+ { &hf_isns_pg_iscsi_name,
+ { "PG iSCSI Name", "isns.pg_iscsi_name",
+ FT_STRING, BASE_NONE, NULL, 0x0,
+ NULL, HFILL }},
+
+ { &hf_isns_pg_portal_ip_addr,
+ { "PG Portal IP Address", "isns.pg_portal.ip_address",
+ FT_IPv6, BASE_NONE, NULL, 0x0,
+ "PG Portal IPv4/IPv6 Address", HFILL }},
+
+ { &hf_isns_pg_index,
+ { "PG Index", "isns.pg_index",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+
+ { &hf_isns_pg_next_index,
+ { "PG Next Index", "isns.pg_next_index",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+
+ { &hf_isns_dd_id_next_id,
+ { "DD ID Next ID", "isns.dd_id_next_id",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+
+ { &hf_isns_member_iscsi_index,
+ { "Member iSCSI Index", "isns.member_iscsi_index",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+
+ { &hf_isns_member_portal_index,
+ { "Member Portal Index", "isns.member_portal_index",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+
+ { &hf_isns_member_fc_port_name,
+ { "Member FC Port Name", "isns.member_fc_port_name",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+
+ { &hf_isns_vendor_oui,
+ { "Vendor OUI", "isns.vendor_oui",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+
+ { &hf_isns_preferred_id,
+ { "Preferred ID", "isns.preferred_id",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+
+ { &hf_isns_dd_set_id,
+ { "DD Set ID", "isns.dd_set_id",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+
+ { &hf_isns_dd_id,
+ { "DD ID", "isns.dd_id",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+
+ { &hf_isns_port_id,
+ { "Port ID", "isns.port_id",
+ FT_UINT24, BASE_HEX, NULL, 0x0,
+ NULL, HFILL }},
+
+ { &hf_isns_hard_address,
+ { "Hard Address", "isns.hard_address",
+ FT_UINT24, BASE_HEX, NULL, 0x0,
+ NULL, HFILL }},
+
+ { &hf_isns_wwnn_token,
+ { "WWNN Token", "isns.wwnn_token",
+ FT_UINT64, BASE_HEX, NULL, 0x0,
+ NULL, HFILL }},
+
+ { &hf_isns_fc_port_name_wwpn,
+ { "FC Port Name WWPN", "isns.fc_port_name_wwpn",
+ FT_UINT64, BASE_HEX, NULL, 0x0,
+ NULL, HFILL }},
+
+ { &hf_isns_fc_node_name_wwnn,
+ { "FC Node Name WWNN", "isns.fc_node_name_wwnn",
+ FT_UINT64, BASE_HEX, NULL, 0x0,
+ NULL, HFILL }},
+
+ { &hf_isns_node_ipa,
+ { "Node IPA", "isns.node_ipa",
+ FT_UINT64, BASE_HEX, NULL, 0x0,
+ NULL, HFILL }},
+
+ { &hf_isns_fabric_port_name,
+ { "Fabric Port Name", "isns.fabric_port_name",
+ FT_UINT64, BASE_HEX, NULL, 0x0,
+ NULL, HFILL }},
+
+ { &hf_isns_permanent_port_name,
+ { "Permanent Port Name", "isns.permanent_port_name",
+ FT_UINT64, BASE_HEX, NULL, 0x0,
+ NULL, HFILL }},
+
+ { &hf_isns_switch_name,
+ { "Switch Name", "isns.switch_name",
+ FT_UINT64, BASE_HEX, NULL, 0x0,
+ NULL, HFILL }},
+
+ { &hf_isns_dd_set_next_id,
+ { "DD Set Next ID", "isns.dd_set_next_id",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+
+ { &hf_isns_assigned_id,
+ { "Assigned ID", "isns.assigned_id",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+
+ { &hf_isns_node_index,
+ { "Node Index", "isns.node.index",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+
+ { &hf_isns_node_next_index,
+ { "Node Next Index", "isns.node.next_index",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "Node INext index", HFILL }},
+
+ { &hf_isns_portal_index,
+ { "Portal Index", "isns.portal.index",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+
+ { &hf_isns_portal_next_index,
+ { "Portal Next Index", "isns.portal.next_index",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+
+ { &hf_isns_entity_index,
+ { "Entity Index", "isns.entity.index",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+
+ { &hf_isns_entity_next_index,
+ { "Entity Next Index", "isns.entity.next_index",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "Next Entity Index", HFILL }},
+
+ { &hf_isns_timestamp,
+ { "Timestamp", "isns.timestamp",
+ FT_UINT64, BASE_DEC, NULL, 0x0,
+ "Timestamp in Seconds", HFILL }},
+
+ { &hf_isns_esi_interval,
+ { "ESI Interval", "isns.esi_interval",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "ESI Interval in Seconds", HFILL }},
+
+ { &hf_isns_registration_period,
+ { "Registration Period", "isns.registration_period",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "Registration Period in Seconds", HFILL }},
+
+ { &hf_isns_portal_group_tag,
+ { "PG Tag", "isns.portal_group_tag",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "Portal Group Tag", HFILL }},
+
+ { &hf_isns_payload,
+ { "Payload", "isns.payload",
+ FT_BYTES, BASE_NONE, NULL, 0,
+ NULL, HFILL}
+ }
+ };
+
+ /* Setup protocol subtree array */
+ static gint *ett[] = {
+ &ett_isns,
+ &ett_isns_flags,
+ &ett_isns_payload,
+ &ett_isns_attribute,
+ &ett_isns_port,
+ &ett_isns_isnt
+ };
+
+ static ei_register_info ei[] = {
+ { &ei_isns_not_first_pdu,
+ { "isns.not_first_pdu", PI_PROTOCOL, PI_WARN,
+ "This is not the first PDU. The attributes are not decoded", EXPFILL }},
+ { &ei_isns_invalid_attr_len,
+ { "isns.invalid_attribute_length", PI_PROTOCOL, PI_WARN,
+ "Invalid attribute length", EXPFILL }}
+ };
+
+ module_t *isns_module;
+ expert_module_t* expert_isns;
+
+ /* Register the protocol name and description */
+ proto_isns = proto_register_protocol("iSNS", "iSNS", "isns");
+ proto_register_field_array(proto_isns, hf, array_length(hf));
+ proto_register_subtree_array(ett, array_length(ett));
+ expert_isns = expert_register_protocol(proto_isns);
+ expert_register_field_array(expert_isns, ei, array_length(ei));
+
+ /* Register the dissectors */
+ isns_tcp_handle = register_dissector("isns.tcp", dissect_isns_tcp,proto_isns);
+ isns_udp_handle = register_dissector("isns.udp", dissect_isns_udp,proto_isns);
+
+ /* Register preferences */
+ isns_module = prefs_register_protocol(proto_isns, NULL);
+ prefs_register_bool_preference(
+ isns_module, "desegment",
+ "Reassemble iSNS messages spanning multiple TCP segments",
+ "Whether the iSNS dissector should reassemble messages spanning multiple TCP segments."
+ " To use this option, you must also enable \"Allow subdissectors to reassemble TCP streams\" in the TCP protocol settings.",
+ &isns_desegment);
+}
+
+void
+proto_reg_handoff_isns(void)
+{
+ dissector_add_uint_with_preference("tcp.port",ISNS_TCP_PORT,isns_tcp_handle);
+ dissector_add_uint_with_preference("udp.port",ISNS_UDP_PORT,isns_udp_handle);
+}
+
+/*
+ * Editor modelines - https://www.wireshark.org/tools/modelines.html
+ *
+ * Local variables:
+ * c-basic-offset: 4
+ * tab-width: 8
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * vi: set shiftwidth=4 tabstop=8 expandtab:
+ * :indentSize=4:tabSize=8:noTabs=true:
+ */