merge: task/n17-probe 合入 v2-on-ui

任务 n17(1 个提交)经 task-worktree 回收:
- fix(网络): 主动拆会话登记即返——drop 路径不再占用 netTask(登记簿 N-17 收口)
This commit is contained in:
2026-10-25 10:32:25 +08:00
6 changed files with 108 additions and 26 deletions
+25 -7
View File
@@ -758,7 +758,9 @@ void net_process_messages(void) {
break;
}
case NET_MSG_DROP_CONN: {
/* E-02 收口:应用放弃会话的主动拆除(拆连接、保监听) */
/* E-02 收口:应用放弃会话的主动拆除(拆连接、保监听)。监听型
* 登记即返(N-17:拆链排渣交 net_listener_tick,本消息不再占用
* netTask 数百 ms) */
net_sock_t *p_sock = net_get_sock(msg.sockfd);
if (p_sock == NULL) {
/* 描述符无效 → BADF */
@@ -2044,8 +2046,11 @@ static int net_close_locked(net_sock_t *p_sock) {
* (PC 内核自动 ACK keepalive,僵尸判不死),单连接监听被永久
* 占住;应用又不得 net_close 监听 fd(毁监听)——本函数补上
* "拆连接不拆监听"的应用侧形态
* 2. 拆除=sock_reset QUARANTINE(TRAP-NET-18 异常释放语义:FIN + 排渣 +
* 排空事件(quiescent) + 等 byte0=00H,内置二段 CLOSE 补发)
* 2. 芯片侧拆除(TRAP-NET-18 异常释放语义,N-17 收口改异步):监听型 fd
* = net_listener_settle(QUARANTINE) + REQ_DROP 登记即返,动作全部交
* net_listener_tick(隔离窗内持续排空/关闭正是该机的既有语义);
* 非监听 client fd = 同步 sock_reset QUARANTINE(600ms 封顶,原形态)
* ——本处理器不得再对监听型做同步等待(netTask 占用窗见 .h 注)
* 3. auto_relisten(监听型 fd):收口 CLOSED 后登记重建请求(动作在
* net_listener_tick,≤1ms 后执行;芯片已 CLOSED 直接 open 必成,
* E4 定案;未成则 30ms 节奏重试 + reconciler 形态④兜底);
@@ -2079,8 +2084,20 @@ static int net_drop_conn_locked(net_sock_t *p_sock) {
/* 挂起 send 同样先结束(以已发字节数通知;未发部分放弃),再拆芯片会话 */
net_send_pending_cancel((int)(p_sock - s_net_socks), NET_ERR_CONNRESET);
/* 确定性拆除(异常释放 → QUARANTINE 400ms 底,TRAP-NET-18 语义) */
if (net_sock_reset_sync(sockfd, CH395F_RESET_QUARANTINE) != 0) {
/* 芯片侧拆除按 fd 形态分流(异常释放 = QUARANTINE 语义,TRAP-NET-18)。
* 监听型 fd:只登记沉降隔离 + 重建请求,**立即返回**——“排渣/FIN 关闭/
* 排空事件/等 byte0=00H/重建”整套动作由 net_listener_tick 以 30ms 节奏执行
* (与被动超时释放同一台机器;E16 台架实证该 net 层自建序列 = RST 10/10、
* FIN 5/5 的通过版本)。旧形态在本处理器里 net_sock_reset_sync 同步等待,
* netTask 被占用 400ms 底/600ms 顶:串行总线整窗停摆、UI/FTP/对时的 API 回
* 执顺延、NET 与对时位同窗丢 100ms 抽样 → 800ms 停喂声明 stall,距 IWDG
* 最坏超时余量仅 ~0.7s(登记簿 N-17;方向评估与否决论证 → 《网络自愈架构
* 设计》§4.6)。返回语义随之明确:返回 = 已登记,芯片未必已拆完。
* 非监听 client fd:无监听可保,维持同步确定性排渣(600ms 封顶;全仓
* 零生产调用者,形态原样保留防漂移)。 */
if (p_sock->auto_relisten != 0U) {
net_listener_settle(sockfd, NET_LISTENER_SETTLE_QUARANTINE);
} else if (net_sock_reset_sync(sockfd, CH395F_RESET_QUARANTINE) != 0) {
DBG_ERROR("sock%d drop_conn: sock_reset not done", sockfd);
/* 超时继续收口本层;芯片侧交 reconciler/pump 对账接管 */
}
@@ -2424,8 +2441,9 @@ int net_close(int sockfd) {
* 函数说明:1. 单连接模型下挂起但 TCP 仍活的客户端会永久占住监听(keepalive
* 被 PC 内核自动 ACK 判不死,《网络自愈架构设计》§5.2 E13);应用不得
* net_close 监听 fd → 本 API 拆连接不拆监听(E-02 收口)
* 2. netTask 侧执行 sock_reset QUARANTINE + 监听即时重建(见
* net_drop_conn_locked);等待期 netTask 有界占用 ~400-600ms
* 2. 监听型 fd:netTask 侧仅登记隔离沉降 + 重建请求即返回(动作在
* net_listener_tick,netTask 零占用,登记簿 N-17 收口);非监听 client
* fd 仍同步排渣(600ms 封顶)。见 net_drop_conn_locked
*/
int net_drop_conn(int sockfd) {
/* 消息体(按值拷入队列,netTask 改的是其副本) */
+11 -4
View File
@@ -396,15 +396,22 @@ int net_close(int sockfd);
/*
* 函数功能:主动拆掉当前 TCP 会话,**保留监听**(E-02 收口)
* 入口参数:sockfd - socket 描述符
* 返回值:0 成功(含幂等:无活动会话),-1 失败
* 返回值:0 成功(**监听型 fd 的“成功”= 拆除与重建已登记**,芯片未必已拆完,
* 见函数说明 2;含幂等:无活动会话),-1 失败
* 限定条件:非 netTask 上下文(经消息队列委托,同其它 net_* API)
* 函数说明:1. 适用场景=应用层放弃会话(对时 30s 预算耗尽、协议超时等):
* 单连接模型禁止对监听 fd net_close(连监听一起毁,AGENTS 约定),
* 而挂起但 TCP 仍活的客户端会永久占住单连接监听(PC 内核自动
* ACK keepalive,芯片僵尸判不死——《网络自愈架构设计》§5.2 E13 定案缺口)
* 2. 实现=sock_reset QUARANTINE(FIN 关闭 + 排渣 + 排空事件 + 等
* byte0=00H,TRAP-NET-18 异常释放语义);auto_relisten fd 随即重监听
* (失败交 D10 重试),非 auto_relisten(client fd)收口 CLOSED
* 2. 实现(2026-10-25 N-17 起):auto_relisten fd = 登记 QUARANTINE 隔离
* 沉降 + REQ_DROP 重建请求,**登记即返**——“FIN 关闭 + 排渣 + 排空
* 事件 + 等 byte0=00H”(TRAP-NET-18 异常释放语义)与重建由
* net_listener_tick 按 30ms 节奏异步执行,端口恢复窗 ~0.4-1s 与被动
* 断连同型;**调用方不得按旧语义假设“返回即芯片已 CLOSED”**——返回
* 后 accept/recv 得 WOULDBLOCK 直至重建完成(time_sync 既有轮询天然
* 容忍)。旧同步形态曾使 netTask 占用 400-600ms、五任务心跳同窗
* 缺席声明 stall(《网络自愈架构设计》§4.6 N-17 记录,勿复活)。
* 非 auto_relisten(client fd)无监听可保,仍同步排渣(600ms 封顶)
* 3. 幂等:非 ESTABLISHED/CONNECTING 直接返 0,不动监听
*/
int net_drop_conn(int sockfd);