Skip to main content

Module usb_rndis

Module usb_rndis 

Source
Expand description

L2: RNDIS / CDC-ECM の受信フレーム抽出(純粋ロジック)。

§なぜ純粋モジュールにするか

USB から届いたバイト列のどこが Ethernet フレームかを決める処理は、 オフセットと長さの計算だけで外部依存が無い。ここを誤ると

  • 短すぎるフレームを上位へ渡す(ARP/IP 解析が静かに失敗)
  • 範囲外を読む(領域外アクセス)
  • 正しいフレームを捨てる(通信が成立しない) のいずれかになり、いずれも上層では原因が分からない症状になる。

実際 usb.rs には受信経路が 2 つあり、片方は一度も実行されない 死にコードだった(計測で rx_frames=0 となって判明)。 経路が分岐している箇所ほど単体試験で固定する価値が高い。

§RNDIS パケットメッセージの構造(RNDIS 仕様 §5.1)

offset 0 : MessageType   = 0x00000001 (REMOTE_NDIS_PACKET_MSG)
offset 4 : MessageLength
offset 8 : DataOffset    ← **offset 8 からの相対値**
offset 12: DataLength

データの絶対位置は 8 + DataOffset。この +8 を忘れる誤りが典型。

Enums§

ExtractError
抽出失敗の理由。呼び出し側が握り潰さず記録できるよう型で返す。

Constants§

ETH_MIN_LEN
Ethernet フレームの最小長(宛先6 + 送信元6 + タイプ2)。
RNDIS_HEADER_MIN
RNDIS ヘッダの最小長(MessageType..PerPacketInfoLength まで)。
RNDIS_PACKET_MSG
RNDIS パケットメッセージの型。

Functions§

ecm_frame_range
CDC-ECM は受信バイト列がそのまま Ethernet フレーム。 最小長を満たすかだけ判定する。
rndis_frame_range
RNDIS 受信バッファから Ethernet フレームの範囲 (開始, 終了) を求める。