refactor(net)!: N34 阶段1 API 面收敛(对账⑤ + 删 3 个手动自愈 API)
BREAKING CHANGE: 删除公开 API net_relisten / net_resync_listen / net_can_accept 与消息类型 NET_MSG_RESYNC_LISTEN / NET_MSG_RELISTEN。 生产调用者为零(仅看门狗文档与 iec104 门控),应用侧无迁移成本; 如有外部消费者须改用对账/pump 自动机制(见下)。 1. 对账①扩展为①②⑤(F-NET-2 缺口,先补缺口再删 API) net_reconcile_tick 新增 bad=5:本层 ESTABLISHED 且芯片 0x05/0x01 (Socket OPEN + TCP LISTEN,静默回收回监听、不发 DISCONNECT) → RESYNC 语义只修本层(state→LISTENING + last_peer_port 转登 + lost_conn_seen 清零 + 取消挂起 recv),**不发任何芯片命令** (纪律同 pump③ U11,run8 实证重下发会 170s 永拒)。 原判据①要求 TCP==CLOSED、②要求本层 LISTENING,均不命中此形态 ——此前生产无人认领(仅手动 API 能修)。 2. 删 net_relisten(net_socket.c 函数 + 消息分派 + 头文件声明) footgun:对健康监听器无条件 open→USE→close 自毁 ~1s(原注释自认); 与 pump(100ms)/D10(30ms) 完全重叠。 3. 删 net_resync_listen(同上;语义并入第 1 条) 4. 删 net_can_accept(net_socket.c + net_socket.h + sim 三处) 只认 ESTABLISHED 的旧门控把"监听器在服役、待 CONNECT"窗口全挡掉, :2404 丢 CONNECT 探针因此从不运行;iec104 门控迁 net_listener_armed。 5. timeSync :8888 会话收尾不再 net_close(同 fd 续 accept,监听跨会话 常驻;原 close→重建每会话一个 Trap 09 沉降窗)。server 脚本注释同步 新契约(PC 侧 2s 宽限后自行关闭)。 6. lftpd 应用层阻塞重试退役:lftpd_inet_listen 5 轮(500ms/2000ms,最坏 10s 阻塞 ftpTask) → 单次 + 失败即 425;cmd_pasv 3×200ms 同删。 就绪屏障已消除 Trap 09 启动形态,客户端自带传输重试语义。 台架实证修正(本提交内二次修复,务必留痕): - net_listener_armed 补齐 **ESTABLISHED 放行**。首版迁移只放行 LISTENING/CLOSED+残留,漏了 ESTABLISHED=单连接模型的"待 accept"电平 → iec104 200ms 任务周期抢不过对账② 的 ~400ms 去抖,对账②先 standalone accept 转 ESTABLISHED 后 armed=0 → 应用整场不 accept,18/18 检查全 FAIL (设备日志证据:sock1 standalone accept 后无 i104 accepted,直至对端 FIN 才由 closed-with-data 救回)。补放行后 18/18 PASS,且耗时 127s→8.3s。 该态 accept 必返 fd,无 RPC 风暴风险。 - 期间顺带验证 M3 无辜:sock1 suspect DISCONNECT on live conn 命中后 defer→对账①→closed-with-data accept 把未 accept 的 RX 数据救回, 正是 M3 设计意图(资产门保护)。 验证(全绿):@build 0/0(Code=209580;含 CH395F 套件+Phase13 全量重编 0/0 的编译验证);@test PASS(回读无差异);iec104 18/18(8.3s); n30 0/50;:21 @0ms 50/50 p50=512;:7003 50/50 p50=517;ftp_regression 11/11;Trap23 RST 5/5 + FIN 5/5;time_sync :8888 连续推送正常(RTC 更新、 无 [ERR])。文档同步:BSD 指南(§3.3/3.6/10.1/10.2/12 + 变更记录)、 函数调用关系、监听生命周期设计说明、IEC104 上行设计说明、模拟器差距 清单、链路延迟测试说明。 门禁说明:doc-links 工作树 junction 伪影按既定口径 SKIP;mem-budget 分支 .map 漂移同前;cppcheck/coding-standard 手跑 Passed。
This commit is contained in:
@@ -585,9 +585,6 @@ enum {
|
||||
|
||||
static uint8_t s_p13_state = P13_ST_HELLO;
|
||||
static uint8_t s_p13_done = 0U; /* 会话完成/中止:后续调用空操作 */
|
||||
static uint8_t s_p13_resync_done = 0U; /* abort 后首次重同步只执行一次 */
|
||||
static uint8_t s_p13_clean_done = 0U; /* 会话干净完成(全段 OK + 已发 0xFF) */
|
||||
static uint32_t s_p13_resync_tick = 0U; /* 最近一次(重)监听的时刻(周期自愈用) */
|
||||
static uint8_t s_p13_hello_n = 0U;
|
||||
static int s_p13_verdict_all = LAT_VERDICT_OK;
|
||||
static int s_p13_seg_force_fail = 0; /* 当前段出现短写/错误 → 强制 FAIL */
|
||||
@@ -732,9 +729,6 @@ static void p13_reinit(void)
|
||||
s_p13_seg_force_fail = 0;
|
||||
s_p13_verdict_all = LAT_VERDICT_OK;
|
||||
s_p13_done = 0U;
|
||||
s_p13_resync_done = 0U;
|
||||
s_p13_clean_done = 0U;
|
||||
s_p13_resync_tick = HAL_GetTick();
|
||||
s_p13_hello_n = 0U;
|
||||
lat_stat_reset(&s_p13_st);
|
||||
}
|
||||
@@ -763,43 +757,11 @@ void net_latency_phase13_run(int32_t sockfd)
|
||||
if (s_p13_state != P13_ST_ABORT) {
|
||||
return; /* 正常完成/DONE:会话终态,不再处理 */
|
||||
}
|
||||
/* 重同步(run7~run9 实证):peer 断连后芯片 Socket 去向不确定
|
||||
* (静默回收回监听 / RST 关闭 / 监听器丢失)→ 进 abort 时做一次
|
||||
* 分状态重同步 + 等待期周期性自愈:
|
||||
* ESTABLISHED(陈旧)→ 先只修 MCU 侧状态(run8:close 会摧毁芯片
|
||||
* 侧健康监听器 → 连接永拒),再无条件芯片侧重监听(open+listen
|
||||
* 含 Trap 09 重试;run9:一次性 net_listen 落 Trap 09 窗口失败
|
||||
* 且被忽略 → 监听器永久丢失);
|
||||
* CLOSED → 芯片命令重新 LISTEN;
|
||||
* LISTENING → 10s 无新连接则再重监听一次(自愈静默丢失的监听器;
|
||||
* 重监听监听窗口中断 ~1s,peer 重连重试可吸收)。 */
|
||||
if (s_p13_resync_done == 0U) {
|
||||
int st = net_sock_state(sockfd);
|
||||
|
||||
s_p13_resync_done = 1U;
|
||||
s_p13_resync_tick = HAL_GetTick();
|
||||
if (st == NET_SOCK_STATE_ESTABLISHED) {
|
||||
DBG_INFO("[LAT] note: stale ESTABLISHED on abort -> resync + relisten");
|
||||
(void)net_resync_listen(sockfd);
|
||||
(void)net_relisten(sockfd);
|
||||
} else if (st == NET_SOCK_STATE_CLOSED) {
|
||||
DBG_INFO("[LAT] note: CLOSED on abort -> re-listen via chip");
|
||||
(void)net_relisten(sockfd);
|
||||
}
|
||||
} else if (s_p13_clean_done == 0U) {
|
||||
/* 周期自愈:10s 无新连接(状态仍 LISTENING)→ 再重监听一次;
|
||||
* 新连接到来时状态已转 ESTABLISHED,本分支自然不再触发。
|
||||
* 干净完成(已发 0xFF、peer 正常退出)后不再自愈——否则每 10s
|
||||
* 拆建一次监听器(无谓 SPI 开销 + 日志噪声 + 台架永不判空闲,
|
||||
* run12 实证),此时候只需静候下一次 re-HELLO。 */
|
||||
uint32_t now = HAL_GetTick();
|
||||
if (net_sock_state(sockfd) == NET_SOCK_STATE_LISTENING &&
|
||||
(uint32_t)(now - s_p13_resync_tick) >= 10000U) {
|
||||
s_p13_resync_tick = now;
|
||||
DBG_INFO("[LAT] note: no peer in 10s -> relisten (self-heal)");
|
||||
(void)net_relisten(sockfd);
|
||||
}
|
||||
}
|
||||
/* N34 阶段1(F-NET-3):原"进 abort 分状态手动重同步 + 10s 周期 relisten"
|
||||
* 已删——三种去向全部由 net 层自动机制认领(run8 静默回收滞留 ESTABLISHED
|
||||
* → 对账⑤ RESYNC;CLOSED 失位 → pump 100ms 认领重建;LISTENING 静默丢
|
||||
* 监听 → pump"芯片不在听"判据),手动 API net_resync_listen/net_relisten
|
||||
* 已退役。此处只保留收包与 peer re-HELLO 探测。 */
|
||||
n = net_recv(sockfd, s_p13_rx, (int)sizeof(s_p13_rx), NET_MSG_DONTWAIT);
|
||||
if (n > 0) {
|
||||
for (i = 0U; i + 4U <= (uint32_t)n; i++) {
|
||||
@@ -1142,7 +1104,6 @@ void net_latency_phase13_run(int32_t sockfd)
|
||||
"P13 latency baseline (verdict=%s)", p_name);
|
||||
DBG_INFO("[LAT] report complete");
|
||||
TEST_REPORT("Phase 13");
|
||||
s_p13_clean_done = 1U; /* 已下发 0xFF:peer 正常收尾,停止周期自愈 */
|
||||
s_p13_done = 1U;
|
||||
s_p13_state = P13_ST_ABORT;
|
||||
break;
|
||||
|
||||
@@ -54,10 +54,12 @@ def main():
|
||||
|
||||
with socket.create_connection((mcu_ip, port), timeout=5) as sock:
|
||||
sock.sendall(pkt)
|
||||
# 关键:发送后保持连接打开,等板子读完再关。
|
||||
# 关键:发送后保持连接打开,给板子留出读完 8 字节的窗口。
|
||||
# 若立即 close,CH395F 收到 FIN 会丢弃接收缓冲里尚未被板子读出的
|
||||
# 8 字节时间包,导致板子 net_recv 看到 CLOSED 而无数据、时间同步失败。
|
||||
# 这里 recv 直到板子主动关闭(EOF)或 2s 超时,确保板子先读到数据。
|
||||
# N34 阶段1-5 起板子会话收尾**不再 close**(单连接监听跨会话常驻,
|
||||
# EOF 时 net_close 会连监听一起毁掉)——这里 recv 等 2s 宽限后由
|
||||
# 本端关闭;板子 net 层 auto_relisten 随即恢复监听,下一轮照常连接。
|
||||
sock.settimeout(2.0)
|
||||
try:
|
||||
sock.recv(64)
|
||||
|
||||
Reference in New Issue
Block a user