libusb  1.0.24
USBデバイスにアクセスするためのクロスプ・ラットフォームのユーザー・ライブラリ
パケットとオーバーフロー

パケットの抽象化

USB仕様には、データがパケットで送信される方法が説明されていて、そしてエンド・ポイント・デスクリプターによって定義されたパケット・サイズには制限があります。ホストは、エンド・ポイントの最大パケット・サイズよりも大きいデータ・ペイロードを送信してはなりません。

libusbと基盤となるOSは、パケットの概念を抽象化し、任意のサイズの転送を要求できるようにします。内部的には、要求は正しいサイズのパケットに分割されます。 パケット・サイズを気にする必要はありませんが、オーバーフローを考慮する場合は1つの例外があります。

バルク転送・割り込み転送のオーバーフロー

バルク・エンド・ポイントでデータを要求する場合、libusbでは、バッファーと、libusbがそのバッファーに入れることができるデータの最大バイト数を指定する必要があります。 ただし、バッファのサイズはデバイスに伝達されません。デバイスは、任意の量のデータを送信するように要求されるだけです。

デバイスがバッファ・サイズ以下のデータ量を送信する場合は問題ありません。 libusbは、 libusb_transfer.actual_length フィールドを介してこの状態を報告します。

デバイスがバッファに収まらないより多くのデータを送信しようとすると、問題が発生する可能性があります。 libusbは、この状態についてLIBUSB_TRANSFER_OVERFLOWを報告しますが、他の動作はほとんど定義されていません。actual_lengthは正確である場合とそうでない場合があり、(オーバーフロー前に)バッファーに収まるデータのチャンクが転送されている場合とされていない場合があります。

オーバーフローは厄介ですが、回避することができます。あなたが上記のパケットを無視するように言われたとしても、下位レベルの詳細について考えてください。各転送はパケットに分割されます(通常は小さく、最大サイズは512バイトです)。オーバーフローは、着信データ転送の最後のパケットが、デバイスが転送したい実際のパケットよりも小さい場合にのみ発生する可能性があります。したがって、転送バッファサイズがエンドポイントのパケット・サイズの倍数である場合、オーバーフローが発生することはありません。最終的なパケットは完全にいっぱいになるか、部分的にしかいっぱいになりません。