63cf73b4d0
动机: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 只校验 § 编号存在性, 照不出"函数在哪个文件",需在文档提交中一并修正。
47 lines
2.4 KiB
C
47 lines
2.4 KiB
C
/*
|
||
* 模块名称: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 */
|