Wireshark-dev: Re: [Wireshark-dev] Doku
From: Gerhard Gappmeier <gerhard.gappmeier@xxxxxxxxxxx>
Date: Thu, 13 Jul 2006 19:00:10 +0200
Hi Jaap and Ulf I have added a new chapter about tcp_dissect_pdu to WSDG_chapter_dissection.xml (revision 18722). Can you please review that and check it in. regards, Gerhard On Wednesday 12 July 2006 14:44, Jaap Keuter wrote: > Hi Gerhard, > > On Mon, 31 Jul 2006, Gerhard Gappmeier wrote: > > Hi Jaap > > > > I'm not a wireshark expert yet, but I will try to add a basic chapter > > that you can review before committing it to svn. > > I will post a patch when I finished it. > > Cool, this is the stuff Open Source projects are made of. > [SNIP]
Index: WSDG_chapter_dissection.xml
===================================================================
--- WSDG_chapter_dissection.xml (revision 18722)
+++ WSDG_chapter_dissection.xml (working copy)
@@ -982,6 +982,86 @@
The other variables are used for flagging up errors.
</para>
</section>
+ <section id="TcpDissectPdus">
+ <title>How to reassemble split TCP Packets</title>
+ <para>
+ A dissector gets a tvbuff_t pointer which holds the payload
+ of a TCP packet. This payload contains the header and data
+ of your application layer protocol.
+ </para>
+ <para>
+ When dissecting an application layer protocol you cannot assume
+ that each TCP packet contains exactly one application layer message.
+ One application layer message can be split into several TCP packets.
+ </para>
+ <para>
+ You also cannot assume the a TCP packet contains only one application layer message
+ and that the message header is at the start of your TCP payload.
+ More than one messages can be transmitted in one TCP packet,
+ so that a message can start at an abitrary position.
+
+ </para>
+ <para>
+ This sounds complicated, but there is a simple solution.
+ <methodname>tcp_dissect_pdus()</methodname> does all this tcp packet reassembling for you.
+ This function is implemented in <filename>epan/dissectors/packet-tcp.h</filename>.
+ </para>
+ <example>
+ <title>Reassembling TCP fragments</title>
+ <programlisting>
+<![CDATA[
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <gmodule.h>
+#include <epan/packet.h>
+#include <epan/emem.h>
+#include <epan/dissectors/packet-tcp.h>
+#include <epan/prefs.h>
+
+...
+
+#define FRAME_HEADER_LEN 8
+
+/* The main dissecting routine */
+static void dissect_foo(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
+{
+ tcp_dissect_pdus(tvb, pinfo, tree, TRUE, FRAME_HEADER_LEN,
+ get_foo_message_len, dissect_foo_message);
+}
+
+/* This method dissects fully reassembled messages */
+static void dissect_foo_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
+{
+ /* TODO: implement your dissecting code */
+}
+
+/* determine PDU length of protocol foo */
+static guint get_opcua_message_len(tvbuff_t *tvb, int offset)
+{
+ /* TODO: change this to your needs */
+ guint iLen = tvb_get_ntohl(tvb, offset+4); /* e.g. length is at offset 4 */
+}
+
+...
+]]>
+ </programlisting>
+ </example>
+ <para>
+ As you can see this is really simple. Just call <function>tcp_dissect_pdus()</function> in
+ your main dissection routine and move you message parsing code into another function.
+ This function gets called whenever a message has been reassembled.
+ </para>
+ <para>
+ The parameters <parameter>tvb</parameter>, <parameter>pinfo</parameter> and <parameter>tree</parameter> are just handed over
+ to <function>tcp_dissect_pdus()</function>.
+ The 4th parameter is a flag to indicate if the data should be reassebled or not. That's why we are using this function.
+ Parameter 5 indicates how much data has to be read at least to be able to determine the length of the foo message.
+ Parameter 6 is a function pointer to a method the returns this length.
+ Parameter 7 is a function pointer to your real message dissector.
+ </para>
+ </section>
</section>
<section id="ChDissectTap">
<title>How to tap protocols</title>
- Follow-Ups:
- Re: [Wireshark-dev] Doku
- From: Jaap Keuter
- Re: [Wireshark-dev] Doku
- References:
- Re: [Wireshark-dev] Packet reassembling
- From: Jaap Keuter
- Re: [Wireshark-dev] Packet reassembling
- Prev by Date: Re: [Wireshark-dev] build fail.: autogen: macro `AM_??' not found
- Next by Date: Re: [Wireshark-dev] Problem with tcp_dissect_pdus
- Previous by thread: Re: [Wireshark-dev] Packet reassembling
- Next by thread: Re: [Wireshark-dev] Doku
- Index(es):