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:
@@ -156,12 +156,30 @@ class Peer:
|
||||
return self.check(False, "TC 0x{0:02X} 端口 {1}: 板端 {2:.0f}s 内无回显"
|
||||
.format(tag, port, step_budget))
|
||||
attempt = 4.0 if first_wait > 0 else 6.0
|
||||
try:
|
||||
got, addr = self._recv_after(sock, min(attempt, left))
|
||||
self.note_port(sock, tag)
|
||||
except (socket.timeout, ConnectionResetError):
|
||||
# ConnectionResetError = 对端端口当时没开换来的 ICMP 不可达(见
|
||||
# new_peer_socket 的说明);这里和「这一轮没收到」同等对待,继续重试。
|
||||
round_deadline = time.time() + min(attempt, left)
|
||||
resets = 0
|
||||
while got is None:
|
||||
remain = round_deadline - time.time()
|
||||
if remain <= 0:
|
||||
break
|
||||
try:
|
||||
got, addr = self._recv_after(sock, remain)
|
||||
self.note_port(sock, tag)
|
||||
except socket.timeout:
|
||||
break # 这一轮确实等满了,出去重发一次
|
||||
except ConnectionResetError:
|
||||
# ICMP 端口不可达(见 new_peer_socket 的说明)——它只说明「板端把
|
||||
# 某个回显发给了本端已经关掉的临时端口」,并不代表本端这一步该重发。
|
||||
# 2026-11-04 台架上的教训:把它当成「没收到」立刻重发,会在一秒里
|
||||
# 往芯片灌上百个包(日志 148 s 起每秒上百行),把整条梯子彻底冲乱。
|
||||
# 正确做法:本轮不再重发,安静地等完本轮预算,节奏仍由 attempt 决定。
|
||||
resets += 1
|
||||
if resets == 1 or resets % 20 == 0:
|
||||
self.log("TC 0x{0:02X}: 收到 {1} 次 ICMP 不可达(板端回显打到了本端"
|
||||
"已关闭的端口),本轮不重发,继续等到 {2:.0f}s"
|
||||
.format(tag, resets, round_deadline))
|
||||
time.sleep(0.2)
|
||||
if got is None and resets == 0:
|
||||
self.log("TC 0x{0:02X}: 无回显,重发(本步剩余 {1:.0f}s)".format(tag, left))
|
||||
# 一个数据报进、一个数据报出——唯一例外是本步载荷超过芯片发送缓冲(1KB):
|
||||
# 那是已登记的芯片限制(NET_SEND_CHUNK_MAX 本是 TCP 流的分块口径,UDP 上每块
|
||||
|
||||
Reference in New Issue
Block a user