Skip to main content

nak_received_len

Function nak_received_len 

Source
pub fn nak_received_len(rx_len: u32, hctsiz: u32) -> usize
Expand description

NAK で止まっている転送が、すでに受け取っているバイト数(0 なら未受信)。

【2026-09-26 バグ修正】QEMU の usb-net は RNDIS モードでは長さが 64 の倍数の フレームでも終端の短パケット(ZLP)を送らない(hw/usb/dev-network.c is_rndis(s) || の条件)。DWC2 の受信チャネルは短パケットが来るまで転送を 終えないので、640 バイト等のフレームを DMA へ書いた後、次のデータが無いと 転送継続のまま NAK 割り込みだけが上がる(hw/usb/hcd-dwc2.c)。 従来はこれを「データ無し」とみなして再アームし、届いていたフレームを捨てていた。 再送も同じ長さなので永久に受信できず、TCP が 15 秒止まっていた (パケットキャプチャで最終セグメント 542 バイト + ヘッダ = 640 バイトと確認)。

rx_len は発行時の転送長、hctsiz は HCTSIZ の値(下位 19 ビットが残りバイト数)。