test(net/udp): 阶段 16 判据文字按真机定案改写,PC 对端不再被 ICMP 拒收打爆(#73)

板级 1603 的标题写的是 "48-byte reply, no header strip in client mode",判据本身
(读回 48 字节且逐字节等于发出去的载荷)在真机上就是对的——错的是那句解释。标题
与两处注释按定案改写,判据一字不动:改判据等于把测出来的事实抹掉。

PC 对端 `test/host/udp_queue_bench.py` 修了一条会把台架自己打死的毛病:Windows 上
对端端口没人听时,发出去的 UDP 会收回 ICMP port-unreachable,CPython 把它变成
`ConnectionResetError [WinError 10054]` 挂在下一次 recv 上(3.14 既没有
`socket.SIO_UDP_CONNRESET` 也拒绝那个数字 ioctl,只能接住这个异常)。原来的写法是
一接到就立刻重发,run #3 从第 148 秒起以约 100 包/秒灌进 CH395F,日志刷出
940,949 字节的「TC 0x02: 无回显,重发」——**板子的真实行为被自己的对端淹掉了**,
看起来却像板子不回包。现在一轮之内跑满预算、按次数限流打印。

回路自检 `test/host/udp_queue_bench_loopback.py` 改后 **27/27 PASSED**。
This commit is contained in:
2026-11-04 09:15:52 +08:00
parent 0d469a835a
commit 66725c0fa3
2 changed files with 34 additions and 10 deletions
+10 -4
View File
@@ -996,7 +996,9 @@ void net_layer_test_main(void)
* 「台架必验」五项:
* 1602 → ① server 形态首包(bind 时 DesIP 已写在全F)+ ⑤ 顺序
* 1603 → TRAP-NET-22 缺陷本体:48 字节小应答在 client 形态下
* 必须一字节不少(旧实现恒剥 8 字节 → 这里会变成 40)
* 必须一字节不少。期望值 2026-11-04 由真机定过案:把 DesIP 从全F
* 改成具体对端**不会**让芯片停止前置信息头(第一轮实测 n=56、
* 首字节 0x38),所以 client 形态同样要剥头,剥完才是 48
* 1604 → ② sendto 切形态后能否真恢复收其它源地址
* 1605 → ③ 截断包排空后下一个包是否完整
* 1607 → ④ 挂起 recv 等待期间的 IWDG 余量(无 [ERR][WD] task stall)
@@ -1386,10 +1388,14 @@ void net_layer_udp_bench_test_main(void)
TEST_CHECK(net_udp_get_mode(fd) == NET_UDP_MODE_CLIENT,
"TC-NET-1602e: sendto switched mode to CLIENT (%d)", net_udp_get_mode(fd));
/* ---------- TC-NET-1603:48 字节小应答(TRAP-NET-22 本体) ---------- */
DBG_INFO("--- TC-NET-1603: 48-byte reply, no header strip in client mode ---");
/* ---------- TC-NET-1603:48 字节小应答(TRAP-NET-22 本体) ---------- *
* 期望的是"仍然剥头":本层 Socket 恒以 DesIP=全 F 开出,运行时把 DesIP 改成
* 具体对端(1602e 那一步)不会让芯片停止前置 8 字节信息头——2026-11-04 08:16
* 真机第一轮跑出来的正是 n=56 / 首字节 0x38,把这条写死在代码里(详见
* TRAP-NET-22 的 2026-11-04 追加段)。 */
DBG_INFO("--- TC-NET-1603: 48-byte reply, header still stripped in client form ---");
n = udp_bench_expect(fd, 0x02, 48, UDP_BENCH_BUF_SIZE, UDP_BENCH_WAIT_MS, NULL, "TC-NET-1603");
TEST_CHECK(n == 48, "TC-NET-1603a: 48B intact in client mode (n=%d)", n);
TEST_CHECK(n == 48, "TC-NET-1603a: 48B intact in client form, header stripped (n=%d)", n);
if (n == 48) {
rc = udp_bench_echo(fd, n, NULL, "TC-NET-1603");
TEST_CHECK(rc == 48, "TC-NET-1603b: echo via booked peer (dest NULL) rc=%d", rc);