USBトラフィックをwiresharkで見る

http://wiki.wireshark.org/CaptureSetup/USB

  1. DEBUG_FSとUSB_MONを有効にしたカーネルを準備する(make menuconfigして、『/』→DEBUG_FSのようにすればメニュー的な場所がわかる)
  2. 適当にマウント等する
  3. libpcapをCVSからビルドする
  4. wiresharkをそっちのlibpcapを使うようにビルドする

portageのと競合するのが面倒だったので、libpcapを--prefix=/opt/pcap/で作り、wiresharkを--with-pcap=/opt/pcap --prefix=/opt/pcapとして作った。wiresharkをLD_LIBRARY_PATHに/opt/pcap/libを含めた状態で、/opt/pcap/bin/wiresharkと直接起動してやれば良い。(不安ならldd /opt/pcap/bin/wiresharkとして確かめる)

もっとも、USBのトラフィックをまったくデコードしてくれないみたいなのであまり有り難みが無い。。/usr/src/linux/Documentation/usb/usbmon.txtを参照のこと。

USBとバス番号の対応

複雑。PC本体のUSBポートごとに一つ一つ番号が付いていると考えれば良いが、直接USB1.1バイスを挿した場合は、担当するコンパニオンコントローラごとに一つのバスを消費する。

このため、同じUSBポートにデバイスを挿してもUSB2.0(Hi-Speed)のデバイスUSB1.1(Full or Low-Speed)のデバイスで出現する場所が代わるという現象が起こる*1USB2.0のコントローラ(EHCI)は、速度変換機能を持つかわりにUSB1のコントローラをコンパニオンコントローラとして内蔵し、それぞれの接続ごとに切り替えられるようになっている。

USB2のハブを遠したときは、バス的にはUSB2側に見える。この場合は速度変換はハブが担当するため。

もし、あるデバイスのデータをキャプチャしたいと考えた場合、そのデバイスがHi-Speedデバイスであれば、他のデバイスとハブを共有せずに接続すれば良い。ハブでPC側のポートを共有してしまうと他のデバイスと出力が混じってしまう。この場合でもアドレスはユニークなので簡単にフィルタできるが。。

USB1.1バイスの場合は話が複雑になる。USBカードを増設するのが手っ取り早いが、他のデバイスをUSB2のハブに移動し、観察したいUSB1.1バイスを直接PCに挿せばおそらく上手くいく。もちろん、PC側のポートはUSB2でなければならない。
これらの対策をするよりもユーザ側でフィルタしたほうが簡単かもしれない。

*1:本来、USB2.0バイスであってもHi-Speedに対応しないこともできるが。。その場合はUSB1.1バイスだと思って処理すれば良い。