Update documentation for tcp_dissect_pdus. Bug 9491 (https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=9491)

From Peter Wu: update to README.dissector
From me: update to WSDG_chapter_dissection.xml

svn path=/trunk/; revision=53678
This commit is contained in:
Michael Mann 2013-11-30 20:48:46 +00:00
parent e2d2d12098
commit fd2f05446d
2 changed files with 39 additions and 29 deletions

View File

@ -72,7 +72,7 @@ Usually, you will put your newly created dissector file into the directory
epan/dissectors/, just like all the other packet-*.c files already in there.
Also, please add your dissector file to the corresponding makefiles,
described in section "1.9 Editing Makefile.common and CMakeLists.txt
described in section "1.8 Editing Makefile.common and CMakeLists.txt
to add your dissector" below.
Dissectors that use the dissector registration API to register with a lower
@ -2833,15 +2833,17 @@ dissect_PROTO_udp (or dissect_PROTO_other).
To register the distinct dissector functions, consider the following
example, stolen from packet-dns.c:
#include "packet-tcp.h"
dissector_handle_t dns_udp_handle;
dissector_handle_t dns_tcp_handle;
dissector_handle_t mdns_udp_handle;
dns_udp_handle = create_dissector_handle(dissect_dns_udp,
dns_udp_handle = new_create_dissector_handle(dissect_dns_udp,
proto_dns);
dns_tcp_handle = create_dissector_handle(dissect_dns_tcp,
dns_tcp_handle = new_create_dissector_handle(dissect_dns_tcp,
proto_dns);
mdns_udp_handle = create_dissector_handle(dissect_mdns_udp,
mdns_udp_handle = new_create_dissector_handle(dissect_mdns_udp,
proto_dns);
dissector_add_uint("udp.port", UDP_PORT_DNS, dns_udp_handle);
@ -2853,11 +2855,13 @@ The dissect_dns_udp function does very little work and calls
dissect_dns_common, while dissect_dns_tcp calls tcp_dissect_pdus with a
reference to a callback which will be called with reassembled data:
static void
dissect_dns_tcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
static int
dissect_dns_tcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
void *data _U_)
{
tcp_dissect_pdus(tvb, pinfo, tree, dns_desegment, 2,
get_dns_pdu_len, dissect_dns_tcp_pdu);
get_dns_pdu_len, dissect_dns_tcp_pdu, data);
return tvb_length(tvb);
}
(The dissect_dns_tcp_pdu function acts similarly to dissect_dns_udp.)
@ -2880,10 +2884,13 @@ The arguments to tcp_dissect_pdus are:
might not be available, so don't refer to any data past that) - the
total length of the PDU, in bytes;
a routine to dissect the pdu that's passed a tvbuff pointer,
packet_info pointer, and proto_tree pointer, with the tvbuff
containing a possibly-reassembled PDU. (The "reported_length"
of the tvbuff will be the length of the PDU).
a new_dissector_t routine to dissect the pdu that's passed a tvbuff
pointer, packet_info pointer, proto_tree pointer and a void pointer for
user data, with the tvbuff containing a possibly-reassembled PDU. (The
"reported_length" of the tvbuff will be the length of the PDU).
a void pointer to user data that is passed to the dissector routine
referenced in the previous parameter.
2.7.2 Modifying the pinfo struct.

View File

@ -978,17 +978,11 @@ static gint *ett[] =
#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)
static int dissect_foo_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
{
/* TODO: implement your dissecting code */
return tvb_length(tvb);
}
/* determine PDU length of protocol foo */
@ -998,6 +992,14 @@ static guint get_foo_message_len(packet_info *pinfo, tvbuff_t *tvb, int offset)
return (guint)tvb_get_ntohl(tvb, offset+4); /* e.g. length is at offset 4 */
}
/* The main dissecting routine */
static int dissect_foo(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
{
tcp_dissect_pdus(tvb, pinfo, tree, TRUE, FRAME_HEADER_LEN,
get_foo_message_len, dissect_foo_message, data);
return tvb_length(tvb);
}
...]]>
</programlisting>
</example>
@ -1007,16 +1009,17 @@ static guint get_foo_message_len(packet_info *pinfo, tvbuff_t *tvb, int offset)
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 reassembled 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.
</para>
The parameters <parameter>tvb</parameter>, <parameter>pinfo</parameter>, <parameter>tree</parameter>
and <parameter>data</parameter> are just handed over to <function>tcp_dissect_pdus()</function>.
The 4th parameter is a flag to indicate if the data should be reassembled 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.
Parameter 8 is a the data passed in from parent dissector.
</para>
</section>
</section>
<section id="ChDissectTap">