summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean O. Stalley <sean.stalley@intel.com>2014-08-25 15:02:10 -0700
committerAnders Broman <a.broman58@gmail.com>2014-08-26 06:10:20 +0000
commit64cd8270c669e35bc2911133a9a7da31c4bb1965 (patch)
tree73de92c942d5e2deda4affdac6ea0e87e0f14049
parent3d4d0216e43fa2c8f1487103dc9f4185c471adf0 (diff)
downloadwireshark-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.c9
-rw-r--r--epan/dissectors/packet-usb.c51
-rw-r--r--epan/dissectors/packet-usb.h7
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