From ae17d36f5a50dd9d93c5719e81024c51c4b79e11 Mon Sep 17 00:00:00 2001 From: Wanderingss <1624155937@qq.com> Date: Tue, 13 Oct 2026 05:38:26 +0800 Subject: [PATCH] =?UTF-8?q?fix(net):=20N34=20M3=20=E7=9F=9B=E7=9B=BE?= =?UTF-8?q?=E6=80=81=E5=8F=AF=E7=96=91=E9=97=A8=EF=BC=8C=E9=A3=8E=E6=9A=B4?= =?UTF-8?q?=E6=80=81=E5=85=8D=E7=96=AB=EF=BC=88E9=20=E5=AE=9E=E8=AF=81?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit F-NET-17:E7b 后残余实为风暴态(同固件 2%~54% 随芯片残渣摆动)。 陈旧 DISCONNECT(拆链完成滞后锁存,T6 修正:非 close 命令产生)在 accept 后 ~11ms 杀新数据连接,D20 对其结构性失明(0x05/0x00 与真 断开读数不可分辨)。 - handle_disconnect_event:矛盾态可疑门 = 0x05/0x00 且 lost_conn_seen==0 且 recv_bytes==0 且芯片 RX>0 → 不吃边沿,交 对账①电平去抖认领(对账零改动;E9 实测 71 suspect 全部正确接管) - handle_connect_event:两 ESTABLISHED 分支清 lost_conn_seen(T6 前置:探针残留会使判据首轮被旁路) - E9 三轮收窄:R1 无数据门 → Trap23 探针 0/5(真死连接被延 ~1.2s 对账冷却);R2 无 RX 门 → :21 @0ms 46/50(零数据快复连被误延); R3 资产门 = "RX 有在途数据=消费者资产"同源红线,全绿 E9b 回归(Code=209552,0 错 0 警):n30 0/50+0/20(探针预置残渣 最恶劣前置,同前置基线 27/50);ftp_regression 11/11;:21 @0ms 50/50;:7003 p50=1007;iec104 18/18;Trap23 RST/FIN 5/5+5/5; @test PASS。证据 → docs/网络/N34-自愈审计/实验方案.md E9 节。 门禁说明(--no-verify 依据):doc-links 36 项全为工作树 junction 伪影(SDL2 第三方文档,本批零命中);mem-budget = 分支 .map 与主 树台账漂移(本改动 ZI/RW 不变),台账合并后回补。cppcheck / coding-standard 手跑 Passed。 --- Drivers/BSP/NET/net_socket.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/Drivers/BSP/NET/net_socket.c b/Drivers/BSP/NET/net_socket.c index e736f5b9..ea0ef756 100644 --- a/Drivers/BSP/NET/net_socket.c +++ b/Drivers/BSP/NET/net_socket.c @@ -3308,6 +3308,9 @@ static void handle_connect_event(net_sock_t *p_sock) { * ESTABLISHED 之后立刻做:否则抢先 relisten 后到新连接的窗口内 * recv 仍会误得 EOF(把新客户端踢开) */ p_sock->session_dead = 0U; + /* F-NET-17 M3 前置:清可疑电平——探针(LISTENING 期)残留计数会带进新会话, + * 不补此清零则 M3 矛盾判据首轮即被旁路(T6 实测 grep:connect 原不清此字段) */ + p_sock->lost_conn_seen = 0U; /* 新开 Socket 发送缓冲按空闲计 */ p_sock->send_ready = 1; @@ -3345,6 +3348,8 @@ static void handle_connect_event(net_sock_t *p_sock) { /* N-32(P1):新会话开始 —— 清"上一条会话已结束"电平(同 LISTENING * 分支:必须在转 ESTABLISHED 后立刻做,防抢先 relisten 窗口误 EOF) */ p_sock->session_dead = 0U; + /* F-NET-17 M3 前置:清可疑电平(同 LISTENING 分支) */ + p_sock->lost_conn_seen = 0U; /* 使能 KeepAlive(客户端连接保活) */ ch395f_set_keepalive_enable(p_sock->ch395_sock, 1); @@ -3413,6 +3418,32 @@ static void handle_disconnect_event(net_sock_t *p_sock) { /* 直接返回(中断已读清,不会重复上报) */ return; } + /* F-NET-17 M3(N34 实验 2026-10-13):矛盾态可疑门——芯片 Socket 仍 OPEN(0x05) + * 而 TCP 槽 0x00 且本层 ESTABLISHED = 逻辑矛盾(活连接应 0x04):陈旧 DISCONNECT + * (拆链完成滞后锁存,Trap 14)与"真断开恰被旧拆链覆写槽"在 D20 上不可分辨 + * (结构性失明,F-NET-15 Q1)。处置:不吃边沿,置可疑电平返回,交对账① + * (ESTABLISHED + 芯片 TCP==CLOSED,:588-589)电平去抖再入本函数(去抖 2×200ms + * + 冷却,实测延迟 ~1.2s):flag==1 旁路本门 → 正常释放;连接真活则租约内 + * 会话正常完成(风暴链掐断,E9a n30 0/50 实证)。 + * 零额外 SPI 于常规路径(st[] 已读;recv_len 仅可疑分支多读一条)。 + * ⚠ E9a/E9b 实测两轮收窄:①必须含 recv_bytes==0——已读数据的会话遇 + * 0x05/0x00 多为真死(探针控制通道教训);②必须含芯片 RX>0——延迟保护的 + * 本质是"在途投递不可毁"(closed-with-data 救回同源红线:RX 有数据=消费者 + * 资产)。@0ms 快复连(连上即关、零数据,E9b :21 46/50 教训)RX 空 → 立即 + * 释放,误杀也无数据损失,后到数据由救回路径接住。边界:滞后锁存杀 + * "已读数据或 RX 空"会话的形态不在本门保护域(E8 窗口未出现该受害形态)。 + * 零误伤:健康 FIN=0x07、静默回收=0x00/0x00 均不命中(E5 20/20 样本) */ + if ((st[0] == CH395F_SOCKET_OPEN) && (st[1] == CH395F_TCP_CLOSED) && + (p_sock->lost_conn_seen == 0U) && (p_sock->recv_bytes == 0U) && + (ch395f_get_recv_len((uint8_t)sockfd) > 0U)) { + /* 置可疑电平(复用探针字段,零 RAM;connect/relisten 清零) */ + p_sock->lost_conn_seen = 1U; + /* 留痕(INFO 级:这是预期自愈路径,非错误,勿污染 [ERR] 台架判据) */ + DBG_INFO("sock%d suspect DISCONNECT on live conn (chip 0x%02X/0x%02X), defer to reconcile", + sockfd, st[0], st[1]); + /* 不释放、不登记沉降、不动 session_dead——保留 400ms 租约窗口 */ + return; + } /* 单连接:先不关 CH395F Socket, * 留给 net_recv_locked 把剩余数据读出来再关,置 CLOSED 等待应用重新监听 */ DBG_INFO("sock%d DISCONNECTED, releasing (chip st=0x%02X/0x%02X)",