From 0054ae629ad2bc8bb9733b437f663712f3d4d847 Mon Sep 17 00:00:00 2001 From: Wanderingss <1624155937@qq.com> Date: Tue, 27 Oct 2026 09:05:27 +0800 Subject: [PATCH] =?UTF-8?q?refactor(=E7=BC=96=E5=8F=B7):=20F-*=20=E7=BD=91?= =?UTF-8?q?=E7=BB=9C=E8=AE=BE=E8=AE=A1=E6=9D=A1=E7=9B=AE=E5=8F=B7=E8=BD=AC?= =?UTF-8?q?=E8=AF=AD=E4=B9=89=E8=AF=B4=E6=98=8E=E2=80=94=E2=80=94=E6=89=B9?= =?UTF-8?q?=E6=AC=A1=E4=B8=80=E6=94=B6=E5=B0=BE=EF=BC=8C=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=B3=A8=E9=87=8A=2043=20=E5=A4=84=20+=20=E6=96=87=E6=A1=A3=20?= =?UTF-8?q?9=20=E5=A4=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 批次一(不碰门禁即可清)的最后半批,原派道中途失败且**未留任何改动**(Lead 核实那批文件零 diff 后重派 setpage 执行,14 只文件 / 46 处),测试侧与一张生成器共 9 处由 Lead 收尾。 做法:**逐处先读属主文档 §7 速查表里那条的语义**,再改写成「一句话结论 + §指针」,同号跨文件同一措辞, 无一处机械删号(例:`F-NET-7` → 「唯一读者红线(docs/网络/网络自愈架构设计.md §7 I7)」)。属主登记处 **12 条定义行原样保留**、不删登记族(删了历史行会报未登记前缀),只在该章加停发句。 顺带清掉 **3 处裸形**(`T6` → 「台架实测」、`M4-lite`、`Q1` 语义化)——裸形正是 id-check 校验 2 抓的形态, 属净减。测试侧收尾时两条纪律:主机侧**断言字符串必须保持 ASCII**(`ns_s3_msg.c` 等三处的号在 CHECK 文本 里,改成 `sole reader of the global register` 而不是中文);板端注释可用中文。 生成器 gen_net_instability_svg.py 文案改动 → 同批重跑产物 `docs/images/网络不稳根因总览.svg`:只有那一 行的**框宽随文字自适应**(526 → 551,右缘 1411 未越界),画布 1560x1468 不变,无溢出告警。 ⚠ 本笔**只含代码注释面**:该半批的文档面(BSD 函数调用关系 9 处、属主文档 §7 停发句、 生成器与产物那张网络不稳图)已被上一笔 `git add docs tools` 一并收走,两笔合起来才是完整的 F-* 批次。 自证:@build **0 错 0 警**且 Program Size 与改前**逐字节同数**(Code=233900 RO=26104 RW=1 536 ZI=136808, 注释无误伤的机器证据);net_socket 457/457、iec104_serv / net_pending 两套 exit 0;cppchec k 钩子参数零 发现、coding-standard 0(lftpd_inet.c 那 4 条是存量且该目录本在钩子 exclude 内,用 HEAD 副本对照 甄别过)。 --- Drivers/BSP/CH395F/ch395f.c | 6 +++--- Drivers/BSP/CH395F/ch395f.h | 16 +++++++++------ Drivers/BSP/NET/README.md | 4 ++-- Drivers/BSP/NET/lftpd/lftpd_inet.c | 3 ++- Drivers/BSP/NET/net_events.c | 33 +++++++++++++++++------------- Drivers/BSP/NET/net_listener.c | 3 ++- Drivers/BSP/NET/net_socket.c | 19 +++++++++-------- Drivers/BSP/NET/net_socket.h | 7 ++++--- Drivers/BSP/NET/net_types.h | 3 ++- 9 files changed, 54 insertions(+), 40 deletions(-) diff --git a/Drivers/BSP/CH395F/ch395f.c b/Drivers/BSP/CH395F/ch395f.c index ad284d21..d0ce22cb 100644 --- a/Drivers/BSP/CH395F/ch395f.c +++ b/Drivers/BSP/CH395F/ch395f.c @@ -1438,7 +1438,7 @@ typedef struct { } ch395f_rst_slot_t; static ch395f_rst_slot_t g_rst[8]; -/* 链路态缓存(F-DRV-13) */ +/* 链路态缓存(docs/网络/网络自愈架构设计.md §4.4 链路态喂料) */ static uint8_t g_link_up; static uint8_t g_link_valid; static uint16_t g_link_changes; @@ -1532,7 +1532,7 @@ int ch395f_sock_is_listening(uint8_t sn) { /* * 函数功能:事件护栏——只读本 Socket SINT(读即清),永不触碰全局寄存器 - * (F-NET-7 收窄:两级预清会清掉其它 Socket 的事件位) + * (唯一读者红线收窄,docs/网络/网络自愈架构设计.md §4.10:两级预清会清掉其它 Socket 的事件位) * 入口参数:sn - Socket 索引 uint8_t 0 - 7 * 返回值:SINT 位图;sn>7 返回 0 uint8_t * 限定条件:芯片已初始化;全局寄存器唯一读者=net_poll(驱动侧契约) @@ -1543,7 +1543,7 @@ uint8_t ch395f_sock_events(uint8_t sn) { return 0U; } /* 契约:只读本 Socket SINT(0x30 读即清),永不触碰全局寄存器 0x19—— - * 全局寄存器读即清且含全部 Socket 事件位,唯一读者=net_poll(F-NET-7) */ + * 全局寄存器读即清且含全部 Socket 事件位,唯一读者=net_poll(唯一读者红线,§4.10) */ return ch395f_get_sock_int_status(sn); } diff --git a/Drivers/BSP/CH395F/ch395f.h b/Drivers/BSP/CH395F/ch395f.h index ea5ceedb..b0f621d4 100644 --- a/Drivers/BSP/CH395F/ch395f.h +++ b/Drivers/BSP/CH395F/ch395f.h @@ -580,7 +580,8 @@ uint16_t ch395f_get_recv_len(uint8_t sock); * 函数功能:获取全局中断状态(2 字节版,支持 Socket 0~7) * 返回值:中断状态 uint16_t(低字节=Socket 0~3 + PHY/DHCP,高字节=Socket 4~7 + DHCPv6) * 限定条件:芯片已初始化 - * ⚠ 护栏(F-NET-7,I7 不变量):本寄存器**读即清**且含全部 Socket 事件位—— + * ⚠ 护栏(唯一读者红线,docs/网络/网络自愈架构设计.md §4.10;I7 不变量): + * 本寄存器**读即清**且含全部 Socket 事件位—— * 任何未配对 SINT 消费的读取都会吞掉其它 Socket 的事件通知。 * **唯一读者 = net_poll(net_socket.c);测试/台架代码同样禁自行读取** * (用户裁定 2026-10-13)——等事件一律直读本 Socket ch395f_get_sock_int_status()。 @@ -758,7 +759,7 @@ void ch395f_get_unreach_info(uint8_t *p_buf); * E2 实测:单次状态回读 18.1us;LISTEN 可见延迟 100% <=10ms。 */ -/* 类型化状态回读 + 每 Socket 缓存(F-DRV-1/3) */ +/* 类型化状态回读 + 每 Socket 缓存 = 单一事实源(docs/网络/网络自愈架构设计.md §4.4) */ #define CH395F_SOCK_STATE_NONE 0xFFU /* open=CLOSED 时 tcp_state 哨兵("无意义") */ typedef struct { @@ -791,14 +792,16 @@ int ch395f_sock_is_listening(uint8_t sn); /* * 函数功能:事件护栏——只读本 Socket SINT(0x30,读即清),永不触碰全局寄存器 - * (F-NET-7 收窄:两级预清"先读全局再读本 socket"会清掉其它 Socket 的 + * (唯一读者红线收窄,docs/网络/网络自愈架构设计.md §4.10:两级预清 + * "先读全局再读本 socket"会清掉其它 Socket 的 * 事件位;全局寄存器唯一读者=net_poll 写成驱动侧契约) * 入口参数:sn - Socket 索引 uint8_t 0 - 7 * 返回值:SINT 位图;sn>7 返回 0 uint8_t */ uint8_t ch395f_sock_events(uint8_t sn); -/* 复合复位模式(F-DRV-4;两模式都必须排 RX——E4 定案,差异只剩最短等待) */ +/* 复合复位模式(两套同构变体的统一原语,docs/网络/网络自愈架构设计.md §4.4; + * 两模式都必须排 RX——E4 定案,差异只剩最短等待) */ typedef enum { CH395F_RESET_GRACEFUL = 0, /* 最短等待 100ms(TRAP-NET-18 二阶段实测值) */ CH395F_RESET_QUARANTINE /* 最短等待 400ms */ @@ -821,7 +824,8 @@ int ch395f_sock_reset_begin(uint8_t sn, ch395f_reset_mode_t mode); */ int ch395f_sock_reset_poll(uint8_t sn); -/* 命令完成判据(F-DRV-8;E3 定案=状态回读,GET_CMD_STATUS 对这三条无判别力) */ +/* 命令完成判据(阻塞等待的非阻塞化,docs/网络/网络自愈架构设计.md §4.4; + * E3 定案=状态回读,GET_CMD_STATUS 对这三条无判别力) */ typedef enum { CH395F_DONE_OPEN = 0, /* open 完成 = byte0 变 05H */ CH395F_DONE_LISTEN, /* listen 完成 = byte0=05H 且 TCP=01H(E2:<=10ms 可见) */ @@ -837,7 +841,7 @@ typedef enum { */ int ch395f_cmd_done(uint8_t sn, ch395f_done_what_t what); -/* 链路态缓存(F-DRV-13;net_poll 读全局后喂 bit0~3) */ +/* 链路态缓存(拔网线不再静默,docs/网络/网络自愈架构设计.md §4.4;net_poll 读全局后喂 bit0~3) */ /* * 函数功能:喂全局中断位(net_poll 读 GET_GLOB_INT_STATUS_ALL 后调用; diff --git a/Drivers/BSP/NET/README.md b/Drivers/BSP/NET/README.md index e573950d..0845caa9 100644 --- a/Drivers/BSP/NET/README.md +++ b/Drivers/BSP/NET/README.md @@ -33,8 +33,8 @@ 本层 CLOSED 而芯片在听 → 只重同步(U11);芯片静默回收 → RESYNC(⑤) - **分级去抖(②=1 轮 / ③④⑤=2 轮 / ①=4 轮)+ 冷却(1s)**——监听失位的重建 动作**必须去抖**,否则"刚 listen 未生效"瞬态会反复重建直至 - `relisten retry budget exhausted`(三监听口全死);①的 4 轮窗是 F-NET-17 M3 - 可疑电平的让位租约(勿改小) + `relisten retry budget exhausted`(三监听口全死);①的 4 轮窗是风暴态三机制里 + M3 可疑门的让位租约(见 `docs/网络/网络自愈架构设计.md` §4.1.6,勿改小) ### 异常复监听隔离(TRAP-NET-18 修复) diff --git a/Drivers/BSP/NET/lftpd/lftpd_inet.c b/Drivers/BSP/NET/lftpd/lftpd_inet.c index 076c050d..759b5d60 100644 --- a/Drivers/BSP/NET/lftpd/lftpd_inet.c +++ b/Drivers/BSP/NET/lftpd/lftpd_inet.c @@ -106,7 +106,8 @@ int lftpd_inet_accept_timeout(int socket, int timeout_ms) if (s >= 0) { return s; } - /* F-NET-15 M2(自愈专项实验 2026-10-12):镜像门控退役——原直读 p_sock->state 在 + /* M2 镜像门控退役(自愈专项实验 2026-10-12;沉降门失效族收口, + * docs/网络/网络自愈架构设计.md §4.3):原直读 p_sock->state 在 * relisten 忙期(CLOSED 瞬态)误判"已关闭",扔掉 ~4.9s 等待预算;armed 门控 * 认"监听器在服役(LISTENING)或待重建且 RX 有残留(closed-with-data 救回窗)", * 与 :7003 的监听生命周期 P1 同型修复 */ diff --git a/Drivers/BSP/NET/net_events.c b/Drivers/BSP/NET/net_events.c index 0ff7629d..551572ec 100644 --- a/Drivers/BSP/NET/net_events.c +++ b/Drivers/BSP/NET/net_events.c @@ -127,8 +127,9 @@ 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 原不清此字段) */ + /* M3 可疑门前置(风暴态三机制,docs/网络/网络自愈架构设计.md §4.1.6): + * 清可疑电平——探针(LISTENING 期)残留计数会带进新会话,不补此清零则矛盾判据 + * 首轮即被旁路(台架实测 grep:connect 原不清此字段) */ p_sock->lost_conn_seen = 0U; /* 新开 Socket 发送缓冲按空闲计 */ p_sock->send_ready = 1; @@ -167,7 +168,7 @@ void handle_connect_event(net_sock_t *p_sock) { /* 监听生命周期 P1:新会话开始 —— 清"上一条会话已结束"电平(同 LISTENING * 分支:必须在转 ESTABLISHED 后立刻做,防抢先 relisten 窗口误 EOF) */ p_sock->session_dead = 0U; - /* F-NET-17 M3 前置:清可疑电平(同 LISTENING 分支) */ + /* M3 可疑门前置:清可疑电平(同 LISTENING 分支,§4.1.6 风暴态三机制) */ p_sock->lost_conn_seen = 0U; /* 使能 KeepAlive(客户端连接保活) */ @@ -238,10 +239,11 @@ void handle_disconnect_event(net_sock_t *p_sock) { /* 直接返回(中断已读清,不会重复上报) */ return; } - /* F-NET-17 M3(自愈专项实验 2026-10-13):矛盾态可疑门——芯片 Socket 仍 OPEN(0x05) + /* M3 可疑门(自愈专项实验 2026-10-13;风暴态三机制收口, + * docs/网络/网络自愈架构设计.md §4.1.6):矛盾态可疑门——芯片 Socket 仍 OPEN(0x05) * 而 TCP 槽 0x00 且本层 ESTABLISHED = 逻辑矛盾(活连接应 0x04):陈旧 DISCONNECT * (拆链完成滞后锁存,TRAP-NET-12)与"真断开恰被旧拆链覆写槽"在 D20 上不可分辨 - * (结构性失明,F-NET-15 Q1)。处置:不吃边沿,置可疑电平返回,交对账① + * (结构性失明,同 GRACEFUL 沉降门放大器根因,§4.3)。处置:不吃边沿,置可疑电平返回,交对账① * (ESTABLISHED + 芯片 TCP==CLOSED)电平去抖再入本函数(对账与重建合一 * 后=4×100ms,NET_RECON_STABLE_DEATH,让位租约 400ms 不变 + 冷却): * flag==1 旁路本门 → 正常释放;连接真活则租约内 @@ -272,7 +274,8 @@ void handle_disconnect_event(net_sock_t *p_sock) { /* TRAP-NET-18 推广(2026-09-24 台架实证):正常 DISCONNECT 释放留下的芯片收尾状态 * 会在复用同一 fd 的下一条连接上以"伪 DISCONNECT"形式投递(实测 accept 后约 10~20ms)→ 该连接被提前释放,应用把已到的 2048B 当整份文件并回报 226; * 仅**本连接收过数据**时登记沉降(实测触发源 = 收过数据的数据通道被关闭),纯连接即关/只发不收的连接免沉降,保住 TRAP-NET-17 的快速复连时序(:21 @0ms ×50 全通过) */ - /* F-NET-15 M1(自愈专项实验 2026-10-12):沉降**无条件**登记。原 recv_bytes!=0 门的 + /* M1 沉降门退役(自愈专项实验 2026-10-12;GRACEFUL 无条件化, + * docs/网络/网络自愈架构设计.md §4.3):沉降**无条件**登记。原 recv_bytes!=0 门的 * 受害者由事件时序定义(accept 后 ~20ms 被陈旧 DISCONNECT 杀 → recv_bytes==0 是 * 构造性必然),门对"残渣循环自持"形态失效(n30_repro 背靠背 9/10 失败,E1 实测); * 门原保护目标(:21 @0ms 快复连)已被监听生命周期单一重建入口延迟化(恢复窗实测 0.3~1s)架空, @@ -426,7 +429,8 @@ static void fire_event(net_sock_t *p_sock, net_event_t event) { * 返回值:无 * 限定条件:netTask 上下文(net_accept_locked 内调用,其开头已 net_poll(), * 驱动缓存新鲜度有保证) - * 函数说明:1. F-MS-9:判据改读**驱动状态缓存**(零 SPI;唯一 + * 函数说明:1. 去抖自偿退役(镜像降级为会话投影的直接红利, + * docs/网络/网络自愈架构设计.md §3.3):判据改读**驱动状态缓存**(零 SPI;唯一 * 刷新点=net_poll),**探针去抖删除**——原去抖防的两类瞬态已 * 结构性消除:"刚 listen 尚未生效"显示 TCP=00 永不命中 ESTABLISHED * 门(E2:LISTEN 可见 100% <=10ms 无长尾);拆链窗假 ESTABLISHED @@ -456,7 +460,7 @@ void net_lost_connect_probe(net_sock_t *p_sock) { p_sock->lost_conn_seen = 0U; return; } - /* F-MS-9:去抖已删(判据读缓存,两类瞬态结构性消除, + /* 探针去抖已删(去抖自偿退役,判据读缓存、两类瞬态结构性消除, * 见函数头注释 1);lost_conn_seen 仅作 M3 可疑电平标志用,动手前清零 */ p_sock->lost_conn_seen = 0U; /* 留痕:事件未收到自愈命中 */ @@ -479,7 +483,7 @@ void net_lost_connect_probe(net_sock_t *p_sock) { * ① 本层 ESTABLISHED 而芯片已无连接 → 按断开处理(只置事实) * ② 本层 LISTENING 而芯片已完成握手 → 补做 standalone accept(命中时 * 才回读对端端口做幽灵甄别——本 tick 唯一按需 SPI) - * ⑤(F-NET-2)本层 ESTABLISHED 而芯片静默回收回 LISTEN(0x05/0x01 无 + * ⑤(静默回收认领,docs/网络/网络自愈架构设计.md §4.1)本层 ESTABLISHED 而芯片静默回收回 LISTEN(0x05/0x01 无 * DISCONNECT)→ RESYNC 只修本层 * ③ 本层 LISTENING(监听型 fd)而芯片监听失位 → 重建 * ④ 本层 CLOSED(监听型 fd)而芯片不在 LISTEN → 重建 @@ -487,10 +491,11 @@ void net_lost_connect_probe(net_sock_t *p_sock) { * (重下发因 USE 错误关掉正听着的 Socket,U12 同源事故) * 4. 去抖分级(100ms/轮;E2:LISTEN 可见 100% <=10ms 无长尾):②=1 轮 * (幽灵甄别挡拆链窗的旧连接 ESTABLISHED);③④⑤=2 轮(2026-09-23 实证: - * 无去抖时监听被反复重建直至放弃);①=4 轮(**勿改小**:F-NET-17 M3 - * 可疑电平让位再入,400ms 让位窗=在途投递不可毁的最后租约,E9a 实证) + * 无去抖时监听被反复重建直至放弃);①=4 轮(**勿改小**:M3 可疑门 + * 让位再入(§4.1.6 让位红线),400ms 让位窗=在途投递不可毁的最后租约,E9a 实证) * 5. 动手后冷却 NET_RECONCILE_COOLDOWN_MS 防风暴(U11 被动重同步不占) - * 6. 链路态订阅(F-DRV-13):驱动 link 变化计数变化 → 留痕(不自动重配) + * 6. 链路态订阅(链路态喂料缓存,docs/网络/网络自愈架构设计.md §4.4): + * 驱动 link 变化计数变化 → 留痕(不自动重配) */ void net_reconcile_tick(void) { /* 上次对账轮的时刻(tick) */ @@ -511,7 +516,7 @@ void net_reconcile_tick(void) { /* 更新本轮起始时刻 */ s_last = now; - /* 链路态订阅(F-DRV-13):net_poll 已喂驱动,这里只看计数变化 */ + /* 链路态订阅(§4.4 链路态喂料缓存):net_poll 已喂驱动,这里只看计数变化 */ { /* 链路变化计数订阅基线(0xFFFF=未建档) */ static uint16_t s_link_last = 0xFFFFU; @@ -556,7 +561,7 @@ void net_reconcile_tick(void) { stable_need = NET_RECON_STABLE_DEATH; } else if ((c.open != CH395F_SOCKET_CLOSED) && (c.tcp_state == CH395F_TCP_LISTEN)) { - /* ⑤(F-NET-2 缺口):芯片静默回收——本层 ESTABLISHED + /* ⑤(静默回收认领,docs/网络/网络自愈架构设计.md §4.1):芯片静默回收——本层 ESTABLISHED * 而芯片已自行把 Socket 收回 LISTEN(0x05/0x01,**不发 DISCONNECT * 中断**,run8 台架实证)→ RESYNC 语义 */ bad = 5; diff --git a/Drivers/BSP/NET/net_listener.c b/Drivers/BSP/NET/net_listener.c index f0a5ada2..f2fe9aba 100644 --- a/Drivers/BSP/NET/net_listener.c +++ b/Drivers/BSP/NET/net_listener.c @@ -140,7 +140,8 @@ static int net_relisten_locked(int sockfd) { ch395f_close_socket((uint8_t)sockfd); /* 主动关:清旧连接收尾状态 */ (void)ch395f_get_sock_int_status((uint8_t)sockfd); /* 读即清:只碰本 Socket */ /* ⚠ 此处**绝不**读全局中断寄存器:它整体读即清、无按位手段,每 30ms 一轮会把 - * 其它在用 Socket 的门焊死(F-NET-15 M4-lite 删的就是它 → 架构设计 §4.10.3) */ + * 其它在用 Socket 的门焊死(沉降段全局读即清的删除对象就是它 → + * docs/网络/网络自愈架构设计.md §4.10.3) */ ch395f_get_socket_status((uint8_t)sockfd, st); /* 芯片尚未回到 CLOSED/TCP_CLOSED,或未满最短等待 */ diff --git a/Drivers/BSP/NET/net_socket.c b/Drivers/BSP/NET/net_socket.c index 8e7afd9f..c4edb185 100644 --- a/Drivers/BSP/NET/net_socket.c +++ b/Drivers/BSP/NET/net_socket.c @@ -482,7 +482,7 @@ int net_poll(void) { /* 读取全局中断状态(2 字节):读操作本身会清除 CH395F 中断并使其拉高 INT#, * 若此后仍有新中断,CH395F 会再次拉低 INT#,由下一次 net_poll() 处理 */ int_status = ch395f_get_glob_int_status_all(); - /* F-DRV-13 接线:把全局位喂驱动——bit2 PHY_CHANGE 时驱动 + /* 链路态喂料接线(docs/网络/网络自愈架构设计.md §4.4):把全局位喂驱动——bit2 PHY_CHANGE 时驱动 * 重读 PHY 更新 link_up 缓存 + 变化计数,net 层在 reconciler 订阅留痕 * (运行期拔网线不再静默;不自动重配,重配仍走 UI/配置引擎路径) */ ch395f_glob_event_feed(int_status); @@ -779,8 +779,9 @@ void net_process_messages(void) { } break; } - /* F-NET-3:NET_MSG_RESYNC_LISTEN / NET_MSG_RELISTEN 两个 - * 手动自愈消息已删——RESYNC 语义并入对账⑤(net_reconcile_tick), + /* 手动自愈 API 退役(docs/网络/网络自愈架构设计.md §4.2): + * NET_MSG_RESYNC_LISTEN / NET_MSG_RELISTEN 两个 + * 消息已删——RESYNC 语义并入对账⑤(net_reconcile_tick), * RELISTEN 与 reconciler/D10 完全重叠且对健康监听器是 footgun; * 生产调用者本就为零(仅 test/board Phase 13,已改由自动机制接管) */ default: @@ -1396,7 +1397,7 @@ int net_accept(int sockfd, struct net_sockaddr *addr, int *addrlen) { return msg.result; } -/* F-NET-4:net_can_accept 已删除——它只认 ESTABLISHED,作为 accept +/* accept 门控迁移(docs/网络/网络自愈架构设计.md §4.2):net_can_accept 已删除——它只认 ESTABLISHED,作为 accept * 门控会把"监听器在服役但本轮还没 CONNECT"的窗口全挡掉(:2404 CONNECT 事件补 accept 探针 * 因此从不运行,与已修的 :7003 探针失效同型);唯一生产调用者 iec104 已迁 * net_listener_armed。net_can_read(RECV 门控)不受影响、保留。 */ @@ -1409,10 +1410,10 @@ int net_accept(int sockfd, struct net_sockaddr *addr, int *addrlen) { * 0 - 未就绪(fd 未分配 / 非监听型 / 正处隔离期以外的不就绪态) int * 限定条件:任意任务上下文;net_init() 已调用 * 函数说明:1. 不变量 II(单一重建所有者):取代已退役的 net_can_accept()(只认 - * ESTABLISHED,F-NET-4 删除)作为监听 accept 门控。原门控下 + * ESTABLISHED,§4.2 门控迁移删除)作为监听 accept 门控。原门控下 * :7003 永不进 net_accept → * net_lost_connect_probe(CONNECT 事件未收到补 accept)对该端口从不运行 - * (F-NET-4) + * (门控迁移,docs/网络/网络自愈架构设计.md §4.2) * 2. 为什么放行 LISTENING:探针与"closed-but-readable 接受"(:1338) * 只在 net_accept_locked 内部发生,门控挡在外面就永远到不了; * LISTENING 态 accept 由探测补 accept 或返 WOULDBLOCK,均安全 @@ -1646,7 +1647,7 @@ static int net_connect_locked(int sockfd, const struct net_sockaddr *addr, int a } /* 清掉本 Socket 可能残留的中断状态,丢弃上一条连接遗留的 DISCONNECT。 - * F-NET-7:只清**本 Socket** SINT(驱动护栏原语)——原 + * 唯一读者红线(docs/网络/网络自愈架构设计.md §4.10):只清**本 Socket** SINT(驱动护栏原语)——原 * "再读清全局"会焊死其它在用 Socket 的事件位(全局寄存器唯一读者=net_poll) */ (void)ch395f_sock_events((uint8_t)sockfd); @@ -1981,7 +1982,7 @@ static int net_recv_locked(net_sock_t *p_sock, void *buf, int len, int flags, * **确定性 sock_reset**(读空 RX -> CLOSE(幂等) -> 排空本 Socket * 事件(quiescent) -> 等 byte0=00H,内置 LISTEN 态二段 CLOSE 补发 * ——E2 补充发现:一次 CLOSE 只拆监听 byte0 恒 05) - * 2. F-NET-7:排空只碰本 Socket SINT,**不再读清全局中断寄存器** + * 2. 唯一读者红线(docs/网络/网络自愈架构设计.md §4.10):排空只碰本 Socket SINT,**不再读清全局中断寄存器** * (唯一读者=net_poll;原循环读全局会焊死其它 Socket 事件位) * 3. 快路径:芯片已 CLOSED(byte0=00H)→ 跳过复位只清残留事件 * 4. 复位超时照常放行(同原 500ms 超时容忍;后续 relisten 由 @@ -2920,7 +2921,7 @@ int net_sock_state(int sockfd) { return (int)s_net_socks[sockfd].state; } -/* F-NET-3:手动自愈 API net_resync_listen / net_relisten 已删除—— +/* 手动自愈 API 退役(docs/网络/网络自愈架构设计.md §4.2):net_resync_listen / net_relisten 已删除—— * RESYNC 语义并入对账⑤(net_reconcile_tick 自动认领"芯片静默回收回 LISTEN"形态, * 200ms×2 去抖 + 1s 冷却沿用);RELISTEN 与 reconciler/D10 完全重叠且对健康监听器是 * footgun(无条件 open→USE→close 自毁 ~1s,原注释自认)。生产调用者本就为零 diff --git a/Drivers/BSP/NET/net_socket.h b/Drivers/BSP/NET/net_socket.h index 9014ea1c..59fa04d2 100644 --- a/Drivers/BSP/NET/net_socket.h +++ b/Drivers/BSP/NET/net_socket.h @@ -39,7 +39,8 @@ typedef enum { NET_MSG_LISTEN, NET_MSG_ACCEPT, NET_MSG_DROP_CONN, /* 主动拆会话、保监听(见 net_drop_conn) */ - /* F-NET-2/3:NET_MSG_RESYNC_LISTEN / NET_MSG_RELISTEN 已删—— + /* 静默回收认领 + 手动自愈 API 退役(docs/网络/网络自愈架构设计.md §4.1、§4.2): + * NET_MSG_RESYNC_LISTEN / NET_MSG_RELISTEN 已删—— * 静默回收由对账⑤自动认领(net_reconcile_tick),重建由 reconciler * 形态③④/D10 单一 * 所有者负责;手动自愈 API 面退役(生产调用者本就为零) */ @@ -172,7 +173,7 @@ int net_listen(int sockfd); */ int net_accept(int sockfd, struct net_sockaddr *addr, int *addrlen); -/* F-NET-4:net_can_accept 已退役——只认 ESTABLISHED 的旧门控会把 +/* accept 门控迁移(docs/网络/网络自愈架构设计.md §4.2):net_can_accept 已退役——只认 ESTABLISHED 的旧门控会把 * "监听器在服役、本轮待 CONNECT"窗口全挡掉(CONNECT 事件补 accept 探针因此从不运行); * 监听 accept 门控统一用 net_listener_armed(),recv 门控 net_can_read() 保留。 */ @@ -457,7 +458,7 @@ int net_get_errno(void); */ int net_sock_state(int sockfd); -/* F-NET-3:net_resync_listen / net_relisten 声明已删—— +/* 手动自愈 API 退役(docs/网络/网络自愈架构设计.md §4.2):net_resync_listen / net_relisten 声明已删—— * 静默回收形态由对账⑤自动认领(2 轮去抖 + 1s 冷却,纪律"不发芯片命令" * 原样保留在认领动作内);监听重建由 reconciler 形态③④(100ms 周期)/ * D10(30ms 重试)单一所有者。勿再引入"应用层手动自愈"入口。 */ diff --git a/Drivers/BSP/NET/net_types.h b/Drivers/BSP/NET/net_types.h index 72a565c8..189968fc 100644 --- a/Drivers/BSP/NET/net_types.h +++ b/Drivers/BSP/NET/net_types.h @@ -124,7 +124,8 @@ struct net_sockaddr_in { * 芯片侧状态唯一事实源=驱动状态缓存(ch395f_sock_state_cached,刷新点=net_poll); * 本 8 态只表达**本层会话语义**(fd 生命周期/待 accept 电平/门控展示), * 事件与对账把它与芯片事实对齐。新增"按芯片状态决策"的代码一律读驱动缓存, - * 勿再直读本投影判芯片(历史五层补丁的根因,见主流方案对照 F-MS-8)。 + * 勿再直读本投影判芯片(历史五层补丁的根因 = 有损投影必生决策窗口, + * 见 docs/网络/网络自愈架构设计.md §1.5 主流方案对照与 §3.3 会话投影)。 */ typedef enum { NET_SOCK_STATE_CLOSED = 0, /* 未使用 */