lbl
|
0a73bc3356
|
fix(nat): TCP/ICMP NAT 不再因单点瞬时错误永久瘫痪
问题:
- tcp_nat listen_task:accept() 或 local/peer_addr 查询失败、
no_tun 下 network.ip() 未就绪(None),任一错误经 ? 传播直接
杀掉整个监听任务,NAT 永久失效且无重启。
- icmp_nat task:任一侧 socket 收发或单包处理出错同样经 ? 传播
终止整个任务。
修复:
- 循环内错误改为 log::warn + continue,并加 100ms 休眠避免持续性
错误造成空转。
- no_tun 下 network.ip() 为 None 时跳过重写/丢弃该包,而非报错退出。
注:该修复为异步 I/O 循环的容错行为变更,依赖真实 socket,
未补充端到端测试;已有 nat 相关单测全部通过。
|
2026-08-20 23:05:08 +08:00 |
|
lbl
|
40e2396741
|
fix(nat): 修复 ICMP NAT 映射只增不减导致内存无界增长
每个 ping 包都会以 (对端地址, identifier, sequence) 为键新增一条
永久映射,运行时间越长内存占用越大。
修复:
- 收到 EchoReply 命中映射即移除该条目(一次 echo 交换完成)。
- 映射值携带创建时间,select 循环中加入 60s 周期的 GC 分支,
清理超时(60s)未收到应答的残留条目。
测试:test_evict_expired 验证超时条目被清理、未超时条目保留。
|
2026-08-20 23:00:44 +08:00 |
|
lbl
|
d29c9e3122
|
fix(nat): 修复 UDP NAT 老化回收失效与误删竞态
问题:
1. GC 仅从映射表删除过期条目,其反向转发任务仍阻塞在 socket.recv
上,任务与 socket 永久残留。
2. 条目过期被 GC 删除并以新 socket 重建后,旧任务退出时无条件
remove 会把新条目误删。
修复:
- NatEntry 持有反向转发任务的 SubTask 句柄,GC 回收条目时一并
stop 任务,释放 socket。
- 任务退出时通过 Arc::ptr_eq 确认表中条目仍是本任务的 socket 才删除。
测试:
- test_remove_if_current_only_removes_same_socket: 旧 socket 不能删新条目
- test_entry_inbound_task_stoppable: 条目任务可被 GC 正常终止
|
2026-08-20 22:58:11 +08:00 |
|
lbl
|
6489237233
|
修复空载荷包越界 panic 杀死数据面任务
对端构造的零载荷包(头部长度恰好等于 HEAD_LENGTH)会使
TunDataInbound/InternalNatInbound 的 data[0] 索引越界 panic,
tokio 任务终止后连接永久静默死亡。两处 send 均增加空切片检查,
畸形包静默丢弃。补充空包/短包不 panic 的测试。
|
2026-08-20 21:48:24 +08:00 |
|
lbl
|
7d481560e3
|
规范依赖管理并适配 rand 0.10
- tcp_ip 从 git 依赖切换为 crates.io 0.2(IpStackConfig 改用 builder)
- 公共依赖收拢到 workspace.dependencies 统一版本
- 移除 release profile 的 panic=abort(避免 vnt-jni 中止宿主 JVM)
- vnt-jni 升级 edition 2024(no_mangle 改为 unsafe(no_mangle))
- vnt-ipc 显式声明 tokio features
- 适配 rand 0.10:random_range 移至 RngExt,choose_multiple 改名 sample
- 修复 clippy 警告(type_complexity/collapsible_if/ptr_arg)
|
2026-08-20 20:58:07 +08:00 |
|
lbl
|
b4301a8106
|
v2
|
2026-02-10 18:20:39 +08:00 |
|