Wireshark-dev: [Wireshark-dev] conversation_add_proto_data
From: David Dugoujon <dav176fr@xxxxxxxx>
Date: Mon, 22 Jan 2007 09:57:59 -0800 (PST)
Dear All,
I am new to wireshark and I am trying to write a
dissector plugin for the freepastry binary protocol.
This protocol runs on top of TCP and, for some reason,
I need to keep a context for the TCP streams.
Indeed, FreePastry requires a specific header to be
sent over a newly established TCP connection
The pastry Stream header looks like this:
Pastry_magic_number (4 bytes)
...
AppId (4bytes)
If Pastry_magic_number =! 0x2740753A, I know that this
socket is not related to freepastry
If AppId != 0, I know that the stream is related to a
tier 2 application that reused the freepastry socket
management facilies (I.e. I won't be able to dissect
the stream because it is application specific)
Then, the freepastry application stream is broken up
into "normal" messages (payload-len + payload)
Here is my problem:
I tried to use conversation_add_proto_data(...) to
save information about appId
typedef struct _freepastry_conv_info_t {
gboolean app_conv;
} freepastry_conv_info_t;
I first wanted to create a new conversation, but I
noticed that a conversation was already created by
wireshark (i.e. find_conversation(pinfo->fd->num,
&pinfo->src, &pinfo->dst, pinfo->ptype,
pinfo->srcport, pinfo->destport, 0) never returns a
NULL pointer)
Is it normal?
Next, when I save private data with
conversation_add_proto_data for the current
conversation, I notice that the tree information
related to freepastry for this message is not
displayed.
Here is the code I wrote to save context:
/* Do we already have a state structure for this
conv*/
freepastry_info =
conversation_get_proto_data(conversation,
proto_freepastry);
if (!freepastry_info) {
gboolean is_app_socket = FALSE;
/* No. Attach that information to the
conversation, and add
* it to the list of information structures.
*/
freepastry_info =
se_alloc(sizeof(freepastry_conv_info_t));
if (app_id != 0x0){
is_app_socket = TRUE;
}
freepastry_info->app_conv = is_app_socket;
conversation_add_proto_data(conversation,
proto_freepastry, freepastry_info);
}
Here is the code I wrote to display message structure:
if (tree) {
proto_item *ti = NULL;
proto_tree *freepastry_tree = NULL;
gint offset = 0;
ti = proto_tree_add_item(tree, proto_freepastry,
tvb, 0, -1, FALSE);
freepastry_tree = proto_item_add_subtree(ti,
ett_freepastry);
proto_tree_add_item(freepastry_tree,
hf_freepastry_header_magic_number, tvb, offset, 4,
FALSE);
offset += 4;
...
}
When I comment out the line
conversation_add_proto_data(conversation,
proto_freepastry, freepastry_info); the protocol tree
for freepastry is correctly displayed.
Do you have any idea where the problem is? Have I
understood correctly the use of
conversation_add_proto_data()? Is there a better way
to do this?
Thanks,
David
____________________________________________________________________________________
Sucker-punch spam with award-winning protection.
Try the free Yahoo! Mail Beta.
http://advision.webevents.yahoo.com/mailbeta/features_spam.html
- Prev by Date: [Wireshark-dev] Monitor mode using FreeBSD
- Next by Date: Re: [Wireshark-dev] How do I initialise a boolean preference
- Previous by thread: Re: [Wireshark-dev] Monitor mode using FreeBSD
- Next by thread: [Wireshark-dev] Dual screen initial window position & initial window size bugs
- Index(es):