Um USB URB é como um pacote IP e um ponto final USB é como uma porta IP. Os pontos de extremidade USB 0x00-0x7F estão no host e os pontos de extremidade 0x80-0xFF estão no dispositivo (eu acho). Portanto, o endpoint codifica a direção da transferência. lsusb
mostrará a você quais endpoints e quais tipos de transferência um dispositivo suporta.
Usarei "pacotes" entre aspas para indicar a unidade de atividade que o wireshark captura. Estes não são literalmente o que está sendo enviado no fio. Por exemplo, os "pacotes" terão registros de data e hora para quando as transferências foram iniciadas, mesmo que isso não seja transmitido pelo barramento USB.
Acho que o aspecto mais confuso de farejar o protocolo USB é que você vê dois "pacotes" do Wireshark para cada USB URB. Quando o host inicia alguma transferência, isso é um URB_SUBMIT
(filtro de exibição do Wireshark usb.urb_type == URB_SUBMIT
). Quando a transferência for concluída, isso é um URB_COMPLETE
(filtro de exibição do Wireshark usb.urb_type == URB_COMPLETE
)
Pelo que posso dizer, quando há uma transferência do host para o dispositivo, o SUBMIT
"pacote" contém os dados USB reais transmitidos. Quando há uma transferência do dispositivo para o host (iniciada pelo host, como sempre), o COMPLETE
"pacote" contém os dados USB reais transmitidos.
Do ponto de vista da análise de um protocolo, todos os outros "pacotes" são uma distração OU um erro URB. Para filtrar as distrações, eu uso o seguinte filtro de exibição
!(usb.urb_type == URB_SUBMIT && usb.endpoint_number.direction == IN) && !(usb.urb_type == URB_COMPLETE && usb.endpoint_number.direction == OUT)
Eu acredito que o protocolo USB envolve alguns handshaking e ACKs e retransmissões, mas isso é tudo tratado pelo controlador host, e o sistema operacional não está envolvido. Eu não acho, por exemplo, que o SO monitore os reconhecimentos ou retransmissões.
A propósito, estou usando o seguinte comando para analisar um protocolo. Além de fazer a filtragem acima, ele exibe apenas o número do terminal (em decimal) e os dados do USB. Isso é em uma máquina GNU / Linux usando o dispositivo usbmon1 para farejar, e assumindo que o dispositivo USB que eu quero monitorar está no barramento 1 e tem o endereço 11.
tshark -i usbmon1 -Y "usb.device_address == 11 && !(usb.urb_type == URB_SUBMIT && usb.endpoint_number.direction == IN) && !(usb.urb_type == URB_COMPLETE && usb.endpoint_number.direction == OUT)" -Tfields -e usb.endpoint_number -e usb.capdata