summaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-usb.h
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 20:34:10 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 20:34:10 +0000
commite4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc (patch)
tree68cb5ef9081156392f1dd62a00c6ccc1451b93df /epan/dissectors/packet-usb.h
parentInitial commit. (diff)
downloadwireshark-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.h349
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:
+ */