Skip to content

refactor(ax-net): unify network stack into single net/ax-net crate, r…#1203

Merged
ZR233 merged 14 commits into
devfrom
axnet
Jun 11, 2026
Merged

refactor(ax-net): unify network stack into single net/ax-net crate, r…#1203
ZR233 merged 14 commits into
devfrom
axnet

Conversation

@ZCShou

@ZCShou ZCShou commented Jun 10, 2026

Copy link
Copy Markdown
Contributor

统一网络模块为 ax-net 的方案

1. 背景

当前仓库存在两套网络 crate:

  • ax-net:旧的 ArceOS 网络模块,提供 TcpSocketUdpSocketdns_querypoll_interfacesbench_*,主要被 ax-apiax-posix-apiaxstdaxlibc 使用。
  • 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-runtimeax-feat 同时保留 netnet-ng 两套 feature/初始化路径。
  • ax-net 又依赖 ax-net-ng 的驱动适配类型,形成“旧 API 壳 + 新组件片段”的混合状态。
  • StarryOS 的对外依赖名是 axnet,但真实 package 是 ax-net-ng,命名和架构不一致。
  • ArceOS 公共 API 仍走旧 ax-net,无法获得 ax-net-ng 的完整 socket 能力。

目标:

  • 仅保留 ax-net 作为唯一网络 crate/package。
  • 在仓库根目录新增 net/ax-net,以当前 ax-net-ng 为主体实现统一网络栈,并以清晰、统一的新 API 作为唯一对外接口。
  • 移除 os/arceos/modules/axnetos/arceos/modules/axnet-ng 两个 ArceOS-local 网络 crate,删除对应 workspace dependency、feature 路径和 runtime 分支。
  • 统一 ArceOS 与 StarryOS 的网络能力入口,降低重复实现和 feature 组合风险。
  • 将网络栈从 ArceOS modules 目录中提升为根目录通用组件,使其成为 ArceOS、StarryOS 以及后续其他系统可复用的统一 net 支持。
  • 不保留旧 ax-net 的兼容 wrapper、旧 feature alias 或旧 benchmark stub;所有调用方在本轮同步迁移到统一 API。

2. 修改方案

2.1 总体架构

在仓库根目录新增 net/ 顶层目录,其中放置 ax-net/ 网络模块作为跨 ArceOS、StarryOS、Axvisor 的核心基础设施。重构后的 ax-net 本身分为五层:设备适配层、协议服务层、socket 抽象层、地址族实现层、公开入口层。

net/ax-net
  public facade
    -> lib.rs
    -> init_network / init_vsock / poll_interfaces
    -> public socket, option, device, status APIs

  socket abstraction
    -> socket.rs: Socket, SocketOps, SocketAddrEx, SendOptions, RecvOptions
    -> options.rs: Configurable, GetSocketOption, SetSocketOption
    -> general.rs: common nonblocking, timeout, protocol/domain/type state

  address-family implementations
    -> tcp.rs
    -> udp.rs
    -> raw.rs
    -> unix/
    -> vsock/

  protocol service
    -> service.rs: smoltcp Interface owner, DHCP, DNS server state, waker registration
    -> router.rs: route table, device dispatch, packet rx/tx path
    -> listen_table.rs: TCP listen/accept queue
    -> wrapper.rs: smoltcp SocketSet access
    -> state.rs: socket state transitions

  device adaptation
    -> device/driver.rs: rd-net -> ax-net EthernetDriver adapter
    -> device/ethernet.rs: Ethernet device implementation
    -> device/loopback.rs: loopback device
    -> device/vsock.rs: rdif-vsock integration

落地目录:

net/
  ax-net/
    Cargo.toml
    src/
      lib.rs
      config.rs
      consts.rs
      device/
      general.rs
      router.rs
      service.rs
      socket.rs
      tcp.rs
      udp.rs
      raw.rs
      unix/
      vsock/
      options.rs
      wrapper.rs
      listen_table.rs
      state.rs

内部边界:

  • lib.rs 只做 facade、初始化入口和必要 re-export,不承载协议状态机逻辑。
  • config.rs 定义 NetworkConfig / StaticIpConfig,作为 ax-runtimeax-net 的结构化初始化配置入口;该配置使用 core::net::Ipv4Addr,不把 smoltcp 类型暴露给 runtime。
  • socket.rs 定义跨地址族统一抽象;TCP、UDP、raw、Unix、vsock 都实现同一组 SocketOps / Pollable / Configurable 语义。
  • service.rsrouter.rs 是协议服务核心,负责把 smoltcp、路由、设备和 waker 串起来。
  • unix/namespace.rs 定义可插拔的 path-based Unix socket namespace trait;ax-net 只依赖 trait,不依赖具体文件系统实现。
  • device/ 只负责把 rd-net / rdif-vsock 设备接入网络栈,不包含具体硬件驱动。
  • routerservicewrapperlisten_tablestate 默认 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/axnetos/arceos/modules/axnet-ng 目录,避免 ArceOS modules 下继续存在网络栈实现。
  • 不迁移旧 ax-netsmoltcp_impl、旧 DNS socket wrapper、旧 bench_transmit() / bench_receive();需要这些能力的调用方必须改到新 API 或独立工具。

2.2 依赖关系

ax-net 依赖的组件:

ax-net
  -> smoltcp                 TCP/IP 协议栈
  -> axpoll                  readiness / Pollable / waker 语义
  -> ax-task                 阻塞等待、任务调度、DHCP/vsock 后台任务
  -> ax-sync / ax-kspin      锁与同步原语
  -> ax-io                   Read/Write/IoBuf 抽象
  -> ax-errno                AxError / AxResult / LinuxError 映射
  -> ax-hal                  时间等底层能力
  -> rd-net                  Ethernet queue/DMA 设备抽象
  -> rdif-vsock              可选,vsock 设备抽象

ax-config 依赖已移除(改为运行时配置参数化),ax-fs-ng / axfs-ng-vfs 依赖已移除(改为可插拔 namespace trait,由 ax-runtime 注册实现)。

依赖 ax-net 的组件:

ax-runtime
  -> ax-net                  网络和 vsock 初始化

ax-feat
  -> ax-net                  net/vsock feature 装配

ax-api
  -> ax-net                  ArceOS Rust API 网络入口

ax-posix-api
  -> ax-net                  ArceOS POSIX socket 入口

ax-std / ax-libc
  -> ax-api / ax-posix-api
  -> ax-net                  间接使用统一网络栈

starry-kernel
  -> ax-net                  Linux syscall socket 底层实现

apps / test-suit
  -> ax-std / ax-libc / starry-kernel
  -> ax-net                  间接验证统一网络栈

不属于 ax-net 依赖方向的内容:

  • ax-driver 不依赖 ax-net,只负责注册 rd-net::Netrdif-vsock::Interface
  • 具体网卡/vsock 驱动位于 drivers/,不进入 net/ax-net
  • StarryOS 的 AF_PACKETAF_NETLINK、Linux sockaddr 编解码、ioctl(SIOCGIF*)、syscall errno 细节保留在 os/StarryOS/
  • os/arceos/modules/axnetos/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_IPAX_GWAX_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,公开 ConfigurableGetSocketOptionSetSocketOptionTcpInfoUnixCredentials 等 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-runtimeax-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-apiaxstd::net::ToSocketAddrs 和 POSIX getaddrinfo 路径使用。
  • 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_PACKETAF_NETLINK、Linux sockaddr 编解码、ioctl(SIOCGIF*)、syscall errno 细节仍属于 StarryOS Linux ABI 层。
  • 具体网卡驱动、PCI/VirtIO 设备探测、DMA mapping 策略仍属于 drivers/ax-driver
  • ax-net 的阻塞式 inherent methods、旧 DNS wrapper、旧 benchmark 入口不进入新 ax-net 公共 API。
  • routerservicewrapperlisten_tablestate 默认保持 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::netaxlibc::net 保持面向应用的 API 不变,但其底层实现通过 ax-api / ax-posix-api 迁移到新 ax-net
  • TCP/UDP 阻塞、非阻塞、poll 状态统一由 PollableConfigurableaxpoll 语义提供,不再维护旧轮询式阻塞路径。
  • TCP recv() 需要保持上层期望的短读语义:读取当前已经 ready 的数据,并能跨 smoltcp 内部 RX buffer 分段 drain 当前队列,但不能为了填满用户 buffer 等待未来数据到达。
  • ax-api::net::ax_dns_query() 改为调用 ax_net::dns_query()dns_query() 是新 ax-net 的正式 DNS API,不是旧 smoltcp_impl DNS wrapper 的兼容保留。

2.5 feature 设计

统一后只保留语义主 feature:

  • ax-feat/net:启用统一 ax-net
  • ax-runtime/net:启用 dep:ax-netdep:rd-netdep:spindep:axklibax-driver/net
  • ax-feat/vsock:启用 ax-runtime/vsock
  • ax-runtime/vsock:启用 netax-net/vsockax-driver/vsock
  • ax-net/vsock:启用 dep:rdif-vsock
  • axstd/netaxlibc/netax-api/netax-posix-api/net:继续依赖 ax-feat/netax-net

处理旧 feature:

  • 彻底删除 net-ng feature,不保留 alias、不保留 deprecated 兼容入口。
  • 所有仓库内配置、Cargo.toml、文档、测试统一改为 net
  • 任何残留的 net-ng 引用都视为本轮重构必须修复的编译错误。

2.6 Cargo 与调用方修改

Workspace:

  • 新增 workspace member net/ax-net
  • 删除 workspace members os/arceos/modules/axnetos/arceos/modules/axnet-ng
  • 将 workspace dependency ax-net 改为 path = "net/ax-net"
  • 新增 workspace dependency alias axnet = { package = "ax-net", path = "net/ax-net", ... },供 StarryOS 在不改 use axnet::... 的前提下继承统一网络栈。
  • 删除 workspace dependency ax-net-ng
  • ax-net 版本可提升到当前 ax-net-ng 的版本线或项目约定的新版本。

ArceOS:

  • ax-feat 删除 dep:ax-net-ng 的真实依赖路径。
  • ax-runtime 删除 init_dyn_net_ngtake_*_net_ng_drivers 分支,所有网络初始化走 ax_net
  • ax-runtime 负责读取 AX_IPAX_GWAX_DNS,解析为 NetworkConfig 后传给 ax_net::init_network();当前静态地址路径使用 AX_IP + AX_GW,prefix 长度由 runtime 填入 StaticIpConfig::prefix_len
  • ax-runtimenet + fs-ng 下注册 AxFsUnixNamespace,把 Unix domain socket path namespace 接到 ax-fs-ngFS_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
    • feature 从 ax-feat/net-ng 改为 ax-feat/net
    • vsock 继续通过 ax-feat/vsock
  • StarryOS syscall 代码中的 use axnet::... 保持不变。

测试与应用配置:

  • test-suit/starryos/**/build-*.toml 中的 starry-kernel/vsock 保持。
  • ax-driver/virtio-netax-driver/virtio-socket 保持。
  • 若出现显式 net-ng 配置,全部改为 net
  • QEMU 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/httpclientfeature = "dns" 下使用域名连接

因此要做如下修改:

  1. 保留 DNS 查询功能,迁移实现

    • net/ax-net/src/lib.rs 中提供正式 public API:pub fn dns_query(name: &str) -> AxResult<Vec<IpAddr>>
    • 基于 smoltcp 的 DNS socket 功能实现(socket-dns feature 已启用)
    • 复用旧 DNS 查询流程,但重写实现以接入新的 SocketSetWrapperService 和动态 DNS server 列表,不迁移旧 ETH0 / 旧 SOCKET_SET 结构
    • 使用 DHCP 获取的 DNS server 或静态配置的 DNS server
  2. DNS server 配置管理

    • ax-net 内部维护 DNS server 列表(从 DHCP 或显式静态配置获取)
    • 静态 DNS 配置由 ax-runtimeAX_DNS 读取并解析为 NetworkConfig::dns_serversax-net 本身不读取环境变量、不依赖 ax-config、也不在 consts.rs 中硬编码 DNS server
    • 可提供查询接口:pub fn dns_servers() -> Vec<Ipv4Address>,仅作为诊断 API,不作为 resolver 配置修改入口
    • DNS server 来源优先级:
      • DHCP 获取的 DNS server(优先)
      • 显式静态 DNS 配置
      • 无配置时查询返回错误,不硬编码默认值
  3. DHCP 支持

    • 保持 ax-net-ng 已有的 DHCP 实现(DHCP client、自动获取 IP/gateway/DNS)
    • 初始化时按 NetworkConfig 选择静态网络或 DHCP:ax-runtimeAX_IPAX_GW 都存在时构造 StaticIpConfig,否则传入 static_ip = None 启用 DHCP
    • DHCP bootstrap 超时保持 warning 行为,不新增隐式静态回退;如果需要 DHCP 失败回退静态配置,应作为额外设计单独实现
  4. API 映射

    • ax-api::net::ax_dns_query()ax_net::dns_query()
    • axstd::net::ToSocketAddrs 继续通过 ax_api::net::ax_dns_query() 工作
    • 不改变上层 API,只替换底层实现

迁移注意事项

  • 旧实现位于 os/arceos/modules/axnet/src/smoltcp_impl/dns.rs,仅作为 DNS query 流程参考,不完整搬迁旧结构
  • 测试覆盖:apps/arceos/httpclientdns feature 必须能正常工作
  • ax-net 的 DNS 查询使用 dns_query_timeout() 支持自定义超时;默认 dns_query() 使用固定默认超时
  • 如果 smoltcp DNS socket 实现不足,需要在本轮补充完整

不在本轮范围

  • 复杂的 DNS 缓存机制(可选优化)
  • IPv6 DNS(AAAA 记录)
  • 自定义 DNS resolver 配置(/etc/resolv.conf 等)

3. 测试方案

必须运行:

  • cargo fmt
  • cargo fmt --all -- --check
  • cargo xtask clippy --package ax-net
  • cargo xtask clippy --package ax-runtime
  • cargo xtask clippy --package ax-feat
  • cargo xtask clippy --package ax-api
  • cargo xtask clippy --package ax-posix-api
  • cargo xtask clippy --package ax-std
  • cargo xtask clippy --package ax-libc
  • cargo xtask clippy --package starry-kernel

功能验证:

  • ax-net 内部单元测试:覆盖 TCP/UDP connected socket device mask、TCP info 等基础行为。
  • ArceOS net-loopback 测试:确认 axstd::net::{TcpListener,TcpStream,UdpSocket} 仍可用。
  • ArceOS httpserver / httpclient QEMU:确认 ArceOS 上层已迁移到新 ax-net API。
  • ArceOS httpclient DNS 测试:使用 --features dns 运行,确认域名解析功能正常(ToSocketAddrsax_dns_query 工作)。
  • StarryOS socket dataplane 测试:TCP/UDP bind/connect/send/recv。
  • StarryOS epoll network 测试:确认 axpoll waker 路径未破坏。
  • StarryOS AF_UNIX SCM_RIGHTS/socketpair 测试。
  • StarryOS raw ICMP/packet socket/netlink 测试。
  • StarryOS vsock build 测试,至少覆盖 starry-kernel/vsock + ax-driver/virtio-socket 的编译。
  • DHCP/QEMU user networking 场景:确认 eth0 初始化、默认路由、DNS server 获取不退化。

4. 遗留问题

以下问题不影响本轮“统一为 net/ax-net”的目标,但属于后续真实有效的能力缺口或性能优化点。

  • 网络 benchmark:旧 bench_transmit() / bench_receive() 不迁入新 ax-net。若后续仍需要网络设备吞吐 benchmark,应放到 toolstest-suit 中,作为独立压测工具,而不是重新进入核心网络栈 public API。
  • DNS 高级能力:本轮已保留并迁移 dns_query(),但 DNS cache、IPv6 AAAA 查询、自定义 resolver 配置(例如 /etc/resolv.conf)仍未实现。当前 DNS 查询以功能正确为主,不做复杂缓存和运行时 resolver 策略。
  • DNS resolver 性能:当前 dns_query_timeout() 每次查询会创建并移除一个 smoltcp DNS socket。功能上可用,但大量短连接或高频域名解析场景会产生额外 SocketSet 操作和分配。后续可将 DNS resolver socket 或 resolver state 放入 Service,统一管理 query slot 和 DHCP DNS server 更新。
  • IPv6:StarryOS syscall 层支持 AF_INET6 入口,但统一网络栈目前仍以 IPv4 为主。完整 IPv6 包括地址配置、路由、邻居发现、TCP/UDP IPv6 dataplane、DNS AAAA 查询,不在本轮范围。
  • 多 NIC:当前 router/device 已具备多设备抽象,但初始化和系统接口仍主要围绕 eth0。后续需要补齐多网卡配置策略、接口命名、默认路由选择、源地址选择、以及给 StarryOS ioctl 使用的真实接口信息。
  • 全局 poll 热路径:当前 poll_interfaces() 仍是全局串行推进网络栈的入口,socket send/recv/poll/drop 等路径会频繁主动调用它。该设计简单可靠,但在 SMP、多 socket 高并发场景下会成为瓶颈。后续应引入 net-poll worker、request_poll() 轻量唤醒路径,并减少 socket syscall 热路径中的同步全栈 poll。
  • 全局锁粒度:SERVICESOCKET_SET 仍是网络协议栈的核心全局锁,Service::poll()、smoltcp SocketSet 访问、waker 注册等路径存在较粗的串行化。后续应明确锁顺序,并将 Service 拆成 interface/router、DNS、DHCP、device registry 等更小的状态域,减少临界区范围。
  • 设备到协议栈的拷贝路径:当前 Router 使用统一 rx_buffer / tx_buffer 作为 smoltcp 与设备之间的中转,EthernetDeviceRdNetDriver 也存在 packet copy。该设计降低了迁移风险,但不是高吞吐零拷贝 dataplane。后续若追求性能,需要重构 Device trait 和 rd-net buffer ownership,使 smoltcp token 尽量直接消费/填写驱动 buffer。
  • ARP pending queue 突发分配:ARP 命中后 drain pending packet 时会把待发送 packet 暂存为 Vec。这不在常规每包热路径,但冷启动并发连接、ARP 过期恢复时可能产生突发分配和延迟尖峰。后续可改为固定临时 buffer、索引搬移或在 pending buffer 内重排。
  • UDP 端口绑定检查:当前 UDP bind 冲突检查仍依赖扫描 smoltcp SocketSet。socket 数量较多时 bind 成本会退化。后续应增加类似 TCP bound port table 的 UDP bound table,支持 wildcard address/reuse address 语义。
  • Socket buffer 策略:TCP/UDP/raw 当前使用固定大小 RX/TX buffer。该策略对少量 socket 简单稳定,但大量 socket 场景下内存占用偏刚性。后续应支持 SO_RCVBUF / SO_SNDBUF 的真实调整和全局内存上限策略。
  • StarryOS Linux ABI 边界:AF_PACKETAF_NETLINK、Linux sockaddr 编解码、ioctl(SIOCGIF*)、syscall errno 细节仍保留在 StarryOS 层,不迁入 ax-net。这不是缺陷,而是边界约束;后续若增强这些能力,也应优先在 StarryOS ABI 层完成。

@mai-team-app mai-team-app Bot mentioned this pull request Jun 10, 2026

@ZR233 ZR233 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

当前 head b850a6420372779f23f25469f8fe187043d6d310 的 CI 已经是绿色,网络重构的主要 Cargo/feature 迁移方向也基本一致:net/ax-net 作为统一 crate,ax-runtime/netax-runtime/vsockax-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-tests audit 已启动并返回结果;当前 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 路径并同步清理旧名/导航。

Comment thread p.md Outdated

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

审查总结

本次网络栈统一重构整体迁移方向正确、代码清理彻底(ax-net-ng/net-ng 等旧名在代码和配置中已全部清理)。net/ax-net 作为新的统一网络 crate 结构清晰,所有调用方(ax-runtimeax-featax-apiax-posix-apistarry-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 未做修改。

修复建议

  1. 删除 p.md;或
  2. 将其移动到 docs/ 下的正式位置,并同步清理其中的旧命名(ax-net-ngax-net 等),同时更新文档导航。

由于该问题在上一轮审查中已被标记为阻塞但未解决,本轮维持 REQUEST_CHANGES。修复后可直接重新请求审查。

Powered by deepseek-v4-pro

Comment thread p.md Outdated

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

审查总结

本轮网络栈统一重构(PR #1203)迁移方向正确、代码清理彻底、本地验证全部通过。

上一轮阻塞问题已修复

  • p.md 已从仓库根目录删除(当前 head a73e0883 中不存在该文件)。
  • 上一轮 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-netsmoltcp_impl(TCP/UDP/listen table/DNS/benchmark),不保留兼容 wrapper。
  • ax-runtime 统一为单一 net feature 路径,删除 net-ng 分支。
  • ax-api / ax-posix-api 迁移到新统一 Socket/SocketOps API。
  • StarryOS 通过 workspace alias axnet = { package = "ax-net", path = "net/ax-net" } 保持 use axnet::... 不变。
  • ax-featnet-ng feature 已彻底删除,全部收敛到 net

架构设计合理:网络栈从 ArceOS modules 目录提升为根目录 net/ 顶层组件,device/routerservicewrapperlisten_tablestate 模块边界清晰,外部系统不绑定内部实现细节。

本地验证

检查项 结果
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) ⚠️ 已知构建限制(平台 feature 互斥),非本 PR 引入

CI 状态

当前 head a73e0883 的 CI run (#27259841512, attempt 2) 仍在运行中。已完成的 job:

  • success: Check formatting / run_hostRun sync-lint / run_containerTest with std / run_hostTest axvisor self-hosted x86_64 / run_hostTest arceos riscv64 qemu / run_hostTest axvisor riscv64 qemu / run_host
  • skipped: 所有 run_container 变体(与 run_host 互斥,符合预期)
  • in_progress: Run clippy / run_hostTest 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-features clippy 因平台 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

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

审查总结

本轮 PR #1203 将原有的两套网络 crate(os/arceos/modules/axnetos/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-netsmoltcp_impl(TCP/UDP/listen table/DNS/benchmark),不保留兼容 wrapper。
  • ax-runtime 统一为单一 net feature 路径,删除 net-ng 分支;新增 parse_network_config() 将网络配置从编译时环境变量转为运行时 NetworkConfig 结构体传入。
  • ax-api / ax-posix-api 迁移到新统一 Socket/SocketOps API。
  • StarryOS 通过 workspace alias axnet = { package = "ax-net", path = "net/ax-net" } 保持 use axnet::... 不变。
  • ax-featnet-ng feature 已彻底删除,全部收敛到 net
  • ax-net/config.rs 使用 core::net::Ipv4Addr 替代 smoltcp 类型,ax-runtime 不再需要直接依赖 smoltcp——边界分离清晰。
  • lib.rspub use socket::* 改为显式导出,避免意外暴露内部类型。

架构设计

网络栈从 ArceOS modules 目录提升为根目录 net/ 顶层组件,内部分五层(public facade → socket abstraction → address-family impls → protocol service → device adaptation),routerservicewrapperlisten_tablestate 默认 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-features clippy 因平台 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 ZR233 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

复查了当前 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/netaxruntime/net feature 组合仍保留 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 run 27265673891

未发现阻塞问题,批准合入。

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

审查总结

本轮网络栈统一重构(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/axnetos/arceos/modules/axnet-ng 目录已完全移除。

实现逻辑

  • 以原 ax-net-ng 的完整实现为主体(TCP/UDP/raw/Unix/vsock/DNS/DHCP/router/loopback),删除旧 ax-netsmoltcp_impl,不保留兼容 wrapper。
  • ax-runtime 统一为单一 net feature 路径,删除 net-ng 分支。
  • ax-api / ax-posix-api 迁移到新统一 Socket/SocketOps API。
  • StarryOS 通过 workspace alias axnet = { package = "ax-net", path = "net/ax-net" } 保持 use axnet::... 不变。
  • ax-featnet-ng feature 已彻底删除,全部收敛到 net
  • 架构设计合理:网络栈从 ArceOS modules 目录提升为根目录 net/ 顶层组件,内部分五层(public facade → socket abstraction → address-family impls → protocol service → device adaptation),routerservice 等默认 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:✅ success
  • run_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

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

审查总结

本轮 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_container job(riscv64、loongarch64、x86_64)在失败后被级联取消
  • run_host 类 job(axvisor/arceos/starry board)均成功
  • run_host/run_container 互斥,符合预期

因果分析:

  • 上一轮审查时的 head ce6d626 的 CI 为全部通过(ZR233 和 mai-team-app 均确认)
  • 当前 head 新增的两个 commit(0a6d2639296aad9233)从所有 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 相关的回归。

修复建议

  1. 检查 StarryOS aarch64 QEMU 测试中 DHCP 初始化是否正常工作;可以通过 CI 日志或本地复现确认失败原因。
  2. 如果 DHCP 路径在 aarch64 QEMU 下确实不可用,考虑在 StarryOS QEMU 构建配置中保留静态 IP 配置(AX_IP=10.0.2.15AX_GW=10.0.2.2),或者修复 DHCP 在 aarch64 下的行为。
  3. 修复 git diff --check 报告的空白字符问题:test-suit/arceos/c/build-*.toml 在删除 [env] 段后留下了尾随空行。

实现逻辑确认

重构方案与 PR 描述一致:

  • 以原 ax-net-ng 完整实现为主体(TCP/UDP/raw/Unix/vsock/DNS/DHCP/router/loopback)
  • 删除旧 ax-netsmoltcp_impl(TCP/UDP/listen table/DNS/benchmark),不保留兼容 wrapper
  • ax-runtime 统一为单一 net feature 路径,删除 net-ng 分支
  • ax-api / ax-posix-api 迁移到新统一 Socket/SocketOps API
  • StarryOS 通过 workspace alias axnet = { package = "ax-net", path = "net/ax-net" } 保持 use axnet::... 不变
  • ax-featnet-ng feature 已彻底删除,全部收敛到 net
  • 架构设计合理:网络栈从 ArceOS modules 目录提升为根目录 net/ 顶层组件

CI 问题修复后即可重新请求审查。

Powered by deepseek-v4-pro

ZCShou added 4 commits June 11, 2026 11:54
# 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

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

审查总结

本轮 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.mdaxruntime/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-netsmoltcp_impl(TCP/UDP/listen table/DNS/benchmark),不保留兼容 wrapper。
  • ax-runtime 统一为单一 net feature 路径,删除 net-ng 分支;新增 parse_network_config() 将网络配置从编译时环境变量转为运行时 NetworkConfig 结构体传入,ax-net/config.rs 使用 core::net::Ipv4Addr 替代 smoltcp 类型,边界分离清晰。
  • ax-api / ax-posix-api 迁移到新统一 Socket/SocketOps API,新增 axpoll 依赖用于 poll 状态映射。
  • StarryOS 通过 workspace alias axnet = { package = "ax-net", path = "net/ax-net" } 保持 use axnet::... 不变。
  • ax-featnet-ng feature 已彻底删除,全部收敛到 net
  • 架构设计合理:网络栈从 ArceOS modules 目录提升为根目录 net/ 顶层组件,内部分五层(public facade → socket abstraction → address-family impls → protocol service → device adaptation),routerservicewrapperlisten_tablestate 默认 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

@ZR233
ZR233 merged commit 2a57309 into dev Jun 11, 2026
54 of 56 checks passed
@ZR233
ZR233 deleted the axnet branch June 11, 2026 05:09
This was referenced Jun 11, 2026
luodeb pushed a commit that referenced this pull request Jun 30, 2026
#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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants