Wireshark-dev: [Wireshark-dev] [REPOST][PATCH] update USB dissector (was: update wiretap and su
From: Paolo Abeni <paolo.abeni@xxxxxxxx>
Date: Tue, 30 Jan 2007 09:14:47 +0100
On Fri, 2007-01-26 at 23:39 -0500, Charles Lepple wrote: > One problem is that the proto_tree_add_* calls set the little_endian > flag to true regardless of the endianness of the host. This is a bug. Thanks for pointing it out. The attached patch should solve it. I renew the pledge for reviewing the endianess related stuff. Thanks again and best regards, Paolo -- Email.it, the professional e-mail, gratis per te: http://www.email.it/f Sponsor: Grande Offerta di Benvenuto Cassine di Pietra: * 36 bottiglie di ottimo vino veneto direttamente a casa tua! * Clicca qui: http://adv.email.it/cgi-bin/foclick.cgi?mid=3923&d=30-1
Index: epan/dissectors/packet-usb.c =================================================================== --- epan/dissectors/packet-usb.c (revision 20622) +++ epan/dissectors/packet-usb.c (working copy) @@ -1,6 +1,5 @@ -/* Man this is suboptimal. - * The USB Header and the setup data are BIG ENDIAN - * but all the real usb data is LITTLE ENDIAN. +/* + * The USB Header is in host byte order, while all the real usb data is LITTLE ENDIAN. */ /* packet-usb.c @@ -8,7 +7,7 @@ * $Id$ * * usb basic dissector - * By Paolo Abeni <paolo.abeni@xxxxxxxxx> + * By Paolo Abeni <paolo.abeni@xxxxxxxx> * Ronnie Sahlberg 2006 * * This program is free software; you can redistribute it and/or @@ -41,11 +40,21 @@ #include <string.h> #include "packet-usb.h" +#if G_BYTE_ORDER == G_LITTLE_ENDIAN +#define HOST_BYTE_ORDER 1 +#else +#define HOST_BYTE_ORDER 0 +#endif + /* protocols and header fields */ static int proto_usb = -1; +static int hf_usb_urb_id = -1; +static int hf_usb_bus_id = -1; +static int hf_usb_transfer_type = -1; static int hf_usb_urb_type = -1; static int hf_usb_device_address = -1; -static int hf_usb_setup = -1; +static int hf_usb_data_flag = -1; +static int hf_usb_setup_flag = -1; static int hf_usb_endpoint_number = -1; static int hf_usb_src_endpoint_number = -1; static int hf_usb_dst_endpoint_number = -1; @@ -114,35 +123,6 @@ static dissector_table_t usb_bulk_dissector_table; static dissector_table_t usb_control_dissector_table; - -typedef enum { - URB_CONTROL_INPUT, - URB_CONTROL_OUTPUT, - URB_ISOCHRONOUS_INPUT, - URB_ISOCHRONOUS_OUTPUT, - URB_INTERRUPT_INPUT, - URB_INTERRUPT_OUTPUT, - URB_BULK_INPUT, - URB_BULK_OUTPUT, - URB_UNKNOWN -} urb_type_t; - -typedef struct usb_header { - guint32 urb_type; - guint32 device_address; - guint32 endpoint_number; - guint32 setup_packet; -} usb_header_t; - -typedef struct usb_request { - guint8 bmRequestType; - guint8 bRequest; - guint16 wValue; - guint16 wIndex; - guint16 wLength; -} usb_request_t; - - static const value_string usb_langid_vals[] = { {0x0000, "no language specified"}, {0x0409, "English (United States)"}, @@ -172,16 +152,18 @@ }; +static const value_string usb_transfer_type_vals[] = { + {URB_CONTROL, "URB_CONTROL"}, + {URB_ISOCHRONOUS,"URB_ISOCHRONOUS"}, + {URB_INTERRUPT,"URB_INTERRUPT"}, + {URB_BULK,"URB_BULK"}, + {0, NULL} +}; + static const value_string usb_urb_type_vals[] = { - {URB_CONTROL_INPUT, "URB_CONTROL_INPUT"}, - {URB_CONTROL_OUTPUT,"URB_CONTROL_OUTPUT"}, - {URB_ISOCHRONOUS_INPUT,"URB_ISOCHRONOUS_INPUT"}, - {URB_ISOCHRONOUS_OUTPUT,"URB_ISOCHRONOUS_OUTPUT"}, - {URB_INTERRUPT_INPUT,"URB_INTERRUPT_INPUT"}, - {URB_INTERRUPT_OUTPUT,"URB_INTERRUPT_OUTPUT"}, - {URB_BULK_INPUT,"URB_BULK_INPUT"}, - {URB_BULK_OUTPUT,"URB_BULK_OUTPUT"}, - {URB_UNKNOWN, "URB_UNKNOWN"}, + {URB_SUBMIT, "URB_SUBMIT"}, + {URB_COMPLETE,"URB_COMPLETE"}, + {URB_ERROR,"URB_ERROR"}, {0, NULL} }; @@ -295,7 +277,7 @@ if(parent_tree){ item=proto_tree_add_text(parent_tree, tvb, offset, 0, "DEVICE QUALIFIER DESCRIPTOR"); - tree=proto_item_add_subtree(item, ett_descriptor_device); + tree=proto_item_add_subtree(item, ett_descriptor_device); } /* bLength */ @@ -350,7 +332,7 @@ if(parent_tree){ item=proto_tree_add_text(parent_tree, tvb, offset, 0, "DEVICE DESCRIPTOR"); - tree=proto_item_add_subtree(item, ett_descriptor_device); + tree=proto_item_add_subtree(item, ett_descriptor_device); } /* bLength */ @@ -427,7 +409,7 @@ if(parent_tree){ item=proto_tree_add_text(parent_tree, tvb, offset, 0, "STRING DESCRIPTOR"); - tree=proto_item_add_subtree(item, ett_descriptor_device); + tree=proto_item_add_subtree(item, ett_descriptor_device); } /* bLength */ @@ -473,7 +455,7 @@ if(parent_tree){ item=proto_tree_add_text(parent_tree, tvb, offset, 0, "INTERFACE DESCRIPTOR"); - tree=proto_item_add_subtree(item, ett_descriptor_device); + tree=proto_item_add_subtree(item, ett_descriptor_device); } /* bLength */ @@ -546,7 +528,7 @@ if(parent_tree){ item=proto_tree_add_text(parent_tree, tvb, offset, 0, "ENDPOINT DESCRIPTOR"); - tree=proto_item_add_subtree(item, ett_descriptor_device); + tree=proto_item_add_subtree(item, ett_descriptor_device); } /* bLength */ @@ -560,7 +542,7 @@ /* bEndpointAddress */ if(tree){ endpoint_item=proto_tree_add_item(tree, hf_usb_bEndpointAddress, tvb, offset, 1, TRUE); - endpoint_tree=proto_item_add_subtree(endpoint_item, ett_configuration_bEndpointAddress); + endpoint_tree=proto_item_add_subtree(endpoint_item, ett_configuration_bEndpointAddress); } endpoint=tvb_get_guint8(tvb, offset)&0x0f; proto_tree_add_item(endpoint_tree, hf_usb_bEndpointAddress_direction, tvb, offset, 1, TRUE); @@ -644,7 +626,7 @@ if(parent_tree){ item=proto_tree_add_text(parent_tree, tvb, offset, 0, "CONFIGURATION DESCRIPTOR"); - tree=proto_item_add_subtree(item, ett_descriptor_device); + tree=proto_item_add_subtree(item, ett_descriptor_device); } /* bLength */ @@ -852,8 +834,8 @@ dissect_usb(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent) { int offset = 0; - int type, endpoint; - gboolean setup; + int type, endpoint, event; + guint8 setup_flag; proto_tree *tree = NULL; guint32 src_device, dst_device, tmp_addr; static usb_address_t src_addr, dst_addr; /* has to be static due to SET_ADDRESS */ @@ -869,102 +851,55 @@ /* add usb hdr*/ if (parent) { proto_item *ti = NULL; - ti = proto_tree_add_protocol_format(parent, proto_usb, tvb, 0, sizeof(usb_header_t), "USB URB"); + ti = proto_tree_add_protocol_format(parent, proto_usb, tvb, 0, sizeof(struct usb_request_hdr), "USB URB"); tree = proto_item_add_subtree(ti, usb_hdr); } - - type = tvb_get_ntohl(tvb, offset); - proto_tree_add_item(tree, hf_usb_urb_type, tvb, offset, 4, FALSE); - offset += 4; + proto_tree_add_item(tree, hf_usb_urb_id, tvb, offset, 8, HOST_BYTE_ORDER); + offset += 8; + + event = tvb_get_guint8(tvb, offset); + proto_tree_add_item(tree, hf_usb_urb_type, tvb, offset, 1, HOST_BYTE_ORDER); + offset += 1; + + type = tvb_get_guint8(tvb, offset); + proto_tree_add_item(tree, hf_usb_transfer_type, tvb, offset, 1, HOST_BYTE_ORDER); + offset += 1; if (check_col(pinfo->cinfo, COL_INFO)) { col_append_fstr(pinfo->cinfo, COL_INFO, "%s", val_to_str(type, usb_urb_type_vals, "Unknown type %x")); } - proto_tree_add_item(tree, hf_usb_device_address, tvb, offset, 4, FALSE); - tmp_addr=tvb_get_ntohl(tvb, offset); - offset += 4; + proto_tree_add_item(tree, hf_usb_endpoint_number, tvb, offset, 1, HOST_BYTE_ORDER); + endpoint=tvb_get_guint8(tvb, offset); + offset += 1; - proto_tree_add_item(tree, hf_usb_endpoint_number, tvb, offset, 4, FALSE); - endpoint=tvb_get_ntohl(tvb, offset); - offset += 4; + proto_tree_add_item(tree, hf_usb_device_address, tvb, offset, 1, HOST_BYTE_ORDER); + tmp_addr=tvb_get_guint8(tvb, offset); + offset += 1; - /* check for setup hdr presence */ - proto_tree_add_item(tree, hf_usb_setup, tvb, offset, 4, FALSE); - setup = tvb_get_ntohl(tvb, offset); - offset += 4; + proto_tree_add_item(tree, hf_usb_bus_id, tvb, offset, 2, HOST_BYTE_ORDER); + offset += 2; + proto_tree_add_item(tree, hf_usb_setup_flag, tvb, offset, 1, HOST_BYTE_ORDER); + setup_flag = tvb_get_guint8(tvb, offset); + offset += 26; /* set up addresses and ports */ - switch(type){ - case URB_BULK_INPUT: - /* Bulk input are responses if they contain payload data and - * requests otherwise. - */ - if(tvb_length_remaining(tvb, offset)>0){ - src_device=tmp_addr; - src_endpoint=endpoint; - dst_device=0xffffffff; - dst_endpoint=NO_ENDPOINT; - is_request=FALSE; - } else { - src_device=0xffffffff; - src_endpoint=NO_ENDPOINT; - dst_device=tmp_addr; - dst_endpoint=endpoint; - is_request=TRUE; - } - break; - case URB_BULK_OUTPUT: - /* Bulk output are requests if they contain payload data and - * responses otherwise. - */ - if(tvb_length_remaining(tvb, offset)>0){ - src_device=0xffffffff; - src_endpoint=NO_ENDPOINT; - dst_device=tmp_addr; - dst_endpoint=endpoint; - is_request=TRUE; - } else { - src_device=tmp_addr; - src_endpoint=endpoint; - dst_device=0xffffffff; - dst_endpoint=NO_ENDPOINT; - is_request=FALSE; - } - break; - case URB_CONTROL_INPUT: - /* CONTROL INPUT packets are requests if they contain a "setup" - * blob and responses othervise - */ - if(setup){ - src_device=0xffffffff; - src_endpoint=NO_ENDPOINT; - dst_device=tmp_addr; - dst_endpoint=endpoint; - is_request=TRUE; - } else { - src_device=tmp_addr; - src_endpoint=endpoint; - dst_device=0xffffffff; - dst_endpoint=NO_ENDPOINT; - is_request=FALSE; - } - break; - default: - /* dont know */ - src_device=0xffffffff; - dst_device=0xffffffff; - src_endpoint=NO_ENDPOINT; - dst_endpoint=NO_ENDPOINT; - is_request=FALSE; + is_request = endpoint & URB_TRANSFER_IN; + if (is_request){ + src_addr.device = src_device = tmp_addr; + src_addr.endpoint = src_endpoint = endpoint; + dst_addr.device = dst_device = 0xffffffff; + dst_addr.endpoint = dst_endpoint = NO_ENDPOINT; + } else { + src_addr.device = src_device = 0xffffffff; + src_addr.endpoint = src_endpoint = NO_ENDPOINT; + dst_addr.device = src_device = tmp_addr; + dst_addr.endpoint = src_endpoint = endpoint; } - src_addr.device = src_device; - src_addr.endpoint = src_endpoint; - dst_addr.device = dst_device; - dst_addr.endpoint = dst_endpoint; + SET_ADDRESS(&pinfo->net_src, AT_USB, USB_ADDR_LEN, (char *)&src_addr); SET_ADDRESS(&pinfo->src, AT_USB, USB_ADDR_LEN, (char *)&src_addr); SET_ADDRESS(&pinfo->net_dst, AT_USB, USB_ADDR_LEN, (char *)&dst_addr); @@ -973,7 +908,6 @@ pinfo->srcport=src_endpoint; pinfo->destport=dst_endpoint; - conversation=get_usb_conversation(pinfo, pinfo->srcport, pinfo->destport); usb_conv_info=get_usb_conv_info(conversation); @@ -991,7 +925,6 @@ } pinfo->usb_conv_info=usb_conv_info; - /* request/response matching so we can keep track of transaction specific * data. */ @@ -1023,7 +956,7 @@ switch(type){ - case URB_BULK_INPUT: + case URB_BULK: { proto_item *item; @@ -1040,25 +973,8 @@ } } break; - case URB_BULK_OUTPUT: + case URB_CONTROL: { - proto_item *item; - - item=proto_tree_add_uint(tree, hf_usb_bInterfaceClass, tvb, offset, 0, usb_conv_info->class); - PROTO_ITEM_SET_GENERATED(item); - if(tvb_length_remaining(tvb, offset)){ - tvbuff_t *next_tvb; - - pinfo->usb_conv_info=usb_conv_info; - next_tvb=tvb_new_subset(tvb, offset, tvb_length_remaining(tvb, offset), tvb_reported_length_remaining(tvb, offset)); - if(dissector_try_port(usb_bulk_dissector_table, usb_conv_info->class, next_tvb, pinfo, parent)){ - return; - } - } - } - break; - case URB_CONTROL_INPUT: - { const usb_setup_dissector_table_t *tmp; usb_setup_dissector dissector; proto_item *ti = NULL; @@ -1071,7 +987,7 @@ tvbuff_t *next_tvb; /* this is a request */ - ti = proto_tree_add_protocol_format(tree, proto_usb, tvb, offset, sizeof(usb_request_t), "URB setup"); + ti = proto_tree_add_protocol_format(tree, proto_usb, tvb, offset, sizeof(struct usb_request_hdr), "URB setup"); setup_tree = proto_item_add_subtree(ti, usb_setup_hdr); usb_trans_info->requesttype=tvb_get_guint8(tvb, offset); offset=dissect_usb_bmrequesttype(setup_tree, tvb, offset); @@ -1156,33 +1072,35 @@ break; default: /* dont know */ - ; + ; } - if (setup) { + if (setup_flag == 0) { proto_item *ti = NULL; proto_tree *setup_tree = NULL; guint8 requesttype, request; - ti = proto_tree_add_protocol_format(tree, proto_usb, tvb, offset, sizeof(usb_request_t), "URB setup"); + ti = proto_tree_add_protocol_format(tree, proto_usb, tvb, offset, sizeof(struct usb_request_hdr), "URB setup"); setup_tree = proto_item_add_subtree(ti, usb_setup_hdr); requesttype=tvb_get_guint8(tvb, offset); - offset=dissect_usb_bmrequesttype(setup_tree, tvb, offset); + offset=dissect_usb_bmrequesttype(setup_tree, tvb, offset); request=tvb_get_guint8(tvb, offset); - proto_tree_add_item(setup_tree, hf_usb_request, tvb, offset, 1, FALSE); + proto_tree_add_item(setup_tree, hf_usb_request, tvb, offset, 1, TRUE); offset += 1; - proto_tree_add_item(tree, hf_usb_value, tvb, offset, 2, FALSE); + proto_tree_add_item(tree, hf_usb_value, tvb, offset, 2, TRUE); offset += 2; - proto_tree_add_item(tree, hf_usb_index, tvb, offset, 2, FALSE); + proto_tree_add_item(tree, hf_usb_index, tvb, offset, 2, TRUE); offset += 2; - proto_tree_add_item(tree, hf_usb_length, tvb, offset, 2, FALSE); + proto_tree_add_item(tree, hf_usb_length, tvb, offset, 2, TRUE); offset += 2; } + else + offset += 8; proto_tree_add_item(tree, hf_usb_data, tvb, offset, tvb_length_remaining(tvb, offset), FALSE); @@ -1192,30 +1110,49 @@ proto_register_usb(void) { static hf_register_info hf[] = { - + + { &hf_usb_urb_id, + { "URB id", "usb.urb_id", FT_UINT64, BASE_DEC, + NULL, 0x0, + "URB id", HFILL }}, + + { &hf_usb_bus_id, + { "URB bus id", "usb.bus_id", FT_UINT16, BASE_DEC, + NULL, 0x0, + "URB bus id", HFILL }}, + { &hf_usb_urb_type, - { "URB type", "usb.urb_type", FT_UINT32, BASE_DEC, + { "URB type", "usb.urb_type", FT_UINT8, BASE_DEC, VALS(usb_urb_type_vals), 0x0, "URB type", HFILL }}, + { &hf_usb_transfer_type, + { "URB transfer type", "usb.transfer_type", FT_UINT8, BASE_DEC, + VALS(usb_transfer_type_vals), 0x0, + "URB transfer type", HFILL }}, + { &hf_usb_device_address, - { "Device", "usb.device_address", FT_UINT32, BASE_DEC, NULL, 0x0, + { "Device", "usb.device_address", FT_UINT8, BASE_DEC, NULL, 0x0, "USB device address", HFILL }}, - { &hf_usb_setup, - { "Setup", "usb.setup", FT_UINT32, BASE_DEC, NULL, 0x0, - "USB setup", HFILL }}, + { &hf_usb_data_flag, + { "Flags", "usb.data_flag", FT_UINT8, BASE_DEC, NULL, 0x0, + "USB data flag", HFILL }}, + { &hf_usb_setup_flag, + { "Flags", "usb.data_flag", FT_UINT8, BASE_DEC, NULL, 0x0, + "USB data flag", HFILL }}, + { &hf_usb_endpoint_number, - { "Endpoint", "usb.endpoint_number", FT_UINT32, BASE_HEX, NULL, 0x0, + { "Endpoint", "usb.endpoint_number", FT_UINT8, BASE_HEX, NULL, 0x0, "usb endpoint number", HFILL }}, { &hf_usb_src_endpoint_number, - { "Src Endpoint", "usb.src.endpoint", FT_UINT32, BASE_HEX, NULL, 0x0, + { "Src Endpoint", "usb.src.endpoint", FT_UINT8, BASE_HEX, NULL, 0x0, "src usb endpoint number", HFILL }}, { &hf_usb_dst_endpoint_number, - { "Dst Endpoint", "usb.dst.endpoint", FT_UINT32, BASE_HEX, NULL, 0x0, + { "Dst Endpoint", "usb.dst.endpoint", FT_UINT8, BASE_HEX, NULL, 0x0, "dst usb endpoint number", HFILL }}, { &hf_usb_bmRequestType, @@ -1460,5 +1397,5 @@ dissector_handle_t usb_handle; usb_handle = create_dissector_handle(dissect_usb, proto_usb); - dissector_add("wtap_encap", WTAP_ENCAP_USB, usb_handle); + dissector_add("wtap_encap", WTAP_ENCAP_USB_LINUX, usb_handle); } Index: wiretap/wtap.h =================================================================== --- wiretap/wtap.h (revision 20622) +++ wiretap/wtap.h (working copy) @@ -182,16 +182,17 @@ #define WTAP_ENCAP_JUNIPER_FRELAY 85 #define WTAP_ENCAP_JUNIPER_CHDLC 86 #define WTAP_ENCAP_JUNIPER_GGSN 87 -#define WTAP_ENCAP_LINUX_LAPD 88 +#define WTAP_ENCAP_LINUX_LAPD 88 #define WTAP_ENCAP_CATAPULT_DCT2000 89 #define WTAP_ENCAP_BER 90 #define WTAP_ENCAP_JUNIPER_VP 91 -#define WTAP_ENCAP_USB 92 +#define WTAP_ENCAP_USB 92 #define WTAP_ENCAP_IEEE802_16_MAC_CPS 93 #define WTAP_ENCAP_NETTL_RAW_TELNET 94 +#define WTAP_ENCAP_USB_LINUX 95 /* last WTAP_ENCAP_ value + 1 */ -#define WTAP_NUM_ENCAP_TYPES 95 +#define WTAP_NUM_ENCAP_TYPES 96 /* File types that can be read by wiretap. We support writing some many of these file types, too, so we @@ -275,6 +276,55 @@ * of that. */ +#define URB_TRANSFER_IN 0x80 + +/* + * possible transfer mode + */ +#define URB_ISOCHRONOUS 0x0 +#define URB_INTERRUPT 0x1 +#define URB_CONTROL 0x2 +#define URB_BULK 0x3 + +/* + * possible event type + */ +#define URB_SUBMIT 'S' +#define URB_COMPLETE 'C' +#define URB_ERROR 'E' + +/* + * USB setup header as defined in USB specification + */ +struct usb_request_hdr { + gint8 bmRequestType; + guint8 bRequest; + guint16 wValue; + guint16 wIndex; + guint16 wLength; +}; + +/* + * Header prepent by linux kernel to each USB event + */ +struct linux_usb_phdr { + guint64 id; /* urb id, to link submission and completion events*/ + guint8 event_type; /* Submit ('S'), Completed ('C'), Error ('E') */ + guint8 transfer_type; /* ISO (0), Intr, Control, Bulk (3) */ + guint8 endpoint_number; /* Endpoint number and transfer direction */ + guint8 device_address; + guint16 bus_id; + gint8 setup_flag; /*if !=0 the urb setup header is not present*/ + gint8 data_flag; /*if !=0 no urb data is present*/ + gint64 ts_sec; + gint32 ts_usec; + gint32 status; + guint32 urb_len; /* whole len of urb this event refear to */ + guint32 data_len; /* amount of urb data really present in this event*/ + struct usb_request_hdr setup; /* this is valid only if setup_flag is 0 */ +}; + + /* Packet "pseudo-header" information for Ethernet capture files. */ struct eth_phdr { gint fcs_len; /* Number of bytes of FCS - -1 means "unknown" */ Index: wiretap/libpcap.c =================================================================== --- wiretap/libpcap.c (revision 20622) +++ wiretap/libpcap.c (working copy) @@ -143,6 +143,7 @@ static void libpcap_close(wtap *wth); static gboolean libpcap_dump(wtap_dumper *wdh, const struct wtap_pkthdr *phdr, const union wtap_pseudo_header *pseudo_header, const guchar *pd, int *err); +static void libpcap_fixate_usb_hdr(guchar* pd, int caplen); /* * Either LBL NRG wasn't an adequate central registry (e.g., because of @@ -416,7 +417,8 @@ { 187, WTAP_ENCAP_BLUETOOTH_H4 }, /* IEEE 802.16 MAC Common Part Sublayer */ { 188, WTAP_ENCAP_IEEE802_16_MAC_CPS }, - + /* USB packets with linux specified header */ + { 189, WTAP_ENCAP_USB_LINUX }, /* * To repeat: * @@ -1393,6 +1395,8 @@ } } } + if ((wth->file_encap == WTAP_ENCAP_USB_LINUX) && wth->capture.pcap->byte_swapped) + libpcap_fixate_usb_hdr(buffer_start_ptr(wth->frame_buffer), wth->phdr.caplen); return TRUE; } @@ -1499,6 +1503,8 @@ atm_guess_lane_type(pd, length, pseudo_header); } } + if ((wth->file_encap == WTAP_ENCAP_USB_LINUX) && wth->capture.pcap->byte_swapped) + libpcap_fixate_usb_hdr(pd, length); return TRUE; } @@ -1941,6 +1947,33 @@ return -1; } +static +void libpcap_fixate_usb_hdr(guchar* pd, int caplen) +{ + struct linux_usb_phdr* phdr = (struct linux_usb_phdr*) pd; + if (caplen < 8) + return; + phdr->id = GUINT64_SWAP_LE_BE(phdr->id); + if (caplen < 14) + return; + phdr->bus_id = GUINT16_SWAP_LE_BE(phdr->bus_id); + if (caplen < 24) + return; + phdr->ts_sec = GUINT64_SWAP_LE_BE(phdr->ts_sec); + if (caplen < 28) + return; + phdr->ts_usec = GUINT32_SWAP_LE_BE(phdr->ts_usec); + if (caplen < 32) + return; + phdr->status = GUINT32_SWAP_LE_BE(phdr->status); + if (caplen < 36) + return; + phdr->urb_len = GUINT32_SWAP_LE_BE(phdr->urb_len); + if (caplen < 40) + return; + phdr->data_len = GUINT32_SWAP_LE_BE(phdr->data_len); +} + #ifdef HAVE_PCAP_H /* * Given a Wiretap encapsulation type, and raw packet data and the packet
- Follow-Ups:
- Re: [Wireshark-dev] [REPOST][PATCH] update USB dissector
- From: Guy Harris
- Re: [Wireshark-dev] [REPOST][PATCH] update USB dissector
- References:
- [Wireshark-dev] [PATCH] update wiretap and sub dissector
- From: Paolo Abeni
- Re: [Wireshark-dev] [PATCH] update wiretap and sub dissector
- From: Charles Lepple
- [Wireshark-dev] [PATCH] update wiretap and sub dissector
- Prev by Date: Re: [Wireshark-dev] [Wireshark-users] [ANNOUNCE] WinPcap 4.0 has been released
- Next by Date: [Wireshark-dev] wireshark-setup-0.99.5pre2-20620.exe large icon missing
- Previous by thread: Re: [Wireshark-dev] [PATCH] update wiretap and sub dissector
- Next by thread: Re: [Wireshark-dev] [REPOST][PATCH] update USB dissector
- Index(es):