Robert Naumann wrote:

> i'm new to the dissector developement for wireshark. I've read that it 
> should be actually possible to dissect multiple PDUs from one TCP 
> Segment with tcp_dissect_pdus(), but i don't get it working.
> 
> For example: i've got 2 different PDUs with different lengths (5 and 6). 
> I already got the pdu lengths. The Length of the TCP Datasegment is 11.
> 
> So for the first PDU the function:
> 
>  tcp_dissect_pdus(tvb, pinfo, tree, TRUE, min_pdu_size, 
> *first_pdu_size*, dissect_pdu_sc);

tcp_dissect_pdus() isn't called for every PDU; it's called *once* in the 
dissector for your protocol, and the argument you mark as "first pdu 
size" is a function that gets the PDU size of a PDU.

"min_pdu_size" should be the minimum amount of packet data needed to 
calculate the PDU size.  For example, if every PDU starts with a 2-byte 
PDU type and a 2-byte PDU length, in that order, "min_pdu_size" should 
be 4, to include the PDU length.  If the length comes *before* the type, 
it'd be 2.

If the value of the length field in the PDU includes the lengths of the 
type and length fields, and the fields are in big-endian order, then:

In the case where there's a type and length, in that order, the function 
to get the PDU size would be

        static gint
        get_sc_pdu_len(packet_info *pinfo _U_, tvbuff_t *tvb, int offset)
        {
                return tvb_get_ntohs(tvb, offset + 2);
        }

and in the case where the length comes before the type, it'd be

        static gint
        get_sc_pdu_len(packet_info *pinfo _U_, tvbuff_t *tvb, int offset)
        {
                return tvb_get_ntohs(tvb, offset);
        }

Replace "tvb_get_ntohs()" with "tvb_get_letohs()" if the fields are in 
little-endian order.

If the value of the length field in the PDU *doesn't* include the 
lengths of the type and length field, you'd add 4 to the length field in 
the first of those functions and add 2 to the length field in the second 
of those functions.

> so the first PDU with the correct size (proved) should be passed to the 
> dissector function dissect_pdu_sc.
> 
> My first problem:   
> =============
> At the dissection of my top level protocol the PDU is marked as 
> [Malformed Packet], why? Size is correct! bitstream show the complete 
> data of my PDU

So your function is returning the value 5 for the first PDU?

Is your dissector trying to dissect more than 5 bytes in the PDU?  If 
so, it's acting as if the packet should be longer than 5 bytes long, and 
thus a 5-byte-long packet would be malformed.  An attempt to fetch data 
past the end of the 5-byte tvbuff your dissector is handed will cause an 
exception to be thrown and your packet marked as malformed.

> My second problem:     
> ===============
> The second PDU within the the TCP Segment wont be dissected and not 
> shown as a part of my top level protocol. Is the second PDU 
> automatically processed

Yes.

> or do i have to call the function 
> tcp_dissect_pdus() again?

No.  It's called "tcp_dissect_pdus()", plural, not "tcp_dissect_pdu()", 
singular, because it's supposed to be handed all the data that's passed 
to the disector and dissects all the PDUs in that data.
_______________________________________________
Wireshark-dev mailing list
[email protected]
http://www.wireshark.org/mailman/listinfo/wireshark-dev

Reply via email to