Ethereal-dev: [Ethereal-dev] patch for JXTA dissector
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Michael Duigou <ethereal@xxxxxxxxxx>
Date: Fri, 04 Mar 2005 19:48:59 -0800
Some improvements for cleaner dissection of jxta messages.
Index: epan/dissectors/packet-jxta.c
===================================================================
--- epan/dissectors/packet-jxta.c (revision 13594)
+++ epan/dissectors/packet-jxta.c (working copy)
@@ -43,12 +43,17 @@
#include <epan/prefs.h>
#include "packet-tcp.h"
+static const char JXTA_UDP_SIG[] = { 'J', 'X', 'T', 'A' };
+static const char JXTA_MSG_SIG[] = { 'j', 'x', 'm', 'g' };
+static const char JXTA_MSGELEM_SIG[] = { 'j', 'x', 'e', 'l' };
+
static int proto_jxta = -1;
static int hf_jxta_udp = -1;
static int hf_jxta_udpsig = -1;
static int hf_jxta_welcome = -1;
static int hf_jxta_framing = -1;
+static int hf_jxta_framing_header = -1;
static int hf_jxta_framing_header_name_length = -1;
static int hf_jxta_framing_header_name = -1;
static int hf_jxta_framing_header_value_length = -1;
@@ -77,6 +82,7 @@
static gint ett_jxta_welcome = -1;
static gint ett_jxta_udp = -1;
static gint ett_jxta_framing = -1;
+static gint ett_jxta_framing_header = -1;
static gint ett_jxta_msg = -1;
static gint ett_jxta_elem = -1;
@@ -100,6 +106,10 @@
},
{ &hf_jxta_framing,
{ "JXTA Message Framing", "jxta.framing", FT_NONE, BASE_NONE, NULL, 0x0,
+ "JXTA Message Framing Headers", HFILL }
+ },
+ { &hf_jxta_framing_header,
+ { "Header", "jxta.framing.header", FT_NONE, BASE_NONE, NULL, 0x0,
"JXTA Message Framing Header", HFILL }
},
{ &hf_jxta_framing_header_name_length,
@@ -204,6 +214,7 @@
&ett_jxta_welcome,
&ett_jxta_udp,
&ett_jxta_framing,
+ &ett_jxta_framing_header,
&ett_jxta_msg,
&ett_jxta_elem
};
@@ -227,7 +238,7 @@
Dissect a tvbuff containing a JXTA UDP header, JXTA Message framing and a JXTA Message
**/
static void dissect_jxta_udp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) {
- proto_tree *jxta_tree = NULL;
+ proto_tree *jxta_udp_tree = NULL;
proto_item *ti;
if (check_col(pinfo->cinfo, COL_PROTOCOL)) {
@@ -246,15 +257,15 @@
if (tree) {
ti = proto_tree_add_item(tree, hf_jxta_udp, tvb, 0, -1, FALSE);
- jxta_tree = proto_item_add_subtree(ti, ett_jxta_udp);
+ jxta_udp_tree = proto_item_add_subtree(ti, ett_jxta_udp);
- ti = proto_tree_add_item( jxta_tree, hf_jxta_udpsig, tvb, 0, 4, FALSE );
+ ti = proto_tree_add_item( jxta_udp_tree, hf_jxta_udpsig, tvb, 0, 4, FALSE );
}
- if( tvb_memeql(tvb, 0, "JXTA", 4) == 0 ) {
- tvbuff_t* jxta_framed_message_tvb = tvb_new_subset( tvb, 4, -1, -1 );
+ if( tvb_memeql(tvb, 0, JXTA_UDP_SIG, sizeof(JXTA_UDP_SIG)) == 0 ) {
+ tvbuff_t* jxta_framed_message_tvb = tvb_new_subset( tvb, sizeof(JXTA_UDP_SIG), -1, -1 );
- dissect_jxta_framing( jxta_framed_message_tvb, pinfo, tree );
+ dissect_jxta_framing( jxta_framed_message_tvb, pinfo, jxta_udp_tree );
}
}
@@ -277,29 +288,40 @@
Dissect a tvbuff containing a JXTA Message framing and a JXTA Message
**/
static void dissect_jxta_framing(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) {
- proto_tree *jxta_tree = NULL;
- proto_item *ti;
+ proto_item *framing_tree_item = NULL;
+ proto_tree *framing_tree = NULL;
guint offset = 0;
tvbuff_t* jxta_message_tvb;
if (tree) {
- ti = proto_tree_add_item(tree, hf_jxta_framing, tvb, 0, -1, FALSE);
- jxta_tree = proto_item_add_subtree(ti, ett_jxta_framing);
+ framing_tree_item = proto_tree_add_item(tree, hf_jxta_framing, tvb, 0, -1, FALSE);
+ framing_tree = proto_item_add_subtree(framing_tree_item, ett_jxta_framing);
}
/* parse framing headers */
do {
guint8 headernamelen = tvb_get_guint8( tvb, offset );
+ proto_item *framing_header_tree_item = NULL;
+ proto_tree *framing_header_tree = NULL;
if(tree) {
- proto_tree_add_item( jxta_tree, hf_jxta_framing_header_name_length, tvb, offset, 1, headernamelen );
+ framing_header_tree_item = proto_tree_add_item(framing_tree, hf_jxta_framing_header, tvb, 0, -1, FALSE);
+ framing_header_tree = proto_item_add_subtree(framing_header_tree_item, ett_jxta_framing_header);
+
+ proto_tree_add_item( framing_header_tree, hf_jxta_framing_header_name_length, tvb, offset, 1, headernamelen );
}
if( tree && (headernamelen != 0) ) {
/*
* Put header name into protocol tree.
*/
- proto_tree_add_item(jxta_tree, hf_jxta_framing_header_name, tvb, offset+1, headernamelen, FALSE);
+ guint8* headername = tvb_memdup( tvb, offset + 1, headernamelen );
+
+ proto_item_append_text(framing_header_tree_item, " \"%*.*s\"", headernamelen, headernamelen, headername );
+
+ proto_tree_add_item(framing_header_tree, hf_jxta_framing_header_name, tvb, offset+1, headernamelen, FALSE);
+
+ free(headername);
}
offset += 1 + headernamelen;
@@ -308,24 +330,32 @@
guint16 headervaluelen = tvb_get_ntohs( tvb, offset );
if( tree ) {
- proto_tree_add_uint(jxta_tree, hf_jxta_framing_header_value_length, tvb, offset, 2, headervaluelen );
+ proto_tree_add_uint(framing_header_tree, hf_jxta_framing_header_value_length, tvb, offset, 2, headervaluelen );
/** TODO bondolo Add specific handling for known header types */
/*
* Put header value into protocol tree.
*/
- proto_tree_add_item(jxta_tree, hf_jxta_framing_header_value, tvb, offset+2, headervaluelen, FALSE );
+ proto_tree_add_item(framing_header_tree, hf_jxta_framing_header_value, tvb, offset+2, headervaluelen, FALSE );
}
offset += 2 + headervaluelen;
}
+ if( tree ) {
+ proto_item_set_end( framing_header_tree_item, tvb, offset );
+ }
+
if( 0 == headernamelen ) {
break;
}
} while( TRUE );
+ if( tree ) {
+ proto_item_set_end( framing_tree_item, tvb, offset );
+ }
+
jxta_message_tvb = tvb_new_subset( tvb, offset, -1, -1 );
/* Call it a new layer and pass the tree as we got it */
@@ -338,6 +368,7 @@
static void dissect_jxta_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) {
proto_tree *jxta_tree = NULL;
proto_item *ti;
+ unsigned int offset = 0;
if (check_col(pinfo->cinfo, COL_PROTOCOL)) {
col_set_str(pinfo->cinfo, COL_PROTOCOL, "JXTA");
@@ -355,24 +386,29 @@
if (tree) {
ti = proto_tree_add_item(tree, hf_jxta_message, tvb, 0, -1, FALSE);
- jxta_tree = proto_item_add_subtree(ti, ett_jxta_udp);
+ jxta_tree = proto_item_add_subtree(ti, ett_jxta_msg);
}
if( tree ) {
- proto_tree_add_item( jxta_tree, hf_jxta_message_sig, tvb, 0, 4, FALSE);
+ proto_tree_add_item( jxta_tree, hf_jxta_message_sig, tvb, 0, sizeof(JXTA_MSG_SIG), FALSE);
- if( tvb_memeql(tvb, 0, "jxmg", 4) == 0) {
+ if( tvb_memeql(tvb, offset, JXTA_MSG_SIG, sizeof(JXTA_MSG_SIG)) == 0) {
guint8 messageVersion;
- messageVersion = tvb_get_guint8( tvb, sizeof(guint32) );
- proto_tree_add_uint( jxta_tree, hf_jxta_message_version, tvb, sizeof(guint32), 1, messageVersion );
+ offset += sizeof(JXTA_MSG_SIG);
+
+ messageVersion = tvb_get_guint8( tvb, offset );
+ proto_tree_add_uint( jxta_tree, hf_jxta_message_version, tvb, offset, sizeof(guint8), messageVersion );
+ offset += sizeof(guint8);
if( 0 == messageVersion ) {
int eachNamespace;
guint16 numberOfElements;
- unsigned int offset = 7;
- guint16 messageNamespaceCount = tvb_get_ntohs( tvb, 5 );
+ guint16 messageNamespaceCount = tvb_get_ntohs( tvb, offset );
+ offset += sizeof(guint16);
+ proto_tree_add_uint( jxta_tree, hf_jxta_message_namespaces_count, tvb, offset, sizeof(guint16), messageNamespaceCount );
+
/* parse namespaces */
/* TODO 20050103 bondolo Should record the namespaces and number them. */
for( eachNamespace = 0; eachNamespace < messageNamespaceCount; eachNamespace++ ) {
@@ -391,23 +427,24 @@
offset += sizeof(guint16);
while( offset < tvb_reported_length(tvb) ) {
- proto_tree *jxta_elem_tree = NULL;
- proto_item *elem_ti;
+ proto_tree *jxta_elem_tree = NULL;
+ proto_item *elem_ti;
- elem_ti = proto_tree_add_item(jxta_tree, hf_jxta_element, tvb, 0, -1, FALSE);
- jxta_elem_tree = proto_item_add_subtree(elem_ti, ett_jxta_elem);
+ elem_ti = proto_tree_add_item(jxta_tree, hf_jxta_element, tvb, offset, -1, FALSE);
+ jxta_elem_tree = proto_item_add_subtree(elem_ti, ett_jxta_elem);
/* gross hack for parsing of signature element */
element_parse :
{
- proto_tree_add_item( jxta_tree, hf_jxta_element_sig, tvb, offset, 4, FALSE );
- offset += 4;
- if( tvb_memeql(tvb, offset - 4, "jxel", 4) == 0 ) {
+ proto_tree_add_item( jxta_elem_tree, hf_jxta_element_sig, tvb, offset, sizeof(JXTA_MSGELEM_SIG), FALSE );
+ if( tvb_memeql(tvb, offset, JXTA_MSGELEM_SIG, sizeof(JXTA_MSGELEM_SIG)) == 0 ) {
guint8 namespaceID;
guint8 flags;
guint16 nameLen;
guint32 elemContentLength;
+ offset += sizeof(JXTA_MSGELEM_SIG);
+
namespaceID = tvb_get_guint8( tvb, offset );
proto_tree_add_uint( jxta_elem_tree, hf_jxta_element_namespaceid, tvb, offset, sizeof(guint8), namespaceID );
offset += sizeof(guint8);
@@ -460,7 +497,7 @@
}
}
- proto_item_set_end( elem_ti, tvb, offset - 1 );
+ proto_item_set_end( elem_ti, tvb, offset );
}
}
}
- Prev by Date: Re: [Ethereal-dev] Re: [Ethereal-users] Problem with Elapsed Time reading Sniffer File
- Next by Date: Re: [Ethereal-dev] 0.10.10 next week?
- Previous by thread: Re: [Ethereal-dev] TZSP Patch
- Next by thread: [Ethereal-dev] Patch for JXTA dissector
- Index(es):