Appearance
Appearance
当前 cvs 版本的 libpcap(2006 年 10 月 9 日)支持从 USB ports 嗅探,至少在 Linux 平台上支持,前提是使用带有 usbmon 基础设施的 2.6.9 及更高版本 kernel。相关信息请参见 CaptureSetup/USB。
在 libpcap 支持 USB 嗅探的早期版本中,USB buses 被列为 data link type 为 DLT_USB (186) 的“interfaces”。在当前实现中,data link type 是 DLT_USB_LINUX (189)。对于每个捕获的“packet”(按 USB 术语称为 URB),kernel(因而 libpcap)会提供两个“events”:
每个 event 都包含一个 header,其结构如下:
typedef struct _usb_header { u_int64_t id; u_int8_t event_type; u_int8_t transfer_type; u_int8_t endpoint_number; u_int8_t device_address; u_int16_t bus_id; char setup_flag; char data_flag; int64_t ts_sec; int32_t ts_usec; int32_t status; u_int32_t urb_len; u_int32_t data_len; pcap_usb_setup setup;} pcap_usb_header;“id”字段用于将一个“submit”event 与其配对的“completion”或“error”event 关联起来。
“event_type”可以是“S”、“C”或“E”之一,分别表示“submit”、“completion”或“error”event。
“transfer_type”指定该 transfer 是 isochronous (0)、interrupt (1)、control (2) 还是 bulk (3)。
“endpoint_number”还指定传输方向:如果设置了 bit 0x80,则方向为 input(从 device 到 host);否则为 output(从 host 到 device)。
如果“setup_flag”为 0,则 setup data 有效。如果“data_flag”为 0,则该 header 后跟与关联 URB 对应的数据。在 error event 中,“status”字段指定错误代码。
除“setup”字段外,该 header 使用 host byte order。
setup 结构遵循 USB specification 中的 setup header,因此使用 little endian byte order。USB data 只存在于与一个 URB 关联的两个 events 中的一个。如果传输方向是从 host 到 device,则数据存在于“submit”event 中;否则数据存在于“completion”event 中。event 中实际存在的数据量可能小于实际交换的数据量。
对于低于 2.6.21-rc1 的 Linux kernel 版本,USB data 通过“text”API 提供,这会将捕获数据的存储限制为 32 bytes。此类 API 需要将 debugfs 挂载到 /sys/kernel/debug 才能正常工作。最近 Linux kernel 中新增了一个“binary”API,取消了每个 URB 可捕获数据量的任何限制。这个新 API 从 Linux kernel 版本 2.6.21-rc1 开始可用。
一些用于“old”data link type 的 raw USB 示例捕获可在 SampleCaptures wiki 页面上获得。
Imported from https://wiki.wireshark.org/USB on 2020-08-11 23:27:06 UTC