Ich versuche, ein USB-Gerät (HID) zurückzuentwickeln, und kann nicht wirklich herausfinden, wie sich das, was ich auf Wireshark (USBMON + Wireshark unter Linux oder Windows) sehe, auf das USB-Protokoll bezieht. Ich habe mir das USB-Protokoll von www.usb.org angesehen.
Was zeigt Wireshark?
1) Eine Zeile pro Paket? (Token, Daten, Handshake)
2) Eine Zeile pro Transaktion? (Token + [Daten] + Handschlag) (meine Vermutung)
3) Eine Zeile pro Kontrollübertragung?
Die Richtung der Transaktion ist ebenfalls sehr seltsam (zu / von Feldern). Zumindest entspricht es nicht meinen Erwartungen :-) ... und der Datenteil der Aufzählung, des versteckten Berichts usw. scheint manchmal mit den Setup-Daten (8 Bytes) angezeigt zu werden und manchmal nicht ... ich ziehe an Ich weiß nicht wirklich, was URB ist. Soweit ich sehen konnte, wird dies im USB-Protokoll nicht erwähnt. Es scheint mir, dass Wireshark / USBMmon auf einer höheren Stapelebene verfolgt werden und versucht, daraus abzuleiten, was wäre auf dem Draht davon ...
Ein Beispiel für das, was ich sehen kann, ist unten angegeben. Was sehen wir hier?
a) Ich konnte nicht einmal bmtype = 0x20 (des Setups, Frame No = 599) in den Spezifikationen finden.
b) Da ich ein HID-Gerät habe, habe ich angenommen, dass dies eine Berichts- / Funktionskonfiguration sein könnte (die Aufzählung wird zu diesem Zeitpunkt übergeben). So konnte ich der Richtung zustimmen (Host-> Gerät). aber wo sind die Daten? Oder gibt es hier keine Datenphase? Was ist dann Frame 600?
c) Was ist Frame 600? die Daten?
d) Was ist Frame 601? ein Status ACK? ... aber dann haben die Daten und ACK die gleiche Quelle?
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 ............
Offensichtlich fehlt mir etwas. Eine allgemeine Erklärung, wie sich die Wireshark-Anzeige auf das Protokoll und (basierend darauf) auf die Bedeutung der obigen Spur bezieht, ist zu begrüßen!
Ich habe dies ursprünglich auf Stack Overflow gepostet, aber mir wurde gesagt, dass es sich nicht direkt um eine Programmierfrage handelt. Hoffe es passt hier besser.
WireShark USB-Protokolle werden auf Betriebssystemebene erstellt. Bei Linux basiert es auf den von usbmon generierten Daten, die auf der hier beschriebenen internen URB-Struktur von Linux basieren . Wenn Sie sich also die Kommentare und Dokumente zu Kernel und WireShark ansehen, erhalten Sie den besten Einblick in das, was es ist.
Was ich aus den Kernel-Dokumenten herausgefunden habe, ist, dass die Pakete usbmon-Strukturen sind, gefolgt von den gesendeten und empfangenen Daten. Dies ist die Struktur (von hier kopiert ):
quelle