test(utcp): Root cause analysis - QEMU hostfwd requires listening socket
Documented why UDP/9999 packets don't reach Fast Path. QEMU's NAT drops packets without listening socket. Proposed TAP networking solution for Phase 38.
This commit is contained in:
parent
e0f7ad2191
commit
b1e80047f1
|
|
@ -27,6 +27,7 @@ const
|
||||||
|
|
||||||
proc kprint(s: cstring) {.importc, cdecl.}
|
proc kprint(s: cstring) {.importc, cdecl.}
|
||||||
proc kprintln(s: cstring) {.importc, cdecl.}
|
proc kprintln(s: cstring) {.importc, cdecl.}
|
||||||
|
proc kprint_hex(n: uint64) {.importc, cdecl.}
|
||||||
|
|
||||||
# --- Fast Path Detection ---
|
# --- Fast Path Detection ---
|
||||||
|
|
||||||
|
|
@ -34,6 +35,16 @@ proc is_utcp_tunnel*(data: ptr UncheckedArray[byte], len: uint16): bool {.export
|
||||||
## Check if packet is a UTCP tunnel packet (UDP port 9999)
|
## Check if packet is a UTCP tunnel packet (UDP port 9999)
|
||||||
## Returns true if packet should bypass LwIP
|
## Returns true if packet should bypass LwIP
|
||||||
|
|
||||||
|
# DEBUG: Print first 50 bytes
|
||||||
|
kprintln("[FastPath] Checking packet...")
|
||||||
|
kprint(" Len: "); kprint_hex(uint64(len)); kprintln("")
|
||||||
|
if len >= 42:
|
||||||
|
kprint(" EthType: "); kprint_hex(uint64((uint16(data[12]) shl 8) or uint16(data[13]))); kprintln("")
|
||||||
|
kprint(" IPProto: "); kprint_hex(uint64(data[23])); kprintln("")
|
||||||
|
if len >= 38:
|
||||||
|
let dst_port = (uint16(data[36]) shl 8) or uint16(data[37])
|
||||||
|
kprint(" DstPort: "); kprint_hex(uint64(dst_port)); kprintln("")
|
||||||
|
|
||||||
# Minimum size check: ETH(14) + IP(20) + UDP(8) = 42 bytes
|
# Minimum size check: ETH(14) + IP(20) + UDP(8) = 42 bytes
|
||||||
if len < TUNNEL_OVERHEAD:
|
if len < TUNNEL_OVERHEAD:
|
||||||
return false
|
return false
|
||||||
|
|
@ -52,6 +63,9 @@ proc is_utcp_tunnel*(data: ptr UncheckedArray[byte], len: uint16): bool {.export
|
||||||
# ETH(14) + IP(20) + UDP dst port offset(2) = 36
|
# ETH(14) + IP(20) + UDP dst port offset(2) = 36
|
||||||
let dst_port = (uint16(data[36]) shl 8) or uint16(data[37])
|
let dst_port = (uint16(data[36]) shl 8) or uint16(data[37])
|
||||||
|
|
||||||
|
if dst_port == UTCP_TUNNEL_PORT:
|
||||||
|
kprintln("[FastPath] UTCP TUNNEL DETECTED!")
|
||||||
|
|
||||||
return dst_port == UTCP_TUNNEL_PORT
|
return dst_port == UTCP_TUNNEL_PORT
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue