Conversation
…emove legacy axnet and axnet-ng
ZR233
left a comment
There was a problem hiding this comment.
当前 head b850a6420372779f23f25469f8fe187043d6d310 的 CI 已经是绿色,网络重构的主要 Cargo/feature 迁移方向也基本一致:net/ax-net 作为统一 crate,ax-runtime/net、ax-runtime/vsock、ax-feat/net、StarryOS 的 axnet workspace alias 都已切到新路径;scripts/test/std_crates.csv 只删除了已移除的 ax-net-ng,这一点和当前 workspace 状态一致。
本地/静态检查结果:
git diff --check origin/dev...HEAD:通过。rg 'ax-net-ng|axnet-ng|net-ng|dep:ax-net-ng|package = "ax-net-ng"|path = "os/arceos/modules/axnet|os/arceos/modules/axnet|modules/axnet' --glob '!p.md':无残留。update-std-testsaudit 已启动并返回结果;当前 PR 自身的Test with std / run_host在 GitHub current-head CI 已通过,CSV 删除ax-net-ng与删除该 package 一致。- open PR 重叠检查中没有发现另一个直接替代/重复的 ax-net/ax-net-ng 统一重构;#1185 等网络相关 PR 是驱动/Wi-Fi 层,不是同一实现。
但当前还不能合入,因为根目录新增了 p.md,内容是 PR 方案/设计说明的副本,不在 docs 目录或文档导航下,并且它是当前仓库里唯一还包含 ax-net-ng / net-ng 等旧名的文件。这个文件看起来像开发过程中临时保存的方案文档,合入后会把临时草稿和旧命名重新带进仓库根目录。请删除 p.md,或者如果确实需要保留这份设计文档,请移动到正式 docs 路径并同步清理旧名/导航。
There was a problem hiding this comment.
审查总结
本次网络栈统一重构整体迁移方向正确、代码清理彻底(ax-net-ng/net-ng 等旧名在代码和配置中已全部清理)。net/ax-net 作为新的统一网络 crate 结构清晰,所有调用方(ax-runtime、ax-feat、ax-api、ax-posix-api、starry-kernel)均已正确迁移到新 API 路径。
CI 状态
当前 head b850a642 的 CI 检查:
run_host类 jobs 均success(包括 axvisor x86_64 svm、riscv64 qemu、aarch64 qemu、self-hosted boards 等)run_container类 jobs 为skipped(符合预期,因为run_host/run_container互斥)- 无失败检查
本地验证
cargo fmt --check:通过git diff --check origin/dev...HEAD:通过rg 'ax-net-ng|axnet-ng|net-ng|dep:ax-net-ng' --glob '!p.md':无残留- 无
[patch.crates-io]问题 - 无重复/冲突的 open PR
阻塞问题
根目录下存在 p.md(333 行),是 PR 方案说明的临时副本,不在 docs 目录或文档导航下。该文件是当前 checkout 中唯一还保留 ax-net-ng / net-ng 等旧名的文件。这个文件不应合入仓库根目录。ZR233 在上一次审查中已指出此问题(review #4464828983),当前 PR head 未做修改。
修复建议:
- 删除
p.md;或 - 将其移动到
docs/下的正式位置,并同步清理其中的旧命名(ax-net-ng→ax-net等),同时更新文档导航。
由于该问题在上一轮审查中已被标记为阻塞但未解决,本轮维持 REQUEST_CHANGES。修复后可直接重新请求审查。
Powered by deepseek-v4-pro
There was a problem hiding this comment.
审查总结
本轮网络栈统一重构(PR #1203)迁移方向正确、代码清理彻底、本地验证全部通过。
上一轮阻塞问题已修复
p.md已从仓库根目录删除(当前 heada73e0883中不存在该文件)。- 上一轮 review (#4464828983 和 #4464871337) 指出的
ax-net-ng/net-ng旧名残留问题已全部清理完毕:rg 'ax-net-ng|net-ng|axnet-ng' --glob '!Cargo.lock'零匹配。rg 'dep:ax-net-ng|package = "ax-net-ng"'零匹配。rg '\[patch\.crates-io\]' -g 'Cargo.toml'零匹配。
实现逻辑
PR 将原有的两套网络 crate(os/arceos/modules/axnet 旧同步封装 和 os/arceos/modules/axnet-ng 新统一栈)合并为根目录 net/ax-net 单一 crate:
- 以原
ax-net-ng的完整实现为主体(TCP/UDP/raw/Unix/vsock/DNS/DHCP/router/loopback)。 - 删除了旧
ax-net的smoltcp_impl(TCP/UDP/listen table/DNS/benchmark),不保留兼容 wrapper。 ax-runtime统一为单一netfeature 路径,删除net-ng分支。ax-api/ax-posix-api迁移到新统一Socket/SocketOpsAPI。- StarryOS 通过 workspace alias
axnet = { package = "ax-net", path = "net/ax-net" }保持use axnet::...不变。 ax-feat的net-ngfeature 已彻底删除,全部收敛到net。
架构设计合理:网络栈从 ArceOS modules 目录提升为根目录 net/ 顶层组件,device/、router、service、wrapper、listen_table、state 模块边界清晰,外部系统不绑定内部实现细节。
本地验证
| 检查项 | 结果 |
|---|---|
cargo fmt --check |
✅ 通过 |
cargo clippy --manifest-path net/ax-net/Cargo.toml --all-features -- -D warnings |
✅ 通过 |
cargo clippy --manifest-path os/arceos/modules/axruntime/Cargo.toml --all-features -- -D warnings |
✅ 通过 |
cargo clippy --manifest-path os/StarryOS/kernel/Cargo.toml --all-features -- -D warnings |
✅ 通过 |
cargo clippy --manifest-path os/arceos/api/arceos_api/Cargo.toml --all-features -- -D warnings |
✅ 通过 |
cargo clippy --manifest-path os/arceos/api/arceos_posix_api/Cargo.toml --all-features -- -D warnings |
✅ 通过 |
旧名残留检查 (ax-net-ng/net-ng/axnet-ng) |
✅ 零匹配 |
[patch.crates-io] 检查 |
✅ 无 |
axfeat clippy (--all-features) |
CI 状态
当前 head a73e0883 的 CI run (#27259841512, attempt 2) 仍在运行中。已完成的 job:
- success:
Check formatting / run_host、Run sync-lint / run_container、Test with std / run_host、Test axvisor self-hosted x86_64 / run_host、Test arceos riscv64 qemu / run_host、Test axvisor riscv64 qemu / run_host - skipped: 所有
run_container变体(与run_host互斥,符合预期) - in_progress:
Run clippy / run_host、Test starry x86_64/riscv64/aarch64/loongarch64 qemu / run_container - 无 failure
重复/重叠分析
- 搜索
repo:rcore-os/tgoskits type:pr ax-net network unify仅返回本 PR #1203,无重复或冲突的开放 PR。 - 与 #1185 等网络相关 PR 无重叠(#1185 是驱动/Wi-Fi 层变更)。
遗留风险
os/arceos/api/axfeat的--all-featuresclippy 因平台 feature 互斥而构建失败,这是该仓库的已知限制,非本 PR 引入。- 功能验证(ArceOS/StarryOS QEMU TCP/UDP/DNS/DHCP 场景)依赖 CI 完成;本地 clippy 和 fmt 验证已覆盖静态正确性。
- 四月博客回顾文档中
axnet → ax-net条目出现重复(axnet-ng → ax-net-ng被替换为axnet → ax-net),属文档表述小瑕疵,不影响功能。
结论
上一轮阻塞问题已修复,代码重构方向正确、清理彻底、本地静态验证全部通过,CI 无已知失败。批准合入。
Powered by deepseek-v4-pro
There was a problem hiding this comment.
审查总结
本轮 PR #1203 将原有的两套网络 crate(os/arceos/modules/axnet 和 os/arceos/modules/axnet-ng)统一为根目录下单一 net/ax-net crate,迁移方向正确、代码清理彻底、本地静态验证全部通过。
上一轮阻塞问题
ZR233 在 review #4464828983 中指出的 p.md 残留问题已在当前 head 527e86a9 中修复——该文件已删除,仓库中不再存在任何 ax-net-ng / net-ng / axnet-ng 旧名引用(rg 零匹配)。
实现逻辑
- 以原
ax-net-ng完整实现为主体(TCP/UDP/raw/Unix/vsock/DNS/DHCP/router/loopback),删除旧ax-net的smoltcp_impl(TCP/UDP/listen table/DNS/benchmark),不保留兼容 wrapper。 ax-runtime统一为单一netfeature 路径,删除net-ng分支;新增parse_network_config()将网络配置从编译时环境变量转为运行时NetworkConfig结构体传入。ax-api/ax-posix-api迁移到新统一Socket/SocketOpsAPI。- StarryOS 通过 workspace alias
axnet = { package = "ax-net", path = "net/ax-net" }保持use axnet::...不变。 ax-feat的net-ngfeature 已彻底删除,全部收敛到net。ax-net/config.rs使用core::net::Ipv4Addr替代 smoltcp 类型,ax-runtime不再需要直接依赖 smoltcp——边界分离清晰。lib.rs中pub use socket::*改为显式导出,避免意外暴露内部类型。
架构设计
网络栈从 ArceOS modules 目录提升为根目录 net/ 顶层组件,内部分五层(public facade → socket abstraction → address-family impls → protocol service → device adaptation),router、service、wrapper、listen_table、state 默认 crate-private,外部系统不绑定内部实现细节。设计合理,符合 PR 描述。
本地验证
| 检查项 | 结果 |
|---|---|
cargo fmt --check |
✅ 通过 |
cargo clippy --manifest-path net/ax-net/Cargo.toml --all-features -- -D warnings |
✅ 通过 |
cargo clippy --manifest-path os/arceos/modules/axruntime/Cargo.toml --all-features -- -D warnings |
✅ 通过 |
cargo clippy --manifest-path os/StarryOS/kernel/Cargo.toml --all-features -- -D warnings |
✅ 通过 |
cargo clippy --manifest-path os/arceos/api/arceos_api/Cargo.toml --all-features -- -D warnings |
✅ 通过 |
cargo clippy --manifest-path os/arceos/api/arceos_posix_api/Cargo.toml --all-features -- -D warnings |
✅ 通过 |
旧名残留检查 (ax-net-ng/net-ng/axnet-ng) |
✅ 零匹配 |
[patch.crates-io] 检查 |
✅ 无 |
p.md 残留 |
✅ 已删除 |
git diff --check origin/dev...HEAD |
✅ 通过 |
CI 状态
当前 head 527e86a9 的 PR CI run #27265677380(run_number=5914)状态为 in_progress,仍在运行中。上一轮 push CI run #27265673891 因 PR 事件触发的新 run 而被取消(cancelled),属正常行为。目前无 CI 失败。
重复/重叠分析
- 搜索
repo:rcore-os/tgoskits type:pr ax-net network unify仅返回本 PR #1203,无重复或冲突的开放 PR。 - 搜索
repo:rcore-os/tgoskits type:pr axnet net-ng返回本 PR 和 #1185(AIC8800 Wi-Fi SoftAP 驱动),后者是 Wi-Fi 驱动层变更,与本 PR 的网络栈统一不重叠。 - 无其他冲突或替代性 PR。
遗留风险
axfeat的--all-featuresclippy 因平台 feature 互斥无法在本环境构建,这是仓库已知限制,非本 PR 引入。- 功能验证(ArceOS/StarryOS QEMU TCP/UDP/DNS/DHCP 场景)依赖 CI 中
Test starry x86_64 qemu / run_host等 job 完成;本地 clippy 和 fmt 已覆盖静态正确性。CI 当前in_progress,无已知失败。 - 文档中四月博客回顾出现
axnet → ax-net条目重复(axnet-ng → ax-net-ng被替换为axnet → ax-net),属历史记录文档的表述小瑕疵,不影响功能。 - PR 正文第 4 节详细列出了本轮不涵盖的遗留问题(IPv6、多 NIC、DNS 缓存、零拷贝 dataplane 等),范围控制清晰。
结论
上一轮阻塞问题已修复,代码重构方向正确、清理彻底、本地静态验证全部通过,CI 无已知失败,无重复或冲突的开放 PR。批准合入。
Powered by deepseek-v4-pro
ZR233
left a comment
There was a problem hiding this comment.
复查了当前 head 527e86a9,上一轮阻塞的 p.md/旧名残留问题已经修复,当前分支中不再有 ax-net-ng / net-ng / axnet-ng 旧引用。
本轮重点检查:
- 统一后的
net/ax-net与原ax-net-ng行为差异:网络配置迁移到NetworkConfig、DNS 查询不再硬编码默认 DNS、Unix path namespace 改为运行时注册,均与本 PR 目标一致。 axfeat/net和axruntime/netfeature 组合仍保留paging/irq/multitask以及新栈需要的rd-net/spin/axklib依赖。scripts/test/std_crates.csv只删除已移除的ax-net-ng,保留现有ax-net白名单项;额外 std-test 候选属于既有 backlog,不应并入本 refactor。- 未发现
[patch.crates-io],git diff --check origin/dev...HEAD通过。 - 本地验证:
cargo xtask clippy --package ax-net通过 base 和vsock两组检查。 - CI 最新 run
27265677380中格式、sync-lint、clippy、std test、ArceOS/StarryOS/Axvisor 相关 host/container/board job 均无当前失败;旧的Detect changed paths失败来自 stale run27265673891。
未发现阻塞问题,批准合入。
There was a problem hiding this comment.
审查总结
本轮网络栈统一重构(PR #1203)将原有的两套网络 crate(os/arceos/modules/axnet 旧同步封装和 os/arceos/modules/axnet-ng 新统一栈)合并为根目录 net/ax-net 单一 crate,迁移方向正确、代码清理彻底、本地静态验证全部通过。
上一轮阻塞问题已修复
ZR233 在 review #4464828983 中指出的 p.md 残留问题已在当前 head ce6d626 中修复——该文件已删除,grep 全文搜索确认仓库中不再存在任何 ax-net-ng / net-ng / axnet-ng 旧名引用。旧 os/arceos/modules/axnet 和 os/arceos/modules/axnet-ng 目录已完全移除。
实现逻辑
- 以原
ax-net-ng的完整实现为主体(TCP/UDP/raw/Unix/vsock/DNS/DHCP/router/loopback),删除旧ax-net的smoltcp_impl,不保留兼容 wrapper。 ax-runtime统一为单一netfeature 路径,删除net-ng分支。ax-api/ax-posix-api迁移到新统一Socket/SocketOpsAPI。- StarryOS 通过 workspace alias
axnet = { package = "ax-net", path = "net/ax-net" }保持use axnet::...不变。 ax-feat的net-ngfeature 已彻底删除,全部收敛到net。- 架构设计合理:网络栈从 ArceOS modules 目录提升为根目录
net/顶层组件,内部分五层(public facade → socket abstraction → address-family impls → protocol service → device adaptation),router、service等默认 crate-private,边界清晰。
本地验证
| 检查项 | 结果 |
|---|---|
cargo fmt --check |
✅ 通过 |
cargo clippy --manifest-path net/ax-net/Cargo.toml --all-features -- -D warnings |
✅ 通过 |
cargo clippy --manifest-path os/arceos/modules/axruntime/Cargo.toml --all-features -- -D warnings |
✅ 通过 |
cargo clippy --manifest-path os/StarryOS/kernel/Cargo.toml --all-features -- -D warnings |
✅ 通过 |
旧名残留检查(ax-net-ng/net-ng/axnet-ng,排除 Cargo.lock) |
✅ 零匹配 |
[patch.crates-io] 检查 |
✅ 无 |
p.md 残留 |
✅ 已删除 |
git diff --check origin/dev...HEAD |
✅ 通过 |
os/arceos/modules/axnet / axnet-ng 目录残留 |
✅ 已删除 |
CI 状态
当前 head ce6d626 的 CI run #27316373179 中:
Detect changed paths:✅ success(两个 check suite 均通过)Cancel stale CI runs:✅ successrun_container类 job:均为skipped(与run_host互斥,符合预期)- 发布类 job(publish base/axvisor-lvz container image):
skipped(分支受限,符合预期) - 无 failure 或 cancelled job
重复/重叠分析
- 搜索
repo:rcore-os/tgoskits type:pr ax-net network unify仅返回本 PR #1203,无重复或冲突的开放 PR。 - 与 #1185(AIC8800 Wi-Fi SoftAP 驱动)无重叠——后者是 Wi-Fi 驱动层变更,与本 PR 的网络栈统一处于不同层次。
遗留风险
- 功能验证(ArceOS/StarryOS QEMU TCP/UDP/DNS/DHCP 场景)依赖 CI 完成;本地 clippy 和 fmt 已覆盖静态正确性,ZR233 已在上一轮审查中确认 CI host/container/board job 均无失败。
- PR 正文第 4 节详细列出了本轮不涵盖的遗留问题(IPv6、多 NIC、DNS 缓存、零拷贝 dataplane 等),范围控制清晰。
结论
上一轮阻塞问题已修复,代码重构方向正确、清理彻底、本地静态验证全部通过,CI 无已知失败,无重复或冲突的开放 PR。批准合入。
Powered by deepseek-v4-pro
There was a problem hiding this comment.
审查总结
本轮 PR #1203 将原有的两套网络 crate(os/arceos/modules/axnet 旧同步封装和 os/arceos/modules/axnet-ng 新统一栈)合并为根目录 net/ax-net 单一 crate。整体重构方向正确、代码清理彻底、架构设计合理。上一轮阻塞的 p.md 残留问题已在当前 head 96aad92 中修复。
本地静态验证(全部通过)
| 检查项 | 结果 |
|---|---|
cargo fmt --check |
✅ 通过 |
cargo clippy --manifest-path net/ax-net/Cargo.toml --all-features -- -D warnings |
✅ 通过 |
cargo clippy --manifest-path os/arceos/modules/axruntime/Cargo.toml --all-features -- -D warnings |
✅ 通过 |
cargo clippy --manifest-path os/StarryOS/kernel/Cargo.toml --all-features -- -D warnings |
✅ 通过 |
旧名残留检查(ax-net-ng/net-ng/axnet-ng,排除 Cargo.lock) |
✅ 零匹配 |
[patch.crates-io] 检查 |
✅ 无 |
p.md 残留 |
✅ 已删除 |
os/arceos/modules/axnet / axnet-ng 目录残留 |
✅ 已删除 |
重复/重叠分析
搜索 repo:rcore-os/tgoskits type:pr ax-net network unify 仅返回本 PR #1203,无重复或冲突的开放 PR。与 #1185(AIC8800 Wi-Fi 驱动)无重叠。
阻塞问题:CI 失败
当前 head 96aad92 的 CI run #27319309906(attempt 3)在 Test starry aarch64 qemu / run_container 上失败,导致整个 CI workflow 结论为 failure。
具体现象:
Test starry aarch64 qemu / run_container的 "Run command" 步骤失败(运行命令:target/debug/tg-xtask starry test qemu --arch aarch64)- 同级
run_containerjob(riscv64、loongarch64、x86_64)在失败后被级联取消 run_host类 job(axvisor/arceos/starry board)均成功run_host/run_container互斥,符合预期
因果分析:
- 上一轮审查时的 head
ce6d626的 CI 为全部通过(ZR233 和 mai-team-app 均确认) - 当前 head 新增的两个 commit(
0a6d26392和96aad9233)从所有 test-suit 构建配置中移除了AX_IP/AX_GW环境变量 - 网络栈在此 PR 中从编译时环境变量配置转为运行时
NetworkConfig参数化;移除AX_IP/AX_GW后网络将走 DHCP 路径 - StarryOS aarch64 QEMU 测试的网络初始化可能因 DHCP 路径在 aarch64 环境下存在问题(如 DHCP 超时、DHCP server 未响应等)
由于 CI 在新 commit 之后从通过变为失败,且失败的是 StarryOS 网络相关测试(与本次网络配置变更直接相关),该 CI 失败应视为 PR 相关的回归。
修复建议
- 检查 StarryOS aarch64 QEMU 测试中 DHCP 初始化是否正常工作;可以通过 CI 日志或本地复现确认失败原因。
- 如果 DHCP 路径在 aarch64 QEMU 下确实不可用,考虑在 StarryOS QEMU 构建配置中保留静态 IP 配置(
AX_IP=10.0.2.15、AX_GW=10.0.2.2),或者修复 DHCP 在 aarch64 下的行为。 - 修复
git diff --check报告的空白字符问题:test-suit/arceos/c/build-*.toml在删除[env]段后留下了尾随空行。
实现逻辑确认
重构方案与 PR 描述一致:
- 以原
ax-net-ng完整实现为主体(TCP/UDP/raw/Unix/vsock/DNS/DHCP/router/loopback) - 删除旧
ax-net的smoltcp_impl(TCP/UDP/listen table/DNS/benchmark),不保留兼容 wrapper ax-runtime统一为单一netfeature 路径,删除net-ng分支ax-api/ax-posix-api迁移到新统一Socket/SocketOpsAPI- StarryOS 通过 workspace alias
axnet = { package = "ax-net", path = "net/ax-net" }保持use axnet::...不变 ax-feat的net-ngfeature 已彻底删除,全部收敛到net- 架构设计合理:网络栈从 ArceOS modules 目录提升为根目录
net/顶层组件
CI 问题修复后即可重新请求审查。
Powered by deepseek-v4-pro
# Conflicts: # apps/arceos/build-aarch64-unknown-none-softfloat.toml # apps/arceos/build-riscv64gc-unknown-none-elf.toml # apps/arceos/build-x86_64-unknown-none.toml # apps/starry/ebpf/kret/build-riscv64gc-unknown-none-elf.toml # apps/starry/ebpf/kret/build-x86_64-unknown-none.toml # apps/starry/ebpf/mytrace/build-aarch64-unknown-none-softfloat.toml # apps/starry/ebpf/mytrace/build-loongarch64-unknown-none-softfloat.toml # apps/starry/ebpf/mytrace/build-x86_64-unknown-none.toml # apps/starry/ebpf/profile/build-aarch64-unknown-none-softfloat.toml # apps/starry/ebpf/profile/build-riscv64gc-unknown-none-elf.toml # apps/starry/ebpf/sched_trace/build-aarch64-unknown-none-softfloat.toml # apps/starry/ebpf/sched_trace/build-loongarch64-unknown-none-softfloat.toml # apps/starry/ebpf/sched_trace/build-riscv64gc-unknown-none-elf.toml # apps/starry/ebpf/sched_trace/build-x86_64-unknown-none.toml # apps/starry/ebpf/syscall_count/build-aarch64-unknown-none-softfloat.toml # apps/starry/ebpf/syscall_count/build-loongarch64-unknown-none-softfloat.toml # apps/starry/ebpf/syscall_count/build-riscv64gc-unknown-none-elf.toml # apps/starry/ebpf/syscall_count/build-x86_64-unknown-none.toml # apps/starry/ebpf/upb/build-x86_64-unknown-none.toml # os/StarryOS/configs/board/qemu-loongarch64-uefi.toml # test-suit/arceos/c/build-aarch64-unknown-none-softfloat.toml # test-suit/arceos/c/build-riscv64gc-unknown-none-elf.toml # test-suit/arceos/c/build-x86_64-unknown-none.toml
# Conflicts: # Cargo.lock # Cargo.toml # net/ax-net/CHANGELOG.md # net/ax-net/Cargo.toml # os/StarryOS/kernel/Cargo.toml # os/arceos/modules/axnet/CHANGELOG.md # os/arceos/modules/axnet/Cargo.toml
There was a problem hiding this comment.
审查总结
本轮 PR #1203 将原有的两套网络 crate(os/arceos/modules/axnet 旧同步封装和 os/arceos/modules/axnet-ng 新统一栈)合并为根目录 net/ax-net 单一 crate,迁移方向正确、代码清理彻底、架构设计合理。此前多轮审查中指出的阻塞问题(p.md 残留、ax-net-ng 旧名引用、aarch64 QEMU CI 失败)均已在当前 head b9a816a3 中修复。
上轮阻塞问题修复确认
p.md:已删除,当前 head 中不存在。- 旧名残留:
rg 'ax-net-ng|net-ng|axnet-ng' --glob '!Cargo.lock'仅在axfeat/CHANGELOG.md和axruntime/CHANGELOG.md的历史记录中有 2 处提及(均属历史版本更新记录),代码和配置中零匹配。rg 'dep:ax-net-ng|package = "ax-net-ng"'零匹配。 - aarch64 QEMU CI:上一轮 review #4473386517 指出的
Test starry aarch64 qemu / run_container失败已在当前 head 修复——当前 CI run #27323833355 中所有 StarryOS QEMU 测试(x86_64/riscv64/aarch64/loongarch64)均为success。
实现逻辑
- 以原
ax-net-ng完整实现为主体(TCP/UDP/raw/Unix/vsock/DNS/DHCP/router/loopback),删除旧ax-net的smoltcp_impl(TCP/UDP/listen table/DNS/benchmark),不保留兼容 wrapper。 ax-runtime统一为单一netfeature 路径,删除net-ng分支;新增parse_network_config()将网络配置从编译时环境变量转为运行时NetworkConfig结构体传入,ax-net/config.rs使用core::net::Ipv4Addr替代 smoltcp 类型,边界分离清晰。ax-api/ax-posix-api迁移到新统一Socket/SocketOpsAPI,新增axpoll依赖用于 poll 状态映射。- StarryOS 通过 workspace alias
axnet = { package = "ax-net", path = "net/ax-net" }保持use axnet::...不变。 ax-feat的net-ngfeature 已彻底删除,全部收敛到net。- 架构设计合理:网络栈从 ArceOS modules 目录提升为根目录
net/顶层组件,内部分五层(public facade → socket abstraction → address-family impls → protocol service → device adaptation),router、service、wrapper、listen_table、state默认 crate-private,外部系统不绑定内部实现细节。
本地验证
| 检查项 | 结果 |
|---|---|
cargo fmt --check |
✅ 通过 |
cargo clippy --manifest-path net/ax-net/Cargo.toml --all-features -- -D warnings |
✅ 通过 |
cargo clippy --manifest-path os/arceos/modules/axruntime/Cargo.toml --all-features -- -D warnings |
✅ 通过 |
cargo clippy --manifest-path os/StarryOS/kernel/Cargo.toml --all-features -- -D warnings |
✅ 通过 |
旧名残留检查(ax-net-ng/net-ng/axnet-ng,排除 Cargo.lock) |
✅ 仅 CHANGELOG 历史提及 |
[patch.crates-io] 检查 |
✅ 无 |
p.md 残留 |
✅ 已删除 |
os/arceos/modules/axnet / axnet-ng 目录残留 |
✅ 已删除 |
CI 状态
当前 head b9a816a3 的 CI run #27323833355 结论为 SUCCESS:
- success: Check formatting、Run sync-lint、Run clippy、Test with std、所有 ArceOS/StarryOS/Axvisor QEMU 和 self-hosted board 测试
- skipped: 所有
run_container变体(与run_host互斥,符合预期)、发布类 job(分支受限) - 无 failure
statusCheckRollup.state=FAILURE是由 stale CI run #27323832348 被取消(Cancel stale CI runs)引起的,非当前 head 的真实 CI 失败
重复/重叠分析
- 搜索
repo:rcore-os/tgoskits type:pr ax-net network unify仅返回本 PR #1203,无重复或冲突的开放 PR。 - 与 #1185(AIC8800 Wi-Fi SoftAP 驱动)处于不同层次,无重叠。
- 与 #1218(someboot linker 重构)、#1217(mmap readahead)等新 PR 完全无关,无冲突风险。
遗留风险
git diff --check报告test-suit/arceos/c/build-loongarch64-unknown-none-softfloat.toml:16尾随空行,属微小格式问题,不影响行为。- PR 正文第 4 节详细列出了本轮不涵盖的遗留问题(IPv6、多 NIC、DNS 缓存、零拷贝 dataplane 等),范围控制清晰。
结论
上轮阻塞问题已修复,代码重构方向正确、清理彻底、本地静态验证全部通过,CI 全部通过,无重复或冲突的开放 PR。批准合入。
Powered by deepseek-v4-pro
#1203) * refactor(ax-net): unify network stack into single net/ax-net crate, remove legacy axnet and axnet-ng * refactor(ax-net): decouple network config and Unix namespace from ax-fs-ng * style(ax-net): apply rustfmt formatting and reorder imports * fix(ax-net): drain TCP receive queue in bulk instead of single recv * fix(ax-net): safe timeout nanos conversion and remove legacy fs Unix namespace * refactor(ax-net): remove smoltcp dependency from axruntime and config types * fix(ax-net): add missing Vec import in test_support module * refactor(ax-net): removed unused IP gateway and other configurations * refactor(ax-net): fix removed unused IP gateway and other configurations * refactor(ax-net): fix IP env * refactor(ax-net): optimize static ip or dynamic ip
统一网络模块为
ax-net的方案1. 背景
当前仓库存在两套网络 crate:
ax-net:旧的 ArceOS 网络模块,提供TcpSocket、UdpSocket、dns_query、poll_interfaces、bench_*,主要被ax-api、ax-posix-api、axstd、axlibc使用。ax-net-ng:实际更完整的新网络栈,支持 TCP、UDP、raw ICMP、Unix domain socket、vsock、loopback、router、DHCP、socket options、poll/waker,StarryOS 已经通过依赖别名axnet = { package = "ax-net-ng" }使用它。当前问题:
ax-runtime、ax-feat同时保留net和net-ng两套 feature/初始化路径。ax-net又依赖ax-net-ng的驱动适配类型,形成“旧 API 壳 + 新组件片段”的混合状态。axnet,但真实 package 是ax-net-ng,命名和架构不一致。ax-net,无法获得ax-net-ng的完整 socket 能力。目标:
ax-net作为唯一网络 crate/package。net/ax-net,以当前ax-net-ng为主体实现统一网络栈,并以清晰、统一的新 API 作为唯一对外接口。os/arceos/modules/axnet和os/arceos/modules/axnet-ng两个 ArceOS-local 网络 crate,删除对应 workspace dependency、feature 路径和 runtime 分支。ax-net的兼容 wrapper、旧 feature alias 或旧 benchmark stub;所有调用方在本轮同步迁移到统一 API。2. 修改方案
2.1 总体架构
在仓库根目录新增
net/顶层目录,其中放置ax-net/网络模块作为跨 ArceOS、StarryOS、Axvisor 的核心基础设施。重构后的ax-net本身分为五层:设备适配层、协议服务层、socket 抽象层、地址族实现层、公开入口层。落地目录:
内部边界:
lib.rs只做 facade、初始化入口和必要 re-export,不承载协议状态机逻辑。config.rs定义NetworkConfig/StaticIpConfig,作为ax-runtime到ax-net的结构化初始化配置入口;该配置使用core::net::Ipv4Addr,不把 smoltcp 类型暴露给 runtime。socket.rs定义跨地址族统一抽象;TCP、UDP、raw、Unix、vsock 都实现同一组SocketOps/Pollable/Configurable语义。service.rs和router.rs是协议服务核心,负责把 smoltcp、路由、设备和 waker 串起来。unix/namespace.rs定义可插拔的 path-based Unix socket namespace trait;ax-net只依赖 trait,不依赖具体文件系统实现。device/只负责把rd-net/rdif-vsock设备接入网络栈,不包含具体硬件驱动。router、service、wrapper、listen_table、state默认 crate-private,避免外部系统绑定内部实现细节。ax-net-ng的实现作为net/ax-net主体。os/arceos/modules/axnet/src/smoltcp_impl的 TCP/UDP/listen table/router/DNS/benchmark 实现。os/arceos/modules/axnet和os/arceos/modules/axnet-ng目录,避免 ArceOS modules 下继续存在网络栈实现。ax-net的smoltcp_impl、旧 DNS socket wrapper、旧bench_transmit()/bench_receive();需要这些能力的调用方必须改到新 API 或独立工具。2.2 依赖关系
ax-net依赖的组件:注:
ax-config依赖已移除(改为运行时配置参数化),ax-fs-ng / axfs-ng-vfs依赖已移除(改为可插拔 namespace trait,由ax-runtime注册实现)。依赖
ax-net的组件:不属于
ax-net依赖方向的内容:ax-driver不依赖ax-net,只负责注册rd-net::Net和rdif-vsock::Interface。drivers/,不进入net/ax-net。AF_PACKET、AF_NETLINK、Linuxsockaddr编解码、ioctl(SIOCGIF*)、syscall errno 细节保留在os/StarryOS/。os/arceos/modules/axnet、os/arceos/modules/axnet-ng从 workspace members 和 dependencies 中删除。2.3 对外 API 设计
统一后的
ax-net对外 API 分为三类:运行时初始化 API、socket API、设备/状态查询 API。运行时初始化 API:
pub fn init_network(net_devs: EthernetDeviceList, config: NetworkConfig):由ax-runtime调用,完成 loopback、eth0、router、smoltcp service、DHCP/static IP 初始化。接受结构化配置参数,不再依赖编译时环境变量。#[cfg(feature = "vsock")] pub fn init_vsock(vsock_devs: VsockDeviceList):由ax-runtime调用,注册 vsock 设备并启动 vsock 事件处理。pub fn poll_interfaces():推动网络栈收包、发包、协议状态机和 socket readiness 更新;供 runtime、poll/select/epoll 和 OS 适配层显式调用。初始化配置 API:
pub struct NetworkConfig { static_ip: Option<StaticIpConfig>, dns_servers: Vec<Ipv4Addr> }。pub struct StaticIpConfig { ip: Ipv4Addr, prefix_len: u8, gateway: Ipv4Addr }。ax-net只接收结构化配置,不读取AX_IP、AX_GW、AX_DNS,也不依赖ax-config;这些环境变量由ax-runtime解析后转换为NetworkConfig。socket API:
pub mod tcp,公开tcp::TcpSocket。pub mod udp,公开udp::UdpSocket。pub mod raw,公开 raw IPv4/ICMP socket 能力。pub mod unix,公开 Unix domain socket 地址、stream/dgram transport 与UnixSocket。#[cfg(feature = "vsock")] pub mod vsock,公开 vsock 地址、stream transport 与VsockSocket。pub use socket::{Socket, SocketAddrEx, SocketOps, SendOptions, RecvOptions, SendFlags, RecvFlags, Shutdown, CMsgData},作为 StarryOS syscall 层和未来其他 OS 兼容层的统一 socket 抽象。pub mod options,公开Configurable、GetSocketOption、SetSocketOption、TcpInfo、UnixCredentials等 socket option 类型。pub use unix::{UnixNamespace, register_unix_namespace},公开可插拔 namespace trait 和注册入口,供 runtime 注入 filesystem-backed Unix socket path namespace。设备和状态查询 API:
pub use device::{EthernetDeviceList, EthernetDriver, NetRxBuffer, NetTxBuffer, NetDeviceError, NetDeviceResult, NetIrqEvents, RdNetDriver},供ax-runtime将ax-driver暴露的rd-net设备适配进ax-net。#[cfg(feature = "vsock")] pub use device::{VsockDevice, VsockDeviceList}。pub fn arp_entries() -> Vec<ArpEntry>,供/proc/net/arp、诊断工具或系统兼容层查询 ARP 状态。pub fn dns_query(name: &str) -> AxResult<Vec<IpAddr>>,正式 DNS 域名解析 API(默认 5 秒超时),供ax-api、axstd::net::ToSocketAddrs和 POSIXgetaddrinfo路径使用。pub fn dns_query_timeout(name: &str, timeout: Duration) -> AxResult<Vec<IpAddr>>,支持自定义超时的 DNS 查询。pub fn dns_servers() -> Vec<Ipv4Address>,查询当前配置的 DNS server 列表(DHCP 优先,静态配置回退),仅供诊断使用。不作为
ax-net对外 API 的内容:AF_PACKET、AF_NETLINK、Linuxsockaddr编解码、ioctl(SIOCGIF*)、syscall errno 细节仍属于 StarryOS Linux ABI 层。drivers/和ax-driver。ax-net的阻塞式 inherent methods、旧 DNS wrapper、旧 benchmark 入口不进入新ax-net公共 API。router、service、wrapper、listen_table、state默认保持 crate-private,除非有明确跨 OS 复用需求。2.4 ArceOS 调用方迁移
旧 ArceOS 上层直接调用
TcpSocket/UdpSocket的 inherent methods。统一后不在ax-net中保留这套旧方法,而是迁移 ArceOS 调用方使用统一 socket API。迁移原则:
ax-api::net从旧 handle wrapper 迁移为基于ax_net::{SocketOps, SocketAddrEx, SendOptions, RecvOptions, Shutdown}的实现。ax-posix-api::imp::net不再直接依赖旧TcpSocket/UdpSocket方法,改为与 StarryOS 类似的统一Socket/SocketOps调用模型。ax-api/ax-posix-api新增axpoll依赖,用于把Pollable::poll()返回的IoEvents映射回原有AxPollState/PollState。axstd::net和axlibc::net保持面向应用的 API 不变,但其底层实现通过ax-api/ax-posix-api迁移到新ax-net。Pollable、Configurable和axpoll语义提供,不再维护旧轮询式阻塞路径。recv()需要保持上层期望的短读语义:读取当前已经 ready 的数据,并能跨 smoltcp 内部 RX buffer 分段 drain 当前队列,但不能为了填满用户 buffer 等待未来数据到达。ax-api::net::ax_dns_query()改为调用ax_net::dns_query();dns_query()是新ax-net的正式 DNS API,不是旧smoltcp_implDNS wrapper 的兼容保留。2.5 feature 设计
统一后只保留语义主 feature:
ax-feat/net:启用统一ax-net。ax-runtime/net:启用dep:ax-net、dep:rd-net、dep:spin、dep:axklib、ax-driver/net。ax-feat/vsock:启用ax-runtime/vsock。ax-runtime/vsock:启用net、ax-net/vsock、ax-driver/vsock。ax-net/vsock:启用dep:rdif-vsock。axstd/net、axlibc/net、ax-api/net、ax-posix-api/net:继续依赖ax-feat/net和ax-net。处理旧 feature:
net-ngfeature,不保留 alias、不保留 deprecated 兼容入口。net。net-ng引用都视为本轮重构必须修复的编译错误。2.6 Cargo 与调用方修改
Workspace:
net/ax-net。os/arceos/modules/axnet和os/arceos/modules/axnet-ng。ax-net改为path = "net/ax-net"。axnet = { package = "ax-net", path = "net/ax-net", ... },供 StarryOS 在不改use axnet::...的前提下继承统一网络栈。ax-net-ng。ax-net版本可提升到当前ax-net-ng的版本线或项目约定的新版本。ArceOS:
ax-feat删除dep:ax-net-ng的真实依赖路径。ax-runtime删除init_dyn_net_ng、take_*_net_ng_drivers分支,所有网络初始化走ax_net。ax-runtime负责读取AX_IP、AX_GW、AX_DNS,解析为NetworkConfig后传给ax_net::init_network();当前静态地址路径使用AX_IP + AX_GW,prefix 长度由 runtime 填入StaticIpConfig::prefix_len。ax-runtime在net + fs-ng下注册AxFsUnixNamespace,把 Unix domain socket path namespace 接到ax-fs-ng的FS_CONTEXT;仅启用旧fs时不提供 path-based Unix socket namespace。ax-api/ax-posix-api迁移为使用ax-net新统一 API,不保留旧 socket handle 到旧方法的适配层。axstd/axlibc面向应用的公开 API 可保持不变,但内部必须通过迁移后的ax-api/ax-posix-api工作。StarryOS:
os/StarryOS/kernel/Cargo.toml(package name:starry-kernel)改为:axnet = { workspace = true }(继承 workspace dependency alias,真实 package 为ax-net)ax-feat/net-ng改为ax-feat/netvsock继续通过ax-feat/vsockuse axnet::...保持不变。测试与应用配置:
test-suit/starryos/**/build-*.toml中的starry-kernel/vsock保持。ax-driver/virtio-net、ax-driver/virtio-socket保持。net-ng配置,全部改为net。virtio-net-pci和-netdev user配置不变。2.7 DNS 与 DHCP
当前已有依赖 DNS 的功能,必须在本轮实现以避免功能退化:
axstd::net::ToSocketAddrs中(&str, u16)需要 DNS 解析ax-api::net::ax_dns_query()被axstd依赖apps/arceos/httpclient在feature = "dns"下使用域名连接因此要做如下修改:
保留 DNS 查询功能,迁移实现
net/ax-net/src/lib.rs中提供正式 public API:pub fn dns_query(name: &str) -> AxResult<Vec<IpAddr>>socket-dnsfeature 已启用)SocketSetWrapper、Service和动态 DNS server 列表,不迁移旧ETH0/ 旧SOCKET_SET结构DNS server 配置管理
ax-net内部维护 DNS server 列表(从 DHCP 或显式静态配置获取)ax-runtime从AX_DNS读取并解析为NetworkConfig::dns_servers,ax-net本身不读取环境变量、不依赖ax-config、也不在consts.rs中硬编码 DNS serverpub fn dns_servers() -> Vec<Ipv4Address>,仅作为诊断 API,不作为 resolver 配置修改入口DHCP 支持
ax-net-ng已有的 DHCP 实现(DHCP client、自动获取 IP/gateway/DNS)NetworkConfig选择静态网络或 DHCP:ax-runtime在AX_IP和AX_GW都存在时构造StaticIpConfig,否则传入static_ip = None启用 DHCPAPI 映射
ax-api::net::ax_dns_query()→ax_net::dns_query()axstd::net::ToSocketAddrs继续通过ax_api::net::ax_dns_query()工作迁移注意事项:
os/arceos/modules/axnet/src/smoltcp_impl/dns.rs,仅作为 DNS query 流程参考,不完整搬迁旧结构apps/arceos/httpclient的dnsfeature 必须能正常工作ax-net的 DNS 查询使用dns_query_timeout()支持自定义超时;默认dns_query()使用固定默认超时不在本轮范围:
/etc/resolv.conf等)3. 测试方案
必须运行:
cargo fmtcargo fmt --all -- --checkcargo xtask clippy --package ax-netcargo xtask clippy --package ax-runtimecargo xtask clippy --package ax-featcargo xtask clippy --package ax-apicargo xtask clippy --package ax-posix-apicargo xtask clippy --package ax-stdcargo xtask clippy --package ax-libccargo xtask clippy --package starry-kernel功能验证:
ax-net内部单元测试:覆盖 TCP/UDP connected socket device mask、TCP info 等基础行为。net-loopback测试:确认axstd::net::{TcpListener,TcpStream,UdpSocket}仍可用。httpserver/httpclientQEMU:确认 ArceOS 上层已迁移到新ax-netAPI。httpclientDNS 测试:使用--features dns运行,确认域名解析功能正常(ToSocketAddrs和ax_dns_query工作)。axpollwaker 路径未破坏。starry-kernel/vsock + ax-driver/virtio-socket的编译。eth0初始化、默认路由、DNS server 获取不退化。4. 遗留问题
以下问题不影响本轮“统一为
net/ax-net”的目标,但属于后续真实有效的能力缺口或性能优化点。bench_transmit()/bench_receive()不迁入新ax-net。若后续仍需要网络设备吞吐 benchmark,应放到tools或test-suit中,作为独立压测工具,而不是重新进入核心网络栈 public API。dns_query(),但 DNS cache、IPv6 AAAA 查询、自定义 resolver 配置(例如/etc/resolv.conf)仍未实现。当前 DNS 查询以功能正确为主,不做复杂缓存和运行时 resolver 策略。dns_query_timeout()每次查询会创建并移除一个 smoltcp DNS socket。功能上可用,但大量短连接或高频域名解析场景会产生额外 SocketSet 操作和分配。后续可将 DNS resolver socket 或 resolver state 放入Service,统一管理 query slot 和 DHCP DNS server 更新。router/device已具备多设备抽象,但初始化和系统接口仍主要围绕eth0。后续需要补齐多网卡配置策略、接口命名、默认路由选择、源地址选择、以及给 StarryOS ioctl 使用的真实接口信息。poll_interfaces()仍是全局串行推进网络栈的入口,socket send/recv/poll/drop 等路径会频繁主动调用它。该设计简单可靠,但在 SMP、多 socket 高并发场景下会成为瓶颈。后续应引入net-pollworker、request_poll()轻量唤醒路径,并减少 socket syscall 热路径中的同步全栈 poll。SERVICE和SOCKET_SET仍是网络协议栈的核心全局锁,Service::poll()、smoltcpSocketSet访问、waker 注册等路径存在较粗的串行化。后续应明确锁顺序,并将Service拆成 interface/router、DNS、DHCP、device registry 等更小的状态域,减少临界区范围。Router使用统一rx_buffer/tx_buffer作为 smoltcp 与设备之间的中转,EthernetDevice和RdNetDriver也存在 packet copy。该设计降低了迁移风险,但不是高吞吐零拷贝 dataplane。后续若追求性能,需要重构Devicetrait 和rd-netbuffer ownership,使 smoltcp token 尽量直接消费/填写驱动 buffer。Vec。这不在常规每包热路径,但冷启动并发连接、ARP 过期恢复时可能产生突发分配和延迟尖峰。后续可改为固定临时 buffer、索引搬移或在 pending buffer 内重排。SocketSet。socket 数量较多时 bind 成本会退化。后续应增加类似 TCP bound port table 的 UDP bound table,支持 wildcard address/reuse address 语义。SO_RCVBUF/SO_SNDBUF的真实调整和全局内存上限策略。AF_PACKET、AF_NETLINK、Linuxsockaddr编解码、ioctl(SIOCGIF*)、syscall errno 细节仍保留在 StarryOS 层,不迁入ax-net。这不是缺陷,而是边界约束;后续若增强这些能力,也应优先在 StarryOS ABI 层完成。