From c2833c436d92e4aa7e2fe514a45fd2d878b98cc6 Mon Sep 17 00:00:00 2001 From: Jaap Keuter Date: Thu, 13 Jul 2006 19:06:40 +0000 Subject: From Gerhard Gappmeier: I have added a new chapter about tcp_dissect_pdu svn path=/trunk/; revision=18730 --- docbook/wsdg_src/WSDG_chapter_dissection.xml | 83 ++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) (limited to 'docbook/wsdg_src') diff --git a/docbook/wsdg_src/WSDG_chapter_dissection.xml b/docbook/wsdg_src/WSDG_chapter_dissection.xml index d22f04863a..6457db04ef 100644 --- a/docbook/wsdg_src/WSDG_chapter_dissection.xml +++ b/docbook/wsdg_src/WSDG_chapter_dissection.xml @@ -982,6 +982,89 @@ static gint *ett[] = The other variables are used for flagging up errors. +
+ How to reassemble split TCP Packets + + 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. + + + 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. + + + 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. + + + + This sounds complicated, but there is a simple solution. + tcp_dissect_pdus() does all this tcp packet reassembling for you. + This function is implemented in epan/dissectors/packet-tcp.h. + + + Reassembling TCP fragments + + +#include +#include +#include +#include + +... + +#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_foo_message_len(tvbuff_t *tvb, int offset) +{ + /* TODO: change this to your needs */ + return (guint)tvb_get_ntohl(tvb, offset+4); /* e.g. length is at offset 4 */ +} + +... +]]> + + + + As you can see this is really simple. Just call tcp_dissect_pdus() in + your main dissection routine and move you message parsing code into another function. + This function gets called whenever a message has been reassembled. + + + The parameters tvb, pinfo and tree + are just handed over to tcp_dissect_pdus(). + The 4th parameter is a flag to indicate if the data should be reassebled or not. This could be set + according to a dissector preference as well. + Parameter 5 indicates how much data has at least to be available to be able to determine the length + of the foo message. + Parameter 6 is a function pointer to a method that returns this length. It gets called when at least + the number of bytes given in the previous parameter is available. + Parameter 7 is a function pointer to your real message dissector. + +
How to tap protocols -- cgit v1.2.3