docs(net): N-32 监听生命周期文档同步(4 tick/五层自愈/net_listener.c)

N-32 把监听生命周期抽为 net_listener.c,并把周期性重建收敛到
唯一入口 net_listener_pump;文档与代码注释滞后于实现,本次同步:

- 主循环自愈 tick 3 → 4(新增 net_listener_pump,100ms)
- 自愈分层 四层 → 五层(新增 N-32 pump 行)
- net_reconcile_tick 对账收窄为 ①②,③④ 移交 pump
- 函数更名:net_relisten_try/clear/retry_tick → net_listener_*
- Trap 23 沉降等级订正:异常 400ms / 正常 100ms(正常 FIN 亦沉降)
- net_socket.c 注释同步(四个自愈 tick、函数名、pump 条目)

权威设计见 docs/子系统设计/网络Socket监听生命周期设计说明.md §10。
This commit is contained in:
2026-10-12 19:16:31 +08:00
parent e5d3dc1205
commit 1a17d73e35
4 changed files with 113 additions and 75 deletions
+12 -10
View File
@@ -651,19 +651,21 @@ static void net_reconcile_tick(void) {
* 失败=具体错误码),调用方 net_wait_result 拾取,对外统一 -1。
* 限定条件:必须在 netTask 上下文中调用(独占 CH395F 与 s_net_socks 访问权);
* 由 net_task.c 在 net_stack_bring_up 之后每次 1ms 循环调用。
* 函数说明:1. 三个自愈 tick 均非阻塞(绝不 osDelay 忙等,netTask 永不冻结),先于消息分派执行
* 2. net_relisten_retry_tick(D10):断连后按 30ms
* 函数说明:1. 四个自愈 tick 均非阻塞(绝不 osDelay 忙等,netTask 永不冻结),先于消息分派执行
* 2. net_listener_retry_tick(D10):断连后按 30ms
* (NET_RELISTEN_RETRY_MS)节拍重试 open+listen;2s(NET_RELISTEN_DEADLINE_MS)
* 总时限到期放弃留痕
* 3. D10:本 fd 有在途挂起 recv 时跳过(L3 保险)
* 4. net_pending_tick(L3):按节拍了结挂起 recv(数据/到点/断连)
* 5. L3 看门狗:到点后 1s(NET_PENDING_WATCHDOG_MS)未了结 → 强制了结 + DBG_ERROR 留痕
* 6. net_reconcile_tick(Trap 22):每 200ms(NET_RECONCILE_PERIOD_MS)对账
* 7. 对账以连续 2 次失配去抖 + 1s 冷却,自愈三类失同步
* 8. net_msg_t 按值入队,netTask 侧副本调用方不可见 → 结果只能搭任务通知值回传
* 9. 32 位整体即结果,不做位域压缩
* 10. RECV 特例:无数据+阻塞 → 登记 pending 哨兵 NET_PENDING_REGISTERED(0x70000000)
* 11. RECV 特例 do_notify=0,回执推迟到 net_pending_tick 完成时
* 6. net_reconcile_tick(Trap 22):每 200ms(NET_RECONCILE_PERIOD_MS)对账①②
* 7. 对账以连续 2 次失配去抖 + 1s 冷却,自愈两类失同步
* 8. net_listener_pump(N-32 P2):每 100ms 监听器 pump,本层**唯一**重建入口
* (原对账③④;本层 CLOSED 而芯片在听时只重同步)——置于对账之后
* 9. net_msg_t 按值入队,netTask 侧副本调用方不可见 → 结果只能搭任务通知值回传
* 10. 32 位整体即结果,不做位域压缩
* 11. RECV 特例:无数据+阻塞 → 登记 pending 哨兵 NET_PENDING_REGISTERED(0x70000000)
* 12. RECV 特例 do_notify=0,回执推迟到 net_pending_tick 完成时
*/
void net_process_messages(void) {
net_msg_t msg;
@@ -1922,7 +1924,7 @@ static int net_recv_locked(net_sock_t *p_sock, void *buf, int len, int flags,
if ((p_sock->state == NET_SOCK_STATE_CLOSED) || (p_sock->session_dead != 0U)) {
/* 启用自动重监听:先把监听器重新置回 LISTEN。
* ⚠ 内层 `state == CLOSED` 门是**必需的**,不是冗余:
* `net_relisten_try` 无状态门,对已 LISTENING 的 fd 再 open+listen
* `net_listener_try` 无状态门,对已 LISTENING 的 fd 再 open+listen
* 会让 ch395f_open_socket 返 USE,其失败分支会 ch395f_close_socket
* —— 把正听着新 SYN 的 Socket 当场关掉(U12 同源事故)。
* session_dead + 已回 LISTENING = 重建已由别处完成,这里只报 EOF。
@@ -3072,7 +3074,7 @@ int net_resync_listen(int sockfd) {
* 函数说明:1. 用于"断连后监听器可能已失位"的自愈场景(2026-09-22 run9 实证)
* 2. 一次性 net_listen 落在 Trap 09 窗口失败且被静默忽略 → 监听器永久丢失
* 3. 后续连接全部拒绝
* 4. 与 auto_relisten 内部路径同一实现(net_relisten_locked:单次尝试 + 非阻塞重试,见 net_relisten_retry_tick)
* 4. 与 auto_relisten 内部路径同一实现(net_relisten_locked:单次尝试 + 非阻塞重试,见 net_listener_retry_tick)
* 5. 芯片侧已在监听时:首次 open 失败 → close 重建 → 监听短暂中断 ~1s
*/
int net_relisten(int sockfd) {