diff options
author | Sean O. Stalley <sean.stalley@intel.com> | 2014-08-25 15:02:10 -0700 |
---|---|---|
committer | Anders Broman <a.broman58@gmail.com> | 2014-08-26 06:10:20 +0000 |
commit | 64cd8270c669e35bc2911133a9a7da31c4bb1965 (patch) | |
tree | 73de92c942d5e2deda4affdac6ea0e87e0f14049 | |
parent | 3d4d0216e43fa2c8f1487103dc9f4185c471adf0 (diff) | |
download | wireshark-64cd8270c669e35bc2911133a9a7da31c4bb1965.tar.gz |
Have dissect_usb_setup_request handle non-standard requests
Moved code for parsing non-standard setup requests from
dissect_usb_common() to dissect_usb_setup_request().
Also added header_info flag USB_HEADER_IS_MAUSB & updated mausb
dissector.
Change-Id: Ifa8abccbd57bf4dd3965f582872952383e6f737d
Reviewed-on: https://code.wireshark.org/review/3851
Petri-Dish: Anders Broman <a.broman58@gmail.com>
Reviewed-by: Anders Broman <a.broman58@gmail.com>
-rw-r--r-- | epan/dissectors/packet-mausb.c | 9 | ||||
-rw-r--r-- | epan/dissectors/packet-usb.c | 51 | ||||
-rw-r--r-- | epan/dissectors/packet-usb.h | 7 |
3 files changed, 38 insertions, 29 deletions
diff --git a/epan/dissectors/packet-mausb.c b/epan/dissectors/packet-mausb.c index d9fcfcaa0e..a57ada204e 100644 --- a/epan/dissectors/packet-mausb.c +++ b/epan/dissectors/packet-mausb.c @@ -1150,7 +1150,6 @@ dissect_mausb_pkt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_tree *mausb_tree; proto_tree *flags_tree; proto_tree *tflags_tree; - proto_tree *setup_tree; /* Other misc. local variables. */ struct mausb_header header; gint offset = 0; @@ -1240,7 +1239,8 @@ dissect_mausb_pkt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, /* TODO: set all the usb_conv_info values */ usb_conv_info->is_request = mausb_is_transfer_req(&header); - usb_trans_info = usb_get_trans_info(tvb, pinfo, tree, 0, usb_conv_info); + usb_trans_info = usb_get_trans_info(tvb, pinfo, tree, + USB_HEADER_IS_MAUSB, usb_conv_info); usb_conv_info->usb_trans_info = usb_trans_info; } @@ -1364,8 +1364,9 @@ dissect_mausb_pkt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, /* If this packet contains USB Setup Data */ if (mausb_has_setup_data(&header)) { - offset = dissect_usb_setup_request(pinfo, mausb_tree, tvb, offset, - usb_conv_info, &setup_tree); + offset = dissect_usb_setup_request(pinfo, mausb_tree, mausb_tree, tvb, + offset, URB_SUBMIT, usb_conv_info, + USB_HEADER_IS_MAUSB); } if (mausb_is_setup_response(&header)) { diff --git a/epan/dissectors/packet-usb.c b/epan/dissectors/packet-usb.c index 28a76231f3..5a63a06623 100644 --- a/epan/dissectors/packet-usb.c +++ b/epan/dissectors/packet-usb.c @@ -2833,19 +2833,26 @@ dissect_nonstandard_usb_setup_request(packet_info *pinfo, proto_tree *tree, prot /* Dissector used for usb setup requests */ int -dissect_usb_setup_request(packet_info *pinfo, proto_tree *parent, tvbuff_t *tvb, - int offset, usb_conv_info_t *usb_conv_info, proto_tree **setup_tree) +dissect_usb_setup_request(packet_info *pinfo, proto_tree *tree, + proto_tree *parent, tvbuff_t *tvb, int offset, + guint8 urb_type, usb_conv_info_t *usb_conv_info, + guint8 header_info) { + + int type; - proto_item *ti = NULL; + proto_item *ti; + proto_tree *setup_tree; + usb_trans_info_t *usb_trans_info = usb_conv_info->usb_trans_info; + gint req_type = USB_TYPE(tvb_get_guint8(tvb, offset)); ti = proto_tree_add_protocol_format(parent, proto_usb, tvb, offset, 8, "URB setup"); - *setup_tree = proto_item_add_subtree(ti, usb_setup_hdr); + setup_tree = proto_item_add_subtree(ti, usb_setup_hdr); usb_trans_info->setup.requesttype = tvb_get_guint8(tvb, offset); usb_conv_info->setup_requesttype = tvb_get_guint8(tvb, offset); - offset = dissect_usb_bmrequesttype(*setup_tree, tvb, offset, &type); + offset = dissect_usb_bmrequesttype(setup_tree, tvb, offset, &type); /* read the request code and spawn off to a class specific @@ -2860,18 +2867,29 @@ dissect_usb_setup_request(packet_info *pinfo, proto_tree *parent, tvbuff_t *tvb, switch (type) { case RQT_SETUP_TYPE_STANDARD: /* This is a standard request */ - offset = dissect_usb_standard_setup_request(pinfo, *setup_tree, tvb, offset, + offset = dissect_usb_standard_setup_request(pinfo, setup_tree, tvb, offset, usb_conv_info, usb_trans_info); break; default: /* no dissector found - display generic fields */ - proto_tree_add_item(*setup_tree, hf_usb_request_unknown_class, tvb, offset, 1, ENC_LITTLE_ENDIAN); + proto_tree_add_item(setup_tree, hf_usb_request_unknown_class, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; - offset = dissect_usb_setup_generic(pinfo, *setup_tree, tvb, offset, usb_conv_info); + offset = dissect_usb_setup_generic(pinfo, setup_tree, tvb, offset, usb_conv_info); } + if (req_type != RQT_SETUP_TYPE_CLASS) { + usb_tap_queue_packet(pinfo, urb_type, usb_conv_info); + } + + if (req_type != RQT_SETUP_TYPE_STANDARD) { + dissect_nonstandard_usb_setup_request(pinfo, tree, parent, &setup_tree, tvb, offset, + usb_conv_info, urb_type, header_info); + } else + offset = try_dissect_linux_usb_pseudo_header_ext(tvb, offset, pinfo, tree, header_info); + + return offset; } @@ -3440,22 +3458,9 @@ dissect_usb_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent, if (usb_conv_info->is_request) { if (usb_conv_info->is_setup) { - - proto_tree *setup_tree = NULL; - gint req_type = USB_TYPE(tvb_get_guint8(tvb, offset)); - /* Dissect the setup header - it's applicable */ - offset = dissect_usb_setup_request(pinfo, parent, tvb, offset, usb_conv_info, &setup_tree); - - if (req_type != RQT_SETUP_TYPE_CLASS) { - usb_tap_queue_packet(pinfo, urb_type, usb_conv_info); - } - - if (req_type != RQT_SETUP_TYPE_STANDARD) { - dissect_nonstandard_usb_setup_request(pinfo, tree, parent, &setup_tree, tvb, offset, - usb_conv_info, urb_type, header_info); - } else - offset = try_dissect_linux_usb_pseudo_header_ext(tvb, offset, pinfo, tree, header_info); + offset = dissect_usb_setup_request(pinfo, tree, parent, tvb, offset, + urb_type, usb_conv_info, header_info); } else { if (header_info & USB_HEADER_IS_LINUX) { diff --git a/epan/dissectors/packet-usb.h b/epan/dissectors/packet-usb.h index dccfd6c4ef..9c2c2e848c 100644 --- a/epan/dissectors/packet-usb.h +++ b/epan/dissectors/packet-usb.h @@ -45,6 +45,7 @@ typedef struct _usb_conv_info_t usb_conv_info_t; #define USB_HEADER_IS_LINUX (1 << 0) #define USB_HEADER_IS_64_BYTES (1 << 1) #define USB_HEADER_IS_USBPCAP (1 << 2) +#define USB_HEADER_IS_MAUSB (1 << 3) /* there is one such structure for each request/response */ typedef struct _usb_trans_info_t { @@ -228,8 +229,10 @@ dissect_usb_setup_response(packet_info *pinfo, proto_tree *tree, guint8 urb_type, usb_conv_info_t *usb_conv_info); int -dissect_usb_setup_request(packet_info *pinfo, proto_tree *parent, tvbuff_t *tvb, - int offset, usb_conv_info_t *usb_conv_info, proto_tree **setup_tree); +dissect_usb_setup_request(packet_info *pinfo, proto_tree *tree, + proto_tree *parent, tvbuff_t *tvb, int offset, + guint8 urb_type, usb_conv_info_t *usb_conv_info, + guint8 header_info); void |