aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-usb-com.c
diff options
context:
space:
mode:
authorPascal Quantin <pascal.quantin@gmail.com>2015-05-11 23:24:05 +0200
committerMichael Mann <mmann78@netscape.net>2015-05-12 11:35:19 +0000
commitd3dbb2b33ac2d81d0cf82d40f12af8e5294eb4fa (patch)
tree7ecc0146ce83a49f714f04dbeb52b194e9983bb8 /epan/dissectors/packet-usb-com.c
parent2693e1d1081ac8a5f3cf15b5961d0229775e25e6 (diff)
USB COM: add dissection of ECM Management Element Notifications
Change-Id: I9395c5e7974526d9be5cceca479e840dca5ff71e Reviewed-on: https://code.wireshark.org/review/8409 Reviewed-by: Pascal Quantin <pascal.quantin@gmail.com> Reviewed-by: Michael Mann <mmann78@netscape.net>
Diffstat (limited to 'epan/dissectors/packet-usb-com.c')
-rw-r--r--epan/dissectors/packet-usb-com.c167
1 files changed, 146 insertions, 21 deletions
diff --git a/epan/dissectors/packet-usb-com.c b/epan/dissectors/packet-usb-com.c
index a0e6402cda..15dc7c0d1b 100644
--- a/epan/dissectors/packet-usb-com.c
+++ b/epan/dissectors/packet-usb-com.c
@@ -37,6 +37,7 @@ static int hf_usb_com_control_value = -1;
static int hf_usb_com_control_index = -1;
static int hf_usb_com_control_length = -1;
static int hf_usb_com_control_response_code = -1;
+static int hf_usb_com_control_payload = -1;
static int hf_usb_com_get_ntb_params_length = -1;
static int hf_usb_com_get_ntb_params_ntb_formats_supported = -1;
static int hf_usb_com_get_ntb_params_ntb_formats_supported_16bit = -1;
@@ -71,13 +72,21 @@ 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_control_interface = -1;
+static int hf_usb_com_descriptor_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_capabilities_call_management_over_data_class_interface = -1;
+static int hf_usb_com_descriptor_cm_capabilities_call_management = -1;
static int hf_usb_com_descriptor_cm_data_interface = -1;
-static int hf_usb_com_control_payload = -1;
+static int hf_usb_com_interrupt_request_type = -1;
+static int hf_usb_com_interrupt_notif_code = -1;
+static int hf_usb_com_interrupt_value = -1;
+static int hf_usb_com_interrupt_value_nw_conn = -1;
+static int hf_usb_com_interrupt_index = -1;
+static int hf_usb_com_interrupt_length = -1;
+static int hf_usb_com_interrupt_dl_bitrate = -1;
+static int hf_usb_com_interrupt_ul_bitrate = -1;
+static int hf_usb_com_interrupt_payload = -1;
static gint ett_usb_com = -1;
static gint ett_usb_com_capabilities = -1;
@@ -286,6 +295,33 @@ static const value_string usb_com_crc_mode_vals[] = {
{0, NULL}
};
+#define NETWORK_CONNECTION 0x00
+#define RESPONSE_AVAILABLE 0x01
+#define AUX_JACK_HOOK_STATE 0x08
+#define RING_DETECT 0x09
+#define SERIAL_STATE 0x20
+#define CALL_STATE_CHANGE 0x28
+#define LINE_STATE_CHANGE 0x29
+#define CONNECTION_SPEED_CHANGE 0x2a
+
+static const value_string usb_com_interrupt_notif_code_vals[] = {
+ {NETWORK_CONNECTION, "NETWORK CONNECTION"},
+ {RESPONSE_AVAILABLE, "RESPONSE AVAILABLE"},
+ {AUX_JACK_HOOK_STATE, "AUX JACK HOOK STATE"},
+ {RING_DETECT, "RING DETECT"},
+ {SERIAL_STATE, "SERIAL STATE"},
+ {CALL_STATE_CHANGE, "CALL STATE CHANGE"},
+ {LINE_STATE_CHANGE, "LINE STATE CHANGE"},
+ {CONNECTION_SPEED_CHANGE, "CONNECTION SPEED CHANGE"},
+ {0, NULL}
+};
+
+static const value_string usb_com_interrupt_value_nw_conn_vals[] = {
+ {0, "Disconnect"},
+ {1, "Connected"},
+ {0, NULL}
+};
+
void proto_register_usb_com(void);
void proto_reg_handoff_usb_com(void);
@@ -318,8 +354,8 @@ dissect_usb_com_descriptor(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
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_capabilities, hf_usb_com_descriptor_cm_capabilities_call_management_over_data_class_interface, tvb, 3, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(subtree_capabilities, hf_usb_com_descriptor_cm_capabilities_call_management, 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;
@@ -337,10 +373,10 @@ dissect_usb_com_descriptor(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
break;
case 0x06:
offset = 3;
- proto_tree_add_item(subtree, hf_usb_com_control_interface, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(subtree, hf_usb_com_descriptor_control_interface, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
while (tvb_reported_length_remaining(tvb,offset) > 0) {
- proto_tree_add_item(subtree, hf_usb_com_subordinate_interface, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(subtree, hf_usb_com_descriptor_subordinate_interface, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
}
break;
@@ -566,6 +602,65 @@ dissect_usb_com_bulk(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *
return call_dissector_only(eth_withoutfcs_handle, tvb, pinfo, tree, NULL);
}
+static int
+dissect_usb_com_interrupt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
+{
+ proto_tree *subtree;
+ proto_item *it;
+ guint32 notif_code;
+ gint offset = 0;
+
+ col_set_str(pinfo->cinfo, COL_PROTOCOL, "USBCOM");
+
+ it = proto_tree_add_item(tree, proto_usb_com, tvb, 0, -1, ENC_NA);
+ subtree = proto_item_add_subtree(it, ett_usb_com);
+
+ proto_tree_add_item(subtree, hf_usb_com_interrupt_request_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset++;
+ proto_tree_add_item_ret_uint(subtree, hf_usb_com_interrupt_notif_code, tvb, offset, 1, ENC_LITTLE_ENDIAN, &notif_code);
+ offset++;
+ col_add_fstr(pinfo->cinfo, COL_INFO, "%s", val_to_str(notif_code, usb_com_interrupt_notif_code_vals, "Unknown type %x"));
+ switch (notif_code) {
+ case NETWORK_CONNECTION:
+ proto_tree_add_item(subtree, hf_usb_com_interrupt_value_nw_conn, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ proto_tree_add_item(subtree, hf_usb_com_interrupt_index, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ proto_tree_add_item(subtree, hf_usb_com_interrupt_length, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ break;
+ case RESPONSE_AVAILABLE:
+ proto_tree_add_item(subtree, hf_usb_com_interrupt_value, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ proto_tree_add_item(subtree, hf_usb_com_interrupt_index, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ proto_tree_add_item(subtree, hf_usb_com_interrupt_length, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ break;
+ case CONNECTION_SPEED_CHANGE:
+ proto_tree_add_item(subtree, hf_usb_com_interrupt_value, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ proto_tree_add_item(subtree, hf_usb_com_interrupt_index, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ proto_tree_add_item(subtree, hf_usb_com_interrupt_length, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ it = proto_tree_add_item(subtree, hf_usb_com_interrupt_dl_bitrate, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(it, " b/s");
+ offset += 4;
+ it = proto_tree_add_item(subtree, hf_usb_com_interrupt_ul_bitrate, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(it, " b/s");
+ offset += 4;
+ break;
+ default:
+ break;
+ }
+
+ if (tvb_reported_length_remaining(tvb, offset) > 0) {
+ proto_tree_add_item(subtree, hf_usb_com_interrupt_payload, tvb, offset, -1, ENC_NA);
+ }
+ return tvb_captured_length(tvb);
+}
+
void
proto_register_usb_com(void)
{
@@ -681,6 +776,9 @@ proto_register_usb_com(void)
{ &hf_usb_com_set_crc_mode_crc_mode,
{ "CRC Mode", "usbcom.control.set_crc_mode.crc_mode", FT_UINT16, BASE_HEX,
VALS(usb_com_crc_mode_vals), 0, NULL, HFILL }},
+ { &hf_usb_com_control_payload,
+ { "Payload", "usbcom.control.payload", FT_BYTES, BASE_NONE,
+ NULL, 0, NULL, HFILL }},
{ &hf_usb_com_capabilities,
{ "bmCapabilities", "usbcom.descriptor.capabilities", FT_UINT8, BASE_HEX,
NULL, 0, NULL, HFILL }},
@@ -699,26 +797,50 @@ proto_register_usb_com(void)
{ &hf_usb_com_descriptor_acm_capabilities_comm_features,
{ "Comm Features Combinations", "usbcom.descriptor.acm.capabilities.comm_features", FT_BOOLEAN, 8,
TFS(&tfs_supported_not_supported), 0x01, NULL, HFILL }},
- { &hf_usb_com_control_interface,
- { "bControlInterface", "usbcom.descriptor.control_interface", FT_UINT8, BASE_HEX,
+ { &hf_usb_com_descriptor_control_interface,
+ { "Control Interface", "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,
+ { &hf_usb_com_descriptor_subordinate_interface,
+ { "Subordinate Interface", "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,
+ { &hf_usb_com_descriptor_cm_capabilities_call_management_over_data_class_interface,
+ { "Call Management over Data Class Interface", "usbcom.descriptor.cm.capabilities.call_management_over_data_class_interface", FT_BOOLEAN, 8,
TFS(&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,
+ { &hf_usb_com_descriptor_cm_capabilities_call_management,
+ { "Call Management", "usbcom.descriptor.cm.capabilities.call_management", FT_BOOLEAN, 8,
TFS(&tfs_supported_not_supported), 0x01, NULL, HFILL }},
{ &hf_usb_com_descriptor_cm_data_interface,
- { "bDataInterface", "usbcom.descriptor.cm.data_interface", FT_UINT8, BASE_HEX,
+ { "Data Interface", "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,
+ { &hf_usb_com_interrupt_request_type,
+ { "Request Type", "usbcom.interrupt.request_type", FT_UINT8, BASE_HEX,
+ NULL, 0, NULL, HFILL }},
+ { &hf_usb_com_interrupt_notif_code,
+ { "Notification Code", "usbcom.interrupt.notification_code", FT_UINT8, BASE_HEX,
+ VALS(usb_com_interrupt_notif_code_vals), 0, NULL, HFILL }},
+ { &hf_usb_com_interrupt_value,
+ { "Value", "usbcom.interrupt.value", FT_UINT16, BASE_HEX,
+ NULL, 0, NULL, HFILL }},
+ { &hf_usb_com_interrupt_value_nw_conn,
+ { "Value", "usbcom.interrupt.value", FT_UINT16, BASE_HEX,
+ VALS(usb_com_interrupt_value_nw_conn_vals), 0, NULL, HFILL }},
+ { &hf_usb_com_interrupt_index,
+ { "Index", "usbcom.interrupt.index", FT_UINT16, BASE_DEC,
+ NULL, 0, NULL, HFILL }},
+ { &hf_usb_com_interrupt_length,
+ { "Length", "usbcom.interrupt.length", FT_UINT16, BASE_DEC,
+ NULL, 0, NULL, HFILL }},
+ { &hf_usb_com_interrupt_dl_bitrate,
+ { "DL Bitrate", "usbcom.interrupt.conn_speed_change.dl_bitrate", FT_UINT32, BASE_DEC,
+ NULL, 0, NULL, HFILL }},
+ { &hf_usb_com_interrupt_ul_bitrate,
+ { "UL Bitrate", "usbcom.interrupt.conn_speed_change.ul_bitrate", FT_UINT32, BASE_DEC,
+ NULL, 0, NULL, HFILL }},
+ { &hf_usb_com_interrupt_payload,
+ { "Payload", "usbcom.interrupt.payload", FT_BYTES, BASE_NONE,
NULL, 0, NULL, HFILL }}
};
@@ -736,7 +858,8 @@ proto_register_usb_com(void)
void
proto_reg_handoff_usb_com(void)
{
- dissector_handle_t usb_com_descriptor_handle, usb_com_control_handle, usb_com_bulk_handle;
+ dissector_handle_t usb_com_descriptor_handle, usb_com_control_handle,
+ usb_com_bulk_handle, usb_com_interrupt_handle;
usb_com_descriptor_handle = new_create_dissector_handle(dissect_usb_com_descriptor, proto_usb_com);
dissector_add_uint("usb.descriptor", IF_CLASS_COMMUNICATIONS, usb_com_descriptor_handle);
@@ -744,6 +867,8 @@ proto_reg_handoff_usb_com(void)
dissector_add_uint("usb.control", IF_CLASS_COMMUNICATIONS, usb_com_control_handle);
usb_com_bulk_handle = new_create_dissector_handle(dissect_usb_com_bulk, proto_usb_com);
dissector_add_uint("usb.bulk", IF_CLASS_CDC_DATA, usb_com_bulk_handle);
+ usb_com_interrupt_handle = new_create_dissector_handle(dissect_usb_com_interrupt, proto_usb_com);
+ dissector_add_uint("usb.interrupt", IF_CLASS_COMMUNICATIONS, usb_com_interrupt_handle);
mbim_control_handle = find_dissector("mbim.control");
mbim_descriptor_handle = find_dissector("mbim.descriptor");
mbim_bulk_handle = find_dissector("mbim.bulk");