refactor(net): N-32 §10 监听生命周期抽为 net_listener.c(纯搬移)

把监听生命周期从 net_socket.c 整体抽出为真机专属模块 net_listener.c:
7 个函数 + 7 个状态数组 + 8 个常量 ≈470 行。
net_socket.c 4126 → 3656 行(-471)。

模块边界(详见 net_listener.h 头注释):
- 搬入:relisten_locked / try / clear / done / retry_tick / pump / drain_chip_rx
- 留在 net_socket.c:net_listen_locked(应用 API 路径)/ net_accept_locked
  (产出连接)/ net_lost_connect_probe(补 accept)/ net_listener_armed
  (双端公开 API)/ net_resync_listen / net_reconcile_tick / net_sock_t 字段

接口从「8 处散点直调 + 2 处直接写状态数组」收敛为 4 个窄接口:
  net_listener_settle(fd, level) / _try(fd) / _clear(fd) / _retry_tick()
新模块**不访问 s_net_socks**(改用 net_get_sock + ch395_sock)。

搬移中必要的两处可见性提升(非纯机械搬移,已注释留痕):
- net_set_errno 由 static 提升为模块间可见(NET_ERR_RETURN_1 宏随迁头文件)
- 新增 net_pending_active(fd),替代直接读 s_net_pending[i].active
  (L3 保险语义原样保留)

真机专属:net_listener.c 依赖 ch395f_* SPI 驱动,sim(Winsock)无对应
→ 只注册 Keil 端,并在 check_registration.py 的 SIM_EXEMPT **显式点名**
(不整目录一刀切,遵脚本既定原则)。

验证(纯搬移的可证判据):
- 尺寸:**RW-data 980 与 ZI-data 143060 完全不变**(数据总量不变);
  Code 197236→197228(-8)、RO-data 17012→17000(-12)——接口改造的
  极小开销,相对 471 行搬移可忽略
- 门禁全绿(cppcheck / C 规范 / 双端注册 / 主机侧单测 12 套 / mem-numbers)
- @test PASS + 回读 No difference found
- 全量回归::21 0ms×50 与 100ms×50 各 50/50;:8888 20/20;:7003 10/10;
  ftp_regression 11/11;Trap23 abort/graceful 各 5/5
- 设备侧:orphan listener **0**(保持 P2a 基线)、pump 留痕正常
This commit is contained in:
2026-10-12 16:59:44 +08:00
parent 861adfc013
commit c1ab902ef1
7 changed files with 730 additions and 496 deletions
+28
View File
@@ -435,6 +435,34 @@ void net_process_messages(void);
*/
net_sock_t *net_get_sock(int sockfd);
/*
* 函数功能:记录**本任务**最后一次失败的精确错误码(net 层内部通用工具)
* 入口参数:err - 错误码(NET_ERR_xxx,负值)
* 出口参数:无
* 返回值:err 原值(便于写成 `return net_set_errno(NET_ERR_XXX);`)
* 限定条件:无
* 函数说明:1. 只写本任务的槽位,其他任务读不到、也改不了 → 消除跨任务覆写竞态
* 2. N-32 §10 模块化:由 net_socket.c 的 static 提升为**模块间可见**,
* 供 net_listener.c 等同目录内部模块复用(定义仍在 net_socket.c)
*/
int net_set_errno(int err);
/* 「记本任务错误码 + 统一失败返回 -1」的紧凑写法(取代 `s_net_errno = X; return -1;`)
* N-32 §10:原定义在 net_socket.c,随 net_set_errno 一并提升到本头文件 */
#define NET_ERR_RETURN_1(err) (net_set_errno(err), -1)
/*
* 函数功能:查询本 fd 是否有在途挂起 recv(L3 pending)—— 供 net_listener.c 消费
* 入口参数:sockfd - Socket 描述符 (0~7) int
* 出口参数:无
* 返回值:1 - 有挂起;0 - 无(含描述符越界) int
* 限定条件:任意上下文(纯 RAM 读,不发起 RPC)
* 函数说明:1. N-32 §10 模块化:net_listener_retry_tick 用它跳过"重开 Socket
* 会摧毁在途连接"的 fd(L3 保险,原为直接读 s_net_pending[i].active)
* 2. 定义在 net_socket.c(配对头即本文件)
*/
int net_pending_active(int sockfd);
/*
* 函数功能:获取 Socket 本地地址(IP + Port)
* 入口参数:sockfd - socket 描述符