Sto cercando di decodificare un dispositivo USB (HID) e non riesco davvero a capire come ciò che vedo su WireShark (USBmon + WireShark su Linux o Windows) si collega al protocollo USB ?. Ho esaminato il protocollo USB da www.usb.org.
Cosa mostra WireShark?
1) Una riga per pacchetto? (token, dati, stretta di mano)
2) Una riga per transazione? (token + [dati] + stretta di mano) (la mia ipotesi)
3) Una linea per trasferimento di controllo?
Anche la direzione della transazione è molto strana (da / verso i campi). Almeno, non corrisponde alle mie aspettative :-) ... E la parte dei dati dell'enumerazione, il rapporto nascosto ecc ... a volte sembra essere visualizzata con i dati di installazione (8 byte) e qualche volta no ... so davvero cosa sia URB ... non c'è menzione di ciò nel protocollo USB per quanto ho potuto vedere ... Mi sembra che la traccia di wirehark / usbmon ad un livello di stack più alto e cerchi di dedurre cosa sarebbe sul filo da quello ...
Di seguito è riportato un esempio di ciò che posso vedere, cosa vediamo qui?
a) Non sono riuscito a trovare nemmeno bmtype = 0x20 (del setup, frame No = 599) nelle specifiche.
b) Poiché ho un dispositivo HID, ho pensato che potesse essere una configurazione di report / funzionalità (l'enumerazione viene passata in questa fase). Quindi potrei essere d'accordo con la direzione (host-> dispositivo). ma dove sono i dati? O non ci sono fasi di dati qui? Cos'è quindi il frame 600?
c) cos'è il frame 600? i dati?
d) cos'è il frame 601? uno stato ACK? ... ma poi i dati e ACK hanno la stessa fonte?
No. Time Source Destination Protocol Length Info
599 67.996889 host 2.0 USB 36 URB_CONTROL out
Frame 599: 36 bytes on wire (288 bits), 36 bytes captured (288 bits)
USB URB
USBPcap pseudoheader length: 28
IRP ID: 0xfffffa800a1e2610
IRP USBD_STATUS: USBD_STATUS_SUCCESS (0x00000000)
URB Function: URB_FUNCTION_CLASS_DEVICE (0x001a)
IRP information: 0x00, Direction: FDO -> PDO
URB bus id: 1
Device address: 2
Endpoint: 0x00, Direction: OUT
URB transfer type: URB_CONTROL (0x02)
Packet Data Length: 8
Control transfer stage: Setup (0)
[Response in: 601]
[bInterfaceClass: Unknown (0xffff)]
URB setup
bmRequestType: 0x20
0... .... = Direction: Host-to-device
.01. .... = Type: Class (0x01)
...0 0000 = Recipient: Device (0x00)
bRequest: 0
wValue: 0x0000
wIndex: 0
wLength: 16
0000 1c 00 10 26 1e 0a 80 fa ff ff 00 00 00 00 1a 00 ...&............
0010 00 01 00 02 00 00 02 08 00 00 00 00 20 00 00 00 ............ ...
0020 00 00 10 00 ....
No. Time Source Destination Protocol Length Info
600 67.997889 2.0 host USB 44 URB_CONTROL out
Frame 600: 44 bytes on wire (352 bits), 44 bytes captured (352 bits)
USB URB
USBPcap pseudoheader length: 28
IRP ID: 0xfffffa800a1e2610
IRP USBD_STATUS: USBD_STATUS_SUCCESS (0x00000000)
URB Function: URB_FUNCTION_CONTROL_TRANSFER (0x0008)
IRP information: 0x01, Direction: PDO -> FDO
URB bus id: 1
Device address: 2
Endpoint: 0x00, Direction: OUT
URB transfer type: URB_CONTROL (0x02)
Packet Data Length: 16
Control transfer stage: Data (1)
[Request in: 599]
[Time from request: 0.001000000 seconds]
[bInterfaceClass: Unknown (0xffff)]
CONTROL response data
0000 1c 00 10 26 1e 0a 80 fa ff ff 00 00 00 00 08 00 ...&............
0010 01 01 00 02 00 00 02 10 00 00 00 01 05 04 0d 56 ...............V
0020 fb 82 c0 1d 10 18 cc 02 00 00 00 01 ............
No. Time Source Destination Protocol Length Info
601 67.997889 2.0 host USB 28 GET STATUS Status
Frame 601: 28 bytes on wire (224 bits), 28 bytes captured (224 bits)
USB URB
USBPcap pseudoheader length: 28
IRP ID: 0xfffffa800a1e2610
IRP USBD_STATUS: USBD_STATUS_SUCCESS (0x00000000)
URB Function: URB_FUNCTION_CONTROL_TRANSFER (0x0008)
IRP information: 0x01, Direction: PDO -> FDO
URB bus id: 1
Device address: 2
Endpoint: 0x00, Direction: OUT
URB transfer type: URB_CONTROL (0x02)
Packet Data Length: 0
Control transfer stage: Status (2)
[Request in: 599]
[Time from request: 0.001000000 seconds]
0000 1c 00 10 26 1e 0a 80 fa ff ff 00 00 00 00 08 00 ...&............
0010 01 01 00 02 00 00 02 00 00 00 00 02 ............
Ovviamente mi manca qualcosa. Una spiegazione generale su come il display WireShark si collega al protocollo e, (basato su di esso), il significato della traccia sopra è accolto favorevolmente!
Originariamente l'ho pubblicato su Stack Overflow, ma mi è stato detto che non era direttamente una domanda di programmazione. Spero che vada meglio qui.