Ethereal-dev: [Ethereal-dev] Here is the correct patch for iSNS & conversation
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Dinesh G Dutt <ddutt@xxxxxxxxx>
Date: Tue, 29 Jun 2004 15:08:39 -0700
I sent in the wrong patch file. Please use this one instead. Sorry, Dinesh --
Index: epan/conversation.c
===================================================================
RCS file: /cvsroot/ethereal/epan/conversation.c,v
retrieving revision 1.24
diff -u -r1.24 conversation.c
--- epan/conversation.c 9 Jan 2004 00:57:48 -0000 1.24
+++ epan/conversation.c 29 Jun 2004 09:35:49 -0000
@@ -464,7 +464,7 @@
new_index++;
if (options & NO_ADDR2) {
- if (options & NO_PORT2) {
+ if (options & (NO_PORT2|NO_PORT2_FORCE)) {
g_hash_table_insert(conversation_hashtable_no_addr2_or_port2,
new_key, conversation);
} else {
@@ -472,7 +472,7 @@
new_key, conversation);
}
} else {
- if (options & NO_PORT2) {
+ if (options & (NO_PORT2|NO_PORT2_FORCE)) {
g_hash_table_insert(conversation_hashtable_no_port2,
new_key, conversation);
} else {
@@ -493,7 +493,7 @@
/*
* If the port 2 value is not wildcarded, don't set it.
*/
- if (!(conv->options & NO_PORT2))
+ if ((!(conv->options & NO_PORT2)) || (conv->options & NO_PORT2_FORCE))
return;
if (conv->options & NO_ADDR2) {
Index: epan/conversation.h
===================================================================
RCS file: /cvsroot/ethereal/epan/conversation.h,v
retrieving revision 1.10
diff -u -r1.10 conversation.h
--- epan/conversation.h 28 Aug 2002 20:40:44 -0000 1.10
+++ epan/conversation.h 29 Jun 2004 09:35:49 -0000
@@ -31,6 +31,7 @@
*/
#define NO_ADDR2 0x01
#define NO_PORT2 0x02
+#define NO_PORT2_FORCE 0x04
/*
* Flags to pass to "find_conversation()" to indicate that the address B
@@ -38,6 +39,7 @@
*/
#define NO_ADDR_B 0x01
#define NO_PORT_B 0x02
+#define NO_PORT_B_FORCE 0x04
#include "packet.h" /* for conversation dissector type */
Index: packet-isns.c
===================================================================
RCS file: /cvsroot/ethereal/packet-isns.c,v
retrieving revision 1.8
diff -u -r1.8 packet-isns.c
--- packet-isns.c 27 May 2004 08:33:22 -0000 1.8
+++ packet-isns.c 29 Jun 2004 09:36:00 -0000
@@ -51,6 +51,7 @@
#endif
#include <epan/packet.h>
+#include <epan/conversation.h>
#include "packet-tcp.h"
#include "prefs.h"
@@ -61,13 +62,22 @@
#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
+
+
+dissector_handle_t isns_tcp_handle;
+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(tvbuff_t *tvb, proto_tree *tree, guint offset, guint16 function_id);
+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;
@@ -740,7 +750,7 @@
while( offset < packet_len )
{
- offset = AddAttribute(tvb, tt, offset, function_id);
+ offset = AddAttribute(pinfo, tvb, tt, offset, function_id);
}
}
}
@@ -748,7 +758,6 @@
return;
}
-
static guint
get_isns_pdu_len(tvbuff_t *tvb, int offset)
{
@@ -861,23 +870,46 @@
}
static guint
-dissect_isns_attr_port(tvbuff_t *tvb, guint offset, proto_tree *parent_tree, int hf_index, guint32 tag, guint32 len)
+dissect_isns_attr_port(tvbuff_t *tvb, guint offset, proto_tree *parent_tree, int hf_index, guint32 tag, guint32 len,
+ guint16 port_type, packet_info *pinfo)
{
proto_item *tree=NULL;
proto_item *item=NULL;
guint16 port = tvb_get_ntohs(tvb, offset + 10);
- guint16 port_type = tvb_get_ntohs(tvb, offset + 8)&0x01;
+ guint16 isudp = tvb_get_ntohs(tvb, offset + 8)&0x01;
+ conversation_t *conversation;
if(parent_tree){
- item = proto_tree_add_uint(parent_tree, hf_index, tvb, offset+8, 4, port);
- tree = proto_item_add_subtree(item, ett_isns_port);
+ item = proto_tree_add_uint(parent_tree, hf_index, tvb, offset+8, 4, port);
+ tree = proto_item_add_subtree(item, ett_isns_port);
}
- proto_tree_add_boolean(tree, hf_isns_port_type, tvb, offset+8, 2, port_type);
+ proto_tree_add_boolean(tree, hf_isns_port_type, tvb, offset+8, 2, isudp);
proto_tree_add_uint(tree, hf_isns_attr_tag, tvb, offset, 4, tag);
proto_tree_add_uint(tree, hf_isns_attr_len, tvb, offset+4, 4, len);
+ if ((port_type == ISNS_ESI_PORT) || (port_type == ISNS_SCN_PORT)) {
+ if (isudp) {
+ conversation = find_conversation (&pinfo->src, &pinfo->dst, PT_UDP,
+ port, 0, NO_PORT_B);
+ if (conversation == NULL) {
+ conversation = conversation_new (&pinfo->src, &pinfo->dst,
+ PT_UDP, port, 0, NO_PORT2_FORCE);
+ conversation_set_dissector (conversation, isns_udp_handle);
+ }
+ }
+ else {
+ conversation = find_conversation (&pinfo->src, &pinfo->dst, PT_TCP,
+ port, 0, NO_PORT_B);
+ if (conversation == NULL) {
+ conversation = conversation_new (&pinfo->src, &pinfo->dst,
+ PT_TCP, port, 0, NO_PORT2_FORCE);
+ conversation_set_dissector (conversation, isns_tcp_handle);
+ }
+ }
+ }
+
return offset+8+len;
}
@@ -1018,7 +1050,8 @@
static guint
-AddAttribute(tvbuff_t *tvb, proto_tree *tree, guint offset, guint16 function_id)
+AddAttribute(packet_info *pinfo, tvbuff_t *tvb, proto_tree *tree, guint offset,
+ guint16 function_id)
{
guint32 tag,len;
@@ -1028,6 +1061,14 @@
/* Now the Length */
len = tvb_get_ntohl(tvb, offset + 4);
+
+ if (!len) {
+ if (tree) {
+ proto_tree_add_uint(tree, hf_isns_attr_tag, tvb, offset, 4, tag);
+ proto_tree_add_uint(tree, hf_isns_attr_len, tvb, offset+4, 4, len);
+ }
+ return (offset+8);
+ }
switch( tag )
{
@@ -1068,7 +1109,7 @@
offset = dissect_isns_attr_ip_address(tvb, offset, tree, hf_isns_portal_ip_addr, tag, len);
break;
case ISNS_ATTR_TAG_PORTAL_PORT:
- offset = dissect_isns_attr_port(tvb, offset, tree, hf_isns_portal_port, tag, len);
+ offset = dissect_isns_attr_port(tvb, offset, tree, hf_isns_portal_port, tag, len, ISNS_OTHER_PORT, pinfo);
break;
case ISNS_ATTR_TAG_PORTAL_SYMBOLIC_NAME:
offset = dissect_isns_attr_string(tvb, offset, tree, hf_isns_portal_symbolic_name, tag, len);
@@ -1077,7 +1118,7 @@
offset = dissect_isns_attr_integer(tvb, offset, tree, hf_isns_esi_interval, tag, len, function_id);
break;
case ISNS_ATTR_TAG_ESI_PORT:
- offset = dissect_isns_attr_port(tvb, offset, tree, hf_isns_esi_port, tag, len);
+ offset = dissect_isns_attr_port(tvb, offset, tree, hf_isns_esi_port, tag, len, ISNS_ESI_PORT, pinfo);
break;
case ISNS_ATTR_TAG_PORTAL_GROUP:
offset = dissect_isns_attr_not_decoded_yet(tvb, offset, tree, hf_isns_not_decoded_yet, tag, len);
@@ -1086,7 +1127,7 @@
offset = dissect_isns_attr_integer(tvb, offset, tree, hf_isns_portal_index, tag, len, function_id);
break;
case ISNS_ATTR_TAG_SCN_PORT:
- offset = dissect_isns_attr_port(tvb, offset, tree, hf_isns_scn_port, tag, len);
+ offset = dissect_isns_attr_port(tvb, offset, tree, hf_isns_scn_port, tag, len, ISNS_SCN_PORT, pinfo);
break;
case ISNS_ATTR_TAG_PORTAL_NEXT_INDEX:
offset = dissect_isns_attr_integer(tvb, offset, tree, hf_isns_portal_next_index, tag, len, function_id);
@@ -1107,7 +1148,7 @@
offset = dissect_isns_attr_string(tvb, offset, tree, hf_isns_iscsi_name, tag, len);
break;
case ISNS_ATTR_TAG_ISCSI_NODE_TYPE:
- offset = dissect_isns_attr_iscsi_node_type(tvb, offset, tree, hf_isns_iscsi_node_type, tag, len);
+ offset = dissect_isns_attr_iscsi_node_type(tvb, offset, tree, hf_isns_iscsi_node_type, tag, len);
break;
case ISNS_ATTR_TAG_ISCSI_ALIAS:
offset = dissect_isns_attr_string(tvb, offset, tree, hf_isns_iscsi_alias, tag, len);
@@ -1134,7 +1175,7 @@
offset = dissect_isns_attr_ip_address(tvb, offset, tree, hf_isns_pg_portal_ip_addr, tag, len);
break;
case ISNS_ATTR_TAG_PG_PORTAL_PORT:
- offset = dissect_isns_attr_port(tvb, offset, tree, hf_isns_pg_portal_port, tag, len);
+ offset = dissect_isns_attr_port(tvb, offset, tree, hf_isns_pg_portal_port, tag, len, ISNS_OTHER_PORT, pinfo);
break;
case ISNS_ATTR_TAG_PORTAL_GROUP_TAG:
offset = dissect_isns_attr_integer(tvb, offset, tree, hf_isns_portal_group_tag, tag, len, function_id);
@@ -1284,7 +1325,8 @@
offset = dissect_isns_attr_ip_address(tvb, offset, tree, hf_isns_dd_member_portal_ip_addr, tag, len);
break;
case ISNS_ATTR_TAG_DD_MEMBER_PORTAL_PORT:
- offset = dissect_isns_attr_port(tvb, offset, tree, hf_isns_dd_member_portal_port, tag, len);
+ offset = dissect_isns_attr_port(tvb, offset, tree, hf_isns_dd_member_portal_port,
+ tag, len, ISNS_OTHER_PORT, pinfo);
break;
case ISNS_ATTR_TAG_DD_FEATURES:
offset = dissect_isns_attr_not_decoded_yet(tvb, offset, tree, hf_isns_not_decoded_yet, tag, len);
@@ -1872,10 +1914,9 @@
void
proto_reg_handoff_isns(void)
{
- dissector_handle_t isns_tcp_handle;
- dissector_handle_t isns_udp_handle;
isns_tcp_handle = create_dissector_handle(dissect_isns_tcp,proto_isns);
isns_udp_handle = create_dissector_handle(dissect_isns_udp,proto_isns);
+
dissector_add("tcp.port",ISNS_TCP_PORT,isns_tcp_handle);
dissector_add("udp.port",ISNS_UDP_PORT,isns_udp_handle);
}
-- Become the change you want to see in the world - Gandhi
- Prev by Date: [Ethereal-dev] Patches to iSNS and conversation
- Next by Date: Re: [Ethereal-dev] 0.10.5 soon?
- Previous by thread: [Ethereal-dev] Patches to iSNS and conversation
- Next by thread: [Ethereal-dev] SIR patch
- Index(es):





