refactor(NET): 事件处理与周期对账抽出 net_events.c,net_socket.c 3720→3119

动机:net_socket.c 3720 行(注释 1878 / 代码 1518 / 54 函数),BSD 连接层
与"状态面收敛"两套职责混在一个文件里。16 个消费者只依赖 net_socket.h,
故搬移对应用层零波及;模拟器另有 net_socket_sim.c,新模块走 SIM_EXEMPT。

为什么是一个模块而不是两个:实测对账区真实调用事件处理器 2 处(形态② 补
accept 走 handle_connect_event),且 NET_RECON_STABLE_DEATH 两边共用——
拆成 net_events.c + net_reconcile.c 会造出跨模块调用,合起来则跨模块导出
为零。二者同属"芯片状态面与本层镜像的收敛"一个职责。

搬出:5 个 handle_*_event + fire_event + net_reconcile_tick +
net_lost_connect_probe + NET_RECONCILE_*/NET_RECON_STABLE_* 常量 +
net_bench_cmd_log(含其 2 个 static)。

搬移时 4 处 fd 取法替换(其余代码逐行未改,已用剥注释后的代码行多重集
证明差异恰好等于声明的改动集):
- p_sock - s_net_socks → p_sock->ch395_sock(net_socket() 里
  ch395_sock = sockfd,恒等;模拟器同构造)
- 对账循环 &s_net_socks[i] → net_sock_raw(i)

⚠ 随之收窄两处沉降登记的范围门 (qfd >= 0) && (qfd < MAX) → qfd < MAX:
ch395_sock 是 uint8_t,(int) 后恒非负,下界在类型上不可能越界;留着会被
cppcheck 判 knownConditionTrueFalse 拦提交。已在文件头写"勿加回"。

新增 net_sock_raw():对账必须看到 in_use==0 / state==CLOSED 的槽位
(形态④ 认领孤儿监听正依赖 CLOSED 态),而 net_get_sock() 对未在用槽位返
回 NULL 会漏掉这一类。声明放 net_socket.h 而非内部头 net_events.h——规范
S17 2.2 要求非 static 函数声明在配对头文件(同 net_set_errno 先例)。

验证:
- 代码行多重集差异 = 声明的改动集,无一处意外
- @build BUILD_OK 0 错 0 警;Code 212316→212296(−20 B,拆 TU 布局差),
  RO/RW/ZI 完全不变
- cppcheck / coding-standard / registration-check 全 PASS
- @test 硬件闭环 PASS:635ms 到 net init: OK,:8888/:2404/FTP 均建立,
  [ERR]/Fault/relisten/reconcile 命中 0 条
- 台账随 Code 变化同步(ram_baseline --write / check_mem_numbers --write)

遗留(与仍未提交的文档工作同文件,另提):BSD_Socket_API 使用指南的文件
职责表、net_listener.c/.h 文件头"见 net_socket.c"、自愈架构设计 §11 仍把
net_reconcile_tick 记在 net_socket.c——doc-links 只校验 § 编号存在性,
照不出"函数在哪个文件",需在文档提交中一并修正。
This commit is contained in:
2026-10-14 18:04:57 +08:00
parent 0edbfaf08b
commit 63cf73b4d0
9 changed files with 745 additions and 619 deletions
+46
View File
@@ -0,0 +1,46 @@
/*
* 模块名称:Network Events & Reconcile —— 内部头
* 模块功能:声明「芯片边沿事件处理 + 100ms 周期对账」模块对 net 层宿主提供的接口。
* 适用平台:STM32F407ZGTx + CH395F 以太网芯片
* 作者:王建锋
* 创建日期:2026-10-14
*
* ⚠ **内部头**:只被 `net_socket.c`(宿主)与 `net_events.c`(实现)include,
* **不进** 公开的 `net_socket.h`,也**不被应用层引用**——与 `net_listener.h` 同族约定。
* 本模块依赖 `ch395f_*` SPI 驱动,属**真机专属**:模拟器(Winsock 后端)不编译,
* 故已在 `scripts/check_registration.py` 的 SIM_EXEMPT 显式点名(每行附理由)。
*
* 设计依据 → docs/网络/网络自愈架构设计.md §4
* 形态表 §4.1 / 单一重建所有者 §4.2 / 沉降与隔离 §4.3 / 读即清信源纪律 §4.10
*/
#ifndef NET_EVENTS_H
#define NET_EVENTS_H
#include "net_types.h" /* net_sock_t / net_event_t / NET_MAX_SOCKETS */
/* ===== 宿主 net_socket.c 提供 ===== */
/* `net_sock_raw()`(对账循环需要的"不判 in_use"数组访问器)声明在**配对头** net_socket.h
* —— 规范 S17 2.2 要求非 static 函数声明在配对头文件,内部头不算(同 net_set_errno 先例)。 */
/* ===== 本模块 net_events.c 提供 ===== */
/* 芯片边沿事件处理器:由 net_poll() 在全局中断位命中后分派(netTask 上下文) */
void handle_connect_event(net_sock_t *p_sock); /* CONNECT:转 ESTABLISHED + 记对端 + KeepAlive */
void handle_disconnect_event(net_sock_t *p_sock); /* DISCONNECT:陈旧甄别 + 登记沉降事实 */
void handle_recv_event(net_sock_t *p_sock); /* RECV_OK:置 readable 电平 */
void handle_send_event(net_sock_t *p_sock); /* SEND_OK:清发送忙 + 回调 */
void handle_timeout_event(net_sock_t *p_sock); /* TIM_OUT:按异常释放处理(隔离重建) */
/* 100ms 周期对账:形态①②③④⑤ + U11 的唯一判据所在;由 net_process_messages 每轮调用 */
void net_reconcile_tick(void);
/* accept 路径探针:芯片已 ESTABLISHED 而 CONNECT 事件未到时补做 accept */
void net_lost_connect_probe(net_sock_t *p_sock);
#if defined(NET_BENCH_CMD_LOG)
/* 台架芯片命令序列日志(编译开关默认关;net_poll / 消息分派 / 事件处理三处消费) */
void net_bench_cmd_log(char tag, int sock, int detail);
#endif
#endif /* NET_EVENTS_H */