ax-net
路径:
os/arceos/modules/axnet类型:库 crate 分层:ArceOS 层 / 第一代 IP 网络模块 版本:0.3.0-preview.3文档依据:Cargo.toml、src/lib.rs、src/smoltcp_impl/mod.rs、src/smoltcp_impl/tcp.rs、src/smoltcp_impl/udp.rs、src/smoltcp_impl/dns.rs、src/smoltcp_impl/listen_table.rs、src/smoltcp_impl/bench.rs、os/arceos/modules/axruntime/src/lib.rs、os/arceos/api/ax-api/src/imp/net.rs、os/arceos/api/arceos_posix_api/src/imp/net.rs
ax-net 是 ArceOS 老一代网络封装层。它围绕 smoltcp 构建一个全局、单接口、同步阻塞风格的 IP socket API,把 TCP、UDP 和 DNS 能力接到 ArceOS 运行时与 API 层上。它关心的是“把一块 NIC 和一份 smoltcp 实例变成可用的系统网络能力”,而不是构建跨地址族、跨设备、跨等待模型的通用 socket 服务框架。
最核心的边界是:ax-net 只是第一代 IP 网络包装层,不是统一 socket 服务层。它的重点是 TCP/UDP/DNS over IP,而不是 Unix domain socket、vsock、复杂路由服务或细粒度事件管理。
架构设计
设计定位
ax-net 的设计目标非常直接:把 smoltcp 变成 ArceOS 可直接消费的同步网络 API。当前实现采用三层收敛:
- 设备层:从
ax-driver取出一个AxNetDevice,直接适配成smoltcp::phy::Device - 接口层:使用单个全局
InterfaceWrapper管理唯一网络接口eth0 - socket 层:提供同步的
TcpSocket、UdpSocket和dns_query()
这是一种典型的早期内核集成模型:单 NIC、全局状态、围绕一个 smoltcp::Interface 运转。
模块结构
ax-net 的主要实现集中在 smoltcp_impl:
| 模块 | 作用 |
|---|---|
mod.rs | 全局接口、SocketSet、设备适配、轮询主线 |
tcp.rs | TCP socket 的同步封装、连接、监听、接受 |
udp.rs | UDP socket 的绑定、连接、收发与轮询 |
dns.rs | 基于 smoltcp::socket::dns 的同步 DNS 查询 |
listen_table.rs | TCP 监听队列表,在首个 SYN 到来时预创建 socket |
bench.rs | 原始帧发送/接收吞吐基准入口 |
addr.rs | 地址类型辅助 |
1.3 初始化模型与全局对象
src/lib.rs 暴露的入口非常少,但已经把整个设计说透了:
init_network(net_devs):从设备容器里取第一个 NIC 作为eth0poll_interfaces():推动底层smoltcp协议栈前进TcpSocket/UdpSocket/dns_query():供上层实际使用bench_transmit()/bench_receive():导出带宽基准路径
内部关键全局对象包括:
ETH0:唯一网络接口SOCKET_SET:全局smoltcp::SocketSetLISTEN_TABLE:监听端口到 SYN 队列的映射
这组对象共同说明:ax-net 不是多实例、按命名空间拆分的服务,而是一个单体式全局网络模块。
1.4 设备与接口模型
smoltcp_impl/mod.rs 中的 DeviceWrapper 直接把 AxNetDevice 适配给 smoltcp,并把介质类型固定为 Medium::Ethernet。这意味着:
smoltcp直接面对以太网设备,不经过更高一级的路由器抽象- 发包、收包、tx/rx buffer 回收都由驱动对象承担
- 接口地址和默认网关依赖
AX_IP/AX_GW环境变量 - 默认 DNS 服务器写死为
8.8.8.8
这一模型足够简单,也正因此不承担多设备转发、loopback 独立建模或更复杂的路由策略。
1.5 TCP 监听队列的特别设计
listen_table.rs 与 RxToken::preprocess() 组合出 ax-net 最有代表性的实现细节:当底层收到首个 TCP SYN 时,snoop_tcp_packet() 会提前在 SocketSet 中创建一个监听对应的新 socket,并把 handle 塞入端 口对应的 SYN 队列。等上层 accept() 时,再从队列中取出已经建立连接的 handle。
这不是额外的协议实现,而是为了在保持同步 accept() 语义的同时,适配 smoltcp 原生 socket 集合工作方式。
1.6 与 ax-net-ng 的代际差异
| 维度 | ax-net | ax-net-ng |
|---|---|---|
| 总体定位 | 第一代同步 IP 网络模块 | 第二代统一 socket 服务层 |
| 地址族 | IP/TCP/UDP/DNS | IP + Unix domain + vsock |
| 设备视图 | smoltcp 直接面对 Ethernet 设备 | Router/Device 先做路由、loopback、ARP,再把 IP 包交给 smoltcp |
| readiness 语义 | ax_io::PollState | axpoll::IoEvents |
| 等待方式 | 轮询接口并 yield_now() | poll_io + waker + timeout |
| 主要消费者 | ax-api、ax-posix-api、老一代 ArceOS 路径 | ax-runtime net-ng 与 StarryOS 主 socket 层 |
所以,ax-net 不是“ax-net-ng 的轻量别名”,而是更早一代、边界更窄的 IP 网络封装。