diff options
author | Michael Mann <mmann78@netscape.net> | 2013-11-12 13:46:51 +0000 |
---|---|---|
committer | Michael Mann <mmann78@netscape.net> | 2013-11-12 13:46:51 +0000 |
commit | 76bfa2ce1af4867baf4f6990ac233d04a1b3af23 (patch) | |
tree | c665d826554ef5c3256b9a9b3fdc1fc9841ae56c /epan | |
parent | 2b729ba554b5b5681f2304d0a51b63d3b250a9c0 (diff) |
Remove usb_conv_info_t from packet_info and pass the data directly into the subdissectors. Bug 9413 (https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=9413)
svn path=/trunk/; revision=53274
Diffstat (limited to 'epan')
-rw-r--r-- | epan/dissectors/packet-hci_usb.c | 40 | ||||
-rw-r--r-- | epan/dissectors/packet-mbim.c | 11 | ||||
-rw-r--r-- | epan/dissectors/packet-rfid-pn532-hci.c | 9 | ||||
-rw-r--r-- | epan/dissectors/packet-rfid-pn532.c | 11 | ||||
-rw-r--r-- | epan/dissectors/packet-tfp.c | 45 | ||||
-rw-r--r-- | epan/dissectors/packet-usb-audio.c | 12 | ||||
-rw-r--r-- | epan/dissectors/packet-usb-ccid.c | 8 | ||||
-rw-r--r-- | epan/dissectors/packet-usb-com.c | 12 | ||||
-rw-r--r-- | epan/dissectors/packet-usb-hid.c | 9 | ||||
-rw-r--r-- | epan/dissectors/packet-usb-hub.c | 9 | ||||
-rw-r--r-- | epan/dissectors/packet-usb-masstorage.c | 40 | ||||
-rw-r--r-- | epan/dissectors/packet-usb-video.c | 39 | ||||
-rw-r--r-- | epan/dissectors/packet-usb.c | 131 | ||||
-rw-r--r-- | epan/dissectors/packet-usb.h | 13 | ||||
-rw-r--r-- | epan/packet_info.h | 1 |
15 files changed, 159 insertions, 231 deletions
diff --git a/epan/dissectors/packet-hci_usb.c b/epan/dissectors/packet-hci_usb.c index 2d96953ad5..6fdf2c08de 100644 --- a/epan/dissectors/packet-hci_usb.c +++ b/epan/dissectors/packet-hci_usb.c @@ -106,7 +106,7 @@ dissect_hci_usb(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) proto_tree *titem = NULL; proto_item *pitem = NULL; gint offset = 0; - usb_data_t *usb_data; + usb_conv_info_t *usb_conv_info = (usb_conv_info_t *)data; tvbuff_t *next_tvb = NULL; hci_data_t *hci_data; gint p2p_dir_save; @@ -121,12 +121,10 @@ dissect_hci_usb(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) col_set_str(pinfo->cinfo, COL_PROTOCOL, "HCI_USB"); - - usb_data = (usb_data_t *)data; - DISSECTOR_ASSERT(usb_data); + DISSECTOR_ASSERT(usb_conv_info); p2p_dir_save = pinfo->p2p_dir; - pinfo->p2p_dir = usb_data->direction; + pinfo->p2p_dir = usb_conv_info->direction; switch (pinfo->p2p_dir) { @@ -143,11 +141,11 @@ dissect_hci_usb(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) break; } - session_id = usb_data->bus_id << 16 | usb_data->device_address << 8 | ((pinfo->p2p_dir == P2P_DIR_RECV) ? 1 : 0 ) << 7 | usb_data->endpoint; + session_id = usb_conv_info->bus_id << 16 | usb_conv_info->device_address << 8 | ((pinfo->p2p_dir == P2P_DIR_RECV) ? 1 : 0 ) << 7 | usb_conv_info->endpoint; hci_data = (hci_data_t *) wmem_new(wmem_packet_scope(), hci_data_t); hci_data->interface_id = HCI_INTERFACE_USB; - hci_data->adapter_id = usb_data->bus_id << 8 | usb_data->device_address; + hci_data->adapter_id = usb_conv_info->bus_id << 8 | usb_conv_info->device_address; hci_data->chandle_to_bdaddr_table = chandle_to_bdaddr_table; hci_data->bdaddr_to_name_table = bdaddr_to_name_table; hci_data->localhost_bdaddr = localhost_bdaddr; @@ -156,7 +154,7 @@ dissect_hci_usb(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) pinfo->ptype = PT_BLUETOOTH; next_tvb = tvb_new_subset_remaining(tvb, offset); - if (!pinfo->fd->flags.visited && usb_data->endpoint <= 0x02) { + if (!pinfo->fd->flags.visited && usb_conv_info->endpoint <= 0x02) { fragment_info_t *fragment_info; fragment_info = (fragment_info_t *) wmem_tree_lookup32(fragment_info_table, session_id); @@ -169,12 +167,17 @@ dissect_hci_usb(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) } if (fragment_info->fragment_id == 0) { - if (usb_data->endpoint == 0x00) { + switch(usb_conv_info->endpoint) + { + case 0: fragment_info->remaining_length = tvb_get_guint8(tvb, offset + 2) + 3; - } else if (usb_data->endpoint == 0x01) { + break; + case 1: fragment_info->remaining_length = tvb_get_guint8(tvb, offset + 1) + 2; - } else if (usb_data->endpoint == 0x02) { + break; + case 2: fragment_info->remaining_length = tvb_get_letohs(tvb, offset + 2) + 4; + break; } } @@ -206,21 +209,26 @@ dissect_hci_usb(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) NULL, ttree); } - if (usb_data->endpoint == 0x00) { + switch(usb_conv_info->endpoint) + { + case 0: call_dissector_with_data(bthci_cmd_handle, next_tvb, pinfo, tree, hci_data); - } else if (usb_data->endpoint == 0x01) { + break; + case 1: call_dissector_with_data(bthci_evt_handle, next_tvb, pinfo, tree, hci_data); - } else if (usb_data->endpoint == 0x02) { + break; + case 2: call_dissector_with_data(bthci_acl_handle, next_tvb, pinfo, tree, hci_data); + break; } } else { pitem = proto_tree_add_item(ttree, hf_bthci_usb_packet_unknown_fragment, tvb, offset, -1, ENC_NA); PROTO_ITEM_SET_GENERATED(pitem); } - if (usb_data->endpoint == 0x03) { + if (usb_conv_info->endpoint == 0x03) { call_dissector_with_data(bthci_sco_handle, next_tvb, pinfo, tree, hci_data); - } else if (usb_data->endpoint > 0x03) { + } else if (usb_conv_info->endpoint > 0x03) { proto_tree_add_item(ttree, hf_bthci_usb_data, tvb, offset, -1, ENC_NA); } diff --git a/epan/dissectors/packet-mbim.c b/epan/dissectors/packet-mbim.c index e959bec4fe..f1c9e9662c 100644 --- a/epan/dissectors/packet-mbim.c +++ b/epan/dissectors/packet-mbim.c @@ -4609,16 +4609,15 @@ dissect_mbim_bulk(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *dat static gboolean dissect_mbim_bulk_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) { - usb_conv_info_t *usb_conv_info; + usb_conv_info_t *usb_conv_info = (usb_conv_info_t *)data; - usb_conv_info = (usb_conv_info_t *)pinfo->usb_conv_info; - if (usb_conv_info && - (usb_conv_info->interfaceClass != IF_CLASS_CDC_DATA) && - (usb_conv_info->interfaceClass != IF_CLASS_UNKNOWN)) { + if ((usb_conv_info == NULL) || + ((usb_conv_info->interfaceClass != IF_CLASS_CDC_DATA) && + (usb_conv_info->interfaceClass != IF_CLASS_UNKNOWN))) { return FALSE; } - if (dissect_mbim_bulk(tvb, pinfo, tree, data)) { + if (dissect_mbim_bulk(tvb, pinfo, tree, usb_conv_info)) { return TRUE; } return FALSE; diff --git a/epan/dissectors/packet-rfid-pn532-hci.c b/epan/dissectors/packet-rfid-pn532-hci.c index 3f5d528038..d1218291f3 100644 --- a/epan/dissectors/packet-rfid-pn532-hci.c +++ b/epan/dissectors/packet-rfid-pn532-hci.c @@ -76,10 +76,9 @@ dissect_pn532_hci(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *dat guint16 packet_code; guint16 length; guint8 checksum; - usb_data_t *usb_data; + usb_conv_info_t *usb_conv_info = (usb_conv_info_t *)data; - usb_data = (usb_data_t *) data; - DISSECTOR_ASSERT(usb_data); + DISSECTOR_ASSERT(usb_conv_info); length = tvb_length_remaining(tvb, offset); if (length < 6) return offset; @@ -136,7 +135,7 @@ dissect_pn532_hci(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *dat offset += 1; next_tvb = tvb_new_subset(tvb, offset, length, length); - call_dissector_with_data(pn532_handle, next_tvb, pinfo, tree, usb_data); + call_dissector_with_data(pn532_handle, next_tvb, pinfo, tree, usb_conv_info); offset += length; proto_tree_add_item(main_tree, hf_data_checksum, tvb, offset, 1, ENC_NA); @@ -163,7 +162,7 @@ dissect_pn532_hci(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *dat offset += 1; next_tvb = tvb_new_subset(tvb, offset, length, length); - call_dissector_with_data(pn532_handle, next_tvb, pinfo, tree, usb_data); + call_dissector_with_data(pn532_handle, next_tvb, pinfo, tree, usb_conv_info); offset += length; proto_tree_add_item(main_tree, hf_data_checksum, tvb, offset, 1, ENC_NA); diff --git a/epan/dissectors/packet-rfid-pn532.c b/epan/dissectors/packet-rfid-pn532.c index 4936a33163..2fe0972d37 100644 --- a/epan/dissectors/packet-rfid-pn532.c +++ b/epan/dissectors/packet-rfid-pn532.c @@ -633,7 +633,7 @@ dissect_pn532(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) tvbuff_t *next_tvb; gint offset = 0; command_data_t *command_data = NULL; - usb_data_t *usb_data; + usb_conv_info_t *usb_conv_info = (usb_conv_info_t *)data; wmem_tree_key_t key[5]; guint32 bus_id; guint32 device_address; @@ -657,12 +657,11 @@ dissect_pn532(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) col_set_str(pinfo->cinfo, COL_INFO, val_to_str_ext_const(cmd, &pn532_commands_ext, "Unknown command")); - usb_data = (usb_data_t *) data; - DISSECTOR_ASSERT(usb_data); + DISSECTOR_ASSERT(usb_conv_info); - bus_id = usb_data->bus_id; - device_address = usb_data->device_address; - endpoint = usb_data->endpoint; + bus_id = usb_conv_info->bus_id; + device_address = usb_conv_info->device_address; + endpoint = usb_conv_info->endpoint; k_bus_id = bus_id; k_device_address = device_address; diff --git a/epan/dissectors/packet-tfp.c b/epan/dissectors/packet-tfp.c index 599fcf4029..e8b50d85c8 100644 --- a/epan/dissectors/packet-tfp.c +++ b/epan/dissectors/packet-tfp.c @@ -226,14 +226,9 @@ dissect_tfp_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { byte_offset += byte_count_tfp_flags; - proto_tree_add_item(tfp_tree, - hf_tfp_payload, - tvb, - byte_offset, - -1, - ENC_NA); + proto_tree_add_item(tfp_tree, hf_tfp_payload, tvb, byte_offset, -1, ENC_NA); } - } + } } /* dissector function for dissecting TCP payloads */ @@ -241,32 +236,27 @@ static void dissect_tfp_tcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { col_set_str(pinfo->cinfo, COL_PROTOCOL, "TFP over TCP"); - col_clear(pinfo->cinfo, COL_INFO); + col_clear(pinfo->cinfo, COL_INFO); dissect_tfp_common(tvb, pinfo, tree); } /* dissector function for dissecting USB payloads */ -static void -dissect_tfp_usb(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) +static gboolean +dissect_tfp_bulk_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) { - usb_conv_info_t *usb_conv_info; - usb_conv_info = (usb_conv_info_t *)pinfo->usb_conv_info; + usb_conv_info_t *usb_conv_info = (usb_conv_info_t *)data; - if (usb_conv_info->deviceVendor == tfp_USB_VENDOR_ID) { + if ((usb_conv_info != NULL) && + (usb_conv_info->deviceVendor == tfp_USB_VENDOR_ID) && + (usb_conv_info->deviceProduct == tfp_USB_PRODUCT_ID)) { col_set_str(pinfo->cinfo, COL_PROTOCOL, "TFP over USB"); - if (usb_conv_info->deviceProduct == tfp_USB_PRODUCT_ID) { - col_clear(pinfo->cinfo, COL_INFO); - dissect_tfp_common(tvb, pinfo, tree); - } - else { - /* ToDo? Display "Unknown Product" ?? */ - } - return; - } - else { - return; /* Not tfp_USB_VENDOR_ID */ + col_clear(pinfo->cinfo, COL_INFO); + dissect_tfp_common(tvb, pinfo, tree); + return TRUE; } + + return FALSE; } /* protocol register function */ @@ -418,15 +408,12 @@ proto_register_tfp(void) void proto_reg_handoff_tfp(void) { - static dissector_handle_t - tfp_handle_tcp, - tfp_handle_usb; + dissector_handle_t tfp_handle_tcp; tfp_handle_tcp = create_dissector_handle(dissect_tfp_tcp, proto_tfp); - tfp_handle_usb = create_dissector_handle(dissect_tfp_usb, proto_tfp); dissector_add_uint("tcp.port", tfp_PORT, tfp_handle_tcp); - dissector_add_uint("usb.bulk", IF_CLASS_VENDOR_SPECIFIC, tfp_handle_usb); + heur_dissector_add("usb.bulk", dissect_tfp_bulk_heur, proto_tfp); } /* diff --git a/epan/dissectors/packet-usb-audio.c b/epan/dissectors/packet-usb-audio.c index bd57a79011..54ca0ca493 100644 --- a/epan/dissectors/packet-usb-audio.c +++ b/epan/dissectors/packet-usb-audio.c @@ -275,16 +275,14 @@ dissect_usb_audio_descriptor(tvbuff_t *tvb, packet_info *pinfo _U_, /* dissector for usb midi bulk data */ -static void -dissect_usb_audio_bulk(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree) +static int +dissect_usb_audio_bulk(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void* data) { - usb_conv_info_t *usb_conv_info; + usb_conv_info_t *usb_conv_info = (usb_conv_info_t *)data; proto_tree *tree = NULL; guint offset; guint length = tvb_length(tvb); - usb_conv_info = (usb_conv_info_t *)pinfo->usb_conv_info; - col_set_str(pinfo->cinfo, COL_PROTOCOL, "USBAUDIO"); if (parent_tree) @@ -311,6 +309,8 @@ dissect_usb_audio_bulk(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tre offset = 0; proto_tree_add_expert(tree, pinfo, &ei_usb_audio_undecoded, tvb, offset, length - offset); } + + return tvb_length(tvb); } static void @@ -391,7 +391,7 @@ proto_register_usb_audio(void) expert_register_field_array(expert_usb_audio, ei, array_length(ei)); register_init_routine(&midi_data_reassemble_init); - register_dissector("usbaudio", dissect_usb_audio_bulk, proto_usb_audio); + new_register_dissector("usbaudio", dissect_usb_audio_bulk, proto_usb_audio); } void diff --git a/epan/dissectors/packet-usb-ccid.c b/epan/dissectors/packet-usb-ccid.c index cf25932d21..bd528bb3e0 100644 --- a/epan/dissectors/packet-usb-ccid.c +++ b/epan/dissectors/packet-usb-ccid.c @@ -348,9 +348,9 @@ dissect_ccid(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) proto_tree *ccid_tree; guint8 cmd; tvbuff_t *next_tvb; - usb_data_t *usb_data = (usb_data_t *) data; + usb_conv_info_t *usb_conv_info = (usb_conv_info_t *)data; - DISSECTOR_ASSERT(usb_data); + DISSECTOR_ASSERT(usb_conv_info); col_set_str(pinfo->cinfo, COL_PROTOCOL, "USBCCID"); col_set_str(pinfo->cinfo, COL_INFO, "CCID Packet"); @@ -445,7 +445,7 @@ dissect_ccid(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) if (tvb_get_guint8(tvb, 15) == 0xD4) { /* Skip the 5 byte ACS Pseudo-Header */ - call_dissector_with_data(sub_handles[sub_selected], tvb_new_subset_remaining(tvb, 15), pinfo, tree, usb_data); + call_dissector_with_data(sub_handles[sub_selected], tvb_new_subset_remaining(tvb, 15), pinfo, tree, usb_conv_info); } else { @@ -496,7 +496,7 @@ dissect_ccid(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) /* Strip the ISO 7816 status word at the end, like we do in the PN532 dissector for FeliCa payloads... */ next_tvb= tvb_new_subset(tvb, 10, (tvb_get_guint8(tvb, 1) - 2), (tvb_get_guint8(tvb, 1) - 2)); - call_dissector_with_data(sub_handles[SUB_PN532_ACS_PSEUDO_APDU], next_tvb, pinfo, tree, usb_data); + call_dissector_with_data(sub_handles[SUB_PN532_ACS_PSEUDO_APDU], next_tvb, pinfo, tree, usb_conv_info); } /* Try to dissect responses to GSM SIM packets */ diff --git a/epan/dissectors/packet-usb-com.c b/epan/dissectors/packet-usb-com.c index c95ed8695f..a6ff849ff6 100644 --- a/epan/dissectors/packet-usb-com.c +++ b/epan/dissectors/packet-usb-com.c @@ -198,7 +198,7 @@ dissect_usb_com_descriptor(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, break; case 0x1b: case 0x1c: - offset = call_dissector_only(mbim_descriptor_handle, tvb, pinfo, subtree, NULL); + offset = call_dissector_only(mbim_descriptor_handle, tvb, pinfo, subtree, data); break; default: break; @@ -216,15 +216,13 @@ dissect_usb_com_descriptor(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, } static int -dissect_usb_com_control(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) +dissect_usb_com_control(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) { - usb_conv_info_t *usb_conv_info; + usb_conv_info_t *usb_conv_info = (usb_conv_info_t *)data; proto_tree *subtree; proto_item *ti; gint offset = 0; - usb_conv_info = (usb_conv_info_t *)pinfo->usb_conv_info; - col_set_str(pinfo->cinfo, COL_PROTOCOL, "USBCOM"); ti = proto_tree_add_item(tree, proto_usb_com, tvb, 0, -1, ENC_NA); @@ -254,9 +252,7 @@ dissect_usb_com_control(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, voi static int dissect_usb_com_bulk(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) { - usb_conv_info_t *usb_conv_info; - - usb_conv_info = (usb_conv_info_t *)pinfo->usb_conv_info; + usb_conv_info_t *usb_conv_info = (usb_conv_info_t *)data; if (usb_conv_info) { switch (usb_conv_info->interfaceProtocol) diff --git a/epan/dissectors/packet-usb-hid.c b/epan/dissectors/packet-usb-hid.c index 3a9bef7321..f30bb0fff3 100644 --- a/epan/dissectors/packet-usb-hid.c +++ b/epan/dissectors/packet-usb-hid.c @@ -766,20 +766,17 @@ static const value_string usb_hid_report_type_vals[] = { * and FALSE otherwise. */ static gint -dissect_usb_hid_control(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) +dissect_usb_hid_control(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) { gboolean is_request; - usb_conv_info_t *usb_conv_info; - usb_trans_info_t *usb_trans_info; + usb_conv_info_t *usb_conv_info = (usb_conv_info_t *)data; + usb_trans_info_t *usb_trans_info = usb_conv_info->usb_trans_info; int offset = 0; usb_setup_dissector dissector; const usb_setup_dissector_table_t *tmp; is_request = (pinfo->srcport==NO_ENDPOINT); - usb_conv_info = (usb_conv_info_t *)pinfo->usb_conv_info; - usb_trans_info = usb_conv_info->usb_trans_info; - /* See if we can find a class specific dissector for this request */ dissector = NULL; diff --git a/epan/dissectors/packet-usb-hub.c b/epan/dissectors/packet-usb-hub.c index 033c861394..c1540d98bc 100644 --- a/epan/dissectors/packet-usb-hub.c +++ b/epan/dissectors/packet-usb-hub.c @@ -609,20 +609,17 @@ static const usb_setup_dissector_table_t setup_dissectors[] = { * and FALSE otherwise. */ static gint -dissect_usb_hub_control(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) +dissect_usb_hub_control(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) { gboolean is_request; - usb_conv_info_t *usb_conv_info; - usb_trans_info_t *usb_trans_info; + usb_conv_info_t *usb_conv_info = (usb_conv_info_t *)data; + usb_trans_info_t *usb_trans_info = usb_conv_info->usb_trans_info; int offset = 0; usb_setup_dissector dissector; const usb_setup_dissector_table_t *tmp; is_request = (pinfo->srcport==NO_ENDPOINT); - usb_conv_info = (usb_conv_info_t *)pinfo->usb_conv_info; - usb_trans_info = usb_conv_info->usb_trans_info; - /* See if we can find a class specific dissector for this request */ dissector = NULL; diff --git a/epan/dissectors/packet-usb-masstorage.c b/epan/dissectors/packet-usb-masstorage.c index 9df6ecda6a..9afa7a7ecf 100644 --- a/epan/dissectors/packet-usb-masstorage.c +++ b/epan/dissectors/packet-usb-masstorage.c @@ -127,24 +127,19 @@ static const value_string setup_request_names_vals[] = { * and FALSE othervise. */ static gint -dissect_usb_ms_control(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) +dissect_usb_ms_control(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) { gboolean is_request; - usb_conv_info_t *usb_conv_info; - usb_trans_info_t *usb_trans_info; + usb_conv_info_t *usb_conv_info = (usb_conv_info_t *)data; + usb_trans_info_t *usb_trans_info = usb_conv_info->usb_trans_info; int offset=0; - usb_setup_dissector dissector; + usb_setup_dissector dissector = NULL; const usb_setup_dissector_table_t *tmp; is_request=(pinfo->srcport==NO_ENDPOINT); - usb_conv_info=(usb_conv_info_t *)pinfo->usb_conv_info; - usb_trans_info=usb_conv_info->usb_trans_info; - - /* See if we can find a class specific dissector for this request */ - dissector=NULL; for(tmp=setup_dissectors;tmp->dissector;tmp++){ if (tmp->request == usb_trans_info->setup.request){ dissector=tmp->dissector; @@ -176,10 +171,10 @@ dissect_usb_ms_control(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void /* dissector for mass storage bulk data */ -static void -dissect_usb_ms_bulk(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree) +static int +dissect_usb_ms_bulk(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void* data) { - usb_conv_info_t *usb_conv_info; + usb_conv_info_t *usb_conv_info = (usb_conv_info_t *)data; usb_ms_conv_info_t *usb_ms_conv_info; proto_tree *tree=NULL; guint32 signature=0; @@ -188,7 +183,6 @@ dissect_usb_ms_bulk(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree) itl_nexus_t *itl; itlq_nexus_t *itlq; - usb_conv_info=(usb_conv_info_t *)pinfo->usb_conv_info; /* verify that we do have a usb_ms_conv_info */ usb_ms_conv_info=(usb_ms_conv_info_t *)usb_conv_info->class_data; if(!usb_ms_conv_info){ @@ -295,7 +289,7 @@ dissect_usb_ms_bulk(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree) cdb_tvb=tvb_new_subset(tvb, offset, cdblen, cdbrlen); dissect_scsi_cdb(cdb_tvb, pinfo, parent_tree, SCSI_DEV_UNKNOWN, itlq, itl); } - return; + return tvb_length(tvb); } @@ -324,13 +318,13 @@ dissect_usb_ms_bulk(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree) itlq=(itlq_nexus_t *)wmem_tree_lookup32_le(usb_ms_conv_info->itlq, pinfo->fd->num); if(!itlq){ - return; + return tvb_length(tvb); } itlq->last_exchange_frame=pinfo->fd->num; itl=(itl_nexus_t *)wmem_tree_lookup32(usb_ms_conv_info->itl, itlq->lun); if(!itl){ - return; + return tvb_length(tvb); } if(!status){ @@ -339,7 +333,7 @@ dissect_usb_ms_bulk(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree) /* just send "check condition" */ dissect_scsi_rsp(tvb, pinfo, parent_tree, itlq, itl, 0x02); } - return; + return tvb_length(tvb); } /* @@ -347,20 +341,20 @@ dissect_usb_ms_bulk(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree) */ itlq=(itlq_nexus_t *)wmem_tree_lookup32_le(usb_ms_conv_info->itlq, pinfo->fd->num); if(!itlq){ - return; + return tvb_length(tvb); } itl=(itl_nexus_t *)wmem_tree_lookup32(usb_ms_conv_info->itl, itlq->lun); if(!itl){ - return; + return tvb_length(tvb); } dissect_scsi_payload(tvb, pinfo, parent_tree, is_request, itlq, itl, 0); - + return tvb_length(tvb); } static gboolean -dissect_usb_ms_bulk_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) +dissect_usb_ms_bulk_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data) { const gchar usbc[] = {0x55, 0x53, 0x42, 0x43}; const gchar usbs[] = {0x55, 0x53, 0x42, 0x53}; @@ -369,7 +363,7 @@ dissect_usb_ms_bulk_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, vo if (tvb_memeql(tvb, 0, usbc, sizeof(usbc)) == 0 || tvb_memeql(tvb, 0, usbs, sizeof(usbs)) == 0) { - dissect_usb_ms_bulk(tvb, pinfo, tree); + dissect_usb_ms_bulk(tvb, pinfo, tree, data); return TRUE; } @@ -447,7 +441,7 @@ proto_register_usb_ms(void) proto_register_field_array(proto_usb_ms, hf, array_length(hf)); proto_register_subtree_array(usb_ms_subtrees, array_length(usb_ms_subtrees)); - register_dissector("usbms", dissect_usb_ms_bulk, proto_usb_ms); + new_register_dissector("usbms", dissect_usb_ms_bulk, proto_usb_ms); } void diff --git a/epan/dissectors/packet-usb-video.c b/epan/dissectors/packet-usb-video.c index 355db03619..33f82c2150 100644 --- a/epan/dissectors/packet-usb-video.c +++ b/epan/dissectors/packet-usb-video.c @@ -891,7 +891,7 @@ dissect_usb_video_extension_unit(proto_tree *tree, tvbuff_t *tvb, int offset) */ static int dissect_usb_video_control_interface_descriptor(proto_tree *parent_tree, tvbuff_t *tvb, - guint8 descriptor_len, packet_info *pinfo) + guint8 descriptor_len, packet_info *pinfo, usb_conv_info_t *usb_conv_info) { video_conv_info_t *video_conv_info = NULL; video_entity_t *entity = NULL; @@ -1020,14 +1020,8 @@ dissect_usb_video_control_interface_descriptor(proto_tree *parent_tree, tvbuff_t if (entity_id != 0) proto_item_append_text(item, " (Entity %d)", entity_id); - if (subtype != VC_HEADER && pinfo->usb_conv_info) + if (subtype != VC_HEADER && usb_conv_info) { - /* Remember the entity ID / type for GET/SET transactions */ - usb_conv_info_t* usb_conv_info; - - /* This is the usb_conv_info of the CONTROL endpoint */ - usb_conv_info = (usb_conv_info_t*) pinfo->usb_conv_info; - /* Switch to the usb_conv_info of the Video Control interface */ usb_conv_info = get_usb_iface_conv_info(pinfo, usb_conv_info->interfaceNum); video_conv_info = (video_conv_info_t *)usb_conv_info->class_data; @@ -1470,13 +1464,13 @@ dissect_usb_video_endpoint_descriptor(proto_tree *parent_tree, tvbuff_t *tvb, * @return >0 amount of data in the descriptor */ static int -dissect_usb_vid_descriptor(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - void *data _U_) +dissect_usb_vid_descriptor(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) { int offset = 0; guint8 descriptor_len; guint8 descriptor_type; gint bytes_available; + usb_conv_info_t *usb_conv_info = (usb_conv_info_t *)data; tvbuff_t *desc_tvb; @@ -1493,14 +1487,11 @@ dissect_usb_vid_descriptor(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, } else if (descriptor_type == CS_INTERFACE) { - usb_conv_info_t *usb_conv_info; - - usb_conv_info = (usb_conv_info_t *)pinfo->usb_conv_info; if (usb_conv_info->interfaceSubclass == SC_VIDEOCONTROL) { offset = dissect_usb_video_control_interface_descriptor(tree, desc_tvb, descriptor_len, - pinfo); + pinfo, usb_conv_info); } else if (usb_conv_info->interfaceSubclass == SC_VIDEOSTREAMING) { @@ -1997,22 +1988,16 @@ static const value_string setup_request_names_vals[] = { * @return >0 amount of data in the descriptor */ static int -dissect_usb_vid_control(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) +dissect_usb_vid_control(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) { - gboolean is_request; - usb_conv_info_t *usb_conv_info; - usb_trans_info_t *usb_trans_info; + gboolean is_request = (pinfo->srcport == NO_ENDPOINT); + usb_conv_info_t *usb_conv_info = (usb_conv_info_t *)data; + usb_trans_info_t *usb_trans_info = usb_conv_info->usb_trans_info; int offset = 0; - usb_setup_dissector dissector; + usb_setup_dissector dissector = NULL; const usb_setup_dissector_table_t *tmp; - is_request = (pinfo->srcport == NO_ENDPOINT); - - usb_conv_info = (usb_conv_info_t *)pinfo->usb_conv_info; - usb_trans_info = usb_conv_info->usb_trans_info; - /* See if we can find a class specific dissector for this request */ - dissector = NULL; for (tmp=setup_dissectors; tmp->dissector; tmp++) { if (tmp->request == usb_trans_info->setup.request) @@ -2054,13 +2039,13 @@ dissect_usb_vid_control(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, voi * @return >0 amount of data in the descriptor */ static int -dissect_usb_vid_interrupt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) +dissect_usb_vid_interrupt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) { usb_conv_info_t *usb_conv_info; gint bytes_available; int offset = 0; - usb_conv_info = (usb_conv_info_t *)pinfo->usb_conv_info; + usb_conv_info = (usb_conv_info_t *)data; bytes_available = tvb_length_remaining(tvb, offset); col_set_str(pinfo->cinfo, COL_PROTOCOL, "USBVIDEO"); diff --git a/epan/dissectors/packet-usb.c b/epan/dissectors/packet-usb.c index 14b24cd654..2c15e6a7d8 100644 --- a/epan/dissectors/packet-usb.c +++ b/epan/dissectors/packet-usb.c @@ -1124,8 +1124,7 @@ dissect_usb_setup_clear_feature_request(packet_info *pinfo _U_, proto_tree *tree tvbuff_t *tvb, int offset, usb_trans_info_t *usb_trans_info _U_, usb_conv_info_t *usb_conv_info _U_, - guint bus_id _U_, guint device_address _U_, - usb_data_t *usb_data _U_) + guint bus_id _U_, guint device_address _U_) { /* feature selector */ proto_tree_add_item(tree, hf_usb_wFeatureSelector, tvb, offset, 2, ENC_LITTLE_ENDIAN); @@ -1148,8 +1147,7 @@ dissect_usb_setup_clear_feature_response(packet_info *pinfo _U_, proto_tree *tre tvbuff_t *tvb _U_, int offset, usb_trans_info_t *usb_trans_info _U_, usb_conv_info_t *usb_conv_info _U_, - guint bus_id _U_, guint device_address _U_, - usb_data_t *usb_data _U_) + guint bus_id _U_, guint device_address _U_) { return offset; } @@ -1167,8 +1165,7 @@ dissect_usb_setup_get_configuration_response(packet_info *pinfo _U_, proto_tree tvbuff_t *tvb _U_, int offset, usb_trans_info_t *usb_trans_info _U_, usb_conv_info_t *usb_conv_info _U_, - guint bus_id _U_, guint device_address _U_, - usb_data_t *usb_data _U_) + guint bus_id _U_, guint device_address _U_) { proto_tree_add_item(tree, hf_usb_bConfigurationValue, tvb, offset, 1, ENC_LITTLE_ENDIAN); offset += 1; @@ -1299,7 +1296,7 @@ static int dissect_usb_device_descriptor(packet_info *pinfo, proto_tree *parent_tree, tvbuff_t *tvb, int offset, usb_trans_info_t *usb_trans_info _U_, - guint bus_id, guint device_address) + guint bus_id, guint device_address, usb_conv_info_t *usb_conv_info) { proto_item *item = NULL; proto_tree *tree = NULL; @@ -1310,7 +1307,6 @@ dissect_usb_device_descriptor(packet_info *pinfo, proto_tree *parent_tree, guint16 vendor_id; guint32 product; guint16 product_id; - usb_conv_info_t *usb_conv_info; guint8 *field_description; gint field_description_length; header_field_info *hfi; @@ -1320,8 +1316,6 @@ dissect_usb_device_descriptor(packet_info *pinfo, proto_tree *parent_tree, tree = proto_item_add_subtree(item, ett_descriptor_device); } - usb_conv_info=(usb_conv_info_t *)pinfo->usb_conv_info; - dissect_usb_descriptor_header(tree, tvb, offset, NULL); offset += 2; @@ -1834,7 +1828,7 @@ static int dissect_usb_configuration_descriptor(packet_info *pinfo _U_, proto_tree *parent_tree, tvbuff_t *tvb, int offset, usb_trans_info_t *usb_trans_info, - usb_conv_info_t *usb_conv_info, usb_data_t *usb_data) + usb_conv_info_t *usb_conv_info) { proto_item *item = NULL; proto_tree *tree = NULL; @@ -1940,7 +1934,7 @@ dissect_usb_configuration_descriptor(packet_info *pinfo _U_, proto_tree *parent_ break; default: next_tvb = tvb_new_subset(tvb, offset, next_len, next_len); - if (dissector_try_uint_new(usb_descriptor_dissector_table, usb_conv_info->interfaceClass, next_tvb, pinfo, parent_tree, TRUE, usb_data)) { + if (dissector_try_uint_new(usb_descriptor_dissector_table, usb_conv_info->interfaceClass, next_tvb, pinfo, parent_tree, TRUE, usb_conv_info)) { offset += next_len; } else { offset = dissect_usb_unknown_descriptor(pinfo, parent_tree, tvb, offset, usb_trans_info, usb_conv_info); @@ -1975,8 +1969,7 @@ dissect_usb_setup_get_descriptor_request(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset, usb_trans_info_t *usb_trans_info, usb_conv_info_t *usb_conv_info _U_, - guint bus_id _U_, guint device_address _U_, - usb_data_t *usb_data _U_) + guint bus_id _U_, guint device_address _U_) { /* descriptor index */ proto_tree_add_item(tree, hf_usb_descriptor_index, tvb, offset, 1, ENC_LITTLE_ENDIAN); @@ -2006,8 +1999,7 @@ dissect_usb_setup_get_descriptor_response(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset, usb_trans_info_t *usb_trans_info, usb_conv_info_t *usb_conv_info, - guint bus_id, guint device_address, - usb_data_t *usb_data) + guint bus_id, guint device_address) { col_append_fstr(pinfo->cinfo, COL_INFO, " %s", @@ -2015,10 +2007,10 @@ dissect_usb_setup_get_descriptor_response(packet_info *pinfo, proto_tree *tree, switch(usb_trans_info->u.get_descriptor.type) { case USB_DT_DEVICE: - offset = dissect_usb_device_descriptor(pinfo, tree, tvb, offset, usb_trans_info, bus_id, device_address); + offset = dissect_usb_device_descriptor(pinfo, tree, tvb, offset, usb_trans_info, bus_id, device_address, usb_conv_info); break; case USB_DT_CONFIG: - offset = dissect_usb_configuration_descriptor(pinfo, tree, tvb, offset, usb_trans_info, usb_conv_info, usb_data); + offset = dissect_usb_configuration_descriptor(pinfo, tree, tvb, offset, usb_trans_info, usb_conv_info); break; case USB_DT_STRING: offset = dissect_usb_string_descriptor(pinfo, tree, tvb, offset, usb_trans_info, usb_conv_info); @@ -2061,8 +2053,7 @@ dissect_usb_setup_get_interface_request(packet_info *pinfo _U_, proto_tree *tree tvbuff_t *tvb, int offset, usb_trans_info_t *usb_trans_info _U_, usb_conv_info_t *usb_conv_info _U_, - guint bus_id _U_, guint device_address _U_, - usb_data_t *usb_data _U_) + guint bus_id _U_, guint device_address _U_) { /* zero */ proto_tree_add_item(tree, hf_usb_value, tvb, offset, 2, ENC_LITTLE_ENDIAN); @@ -2084,8 +2075,7 @@ dissect_usb_setup_get_interface_response(packet_info *pinfo _U_, proto_tree *tre tvbuff_t *tvb, int offset, usb_trans_info_t *usb_trans_info _U_, usb_conv_info_t *usb_conv_info _U_, - guint bus_id _U_, guint device_address _U_, - usb_data_t *usb_data _U_) + guint bus_id _U_, guint device_address _U_) { /* alternate setting */ proto_tree_add_item(tree, hf_usb_bAlternateSetting, tvb, offset, 1, ENC_LITTLE_ENDIAN); @@ -2107,8 +2097,7 @@ dissect_usb_setup_get_status_request(packet_info *pinfo _U_, proto_tree *tree, tvbuff_t *tvb, int offset, usb_trans_info_t *usb_trans_info _U_, usb_conv_info_t *usb_conv_info _U_, - guint bus_id _U_, guint device_address _U_, - usb_data_t *usb_data _U_) + guint bus_id _U_, guint device_address _U_) { /* zero */ proto_tree_add_item(tree, hf_usb_value, tvb, offset, 2, ENC_LITTLE_ENDIAN); @@ -2131,8 +2120,7 @@ dissect_usb_setup_get_status_response(packet_info *pinfo _U_, proto_tree *tree, tvbuff_t *tvb, int offset, usb_trans_info_t *usb_trans_info _U_, usb_conv_info_t *usb_conv_info _U_, - guint bus_id _U_, guint device_address _U_, - usb_data_t *usb_data _U_) + guint bus_id _U_, guint device_address _U_) { /* status */ /* XXX - show bits */ @@ -2155,8 +2143,7 @@ dissect_usb_setup_set_address_request(packet_info *pinfo _U_, proto_tree *tree, tvbuff_t *tvb, int offset, usb_trans_info_t *usb_trans_info _U_, usb_conv_info_t *usb_conv_info _U_, - guint bus_id _U_, guint device_address _U_, - usb_data_t *usb_data _U_) + guint bus_id _U_, guint device_address _U_) { /* device address */ proto_tree_add_item(tree, hf_usb_device_address, tvb, offset, 2, ENC_LITTLE_ENDIAN); @@ -2178,8 +2165,7 @@ dissect_usb_setup_set_address_response(packet_info *pinfo _U_, proto_tree *tree tvbuff_t *tvb _U_, int offset, usb_trans_info_t *usb_trans_info _U_, usb_conv_info_t *usb_conv_info _U_, - guint bus_id _U_, guint device_address _U_, - usb_data_t *usb_data _U_) + guint bus_id _U_, guint device_address _U_) { return offset; } @@ -2197,8 +2183,7 @@ dissect_usb_setup_set_configuration_request(packet_info *pinfo _U_, proto_tree * tvbuff_t *tvb, int offset, usb_trans_info_t *usb_trans_info _U_, usb_conv_info_t *usb_conv_info _U_, - guint bus_id _U_, guint device_address _U_, - usb_data_t *usb_data _U_) + guint bus_id _U_, guint device_address _U_) { /* configuration value */ proto_tree_add_item(tree, hf_usb_bConfigurationValue, tvb, offset, 1, ENC_LITTLE_ENDIAN); @@ -2220,8 +2205,7 @@ dissect_usb_setup_set_configuration_response(packet_info *pinfo _U_, proto_tree tvbuff_t *tvb _U_, int offset, usb_trans_info_t *usb_trans_info _U_, usb_conv_info_t *usb_conv_info _U_, - guint bus_id _U_, guint device_address _U_, - usb_data_t *usb_data _U_) + guint bus_id _U_, guint device_address _U_) { return offset; } @@ -2239,8 +2223,7 @@ dissect_usb_setup_set_feature_request(packet_info *pinfo _U_, proto_tree *tree, tvbuff_t *tvb, int offset, usb_trans_info_t *usb_trans_info _U_, usb_conv_info_t *usb_conv_info _U_, - guint bus_id _U_, guint device_address _U_, - usb_data_t *usb_data _U_) + guint bus_id _U_, guint device_address _U_) { /* feature selector */ proto_tree_add_item(tree, hf_usb_wFeatureSelector, tvb, offset, 2, ENC_LITTLE_ENDIAN); @@ -2263,8 +2246,7 @@ dissect_usb_setup_set_feature_response(packet_info *pinfo _U_, proto_tree *tree tvbuff_t *tvb _U_, int offset, usb_trans_info_t *usb_trans_info _U_, usb_conv_info_t *usb_conv_info _U_, - guint bus_id _U_, guint device_address _U_, - usb_data_t *usb_data _U_) + guint bus_id _U_, guint device_address _U_) { return offset; } @@ -2282,8 +2264,7 @@ dissect_usb_setup_set_interface_request(packet_info *pinfo _U_, proto_tree *tree tvbuff_t *tvb, int offset, usb_trans_info_t *usb_trans_info _U_, usb_conv_info_t *usb_conv_info _U_, - guint bus_id _U_, guint device_address _U_, - usb_data_t *usb_data _U_) + guint bus_id _U_, guint device_address _U_) { /* alternate setting */ proto_tree_add_item(tree, hf_usb_bAlternateSetting, tvb, offset, 1, ENC_LITTLE_ENDIAN); @@ -2305,8 +2286,7 @@ dissect_usb_setup_set_interface_response(packet_info *pinfo _U_, proto_tree *tre tvbuff_t *tvb _U_, int offset, usb_trans_info_t *usb_trans_info _U_, usb_conv_info_t *usb_conv_info _U_, - guint bus_id _U_, guint device_address _U_, - usb_data_t *usb_data _U_) + guint bus_id _U_, guint device_address _U_) { return offset; } @@ -2324,8 +2304,7 @@ dissect_usb_setup_synch_frame_request(packet_info *pinfo _U_, proto_tree *tree, tvbuff_t *tvb, int offset, usb_trans_info_t *usb_trans_info _U_, usb_conv_info_t *usb_conv_info _U_, - guint bus_id _U_, guint device_address _U_, - usb_data_t *usb_data _U_) + guint bus_id _U_, guint device_address _U_) { /* zero */ proto_tree_add_item(tree, hf_usb_value, tvb, offset, 2, ENC_LITTLE_ENDIAN); @@ -2348,8 +2327,7 @@ dissect_usb_setup_synch_frame_response(packet_info *pinfo _U_, proto_tree *tree tvbuff_t *tvb _U_, int offset, usb_trans_info_t *usb_trans_info _U_, usb_conv_info_t *usb_conv_info _U_, - guint bus_id _U_, guint device_address _U_, - usb_data_t *usb_data _U_) + guint bus_id _U_, guint device_address _U_) { /* frame number */ proto_tree_add_item(tree, hf_usb_wFrameNumber, tvb, offset, 2, ENC_LITTLE_ENDIAN); @@ -2363,8 +2341,7 @@ typedef int (*usb_setup_dissector)(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset, usb_trans_info_t *usb_trans_info, usb_conv_info_t *usb_conv_info, - guint bus_id, guint device_address, - usb_data_t *usb_data); + guint bus_id, guint device_address); typedef struct _usb_setup_dissector_table_t { guint8 request; @@ -2647,7 +2624,6 @@ dissect_usb_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent, usb_tap_data_t *tap_data; guint bus_id = 0; guint device_address = 0; - usb_data_t *usb_data; tvbuff_t *next_tvb = NULL; col_set_str(pinfo->cinfo, COL_PROTOCOL, "USB"); @@ -2716,17 +2692,6 @@ dissect_usb_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent, return; } - usb_data = wmem_new(wmem_file_scope(), usb_data_t); - usb_data->bus_id = bus_id; - usb_data->device_address = device_address; - usb_data->endpoint = endpoint; - - if (endpoint_with_dir & URB_TRANSFER_IN) { - usb_data->direction = P2P_DIR_RECV; - } else { - usb_data->direction = P2P_DIR_SENT; - } - /* Set up addresses and ports. */ if (is_request) { src_addr.device = 0xffffffff; @@ -2751,8 +2716,16 @@ dissect_usb_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent, conversation = get_usb_conversation(pinfo, &pinfo->src, &pinfo->dst, pinfo->srcport, pinfo->destport); usb_conv_info = get_usb_conv_info(conversation); - pinfo->usb_conv_info = usb_conv_info; + usb_conv_info->bus_id = bus_id; + usb_conv_info->device_address = device_address; + usb_conv_info->endpoint = endpoint; + + if (endpoint_with_dir & URB_TRANSFER_IN) { + usb_conv_info->direction = P2P_DIR_RECV; + } else { + usb_conv_info->direction = P2P_DIR_SENT; + } /* request/response matching so we can keep track of transaction specific * data. @@ -2835,12 +2808,11 @@ dissect_usb_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent, } if (tvb_reported_length_remaining(tvb, offset)) { - pinfo->usb_conv_info = usb_conv_info; next_tvb = tvb_new_subset_remaining(tvb, offset); - if (try_heuristics && dissector_try_heuristic(heur_bulk_subdissector_list, next_tvb, pinfo, parent, NULL)) { + if (try_heuristics && dissector_try_heuristic(heur_bulk_subdissector_list, next_tvb, pinfo, parent, usb_conv_info)) { return; } - else if (dissector_try_uint_new(usb_bulk_dissector_table, usb_conv_info->interfaceClass, next_tvb, pinfo, parent, TRUE, usb_data)) { + else if (dissector_try_uint_new(usb_bulk_dissector_table, usb_conv_info->interfaceClass, next_tvb, pinfo, parent, TRUE, usb_conv_info)) { return; } } @@ -2867,12 +2839,11 @@ dissect_usb_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent, } if (tvb_reported_length_remaining(tvb, offset)) { - pinfo->usb_conv_info = usb_conv_info; next_tvb = tvb_new_subset_remaining(tvb, offset); - if (try_heuristics && dissector_try_heuristic(heur_interrupt_subdissector_list, next_tvb, pinfo, parent, NULL)) { + if (try_heuristics && dissector_try_heuristic(heur_interrupt_subdissector_list, next_tvb, pinfo, parent, usb_conv_info)) { return; } - else if (dissector_try_uint_new(usb_interrupt_dissector_table, usb_conv_info->interfaceClass, next_tvb, pinfo, parent, TRUE, usb_data)) { + else if (dissector_try_uint_new(usb_interrupt_dissector_table, usb_conv_info->interfaceClass, next_tvb, pinfo, parent, TRUE, usb_conv_info)) { return; } } @@ -2933,7 +2904,7 @@ dissect_usb_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent, if (dissector) { offset = dissector(pinfo, setup_tree, tvb, offset, usb_trans_info, - usb_conv_info, bus_id, device_address, usb_data); + usb_conv_info, bus_id, device_address); } else { proto_tree_add_item(setup_tree, hf_usb_value, tvb, offset, 2, ENC_LITTLE_ENDIAN); offset += 2; @@ -2950,7 +2921,6 @@ dissect_usb_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent, guint8 interface_num = usb_trans_info->setup.wIndex & 0xff; usb_conv_info = get_usb_iface_conv_info(pinfo, interface_num); usb_conv_info->usb_trans_info = usb_trans_info; - pinfo->usb_conv_info = usb_conv_info; } else if (USB_RECIPIENT(usb_trans_info->setup.requesttype) == RQT_SETUP_RECIPIENT_ENDPOINT) { static address endpoint_addr; endpoint = usb_trans_info->setup.wIndex & 0x0f; @@ -2961,7 +2931,6 @@ dissect_usb_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent, conversation = get_usb_conversation(pinfo, &pinfo->src, &endpoint_addr, pinfo->srcport, dst_endpoint); usb_conv_info = get_usb_conv_info(conversation); usb_conv_info->usb_trans_info = usb_trans_info; - pinfo->usb_conv_info = usb_conv_info; } tap_data->conv_info = usb_conv_info; @@ -2973,10 +2942,10 @@ dissect_usb_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent, /* Try to find a class specific dissector */ next_tvb = tvb_new_subset_remaining(tvb, offset); - if (try_heuristics && dissector_try_heuristic(heur_control_subdissector_list, next_tvb, pinfo, setup_tree, NULL)) { + if (try_heuristics && dissector_try_heuristic(heur_control_subdissector_list, next_tvb, pinfo, setup_tree, usb_conv_info)) { return; } - if (dissector_try_uint_new(usb_control_dissector_table, usb_conv_info->interfaceClass, next_tvb, pinfo, setup_tree, TRUE, usb_data)) { + if (dissector_try_uint_new(usb_control_dissector_table, usb_conv_info->interfaceClass, next_tvb, pinfo, setup_tree, TRUE, usb_conv_info)) { return; } /* Else no class dissector, just display generic fields */ @@ -3018,10 +2987,10 @@ dissect_usb_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent, if (tvb_reported_length_remaining(tvb, offset) != 0) { next_tvb = tvb_new_subset_remaining(tvb, offset); - if (try_heuristics && dissector_try_heuristic(heur_control_subdissector_list, next_tvb, pinfo, parent, NULL)) { + if (try_heuristics && dissector_try_heuristic(heur_control_subdissector_list, next_tvb, pinfo, parent, usb_conv_info)) { return; } - if (dissector_try_uint_new(usb_control_dissector_table, usb_conv_info->interfaceClass, next_tvb, pinfo, parent, TRUE, usb_data)) { + if (dissector_try_uint_new(usb_control_dissector_table, usb_conv_info->interfaceClass, next_tvb, pinfo, parent, TRUE, usb_conv_info)) { return; } } @@ -3040,7 +3009,6 @@ dissect_usb_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent, guint8 interface_num = usb_trans_info->setup.wIndex & 0xff; usb_conv_info = get_usb_iface_conv_info(pinfo, interface_num); usb_conv_info->usb_trans_info = usb_trans_info; - pinfo->usb_conv_info = usb_conv_info; } else if (USB_RECIPIENT(usb_trans_info->setup.requesttype) == RQT_SETUP_RECIPIENT_ENDPOINT) { static address endpoint_addr; endpoint = usb_trans_info->setup.wIndex & 0x0f; @@ -3051,7 +3019,6 @@ dissect_usb_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent, conversation = get_usb_conversation(pinfo, &endpoint_addr, &pinfo->dst, src_endpoint, pinfo->destport); usb_conv_info = get_usb_conv_info(conversation); usb_conv_info->usb_trans_info = usb_trans_info; - pinfo->usb_conv_info = usb_conv_info; } } } @@ -3085,10 +3052,10 @@ dissect_usb_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent, /* Try to find a class specific dissector */ next_tvb = tvb_new_subset_remaining(tvb, offset); - if (try_heuristics && dissector_try_heuristic(heur_control_subdissector_list, next_tvb, pinfo, parent, NULL)) { + if (try_heuristics && dissector_try_heuristic(heur_control_subdissector_list, next_tvb, pinfo, parent, usb_conv_info)) { return; } - if (dissector_try_uint_new(usb_control_dissector_table, usb_conv_info->interfaceClass, next_tvb, pinfo, parent, TRUE, usb_data)) { + if (dissector_try_uint_new(usb_control_dissector_table, usb_conv_info->interfaceClass, next_tvb, pinfo, parent, TRUE, usb_conv_info)) { return; } @@ -3114,7 +3081,7 @@ dissect_usb_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent, if (dissector) { offset = dissector(pinfo, parent, tvb, offset, usb_conv_info->usb_trans_info, - usb_conv_info, bus_id, device_address, usb_data); + usb_conv_info, bus_id, device_address); } else { if (tvb_reported_length_remaining(tvb, offset) != 0) { proto_tree_add_text(parent, tvb, offset, -1, "CONTROL response data"); @@ -3394,7 +3361,7 @@ dissect_usb_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent, next_tvb = tvb_new_subset_remaining(tvb, offset); - if (!dissector_try_uint_new(device_to_dissector, (guint32) (bus_id << 8 | device_address), next_tvb, pinfo, parent, FALSE, usb_data)) { + if (!dissector_try_uint_new(device_to_dissector, (guint32) (bus_id << 8 | device_address), next_tvb, pinfo, parent, FALSE, usb_conv_info)) { wmem_tree_key_t key[4]; guint32 k_frame_number; guint32 k_device_address; @@ -3417,7 +3384,7 @@ dissect_usb_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent, device_protocol_data = (device_protocol_data_t *)wmem_tree_lookup32_array_le(device_to_protocol_table, key); if (device_protocol_data && device_protocol_data->bus_id == bus_id && device_protocol_data->device_address == device_address && - dissector_try_uint_new(protocol_to_dissector, (guint32) device_protocol_data->protocol, next_tvb, pinfo, parent, FALSE, usb_data)) { + dissector_try_uint_new(protocol_to_dissector, (guint32) device_protocol_data->protocol, next_tvb, pinfo, parent, FALSE, usb_conv_info)) { offset += tvb_length(next_tvb); } else { device_product_data_t *device_product_data; @@ -3426,7 +3393,7 @@ dissect_usb_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent, if (device_product_data && device_product_data->bus_id == bus_id && device_product_data->device_address == device_address && dissector_try_uint_new(product_to_dissector, (guint32) (device_product_data->vendor << 16 | device_product_data->product), - next_tvb, pinfo, parent, FALSE, usb_data)) { + next_tvb, pinfo, parent, FALSE, usb_conv_info)) { offset += tvb_length(next_tvb); } } diff --git a/epan/dissectors/packet-usb.h b/epan/dissectors/packet-usb.h index 16d52148be..19d0afbeab 100644 --- a/epan/dissectors/packet-usb.h +++ b/epan/dissectors/packet-usb.h @@ -79,14 +79,21 @@ typedef struct _usb_trans_info_t { /* Conversation Structure * there is one such structure for each device/endpoint conversation */ struct _usb_conv_info_t { + guint16 bus_id; + guint8 device_address; + guint8 endpoint; + gint direction; + guint16 interfaceClass; /* Interface Descriptor - class */ guint16 interfaceSubclass; /* Interface Descriptor - subclass */ guint16 interfaceProtocol; /* Interface Descriptor - protocol */ guint8 interfaceNum; /* Most recent interface number */ + guint16 deviceVendor; /* Device Descriptor - USB Vendor ID */ guint32 deviceProduct; /* Device Descriptor - USB Product ID - MSBs only for encoding unknown */ wmem_tree_t *transactions; usb_trans_info_t *usb_trans_info; /* pointer to the current transaction */ + void *class_data; /* private class/id decode data */ }; @@ -98,12 +105,6 @@ typedef struct _usb_tap_data_t { usb_trans_info_t *trans_info; } usb_tap_data_t; -typedef struct _usb_data_t { - guint16 bus_id; - guint8 device_address; - guint8 endpoint; - gint direction; -} usb_data_t; /* This is the endpoint number used for "no endpoint" or the fake endpoint * for the host side since we need two endpoints to manage conversations diff --git a/epan/packet_info.h b/epan/packet_info.h index 0610bd6271..b4d48cb568 100644 --- a/epan/packet_info.h +++ b/epan/packet_info.h @@ -195,7 +195,6 @@ typedef struct _packet_info { * MTP2_ANNEX_A_USED_UNKNOWN 2 */ guint16 profinet_type; /**< the type of PROFINET packet (0: not a PROFINET packet) */ - void *usb_conv_info; const char *dcerpc_procedure_name; /* Used by PIDL to store the name of the current dcerpc procedure */ |