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§
- Extract
Error - 抽出失敗の理由。呼び出し側が握り潰さず記録できるよう型で返す。
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 フレームの範囲
(開始, 終了)を求める。