diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 20:34:10 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 20:34:10 +0000 |
commit | e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc (patch) | |
tree | 68cb5ef9081156392f1dd62a00c6ccc1451b93df /epan/dissectors/packet-usb.h | |
parent | Initial commit. (diff) | |
download | wireshark-e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc.tar.xz wireshark-e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc.zip |
Adding upstream version 4.2.2.upstream/4.2.2
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'epan/dissectors/packet-usb.h')
-rw-r--r-- | epan/dissectors/packet-usb.h | 349 |
1 files changed, 349 insertions, 0 deletions
diff --git a/epan/dissectors/packet-usb.h b/epan/dissectors/packet-usb.h new file mode 100644 index 00000000..6d9de0b3 --- /dev/null +++ b/epan/dissectors/packet-usb.h @@ -0,0 +1,349 @@ +/* packet-usb.h + * + * Wireshark - Network traffic analyzer + * By Gerald Combs <gerald@wireshark.org> + * Copyright 1998 Gerald Combs + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef __PACKET_USB_H__ +#define __PACKET_USB_H__ + +#include <epan/value_string.h> +#include <epan/wmem_scopes.h> +#include <epan/conversation.h> + +typedef struct _usb_address_t { + guint32 device; + guint32 endpoint; + guint16 bus_id; +} usb_address_t; +#define USB_ADDR_LEN (sizeof(usb_address_t)) + +/* Flag used to mark usb_address_t.endpoint as an interface + * address instead of the normal endpoint address. + */ +#define INTERFACE_PORT 0x80000000 + + +typedef struct _usb_conv_info_t usb_conv_info_t; + +/* Wireshark specific (i.e. numeric values are arbitrary) enum representing + * USB device speed. + */ +typedef enum { + USB_SPEED_UNKNOWN, /* Unknown, skip speed specific processing */ + USB_SPEED_LOW, + USB_SPEED_FULL, + USB_SPEED_HIGH, +} usb_speed_t; + +/* header type */ +typedef enum { + USB_HEADER_LINUX_48_BYTES, + USB_HEADER_LINUX_64_BYTES, + USB_HEADER_USBPCAP, + USB_HEADER_MAUSB, + USB_HEADER_USBIP, + USB_HEADER_DARWIN, + USB_HEADER_PSEUDO_URB, +} usb_header_t; + +#define USB_HEADER_IS_LINUX(type) \ + ((type) == USB_HEADER_LINUX_48_BYTES || (type) == USB_HEADER_LINUX_64_BYTES) + +typedef struct _usb_pseudo_urb_t { + gboolean from_host; + guint8 transfer_type; + guint8 device_address; + guint8 endpoint; + guint16 bus_id; + usb_speed_t speed; +} usb_pseudo_urb_t; + +/* there is one such structure for each request/response */ +typedef struct _usb_trans_info_t { + guint32 request_in; + guint32 response_in; + nstime_t req_time; + usb_header_t header_type; + + /* Valid only for SETUP transactions */ + struct _usb_setup { + guint8 requesttype; + guint8 request; + guint16 wValue; + guint16 wIndex; + guint16 wLength; + } setup; + + /* Valid only during GET DESCRIPTOR transactions */ + union { + struct { + guint8 type; + guint8 usb_index; + } get_descriptor; + } u; + + + /* used to pass the interface class from the + * interface descriptor onto the endpoint + * descriptors so that we can create a + * conversation with the appropriate class + * once we know the endpoint. + * Valid only during GET CONFIGURATION response. + */ + usb_conv_info_t *interface_info; + + guint64 usb_id; +} usb_trans_info_t; + +enum usb_conv_class_data_type { + USB_CONV_UNKNOWN = 0, + USB_CONV_U3V, + USB_CONV_AUDIO, + USB_CONV_VIDEO, + USB_CONV_MASS_STORAGE_BOT, + USB_CONV_MASS_STORAGE_UASP, +}; + +/* Conversation Structure + * there is one such structure for each device/endpoint conversation */ +struct _usb_conv_info_t { + guint16 bus_id; + guint16 device_address; + guint8 endpoint; + gint direction; + guint8 transfer_type; /* transfer type from URB */ + guint8 descriptor_transfer_type; /* transfer type lifted from the configuration descriptor */ + guint16 max_packet_size; /* max packet size from configuration descriptor */ + guint32 device_protocol; + gboolean is_request; + gboolean is_setup; + guint8 setup_requesttype; + usb_speed_t speed; + + 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 */ + guint16 deviceVersion; /* Device Descriptor - USB device version number BCD */ + guint8 iSerialNumber; /* Device Descriptor - iSerialNumber (0 if no serial number available) */ + wmem_tree_t *transactions; + usb_trans_info_t *usb_trans_info; /* pointer to the current transaction */ + + void *class_data; /* private class/id decode data */ + enum usb_conv_class_data_type class_data_type; + + wmem_array_t *alt_settings; +}; + +/* This is what a tap will tap */ +typedef struct _usb_tap_data_t { + guint8 urb_type; + guint8 transfer_type; + usb_conv_info_t *conv_info; + usb_trans_info_t *trans_info; +} usb_tap_data_t; + + +/* the value for "no endpoint" that's used usb_addr_t, e.g. for the address of the host */ +#define NO_ENDPOINT 0xffffffff +/* the 8bit version of NO_ENDPOINT, it's used in usb_conv_info_t + 0xff would be an invalid endpoint number (reserved bits are 1) */ +#define NO_ENDPOINT8 ((guint8)(NO_ENDPOINT& G_MAXUINT8)) + +/* + * Values from the Linux USB pseudo-header. + */ + +/* + * event_type values + */ +#define URB_SUBMIT 'S' +#define URB_COMPLETE 'C' +#define URB_ERROR 'E' + +/* + * URB transfer_type values + */ +#define URB_ISOCHRONOUS 0x0 +#define URB_INTERRUPT 0x1 +#define URB_CONTROL 0x2 +#define URB_BULK 0x3 +#define URB_UNKNOWN 0xFF + +#define URB_TRANSFER_IN 0x80 /* to host */ + + +/* http://www.usb.org/developers/defined_class */ +#define IF_CLASS_DEVICE 0x00 +#define IF_CLASS_AUDIO 0x01 +#define IF_CLASS_COMMUNICATIONS 0x02 +#define IF_CLASS_HID 0x03 +#define IF_CLASS_PHYSICAL 0x05 +#define IF_CLASS_IMAGE 0x06 +#define IF_CLASS_PRINTER 0x07 +#define IF_CLASS_MASS_STORAGE 0x08 +#define IF_CLASS_HUB 0x09 +#define IF_CLASS_CDC_DATA 0x0a +#define IF_CLASS_SMART_CARD 0x0b +#define IF_CLASS_CONTENT_SECURITY 0x0d +#define IF_CLASS_VIDEO 0x0e +#define IF_CLASS_PERSONAL_HEALTHCARE 0x0f +#define IF_CLASS_AUDIO_VIDEO 0x10 +#define IF_CLASS_DIAGNOSTIC_DEVICE 0xdc +#define IF_CLASS_WIRELESS_CONTROLLER 0xe0 +#define IF_CLASS_MISCELLANEOUS 0xef +#define IF_CLASS_APPLICATION_SPECIFIC 0xfe +#define IF_CLASS_VENDOR_SPECIFIC 0xff + +#define IF_CLASS_UNKNOWN 0xffff +#define IF_SUBCLASS_UNKNOWN 0xffff +#define IF_PROTOCOL_UNKNOWN 0xffff +#define DEV_VENDOR_UNKNOWN 0x0000 /* this id is unassigned */ +#define DEV_PRODUCT_UNKNOWN 0xfffffff /* 0x0000 and 0xffff are used values by vendors, so MSBs encode unknown */ +#define DEV_VERSION_UNKNOWN 0xffff + +#define IF_SUBCLASS_MISC_U3V 0x05 + +#define IF_SUBCLASS_APP_DFU 0x01 + +#define IF_PROTOCOL_DFU_RUNTIME 0x01 +#define IF_PROTOCOL_DFU_MODE 0x02 + +/* Key to be used with "usb.control", "usb.bulk" and/or "usb.interrupt" + * dissector tables when the dissector only applies to specific triple. + * Use class code directly if the code is not shared with other specifications. + * + * MSB (bit 31) is arbitrarily chosen to ensure class registered dissectors + * won't clash with protocol key. + */ +#define USB_PROTOCOL_KEY(class, subclass, protocol) \ + (1u << 31 | (class & 0xff) << 16 | (subclass & 0xff) << 8 | (protocol & 0xff)) + +/* bmRequestType values */ +#define USB_DIR_OUT 0 /* to device */ +#define USB_DIR_IN 0x80 /* to host */ + +#define USB_TYPE_MASK (0x03 << 5) +#define USB_TYPE(type) (((type) & USB_TYPE_MASK) >> 5) +#define RQT_SETUP_TYPE_STANDARD 0 +#define RQT_SETUP_TYPE_CLASS 1 +#define RQT_SETUP_TYPE_VENDOR 2 + +#define USB_RECIPIENT_MASK 0x1F +#define USB_RECIPIENT(type) ((type) & USB_RECIPIENT_MASK) +#define RQT_SETUP_RECIPIENT_DEVICE 0 +#define RQT_SETUP_RECIPIENT_INTERFACE 1 +#define RQT_SETUP_RECIPIENT_ENDPOINT 2 +#define RQT_SETUP_RECIPIENT_OTHER 3 + +/* Endpoint descriptor bmAttributes */ +#define ENDPOINT_TYPE(ep_attrib) ((ep_attrib) & 0x03) +#define ENDPOINT_TYPE_CONTROL 0 +#define ENDPOINT_TYPE_ISOCHRONOUS 1 +#define ENDPOINT_TYPE_BULK 2 +#define ENDPOINT_TYPE_INTERRUPT 3 +#define ENDPOINT_TYPE_NOT_SET 255 + + +#define USB_SETUP_GET_STATUS 0 +#define USB_SETUP_CLEAR_FEATURE 1 +#define USB_SETUP_SET_FEATURE 3 +#define USB_SETUP_SET_ADDRESS 5 +#define USB_SETUP_GET_DESCRIPTOR 6 +#define USB_SETUP_SET_DESCRIPTOR 7 +#define USB_SETUP_GET_CONFIGURATION 8 +#define USB_SETUP_SET_CONFIGURATION 9 +#define USB_SETUP_GET_INTERFACE 10 +#define USB_SETUP_SET_INTERFACE 11 +#define USB_SETUP_SYNCH_FRAME 12 +#define USB_SETUP_SET_SEL 48 +#define USB_SETUP_SET_ISOCH_DELAY 49 + +/* transfer_flags */ +#define URB_SHORT_NOT_OK 0x0001 /* report short reads as errors */ +#define URB_ISO_ASAP 0x0002 /* iso-only; use the first unexpired + * slot in the schedule */ +#define URB_NO_TRANSFER_DMA_MAP 0x0004 /* urb->transfer_dma valid on submit */ +#define URB_NO_FSBR 0x0020 /* UHCI-specific */ +#define URB_ZERO_PACKET 0x0040 /* Finish bulk OUT with short packet */ +#define URB_NO_INTERRUPT 0x0080 /* HINT: no non-error interrupt + * needed */ +#define URB_FREE_BUFFER 0x0100 /* Free transfer buffer with the URB */ + +/* The following flags are used internally by usbcore and HCDs */ +#define URB_DIR_IN 0x0200 /* Transfer from device to host */ +#define URB_DIR_OUT 0 +#define URB_DIR_MASK URB_DIR_IN + +#define URB_DMA_MAP_SINGLE 0x00010000 /* Non-scatter-gather mapping */ +#define URB_DMA_MAP_PAGE 0x00020000 /* HCD-unsupported S-G */ +#define URB_DMA_MAP_SG 0x00040000 /* HCD-supported S-G */ +#define URB_MAP_LOCAL 0x00080000 /* HCD-local-memory mapping */ +#define URB_SETUP_MAP_SINGLE 0x00100000 /* Setup packet DMA mapped */ +#define URB_SETUP_MAP_LOCAL 0x00200000 /* HCD-local setup packet */ +#define URB_DMA_SG_COMBINED 0x00400000 /* S-G entries were combined */ +#define URB_ALIGNED_TEMP_BUFFER 0x00800000 /* Temp buffer was alloc'd */ + + +/* 9.6.6 */ +extern const true_false_string tfs_endpoint_direction; + +extern value_string_ext usb_class_vals_ext; + +usb_conv_info_t *get_usb_iface_conv_info(packet_info *pinfo, guint8 interface_num); +usb_conv_info_t *get_existing_usb_ep_conv_info(packet_info *pinfo, guint16 bus_id, + guint16 device_address, int endpoint); + +proto_item * dissect_usb_descriptor_header(proto_tree *tree, + tvbuff_t *tvb, int offset, + value_string_ext *type_val_str); + +void dissect_usb_endpoint_address(proto_tree *tree, tvbuff_t *tvb, int offset); + +unsigned int +sanitize_usb_max_packet_size(guint8 ep_type, usb_speed_t speed, + unsigned int max_packet_size); + +int +dissect_usb_endpoint_descriptor(packet_info *pinfo, proto_tree *parent_tree, + tvbuff_t *tvb, int offset, + usb_conv_info_t *usb_conv_info, + guint8 *out_ep_type, usb_speed_t speed); + +int +dissect_usb_unknown_descriptor(packet_info *pinfo _U_, proto_tree *parent_tree, + tvbuff_t *tvb, int offset, + usb_conv_info_t *usb_conv_info _U_); + +int +dissect_urb_transfer_flags(tvbuff_t *tvb, int offset, proto_tree* tree, int hf, int endian); + +struct mausb_header; + +void +dissect_usb_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent, + usb_header_t header_type, void *extra_data); + +void usb_lpm_besl_str(gchar *buf, guint32 value); + +#endif + +/* + * Editor modelines - https://www.wireshark.org/tools/modelines.html + * + * Local variables: + * c-basic-offset: 4 + * tab-width: 8 + * indent-tabs-mode: nil + * End: + * + * vi: set shiftwidth=4 tabstop=8 expandtab: + * :indentSize=4:tabSize=8:noTabs=true: + */ |