Wireshark-dev: Re: [Wireshark-dev] Reassembling splitted PPP packets
From: philippe alarcon <philippe.alarcon@xxxxxxx>
Date: Wed, 18 Mar 2009 23:06:30 +0100
|
Hi, We have solved together the problem encountered by Chris. You will find here attached : - the dissector written to decode the protocol and to reassemble the packets. - the pcap file example used to validate the dissector. The protocol has be named PPPHG. May be this will help somebody for a similar problem. However a question is pending : as the protocol is a point to point protocol, and as it is not a sub layer of a well-known like Ethernet, IP, UDP, ..., it is decoded by the frame dissector. Then WireShark displays "UNKNOWN" in the protocol column (normal), and WireShark displays "WTAP_ENCAP=48" in the info column. And then in order to dissect the packets, we have added ppphg dissector as the following : dissector_add("wtap_encap", 48, ppphg_handle); This means that WireShark affects 48 to pinfo->fd->lnk_t. 48=WTAP_ENCAP_USER3 My question is : why ? Regards Philippe Date: Tue, 10 Mar 2009 06:49:03 -0700 From: hanschris.glueck@xxxxxxxx To: wireshark-dev@xxxxxxxxxxxxx Subject: Re: [Wireshark-dev] Reassembling splitted PPP packets Salut, the first byte of the additional header is the total length of the header (because if I would mark the end of the header with a Flag I must implement some kind of byte stuffing....) So, in this example the bytes are: 07 00 01 00 00 06 F9 01 00 F9 07 A8 E8 01 7E 21 So, in this example the bytes are: total_header_length = 0x07 == 7 -> One additional PPP header inside (if there were 2 -> size would be 14 etc... msg_seqid = 0x0001 == First message, number 1 msg_num = 0x0000 == Sequence numer is 0, first segment msg_start = 0x06 == 6 == It is the sixth byte of the MUX frame (Begin of mux frame is the first 0xF9 after the additional header (total_header_length)) msg_end = 0xF9 == The 29 is the end of the PPP packet in the mux frame msg_flag = 0x01 == 1 == there will be more segments reservered =0x00 == Direction of the packet (used for MUX dissector) flag = 0xF9 == Begin of the mux frame ... 7E is the begin of the ppp packet I found one mistake in the fragment_add_seq_check method call, the length attribute was wrong calculated, it must be (tmpOffsetEnd-tmpOffsetBegin)+1, /* fragment length - to the end */ and not tmpOffsetEnd frag_msg = fragment_add_seq_check(tvb, tmpOffsetBegin, pinfo, msg_seqid, /* ID for fragments belonging together */ msg_fragment_table, /* list of message fragments */ msg_reassembled_table, /* list of reassembled messages */ msg_num, /* fragment sequence number */ (tmpOffsetEnd-tmpOffsetBegin)+1, /* fragment length - to the end */ msg_flag); /* More fragments? */ But it doesn´t helped... Do you have another idea? Thank you very much for your help! Merci beaucoup!! :) Chris Von: philippe alarcon <philippe.alarcon@xxxxxxx> An: wireshark-dev <wireshark-dev@xxxxxxxxxxxxx> Gesendet: Montag, den 9. März 2009, 22:50:13 Uhr Betreff: Re: [Wireshark-dev] Reassembling splitted PPP packets Hello, I have had a look at your pcap example. The beginning of the first packet is : 07 00 01 00 00 06 F9 01 00 F9 07 A8 E8 01 7E 21 Then for this packet, according to your code : msg_seqid = 0x700 msg_num = 0x100 msg_start = 0 msg_end = 0x06 msg_flag = 0xF9 Something is wrong : the length (difference between end and start) is not equal nor near the packet length. Then I have checked the second packet. It is the same. When I compare both packets, I have observed the following structure : Description | Length | Value Header | 1 byte | 07 Message ID | 2 bytes| 0001 Fragment Num| 2 bytes| 0000 Data start | 1 byte | 06 Data length | 1 byte | F9 Packet flag | 1 byte | 01 = fragment Unused | 1 byte | 00 Data limiter| 1 byte | F9 Data | x bytes| 07 A8 E8 01 ... B9 (F9 bytes) Data limiter| 1 byte | F9 If I apply this structure to the second packet, I obtain : Description | Length | Value Header | 1 byte | 07 Message ID | 2 bytes| 0001 Fragment Num| 2 bytes| 0001 Data start | 1 byte | 06 Data length | 1 byte | CA Packet flag | 1 byte | 00 = last fragment Unused | 1 byte | 00 Data limiter| 1 byte | F9 Data | x bytes| 07 AA 8A 01 ... 7C (CA bytes) Data limiter| 1 byte | F9 If this is correct, it implies : - there is only one header per packet, - the length of the header for one packet is 9 bytes. This could explain that you do not point to the correct information, and in particular to packet flag information. Then fragment_add_seq_check() function has never the information that it is the last packet. And then process_reassembled_data() never manages to reassemble the whole message. I hope this will help you. Regards Philippe Date: Mon, 9 Mar 2009 07:01:01 -0700 From: hanschris.glueck@xxxxxxxx To: wireshark-dev@xxxxxxxxxxxxx Subject: Re: [Wireshark-dev] Reassembling splitted PPP packets Hi, ok, here is my code, a pcap example with 4 packets inside (2 are a splitted PPP packet, and 2 are ACKs) and a little picture of the first splittet packet. I hope it is understanable :) I´m not sure where I have to call the ppp dissector, I tried it in if (new_tvb) { /* take it all */ //this became never true! next_tvb = new_tvb; call_dissector( ppp_handle, next_tvb, pinfo, tree ); But this clause became never true... /*We have at least one PPP packet*/ if (sizeMuxPPPHeader > 0){ guint16 tmpOffset = 1; guint16 tmpOffsetBegin = 1; guint16 tmpOffsetEnd = 1; tvbuff_t* new_tvb = NULL; fragment_data *frag_msg = NULL; guint16 msg_seqid;//ID of the message guint16 msg_num;//Sequence number guint8 msg_start;//Start position of PPP packet guint8 msg_end;//End of PPP packet guint8 msg_flag;//Flag of packet //There could be more than one PPP packet in the multiplexer packet for (i = 0; i < sizeMuxPPPHeader/7; i++){ tmpOffset = 7; tmpOffset = i * tmpOffset+1; //Get the necessary data msg_seqid = tvb_get_ntohs(tvb, tmpOffset); tmpOffset += 2; msg_num = tvb_get_ntohs(tvb, tmpOffset); tmpOffset += 2; msg_start = tvb_get_guint8(tvb, tmpOffset); tmpOffset += 1; msg_end = tvb_get_guint8(tvb, tmpOffset); tmpOffset += 1; msg_flag = tvb_get_guint8(tvb, tmpOffset); tmpOffset += 1; //Calculate the offset tmpOffsetBegin = sizeMuxPPPHeader + 1 + msg_start; //+ Header_Size, + Direction tmpOffsetEnd = sizeMuxPPPHeader + 1 + msg_end; pinfo->fragmented = TRUE; frag_msg = fragment_add_seq_check(tvb, tmpOffsetBegin, pinfo, msg_seqid, /* ID for fragments belonging together */ msg_fragment_table, /* list of message fragments */ msg_reassembled_table, /* list of reassembled messages */ msg_num, /* fragment sequence number */ tmpOffsetEnd, /* fragment length - to the end */ msg_flag); /* More fragments? */ new_tvb = process_reassembled_data(tvb, tmpOffsetBegin, pinfo, "Reassembled Message", frag_msg, &msg_frag_items, NULL, mux27010_tree); if (frag_msg) { /* Reassembled */ // call_dissector( ppp_handle, new_tvb, pinfo, tree ); -> Trying to call PPP dissector => Error (new_tvb=null) if (check_col(pinfo->cinfo, COL_INFO)) col_append_str(pinfo->cinfo, COL_INFO," (Reassembled)"); } else { /* Not last packet of reassembled Short Message */ if (check_col(pinfo->cinfo, COL_INFO)) col_append_fstr(pinfo->cinfo, COL_INFO," (Message fragment %u)", msg_num); } if (new_tvb) { /* take it all */ //this became never true! next_tvb = new_tvb; call_dissector( ppp_handle, next_tvb, pinfo, tree ); } else { /* make a new subset */ // next_tvb = tvb_new_subset(tvb, tmpOffsetBegin + 1, length_info-1, length_info-1); // call_dissector( ppp_handle, next_tvb, pinfo, tree ); } } } Thanks, Chris Von: philippe alarcon <philippe.alarcon@xxxxxxx> An: wireshark-dev <wireshark-dev@xxxxxxxxxxxxx> Gesendet: Freitag, den 6. März 2009, 16:16:56 Uhr Betreff: Re: [Wireshark-dev] Reassembling splitted PPP packets Hello, As far as I have seen in WireShark sources, it is able to dissect PPP packets, and a PPP dissector is embedded. Nevertheless the example of packet will help to understand how it is managed by WireShark. Regards Philippe Date: Fri, 6 Mar 2009 05:51:49 -0800 From: hanschris.glueck@xxxxxxxx To: wireshark-dev@xxxxxxxxxxxxx Subject: Re: [Wireshark-dev] Reassembling splitted PPP packets Hello,
you are right, every PPP header has a length of 7 byte and I have one byte which indicates the total length of my PPP header.
Header_Size (size of all PPP header, a multiple of 7)
Msg_ID (2byte)
Freq_ID (2byte)
Start_Pos (1byte)
End_Pos (1byte)
Flag (1byte)
... (more PPP header)
MUX_Packet (begin of multiplexer packet)
and you are right - once again :). There is a mistake in tmpOffset - it should be reset to 7
tmpOffset = i * tmpOffset+1;
for i = 1, tmpOffset = 7+1 = 8 -> tmpOffset = 8;
for i = 2, tmpOffset = 2 x 7 + 1 = 15 -> tmpOffset = 7; for i = 3, tmpOffset = 3 x 7 + 1 = 22 -> tmpOffset = 7; Concerning PPP dissection: Do I have to call a special dissector or will wireshark do it?
I´ll send you an example of a packet on monday - today I´m not in the office...
Thanks
Chris
Von: philippe alarcon <philippe.alarcon@xxxxxxxx>
An: wireshark-dev <wireshark-dev@xxxxxxxxxxxxx> Gesendet: Donnerstag, den 5. März 2009, 14:51:51 Uhr Betreff: Re: [Wireshark-dev] Reassembling splitted PPP packets Hello Chris, Could you send us an example of stored packets within a pcap file ? Then regarding your code, I think there could be a problem how your header offset is managed (tmpOffset variable). I have understood that the packet begins with several headers, each header has a length of 7 octets. tmpOffset is updated after each extracted field, and for one header, tmpOffset = tmpOffset + 7. Correct ? Then when beginning the following loop, tmpOffset is updated as the following : tmpOffset = i * tmpOffset+1; for i = 0, tmpOffset = 0 for i = 1, tmpOffset = 7+1 = 8 for i = 2, tmpOffset = 2 x (8 + 7 + 1) = 32 for i = 3, tmpOffset = 2 x (32 + 7 + 1) = 80 Regards Philippe > Date: Thu, 5 Mar 2009 05:02:45 -0800 > From: hanschris.glueck@xxxxxxxx > To: wireshark-dev@xxxxxxxxxxxxx > Subject: [Wireshark-dev] Reassembling splitted PPP packets > > > Hej, > > I´ve written a dissector for a multiplexer-protocol. The payload of these multiplexer packets could be PPP packets, most of these packets will be splitted to several mux packets. > I´ve tried to reassemble these PPP packets (reading that article 9.4.1. How to reassemble split UDP packets), but it doesn´t work.... > To get the necessary data I´ve added a new header to my multiplexer packet so I have the information about the fragments. > > What am I doing wrong? > > //Check if there is a PPP packet inside > if (sizeMuxPPPHeader > 0){ > guint16 tmpOffset = 1; > guint16 tmpOffsetBegin = 1; > guint16 tmpOffsetEnd = 1; > > //There could be more than one PPP packet in the multiplexer packet > for (i = 0; i < sizeMuxPPPHeader/7; i++){ > > tvbuff_t* new_tvb = NULL; > fragment_data *frag_msg = NULL; > guint16 msg_seqid; //ID of the message > guint16 msg_num; //Sequence number > > guint8 msg_start; //Start position of PPP packet > guint8 msg_end; //End of PPP packet > guint8 msg_flag; //Flag of packet > > tmpOffset = i * tmpOffset+1; > > //Get the necessary data > msg_seqid = tvb_get_ntohs(tvb, tmpOffset); tmpOffset += 2; > msg_num = tvb_get_ntohs(tvb, tmpOffset); tmpOffset += 2; > msg_start = tvb_get_guint8(tvb, tmpOffset); tmpOffset += 1; > msg_end = tvb_get_guint8(tvb, tmpOffset); tmpOffset += 1; > msg_flag = tvb_get_guint8(tvb, tmpOffset); tmpOffset += 1; > > //Calculate the offset > tmpOffsetBegin = sizeMuxPPPHeader + 1 + msg_start; > tmpOffsetEnd = sizeMuxPPPHeader + 1 + msg_end; > > pinfo->fragmented = TRUE; > frag_msg = fragment_add_seq_check(tvb, tmpOffsetBegin, pinfo, > msg_seqid, /* ID for fragments belonging together */ > msg_fragment_table, /* list of message fragments */ > msg_reassembled_table, /* list of reassembled messages */ > msg_num, /* fragment sequence number */ > tmpOffsetEnd, /* fragment length - to the end */ > msg_flag); /* More fragments? */ > > > new_tvb = process_reassembled_data(tvb, tmpOffsetBegin, pinfo, > "Reassembled Message", frag_msg, &msg_frag_items, > NULL, mux27010_tree); > > if (frag_msg) { /* Reassembled */ > if (check_col(pinfo->cinfo, COL_INFO)) > col_append_str(pinfo->cinfo, COL_INFO, > " (Message Reassembled)"); > } else { /* Not last packet of reassembled Short Message */ > if (check_col(pinfo->cinfo, COL_INFO)) > col_append_fstr(pinfo->cinfo, COL_INFO, > " (Message fragment %u)", msg_num); > } > if (new_tvb) { /* take it all */ > next_tvb = new_tvb; > } else { /* make a new subset */ > next_tvb = tvb_new_subset(tvb, tmpOffsetBegin, -1, -1); > } > > Regards, Chris > > > > > > ___________________________________________________________________________ > Sent via: Wireshark-dev mailing list <wireshark-dev@xxxxxxxxxxxxx> > Archives: http://www.wireshark.org/lists/wireshark-dev > Unsubscribe: https://wireshark.org/mailman/options/wireshark-dev > mailto:wireshark-dev-request@xxxxxxxxxxxxx?subject=unsubscribe Discutez sur Messenger où que vous soyez ! Mettez Messenger sur votre mobile ! Discutez sur Messenger où que vous soyez ! Mettez Messenger sur votre mobile ! Souhaitez vous « être au bureau sans y être » ? Oui je le veux ! Discutez sur Messenger où que vous soyez ! Mettez Messenger sur votre mobile ! |
/* packet-ppphg.c
*
* 2009 : Philippe Alarcon
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <stdlib.h>
#include <stdio.h>
#include <glib.h>
#include <string.h>
#include <stat_menu.h>
#include <wsutil/file_util.h>
#include <gtk/gtk.h>
#include <epan/packet.h>
#include <epan/strutil.h>
#include <epan/tap.h>
#include <epan/stat_cmd_args.h>
#include <epan/stats_tree.h>
#include <epan/reassemble.h>
#include <register.h>
/*----------------------------------------------------------------------------*/
/*---------------------- DEFINES -------------------------*/
/*----------------------------------------------------------------------------*/
#define PROTO_TAG_PPPHG "PPPHG"
#define L_UINT8 1
#define L_UINT16 2
#define L_UINT32 4
/*----------------------------------------------------------------------------*/
/*---------------------- TYPDEFS -------------------------*/
/*----------------------------------------------------------------------------*/
typedef struct _ppphg_dissector_data_t
{
guint8 val_header_length;
guint16 val_msg_seqid;
guint16 val_msg_num;
guint8 val_msg_start;
guint8 val_msg_end;
guint8 val_msg_flag;
guint8 val_msg_dir;
guint8 val_mux_frame_start;
guint8 val_mux_frame_res1;
guint16 val_mux_frame_fcs;
guint8 val_mux_frame_res2;
guint8 val_mux_frame_data_length;
} ppphg_dissector_data_t;
/*----------------------------------------------------------------------------*/
/*---------------------- FUNCTIONS -------------------------*/
/*----------------------------------------------------------------------------*/
void dissect_ppphg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
static void msg_init_protocol(void);
/*----------------------------------------------------------------------------*/
/*---------------------- VARIABLES -------------------------*/
/*----------------------------------------------------------------------------*/
/* Wireshark ID of PPPHG protocol */
static int proto_ppphg = -1;
/* Dissectors handles */
static dissector_table_t ppphg_subdissector_table;
static dissector_handle_t data_handle=NULL;
static dissector_handle_t ppphg_handle;
/* Defining the protocol */
static gint hf_header_length = 0;
static gint hf_msg_seqid = 0;
static gint hf_msg_num = 0;
static gint hf_msg_start = 0;
static gint hf_msg_end = 0;
static gint hf_msg_flag = 0;
static gint hf_msg_dir = 0;
static gint hf_mux_frame_start = 0;
static gint hf_mux_frame_res = 0;
static gint hf_mux_frame_fcs = 0;
static gint ett_ppphg = -1;
static const value_string vals_header_length[] =
{
{ 0, "ACK"},
{ 7, "MSG"},
{ 14, "MSG"},
{ 21, "MSG"},
{ 0, NULL }
};
/* Fragments variables */
static GHashTable *msg_fragment_table = NULL;
static GHashTable *msg_reassembled_table = NULL;
static int hf_ppphg_fragments = -1;
static int hf_ppphg_fragment = -1;
static int hf_ppphg_fragment_overlap = -1;
static int hf_ppphg_fragment_overlap_conflict = -1;
static int hf_ppphg_fragment_multiple_tails = -1;
static int hf_ppphg_fragment_too_long_fragment = -1;
static int hf_ppphg_fragment_error = -1;
static int hf_ppphg_reassembled_in = -1;
/* Initialize the subtree pointers */
static gint ett_ppphg_fragment = -1;
static gint ett_ppphg_fragments = -1;
static const fragment_items ppphg_frag_items = {
&ett_ppphg_fragment,
&ett_ppphg_fragments,
&hf_ppphg_fragments,
&hf_ppphg_fragment,
&hf_ppphg_fragment_overlap,
&hf_ppphg_fragment_overlap_conflict,
&hf_ppphg_fragment_multiple_tails,
&hf_ppphg_fragment_too_long_fragment,
&hf_ppphg_fragment_error,
&hf_ppphg_reassembled_in,
"fragments"
};
/*----------------------------------------------------------------------------*/
/*---------------------- CODE -------------------------*/
/*----------------------------------------------------------------------------*/
static void
msg_init_protocol(void)
{
fragment_table_init(&msg_fragment_table);
reassembled_table_init(&msg_reassembled_table);
}
/* This function creates the dissector */
void proto_reg_handoff_ppphg(void)
{
static gboolean init_dissector = FALSE;
if (!init_dissector)
{
ppphg_handle = create_dissector_handle(dissect_ppphg, proto_ppphg);
data_handle = find_dissector("data");
dissector_add("wtap_encap", 48, ppphg_handle);
msg_init_protocol();
init_dissector = TRUE;
}
}
/* This function registers PPPHG protocol */
void proto_register_ppphg (void)
{
/* Protocol fields description */
static hf_register_info hf[] =
{
{ &hf_header_length,
{ "Header length", "ppphg.header_length",
FT_UINT8, BASE_DEC, VALS(vals_header_length), 0x0, "", HFILL }},
{ &hf_msg_seqid,
{ "Message identifier", "ppphg.msg_seqid",
FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_msg_num,
{ "Message number", "ppphg.msg_num",
FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_msg_start,
{ "Message start", "ppphg.msg_start",
FT_UINT8, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_msg_end,
{ "Message end", "ppphg.msg_end",
FT_UINT8, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_msg_flag,
{ "Message flag", "ppphg.msg_flag",
FT_BOOLEAN, BASE_NONE, NULL, 0x0, "", HFILL }},
{ &hf_msg_dir,
{ "Message direction", "ppphg.msg_dir",
FT_UINT8, BASE_DEC, NULL, 0x0, "", HFILL }},
{ &hf_mux_frame_start,
{ "Mux frame start", "ppphg.mux_frame_start",
FT_UINT8, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_mux_frame_res,
{ "Mux frame reserved", "ppphg.mux_frame_res",
FT_UINT8, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_mux_frame_fcs,
{ "Mux frame fcs", "ppphg.mux_frame_fcs",
FT_UINT16, BASE_HEX, NULL, 0x0, "", HFILL }},
{ &hf_ppphg_fragments,
{ "Message fragments", "msg.fragments",
FT_NONE, BASE_NONE, NULL, 0x00, NULL, HFILL } },
{ &hf_ppphg_fragment,
{ "Message fragment", "msg.fragment",
FT_FRAMENUM, BASE_NONE, NULL, 0x00, NULL, HFILL } },
{ &hf_ppphg_fragment_overlap,
{ "Message fragment overlap", "msg.fragment.overlap",
FT_BOOLEAN, BASE_NONE, NULL, 0x00, NULL, HFILL } },
{ &hf_ppphg_fragment_overlap_conflict,
{ "Message fragment overlapping with conflicting data",
"msg.fragment.overlap.conflicts",
FT_BOOLEAN, BASE_NONE, NULL, 0x00, NULL, HFILL } },
{ &hf_ppphg_fragment_multiple_tails,
{ "Message has multiple tail fragments",
"msg.fragment.multiple_tails",
FT_BOOLEAN, BASE_NONE, NULL, 0x00, NULL, HFILL } },
{ &hf_ppphg_fragment_too_long_fragment,
{ "Message fragment too long", "msg.fragment.too_long_fragment",
FT_BOOLEAN, BASE_NONE, NULL, 0x00, NULL, HFILL } },
{ &hf_ppphg_fragment_error,
{ "Message defragmentation error", "msg.fragment.error",
FT_FRAMENUM, BASE_NONE, NULL, 0x00, NULL, HFILL } },
{ &hf_ppphg_reassembled_in,
{ "Reassembled in", "msg.reassembled.in",
FT_FRAMENUM, BASE_NONE, NULL, 0x00, NULL, HFILL } }
};
static gint *ett[] =
{
&ett_ppphg,
&ett_ppphg_fragment,
&ett_ppphg_fragments
};
if (proto_ppphg == -1)
{
proto_ppphg = proto_register_protocol ("PPPHG - PPP Protocol", "PPPHG", "ppphg");
proto_register_field_array (proto_ppphg, hf, array_length(hf));
proto_register_subtree_array (ett, array_length(ett));
register_dissector("ppphg", dissect_ppphg, proto_ppphg);
}
}
/* Dissector for PPPHG Protocol */
static void
dissect_ppphg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
proto_item *ppphg_item = NULL;
proto_tree *ppphg_tree = NULL;
proto_tree *ppphg_tree_frag = NULL;
guint offset = 0;
guint i = 0;
ppphg_dissector_data_t d_d;
fragment_data *frag_msg = NULL;
tvbuff_t* new_tvb = NULL;
guint16 p_size;
/* Erase dissector data */
memset( &d_d, 0, sizeof(ppphg_dissector_data_t) );
/* Add PPPHG protocol in the column */
if (check_col(pinfo->cinfo, COL_PROTOCOL))
col_set_str(pinfo->cinfo, COL_PROTOCOL, PROTO_TAG_PPPHG);
/* Clear out stuff in the info column */
if(check_col(pinfo->cinfo,COL_INFO))
col_clear(pinfo->cinfo,COL_INFO);
if (tree)
{
ppphg_item = proto_tree_add_item(tree, proto_ppphg, tvb, 0, -1, FALSE);
ppphg_tree = proto_item_add_subtree(ppphg_item, ett_ppphg);
d_d.val_header_length = tvb_get_guint8( tvb, offset );
if( d_d.val_header_length > 0 )
{
/* Add information */
if(check_col(pinfo->cinfo, COL_RES_DL_SRC))
col_set_str(pinfo->cinfo, COL_RES_DL_SRC, "DTE");
if(check_col(pinfo->cinfo, COL_RES_DL_DST))
col_set_str(pinfo->cinfo, COL_RES_DL_DST, "DCE");
/* Dissect protocol */
d_d.val_msg_seqid = tvb_get_ntohs ( tvb, offset+1 );
d_d.val_msg_num = tvb_get_ntohs ( tvb, offset+3 );
d_d.val_msg_start = tvb_get_guint8( tvb, offset+5 );
d_d.val_msg_end = tvb_get_guint8( tvb, offset+6 );
d_d.val_msg_flag = tvb_get_guint8( tvb, offset+7 );
d_d.val_msg_dir = tvb_get_guint8( tvb, offset+8 );
d_d.val_mux_frame_start = tvb_get_guint8( tvb, offset+9 );
d_d.val_mux_frame_res1 = tvb_get_guint8( tvb, offset+10 );
d_d.val_mux_frame_fcs = tvb_get_ntohs ( tvb, offset+11 );
d_d.val_mux_frame_res2 = tvb_get_guint8( tvb, offset+13 );
d_d.val_mux_frame_data_length = d_d.val_msg_end - 4;
proto_tree_add_uint( ppphg_tree, hf_header_length, tvb,
offset, L_UINT8, d_d.val_header_length);
proto_tree_add_uint( ppphg_tree, hf_msg_seqid, tvb,
offset+1, L_UINT16, d_d.val_msg_seqid);
proto_tree_add_uint( ppphg_tree, hf_msg_num, tvb,
offset+3, L_UINT16, d_d.val_msg_num);
proto_tree_add_uint( ppphg_tree, hf_msg_start, tvb,
offset+5, L_UINT8, d_d.val_msg_start);
proto_tree_add_uint( ppphg_tree, hf_msg_end, tvb,
offset+6, L_UINT8, d_d.val_msg_end);
proto_tree_add_boolean( ppphg_tree, hf_msg_flag, tvb,
offset+7, L_UINT8, d_d.val_msg_flag);
proto_tree_add_uint( ppphg_tree, hf_msg_dir, tvb,
offset+8, L_UINT8, d_d.val_msg_dir);
proto_tree_add_uint( ppphg_tree, hf_mux_frame_start, tvb,
offset+9, L_UINT8, d_d.val_mux_frame_start);
proto_tree_add_uint( ppphg_tree, hf_mux_frame_res, tvb,
offset+10, L_UINT8, d_d.val_mux_frame_res1);
proto_tree_add_uint( ppphg_tree, hf_mux_frame_fcs, tvb,
offset+11, L_UINT16, d_d.val_mux_frame_fcs);
proto_tree_add_uint( ppphg_tree, hf_mux_frame_res, tvb,
offset+13, L_UINT8, d_d.val_mux_frame_res2);
proto_tree_add_text( ppphg_tree, tvb, offset+14,
d_d.val_mux_frame_data_length, "Mux frame data : %s", "see buffer");
pinfo->fragmented = TRUE;
frag_msg = fragment_add_seq_check( tvb, offset+14, pinfo,
d_d.val_msg_seqid,
msg_fragment_table,
msg_reassembled_table,
d_d.val_msg_num,
d_d.val_mux_frame_data_length,
d_d.val_msg_flag);
new_tvb = process_reassembled_data(tvb, offset+14, pinfo,
"Reassembled Message",
frag_msg,
&ppphg_frag_items,
NULL,
ppphg_tree);
if( frag_msg )
{
if (check_col(pinfo->cinfo, COL_INFO))
col_append_str(pinfo->cinfo, COL_INFO, "Reassembled MSG");
}
else
{
if (check_col(pinfo->cinfo, COL_INFO))
col_append_fstr(pinfo->cinfo, COL_INFO,
"Fragment %u", d_d.val_msg_num);
}
if( new_tvb )
{
/* Process the reassembled packet */
p_size = tvb_length(new_tvb);
/* To complete */
}
}
else
{
/* Add information */
if(check_col(pinfo->cinfo, COL_RES_DL_SRC))
col_set_str(pinfo->cinfo, COL_RES_DL_SRC, "DCE");
if(check_col(pinfo->cinfo, COL_RES_DL_DST))
col_set_str(pinfo->cinfo, COL_RES_DL_DST, "DTE");
/* Dissect protocol */
proto_tree_add_uint( ppphg_tree, hf_header_length, tvb,
offset, L_UINT8, d_d.val_header_length);
}
}
}
Attachment:
reassembling.pcap
Description: Binary data
- References:
- Re: [Wireshark-dev] Reassembling splitted PPP packets
- From: Hans Glück
- Re: [Wireshark-dev] Reassembling splitted PPP packets
- From: philippe alarcon
- Re: [Wireshark-dev] Reassembling splitted PPP packets
- From: Hans Glück
- Re: [Wireshark-dev] Reassembling splitted PPP packets
- Prev by Date: [Wireshark-dev] New CRC code (Was: Re: WS 1.1.3 release?)
- Next by Date: Re: [Wireshark-dev] New CRC code (Was: Re: WS 1.1.3 release?)
- Previous by thread: Re: [Wireshark-dev] Reassembling splitted PPP packets
- Next by thread: [Wireshark-dev] Adding dissector: how to register field array with two protocols?
- Index(es):