refactor(net)!: N34 阶段1 API 面收敛(对账⑤ + 删 3 个手动自愈 API)
BREAKING CHANGE: 删除公开 API net_relisten / net_resync_listen / net_can_accept 与消息类型 NET_MSG_RESYNC_LISTEN / NET_MSG_RELISTEN。 生产调用者为零(仅看门狗文档与 iec104 门控),应用侧无迁移成本; 如有外部消费者须改用对账/pump 自动机制(见下)。 1. 对账①扩展为①②⑤(F-NET-2 缺口,先补缺口再删 API) net_reconcile_tick 新增 bad=5:本层 ESTABLISHED 且芯片 0x05/0x01 (Socket OPEN + TCP LISTEN,静默回收回监听、不发 DISCONNECT) → RESYNC 语义只修本层(state→LISTENING + last_peer_port 转登 + lost_conn_seen 清零 + 取消挂起 recv),**不发任何芯片命令** (纪律同 pump③ U11,run8 实证重下发会 170s 永拒)。 原判据①要求 TCP==CLOSED、②要求本层 LISTENING,均不命中此形态 ——此前生产无人认领(仅手动 API 能修)。 2. 删 net_relisten(net_socket.c 函数 + 消息分派 + 头文件声明) footgun:对健康监听器无条件 open→USE→close 自毁 ~1s(原注释自认); 与 pump(100ms)/D10(30ms) 完全重叠。 3. 删 net_resync_listen(同上;语义并入第 1 条) 4. 删 net_can_accept(net_socket.c + net_socket.h + sim 三处) 只认 ESTABLISHED 的旧门控把"监听器在服役、待 CONNECT"窗口全挡掉, :2404 丢 CONNECT 探针因此从不运行;iec104 门控迁 net_listener_armed。 5. timeSync :8888 会话收尾不再 net_close(同 fd 续 accept,监听跨会话 常驻;原 close→重建每会话一个 Trap 09 沉降窗)。server 脚本注释同步 新契约(PC 侧 2s 宽限后自行关闭)。 6. lftpd 应用层阻塞重试退役:lftpd_inet_listen 5 轮(500ms/2000ms,最坏 10s 阻塞 ftpTask) → 单次 + 失败即 425;cmd_pasv 3×200ms 同删。 就绪屏障已消除 Trap 09 启动形态,客户端自带传输重试语义。 台架实证修正(本提交内二次修复,务必留痕): - net_listener_armed 补齐 **ESTABLISHED 放行**。首版迁移只放行 LISTENING/CLOSED+残留,漏了 ESTABLISHED=单连接模型的"待 accept"电平 → iec104 200ms 任务周期抢不过对账② 的 ~400ms 去抖,对账②先 standalone accept 转 ESTABLISHED 后 armed=0 → 应用整场不 accept,18/18 检查全 FAIL (设备日志证据:sock1 standalone accept 后无 i104 accepted,直至对端 FIN 才由 closed-with-data 救回)。补放行后 18/18 PASS,且耗时 127s→8.3s。 该态 accept 必返 fd,无 RPC 风暴风险。 - 期间顺带验证 M3 无辜:sock1 suspect DISCONNECT on live conn 命中后 defer→对账①→closed-with-data accept 把未 accept 的 RX 数据救回, 正是 M3 设计意图(资产门保护)。 验证(全绿):@build 0/0(Code=209580;含 CH395F 套件+Phase13 全量重编 0/0 的编译验证);@test PASS(回读无差异);iec104 18/18(8.3s); n30 0/50;:21 @0ms 50/50 p50=512;:7003 50/50 p50=517;ftp_regression 11/11;Trap23 RST 5/5 + FIN 5/5;time_sync :8888 连续推送正常(RTC 更新、 无 [ERR])。文档同步:BSD 指南(§3.3/3.6/10.1/10.2/12 + 变更记录)、 函数调用关系、监听生命周期设计说明、IEC104 上行设计说明、模拟器差距 清单、链路延迟测试说明。 门禁说明:doc-links 工作树 junction 伪影按既定口径 SKIP;mem-budget 分支 .map 漂移同前;cppcheck/coding-standard 手跑 Passed。
This commit is contained in:
@@ -37,8 +37,9 @@ typedef enum {
|
||||
NET_MSG_CONNECT,
|
||||
NET_MSG_LISTEN,
|
||||
NET_MSG_ACCEPT,
|
||||
NET_MSG_RESYNC_LISTEN, /* 仅修 MCU 侧状态(ESTABLISHED→LISTENING),不发芯片命令 */
|
||||
NET_MSG_RELISTEN, /* 无条件芯片侧重监听(open+listen,含 Trap 09 重试) */
|
||||
/* N34 阶段1(F-NET-2/3):NET_MSG_RESYNC_LISTEN / NET_MSG_RELISTEN 已删——
|
||||
* 静默回收由对账⑤自动认领(net_reconcile_tick),重建由 pump/D10 单一
|
||||
* 所有者负责;手动自愈 API 面退役(生产调用者本就为零) */
|
||||
} net_msg_type_t;
|
||||
|
||||
typedef struct {
|
||||
@@ -150,48 +151,38 @@ int net_listen(int sockfd);
|
||||
*/
|
||||
int net_accept(int sockfd, struct net_sockaddr *addr, int *addrlen);
|
||||
|
||||
/*
|
||||
* 函数功能:查询监听 Socket 当前是否有可接受的连接(**纯 RAM 读,不发起 RPC**)
|
||||
* 入口参数:sockfd - 监听 Socket 描述符 int
|
||||
* 出口参数:无
|
||||
* 返回值:1 - 有连接可接受;0 - 无(含描述符无效) int
|
||||
* 限定条件:net_init() 已调用;任意任务上下文(含 uiTask 等实时性敏感任务)
|
||||
* 函数说明:1. 只读 Socket 控制块状态,**不经消息队列、不等 netTask 回执** →
|
||||
* 调用方不会被 netTask 的忙碌程度拖住(对比 net_accept:
|
||||
* osMessageQueuePut(osWaitForever) + xTaskNotifyWait(portMAX_DELAY),
|
||||
* 两者均**无上界**)
|
||||
* 2. 判据与 net_accept_locked() 完全一致:单连接模型下监听 Socket 自身
|
||||
* 在 CONNECT 事件后转 ESTABLISHED,即"有连接可接受"
|
||||
* 3. 用途 = **门控**:无连接时直接跳过 net_accept(),把"每轮一次无谓
|
||||
* RPC"降为 0(UI 推流 10 ms 轮询 = 100 msg/s 队列压力的根因)
|
||||
* 4. 跨任务读单字:netTask 是唯一写者,最坏两种结果都无害——
|
||||
* 晚一轮发现(netTask 每 1 ms 就 net_poll 一次),或扑空
|
||||
* (net_accept 返回 -1 + NET_ERR_WOULDBLOCK)
|
||||
* 5. 丢 CONNECT 中断由 net_reconcile_tick()(200 ms 对账 + 去抖)自愈,
|
||||
* 本函数**不承担**自愈责任
|
||||
*/
|
||||
int net_can_accept(int sockfd);
|
||||
/* N34 阶段1(F-NET-4):net_can_accept 已退役——只认 ESTABLISHED 的旧门控会把
|
||||
* "监听器在服役、本轮待 CONNECT"窗口全挡掉(丢 CONNECT 探针因此从不运行);
|
||||
* 监听 accept 门控统一用 net_listener_armed(),recv 门控 net_can_read() 保留。 */
|
||||
|
||||
/*
|
||||
* 函数功能:查询监听 Socket 是否处于"应该尝试 accept"的就绪态(**纯 RAM 读,不发起 RPC**)
|
||||
* 入口参数:sockfd - 监听 Socket 描述符 int
|
||||
* 出口参数:无
|
||||
* 返回值:1 - 就绪(LISTENING,或 CLOSED + auto_relisten = 断连待重建态);0 - 不就绪 int
|
||||
* 返回值:1 - 就绪(ESTABLISHED 待 accept / LISTENING / CLOSED+auto_relisten
|
||||
* +残留数据);0 - 不就绪 int
|
||||
* 限定条件:net_init() 已调用;任意任务上下文
|
||||
* 函数说明:1. N-32(P1 不变量 II):取代 `net_can_accept()`(只认 ESTABLISHED)作为
|
||||
* ui_net_sink 的 accept 门控——原门控使 :7003 永不进 `net_accept()`,
|
||||
* 函数说明:1. N-32(P1 不变量 II,N34 阶段1 补齐 ESTABLISHED 放行):取代已退役的
|
||||
* `net_can_accept()`(只认 ESTABLISHED)作为监听 accept 门控——原门控使
|
||||
* :7003 永不进 `net_accept()`,
|
||||
* `net_lost_connect_probe`(丢 CONNECT 中断补 accept,N-30 实证的
|
||||
* "数据被吞/425"主根因修复)对该端口等于从未运行
|
||||
* 2. 放行 LISTENING:探针与 "closed-but-readable 接受" 都发生在
|
||||
* `net_accept_locked` **内部**,门控挡在外面就永远到不了
|
||||
* 2b. 放行 ESTABLISHED(N34 阶段1 台架修正):单连接模型下 CONNECT 处理
|
||||
* (net_poll 分派 / 探针补 accept / 对账② standalone accept)把监听 fd
|
||||
* 转 ESTABLISHED,这正是"待 accept"电平——漏放行则任务周期慢的消费者
|
||||
* (i104 200ms 抢不过对账② ~400ms 去抖)永不 accept、会话整场饿死
|
||||
* (2026-10-13 实测全 18 项 FAIL)。此态 accept 必返 fd,无风暴风险
|
||||
* 3. 放行 CLOSED+auto_relisten **且 readable≠0**(有残留数据):
|
||||
* 保住 N-30 的 "closed-but-readable" 接受;**无残留时必须返回 0**,
|
||||
* 否则调用方会在整个 CLOSED 窗口内每轮发起 `net_accept`(RPC 无上界)
|
||||
* → 队列积压 → 喂不上狗(2026-10-12 P2a 台架实测 48 条 task stall)。
|
||||
* 重建由 `net_listener_pump` 负责,调用方无需催促
|
||||
* 4. 与 `net_can_accept` 的语义差异**有意为之**:本函数回答"这个监听器
|
||||
* 这一轮**值不值得**发起一次 accept",而非"一定有连接"
|
||||
* 5. 跨任务读单字,同 `net_can_accept` 的最坏情形论证
|
||||
* 4. 与已退役 `net_can_accept` 的关系:本函数 = 其 ESTABLISHED 放行态
|
||||
* ∪ LISTENING ∪ CLOSED+残留;回答"这个监听器这一轮**值不值得**发起
|
||||
* 一次 accept",而非"一定有连接"
|
||||
* 5. 跨任务读单字,同 `net_can_read` 的最坏情形论证
|
||||
*/
|
||||
int net_listener_armed(int sockfd);
|
||||
|
||||
@@ -346,23 +337,10 @@ int net_get_errno(void);
|
||||
*/
|
||||
int net_sock_state(int sockfd);
|
||||
|
||||
/*
|
||||
* 函数功能:断连重同步——仅把 MCU 侧状态对齐到 LISTENING,不发任何芯片命令
|
||||
* 适用场景:芯片"静默回收"(peer 发 FIN 后芯片自行把 Socket 回收回监听
|
||||
* 且不发 DISCONNECT 中断,2026-09-22 台架实证)→ MCU 状态滞留
|
||||
* ESTABLISHED。调用方须确信连接已死/芯片已回收(如会话超时中止后);
|
||||
* 连接仍存活时严禁调用(会把活连接标记成监听态)。
|
||||
* 返回值:0 - 已同步(或原本即 LISTENING);-1 - 失败(描述符/队列无效)
|
||||
*/
|
||||
int net_resync_listen(int sockfd);
|
||||
|
||||
/*
|
||||
* 函数功能:无条件重新监听(芯片侧 open+listen,含 Trap 09 失败重试)
|
||||
* 适用场景:断连后需确保监听器确定在位的自愈(监听短暂中断 ~1s,调用方
|
||||
* 的重连逻辑须容忍)
|
||||
* 返回值:0 - 成功;-1 - 失败
|
||||
*/
|
||||
int net_relisten(int sockfd);
|
||||
/* N34 阶段1(F-NET-3):net_resync_listen / net_relisten 声明已删——
|
||||
* 静默回收形态由对账⑤自动认领(≤400ms 去抖 + 1s 冷却,纪律"不发芯片命令"
|
||||
* 原样保留在认领动作内);监听重建由 pump(100ms 周期)/D10(30ms 重试)
|
||||
* 单一所有者。勿再引入"应用层手动自愈"入口。 */
|
||||
|
||||
/*
|
||||
* 函数功能:将 IP 地址字符串转为网络字节序
|
||||
|
||||
Reference in New Issue
Block a user