diff options
author | Sean O. Stalley <sean.stalley@intel.com> | 2014-06-04 14:26:17 -0700 |
---|---|---|
committer | Alexis La Goutte <alexis.lagoutte@gmail.com> | 2014-06-05 05:45:32 +0000 |
commit | eaa571a666a3d3241731cc019b4790cf58910162 (patch) | |
tree | 306dbbe359337ff042cc6ea0f228ddcacbeb220a /epan | |
parent | 653dd75483a68ca8793ccdb482668cad7dcf950e (diff) | |
download | wireshark-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.c | 52 |
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 */ |