From d3dbb2b33ac2d81d0cf82d40f12af8e5294eb4fa Mon Sep 17 00:00:00 2001 From: Pascal Quantin Date: Mon, 11 May 2015 23:24:05 +0200 Subject: USB COM: add dissection of ECM Management Element Notifications Change-Id: I9395c5e7974526d9be5cceca479e840dca5ff71e Reviewed-on: https://code.wireshark.org/review/8409 Reviewed-by: Pascal Quantin Reviewed-by: Michael Mann --- epan/dissectors/packet-usb-com.c | 167 ++++++++++++++++++++++++++++++++++----- 1 file changed, 146 insertions(+), 21 deletions(-) (limited to 'epan/dissectors/packet-usb-com.c') 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, ¬if_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"); -- cgit v1.2.3