Wireshark-dev: Re: [Wireshark-dev] Another one with dissector questions
From: Jens Steinhauser <jens.steinhauser@xxxxxxxxxx>
Date: Thu, 24 Apr 2008 10:04:30 +0200
The attached patch fixes conversation_lookup_hashtable(). Thanks, Jens On Wed, 2008-04-23 at 22:17 +0200, Jaap Keuter wrote: > Hi, > > Yes, I think you're on the right track here. > > Concerning the conversation search, I think you've a point. When searching for > a conversation along the time axis, you shouldn't get the a conversation > before the first one is established. > > I'm not aware if many dissectors use conversations that way and this is a > corner case. That may be why it wasn't spotted before. > > A simple fix for your code is to check the returned conversation frame number > against the current frames' number and discard it when it's older. Of course > that should be done by the search routine, for which a change will be > committed later. > > Thanx, > Jaap > > Jens Steinhauser wrote: > > Ok, I changed my dissector to use a conversation. The dissector creates > > a new conversation for every configuration frame it finds and uses > > conversation_add_proto_data() to save the information that is needed to > > dissect the data frames. When it dissects a data frame, it uses > > find_conversation() and conversation_get_data() to get the information > > from the config frame. Is that the proper way? > > > > But strange stuff happens when I have data frames before the first > > configuration frame: > > > > README.developer says (line 2741): "The conversation returned is where > > (frame_num >= conversation->setup_frame > > && frame_num < conversation->next->setup_frame)" > > and (line 2723): "If no conversation is found, the routine will return a > > NULL value." > > > > It is my understanding that find_conversation() should return NULL for > > the data frames before the configuration frames. > > > > find_conversation() calls conversation_lookup_hashtable() to search for > > the conversation (conversation.c, line 632): > > > > match = g_hash_table_lookup(hashtable, &key); > > > > if (match) { > > for (conversation = match->next; conversation; conversation = > > conversation->next) { > > if ((conversation->setup_frame <= frame_num) > > && (conversation->setup_frame > match->setup_frame)) > > match = conversation; > > } > > } > > > > return match; > > > > The code doesn't work when frame_num is smaller than setup_frame of all > > conversation in the linked list. The "for (...; conversation; ...)" > > doesn't execute the body of the loop because conversation is null and > > returns a conversation with setup_frame bigger than frame_num passed to > > find_conversation(). I think that's a bug. > > > > Thanks, > > Jens > > > > > > On Tue, 2008-04-22 at 15:58 +0200, Jaap Keuter wrote: > >> Hi, > >> > >> 1) You better use a conversation. Read README.developer on what > >> conversations are and how they are designed for specifically this purpose. > >> Using globals is never a good way to do this, especially when we intend to > >> multithread/work with multiple files. > >> > >> 2) ett's are datastructures for subtrees. They hold the expanded/collapsed > >> state for instance. You can reuse them, but then all these subtrees will > >> have the same expanded/collapsed state. > >> > >> 3) Remove all display filters and *disable packet coloring* (which is also > >> display filter based) to get tree==NULL. > >> > >> Thanx, > >> Jaap > >> > >>> Hi, > >>> > >>> I'm working on a dissector for about a month and some questions came up > >>> when doing more than just basic dissection of the packets: > >>> > >>> 1) The protocol consists mainly of two different types of packets: > >>> configuration frames and data frames. Configuration frames are send at > >>> the beginning of a transmission or when the configuration of the sending > >>> device changes and describe the content and format of data frames. > >>> Without the knowledge out of the configuration frames, the data frames > >>> can't be dissected. > >>> So I created a struct, called config_frame to save the information of > >>> the configuration frames and put these config_frames into a global > >>> GArray. This global array is (re)initialized in my dissectors init > >>> function and pinfo->fd->num (also saved in config_frame) is used to > >>> ensure that every configuration frame just adds one config_frame struct > >>> to the array. When the dissector comes to a data frame, he searches > >>> through that global array for a matching config_frame and uses it to > >>> dissect the data frame. Is that the right way to do that? > >>> > >>> 2) What are the ett_... values for? Section 1.6.2 of README.developer > >>> explains how to initialize and use them, but I didn't get what they are > >>> good for. Is it save to pass the same ett_ variable multiple times? (The > >>> data in the data frames is nested and I do that, didn't have a problem > >>> so far) > >>> > >>> 3) To understand the sequence in that the "proto_register_...", the > >>> "proto_reg_handoff_...", the init and the dissect functions are called, > >>> I put the following at the beginning of the dissect function: > >>> > >>> printf("dissect(): %s\n", (!tree ? "*tree null" : "*tree valid")); > >>> > >>> and always get "*tree valid". Do i need a special configure switch to > >>> enable the "Operational dissection" (enable something like a release > >>> build)? > >>> > >>> Thanks, > >>> Jens > >>> > _______________________________________________ > Wireshark-dev mailing list > Wireshark-dev@xxxxxxxxxxxxx > http://www.wireshark.org/mailman/listinfo/wireshark-dev -- ***************************************************************** Jens Steinhauser (Mr.), Software Dude Tel.: +43 5523 507 422, Fax.: +43 5523 507 999 http://www.omicron.at/ jens.steinhauser AT omicron.at ***************************************************************** OMICRON electronics GmbH, Oberes Ried 1 A-6833 Klaus / Austria Company Registration No. FN 34227i, Commercial Court of Feldkirch *****************************************************************
Index: epan/conversation.c =================================================================== --- epan/conversation.c (revision 25164) +++ epan/conversation.c (working copy) @@ -615,7 +615,6 @@ conversation_lookup_hashtable(GHashTable *hashtable, guint32 frame_num, address *addr1, address *addr2, port_type ptype, guint32 port1, guint32 port2) { - conversation_t* conversation; conversation_t* match; conversation_key key; @@ -631,17 +630,13 @@ match = g_hash_table_lookup(hashtable, &key); - if (match) { - for (conversation = match->next; conversation; conversation = conversation->next) { - if ((conversation->setup_frame <= frame_num) - && (conversation->setup_frame > match->setup_frame)) - match = conversation; - } - if (match->setup_frame > frame_num) - match = NULL; + for (; match; match = match->next) { + if ((match->setup_frame <= frame_num) && + (frame_num < (match->next ? match->next->setup_frame : (guint32)-1))) + return match; } - return match; + return NULL; }
- Follow-Ups:
- Re: [Wireshark-dev] Another one with dissector questions
- From: Jaap Keuter
- Re: [Wireshark-dev] Another one with dissector questions
- References:
- Re: [Wireshark-dev] Another one with dissector questions
- From: Jaap Keuter
- Re: [Wireshark-dev] Another one with dissector questions
- From: Jens Steinhauser
- Re: [Wireshark-dev] Another one with dissector questions
- From: Jaap Keuter
- Re: [Wireshark-dev] Another one with dissector questions
- Prev by Date: Re: [Wireshark-dev] Possible bug in h.245 dissector
- Next by Date: [Wireshark-dev] buildbot failure in Wireshark (development) on Windows-XP-x86
- Previous by thread: Re: [Wireshark-dev] Another one with dissector questions
- Next by thread: Re: [Wireshark-dev] Another one with dissector questions
- Index(es):