aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-usb-com.c
diff options
context:
space:
mode:
authorPascal Quantin <pascal.quantin@gmail.com>2013-10-27 21:14:22 +0000
committerPascal Quantin <pascal.quantin@gmail.com>2013-10-27 21:14:22 +0000
commit13b39aa30dd1bd305170cd750ff00efe6a0fa4ba (patch)
tree832ca006e2cc72dd363bbec9a34bbc0299025feb /epan/dissectors/packet-usb-com.c
parent3f26a0fc52ba1a4d95fb85bb4d2053bb823988af (diff)
From Michal Labedzki via https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=9333 :
USB: CDC: Decode ACM, CM and Union Functional Descriptors svn path=/trunk/; revision=52902
Diffstat (limited to 'epan/dissectors/packet-usb-com.c')
-rw-r--r--epan/dissectors/packet-usb-com.c92
1 files changed, 89 insertions, 3 deletions
diff --git a/epan/dissectors/packet-usb-com.c b/epan/dissectors/packet-usb-com.c
index 9d3c83a285..c95ed8695f 100644
--- a/epan/dissectors/packet-usb-com.c
+++ b/epan/dissectors/packet-usb-com.c
@@ -34,9 +34,22 @@ static int hf_usb_com_descriptor_subtype = -1;
static int hf_usb_com_descriptor_cdc = -1;
static int hf_usb_com_descriptor_payload = -1;
static int hf_usb_com_control_subclass = -1;
+static int hf_usb_com_capabilities = -1;
+static int hf_usb_com_descriptor_acm_capabilities_reserved = -1;
+static int hf_usb_com_descriptor_acm_capabilities_network_connection = -1;
+static int hf_usb_com_descriptor_acm_capabilities_send_break = -1;
+static int hf_usb_com_descriptor_acm_capabilities_line_and_state = -1;
+static int hf_usb_com_descriptor_acm_capabilities_comm_features = -1;
+static int hf_usb_com_control_interface = -1;
+static int hf_usb_com_subordinate_interface = -1;
+static int hf_usb_com_descriptor_cm_capabilities_reserved = -1;
+static int hf_usb_com_descriptor_cm_capabilities_call_managment_over_data_class_interface = -1;
+static int hf_usb_com_descriptor_cm_capabilities_call_managment = -1;
+static int hf_usb_com_descriptor_cm_data_interface = -1;
static int hf_usb_com_control_payload = -1;
static gint ett_usb_com = -1;
+static gint ett_usb_com_capabilities = -1;
static dissector_handle_t mbim_control_handle;
static dissector_handle_t mbim_descriptor_handle;
@@ -123,11 +136,16 @@ static const value_string usb_com_subclass_vals[] = {
};
value_string_ext ext_usb_com_subclass_vals = VALUE_STRING_EXT_INIT(usb_com_subclass_vals);
+void proto_register_usb_com(void);
+void proto_reg_handoff_usb_com(void);
+
static int
dissect_usb_com_descriptor(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
{
guint8 offset = 0, type, subtype;
proto_tree *subtree;
+ proto_tree *subtree_capabilities;
+ proto_item *subitem_capabilities;
proto_item *ti;
ti = proto_tree_add_text(tree, tvb, offset, -1, "COMMUNICATIONS DESCRIPTOR");
@@ -147,6 +165,37 @@ dissect_usb_com_descriptor(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
proto_tree_add_item(subtree, hf_usb_com_descriptor_cdc, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
break;
+ case 0x01:
+ subitem_capabilities = proto_tree_add_item(subtree, hf_usb_com_capabilities, tvb, 3, 1, ENC_LITTLE_ENDIAN);
+ subtree_capabilities = proto_item_add_subtree(subitem_capabilities, ett_usb_com_capabilities);
+
+ proto_tree_add_item(subtree_capabilities, hf_usb_com_descriptor_cm_capabilities_reserved, tvb, 3, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(subtree_capabilities, hf_usb_com_descriptor_cm_capabilities_call_managment_over_data_class_interface, tvb, 3, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(subtree_capabilities, hf_usb_com_descriptor_cm_capabilities_call_managment, tvb, 3, 1, ENC_LITTLE_ENDIAN);
+
+ proto_tree_add_item(subtree, hf_usb_com_descriptor_cm_data_interface, tvb, 4, 1, ENC_LITTLE_ENDIAN);
+ offset = 5;
+ break;
+ case 0x02:
+ subitem_capabilities = proto_tree_add_item(subtree, hf_usb_com_capabilities, tvb, 3, 1, ENC_LITTLE_ENDIAN);
+ subtree_capabilities = proto_item_add_subtree(subitem_capabilities, ett_usb_com_capabilities);
+
+ proto_tree_add_item(subtree_capabilities, hf_usb_com_descriptor_acm_capabilities_reserved, tvb, 3, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(subtree_capabilities, hf_usb_com_descriptor_acm_capabilities_network_connection, tvb, 3, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(subtree_capabilities, hf_usb_com_descriptor_acm_capabilities_send_break, tvb, 3, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(subtree_capabilities, hf_usb_com_descriptor_acm_capabilities_line_and_state, tvb, 3, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(subtree_capabilities, hf_usb_com_descriptor_acm_capabilities_comm_features, tvb, 3, 1, ENC_LITTLE_ENDIAN);
+ offset = 4;
+ break;
+ case 0x06:
+ offset = 3;
+ proto_tree_add_item(subtree, hf_usb_com_control_interface, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+ while (tvb_length_remaining(tvb,offset) > 0) {
+ proto_tree_add_item(subtree, hf_usb_com_subordinate_interface, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+ }
+ break;
case 0x1b:
case 0x1c:
offset = call_dissector_only(mbim_descriptor_handle, tvb, pinfo, subtree, NULL);
@@ -239,15 +288,52 @@ proto_register_usb_com(void)
{ "Payload", "usbcom.descriptor.payload", FT_BYTES, BASE_NONE,
NULL, 0, NULL, HFILL }},
{ &hf_usb_com_control_subclass,
- { "Subclass", "usbcom.control.subclass", FT_UINT8, BASE_HEX,
- VALS(usb_com_subclass_vals), 0, NULL, HFILL }},
+ { "Subclass", "usbcom.control.subclass", FT_UINT8, BASE_HEX|BASE_EXT_STRING,
+ &ext_usb_com_subclass_vals, 0, NULL, HFILL }},
+ { &hf_usb_com_capabilities,
+ { "bmCapabilities", "usbcom.descriptor.capabilities", FT_UINT8, BASE_HEX,
+ NULL, 0, NULL, HFILL }},
+ { &hf_usb_com_descriptor_acm_capabilities_reserved,
+ { "Reserved", "usbcom.descriptor.acm.capabilities.reserved", FT_UINT8, BASE_HEX,
+ NULL, 0xF0, NULL, HFILL }},
+ { &hf_usb_com_descriptor_acm_capabilities_network_connection,
+ { "Network_Connection", "usbcom.descriptor.acm.capabilities.network_connection", FT_BOOLEAN, 8,
+ &tfs_supported_not_supported, 0x08, NULL, HFILL }},
+ { &hf_usb_com_descriptor_acm_capabilities_send_break,
+ { "Send_Break", "usbcom.descriptor.acm.capabilities.network_connection", FT_BOOLEAN, 8,
+ &tfs_supported_not_supported, 0x04, NULL, HFILL }},
+ { &hf_usb_com_descriptor_acm_capabilities_line_and_state,
+ { "Line Requests and State Notification", "usbcom.descriptor.acm.capabilities.line_and_state", FT_BOOLEAN, 8,
+ &tfs_supported_not_supported, 0x02, NULL, HFILL }},
+ { &hf_usb_com_descriptor_acm_capabilities_comm_features,
+ { "Comm Features Combinations", "usbcom.descriptor.acm.capabilities.comm_features", FT_BOOLEAN, 8,
+ &tfs_supported_not_supported, 0x01, NULL, HFILL }},
+ { &hf_usb_com_control_interface,
+ { "bControlInterface", "usbcom.descriptor.control_interface", FT_UINT8, BASE_HEX,
+ NULL, 0, NULL, HFILL }},
+ { &hf_usb_com_subordinate_interface,
+ { "bSubordinateInterface", "usbcom.descriptor.subordinate_interface", FT_UINT8, BASE_HEX,
+ NULL, 0, NULL, HFILL }},
+ { &hf_usb_com_descriptor_cm_capabilities_reserved,
+ { "Reserved", "usbcom.descriptor.cm.capabilities.reserved", FT_UINT8, BASE_HEX,
+ NULL, 0xFC, NULL, HFILL }},
+ { &hf_usb_com_descriptor_cm_capabilities_call_managment_over_data_class_interface,
+ { "Call Managment over Data Class Interface", "usbcom.descriptor.cm.capabilities.call_managment_over_data_class_interface", FT_BOOLEAN, 8,
+ &tfs_supported_not_supported, 0x02, NULL, HFILL }},
+ { &hf_usb_com_descriptor_cm_capabilities_call_managment,
+ { "Call Managment", "usbcom.descriptor.cm.capabilities.call_managment", FT_BOOLEAN, 8,
+ &tfs_supported_not_supported, 0x01, NULL, HFILL }},
+ { &hf_usb_com_descriptor_cm_data_interface,
+ { "bDataInterface", "usbcom.descriptor.cm.data_interface", FT_UINT8, BASE_HEX,
+ NULL, 0, NULL, HFILL }},
{ &hf_usb_com_control_payload,
{ "Payload", "usbcom.control.payload", FT_BYTES, BASE_NONE,
NULL, 0, NULL, HFILL }}
};
static gint *usb_com_subtrees[] = {
- &ett_usb_com
+ &ett_usb_com,
+ &ett_usb_com_capabilities
};
proto_usb_com = proto_register_protocol("USB Communications and CDC Control", "USBCOM", "usbcom");