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:
+29
-11
@@ -124,9 +124,11 @@ static int time_sync_open_listener(void) {
|
||||
* 入口参数:conn_sock - 已建立的连接 Socket 描述符(单连接模式下即监听 Socket 自身)
|
||||
* 返回值:无
|
||||
* 函数说明:pending 读取 PC 发来的时间包("TIME"+uint32 大端 本地时间),解析后
|
||||
* 写回 RTC,然后关闭连接。每次等待 = 一次挂起请求(netTask 零占用,
|
||||
* L3 pending 化),单次超时 = 剩余总预算(≤30s,语义与旧 30s 阻塞一致);
|
||||
* 跨调用累积,容忍时间包被 TCP 分段送达
|
||||
* 写回 RTC。**不在此 close**(N34 阶段1-5:单连接模式下 conn_sock 即
|
||||
* 监听 fd,close 连监听一起毁、重建窗 ~0.3-1s;net 层 auto_relisten
|
||||
* 已把同 fd 收回监听,外层直接续 accept——lftpd 样板)。每次等待 =
|
||||
* 一次挂起请求(netTask 零占用,L3 pending 化),单次超时 = 剩余总预算
|
||||
* (≤30s,语义与旧 30s 阻塞一致);跨调用累积,容忍时间包被 TCP 分段送达
|
||||
*/
|
||||
static void time_sync_handle_conn(int conn_sock) {
|
||||
uint8_t buf[16];
|
||||
@@ -179,7 +181,10 @@ static void time_sync_handle_conn(int conn_sock) {
|
||||
}
|
||||
}
|
||||
|
||||
net_close(conn_sock);
|
||||
/* N34 阶段1-5:原 net_close(conn_sock) 已删——单连接模式 conn==监听 fd,
|
||||
* close 毁监听(AGENTS 模块约定:EOF 时应用层不得 close);net 层
|
||||
* auto_relisten 已把同 fd 收回 LISTENING,外层循环直接续 accept。
|
||||
* 模拟器多连接后端 conn≠ls,由调用方(外层)负责关数据 fd。 */
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -187,8 +192,10 @@ static void time_sync_handle_conn(int conn_sock) {
|
||||
* 入口参数:argument - 未使用
|
||||
* 返回值:无
|
||||
* 限定条件:net_init() 已由 netTask 完成;netTask 正在处理消息队列
|
||||
* 函数说明:等待网络栈就绪后,循环:建监听 -> 等连接 -> 处理 -> 关闭 -> 重建监听。
|
||||
* 全部 socket 操作经消息队列由 netTask 串行执行,与本任务/其它网络任务并发安全。
|
||||
* 函数说明:等待网络栈就绪后,循环:建监听 -> 等连接 -> 处理 -> **同 fd 续
|
||||
* accept**(N34 阶段1-5:会话收尾不 close,监听跨会话常驻,仅网络
|
||||
* 代次变化时重建)。全部 socket 操作经消息队列由 netTask 串行执行,
|
||||
* 与本任务/其它网络任务并发安全。
|
||||
*/
|
||||
void time_sync_task(void *argument) {
|
||||
(void)argument;
|
||||
@@ -213,6 +220,9 @@ void time_sync_task(void *argument) {
|
||||
}
|
||||
}
|
||||
|
||||
/* 监听 fd 跨会话常驻(N34 阶段1-5):仅首次/网络代次变化/被毁时重建 */
|
||||
int ls = -1;
|
||||
|
||||
for (;;) {
|
||||
/* 心跳:本任务在 required_mask 内。以下每一处可能长于 100ms 抽样窗的
|
||||
* 阻塞点(监听重试 2s、accept 轮询 200ms/次、收尾 50ms)都就近补心跳。 */
|
||||
@@ -221,11 +231,13 @@ void time_sync_task(void *argument) {
|
||||
/* 记录本次监听对应的网络代次;代次变化(网络重建)则放弃旧监听重建 */
|
||||
uint32_t gen = net_get_generation();
|
||||
|
||||
int ls = time_sync_open_listener();
|
||||
if (ls < 0) {
|
||||
DBG_ERROR("time_sync: open listener FAIL, retry later");
|
||||
time_sync_delay_fed(2000U);
|
||||
continue;
|
||||
ls = time_sync_open_listener();
|
||||
if (ls < 0) {
|
||||
DBG_ERROR("time_sync: open listener FAIL, retry later");
|
||||
time_sync_delay_fed(2000U);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
/* 等待 PC 连接:net_accept 在无连接时立即返回 -1,循环重试同一监听 Socket */
|
||||
@@ -235,6 +247,7 @@ void time_sync_task(void *argument) {
|
||||
if (conn < 0) {
|
||||
if (net_get_generation() != gen) {
|
||||
net_close(ls); /* 网络重建:旧监听失效,回外层重建 */
|
||||
ls = -1;
|
||||
break;
|
||||
}
|
||||
time_sync_delay_fed(200U);
|
||||
@@ -247,7 +260,12 @@ void time_sync_task(void *argument) {
|
||||
}
|
||||
|
||||
time_sync_handle_conn(conn);
|
||||
/* conn(单连接模式下即 ls)已被 net_close 释放,下次循环重建监听 */
|
||||
/* N34 阶段1-5:会话收尾不 close(单连接模式 conn==ls,close 连监听
|
||||
* 一起毁);net 层 auto_relisten 已把同 fd 收回 LISTENING,下轮循环
|
||||
* 直接续 accept。模拟器多连接后端(conn≠ls)才关数据 fd。 */
|
||||
if (conn != ls) {
|
||||
net_close(conn);
|
||||
}
|
||||
|
||||
time_sync_delay_fed(50U);
|
||||
}
|
||||
|
||||
@@ -189,7 +189,7 @@ static void s_service_link(uint32_t now) {
|
||||
* 函数功能:单次服务循环(代次自愈 → accept → 门控收 → 喂 link → 节拍)
|
||||
* 返回值:无
|
||||
* 限定条件:NET_READY 已置位;s_cfg/s_link 已 init
|
||||
* 函数说明:门控(net_can_accept/net_can_read 纯 RAM 读)+ 兜底节拍照
|
||||
* 函数说明:门控(net_listener_armed/net_can_read 纯 RAM 读)+ 兜底节拍照
|
||||
* ui_net_sink I-1/I-2;EOF 时 client==listen 严禁 close(net 层
|
||||
* 已 auto_relisten,close 会连监听一起毁)
|
||||
*/
|
||||
@@ -224,7 +224,13 @@ static void s_serv_poll(void) {
|
||||
if (s_client < 0) {
|
||||
int c;
|
||||
|
||||
if (net_can_accept(s_listen) == 0) {
|
||||
/* N34 阶段1(F-NET-4):门控从 net_can_accept(只认 ESTABLISHED,已退役)
|
||||
* 迁 net_listener_armed——旧门控把 LISTENING 窗口全挡掉,:2404 的丢
|
||||
* CONNECT 探针(net_accept_locked 内)因此从不运行(与已修的 :7003
|
||||
* 同型);armed=ESTABLISHED 待 accept / LISTENING /
|
||||
* CLOSED+auto_relisten+残留(ESTABLISHED 放行为 2026-10-13 台架补齐:
|
||||
* 漏它则本任务 200ms 周期抢不过对账② ~400ms 去抖、整场饿死) */
|
||||
if (net_listener_armed(s_listen) == 0) {
|
||||
if (net_get_sock(s_listen) == NULL) {
|
||||
s_listen = -1; /* 控制块消失:交回上方重建 */
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user