summaryrefslogtreecommitdiff
path: root/epan
diff options
context:
space:
mode:
authorSean O. Stalley <sean.stalley@intel.com>2014-06-04 14:26:17 -0700
committerAlexis La Goutte <alexis.lagoutte@gmail.com>2014-06-05 05:45:32 +0000
commiteaa571a666a3d3241731cc019b4790cf58910162 (patch)
tree306dbbe359337ff042cc6ea0f228ddcacbeb220a /epan
parent653dd75483a68ca8793ccdb482668cad7dcf950e (diff)
downloadwireshark-eaa571a666a3d3241731cc019b4790cf58910162.tar.gz
Added generic setup dissector for USB control transfers
Added helper function to remove inline duplicate code. Change-Id: I898f1157bfa5f77613be2e82b29bfb21660124eb Reviewed-on: https://code.wireshark.org/review/1962 Reviewed-by: Alexis La Goutte <alexis.lagoutte@gmail.com>
Diffstat (limited to 'epan')
-rw-r--r--epan/dissectors/packet-usb.c52
1 files changed, 25 insertions, 27 deletions
diff --git a/epan/dissectors/packet-usb.c b/epan/dissectors/packet-usb.c
index 67b8958d9c..c5507665f7 100644
--- a/epan/dissectors/packet-usb.c
+++ b/epan/dissectors/packet-usb.c
@@ -2284,6 +2284,24 @@ dissect_usb_setup_synch_frame_response(packet_info *pinfo _U_, proto_tree *tree
return offset;
}
+/* Dissector used for unknown USB setup request/responses */
+static int
+dissect_usb_setup_generic(packet_info *pinfo _U_, proto_tree *tree ,
+ tvbuff_t *tvb, int offset,
+ usb_conv_info_t *usb_conv_info _U_)
+{
+
+ proto_tree_add_item(tree, hf_usb_value, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ proto_tree_add_item(tree, hf_usb_index, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ proto_tree_add_item(tree, hf_usb_length, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+
+ return offset;
+}
+
+
typedef int (*usb_setup_dissector)(packet_info *pinfo, proto_tree *tree,
tvbuff_t *tvb, int offset,
@@ -2933,27 +2951,17 @@ dissect_usb_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent,
}
}
- if (dissector) {
- offset = dissector(pinfo, setup_tree, tvb, offset, usb_conv_info);
- } else {
- proto_tree_add_item(setup_tree, hf_usb_value, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- proto_tree_add_item(setup_tree, hf_usb_index, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- proto_tree_add_item(setup_tree, hf_usb_length, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+ if (!dissector) {
+ dissector = &dissect_usb_setup_generic;
}
+
+ offset = dissector(pinfo, setup_tree, tvb, offset, usb_conv_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);
offset += 1;
- proto_tree_add_item(setup_tree, hf_usb_value, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- proto_tree_add_item(setup_tree, hf_usb_index, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- proto_tree_add_item(setup_tree, hf_usb_length, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+ offset = dissect_usb_setup_generic(pinfo, setup_tree, tvb, offset, usb_conv_info);
if (header_info & (USB_HEADER_IS_LINUX | USB_HEADER_IS_64_BYTES)) {
setup_tvb = tvb_new_composite();
@@ -3109,12 +3117,7 @@ dissect_usb_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent,
offset = dissect_usb_bmrequesttype(setup_tree, tvb, offset, &type_2);
proto_tree_add_item(setup_tree, hf_usb_request, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
- proto_tree_add_item(setup_tree, hf_usb_value, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- proto_tree_add_item(setup_tree, hf_usb_index, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- proto_tree_add_item(setup_tree, hf_usb_length, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+ offset = dissect_usb_setup_generic(pinfo, setup_tree, tvb, offset, usb_conv_info);
} else {
/* Process ISO related fields (usbmon_packet.iso). The fields are
@@ -3300,12 +3303,7 @@ dissect_usb_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent,
offset = dissect_usb_bmrequesttype(setup_tree, tvb, offset, &type_2);
proto_tree_add_item(setup_tree, hf_usb_request, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
- proto_tree_add_item(setup_tree, hf_usb_value, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- proto_tree_add_item(setup_tree, hf_usb_index, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
- proto_tree_add_item(setup_tree, hf_usb_length, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset += 2;
+ offset = dissect_usb_setup_generic(pinfo, setup_tree, tvb, offset, usb_conv_info);
} else {
if (header_info & USB_HEADER_IS_LINUX) {
/* Skip setup/isochronous header - it's not applicable */