网络栈概览
TGOSKits 的网络能力收敛在 net/ax-net。ArceOS 和 StarryOS 直接复用这一实现;Axvisor 仅在启用依赖 ax-std/net 的管理服务功能时通过 ArceOS 间接使用。它向上提供 TCP、UDP、raw/ICMP socket、Unix domain socket、可选 vsock、DNS、DHCP、ARP、接口查询、网卡统计和 readiness/poll 能力,向下通过 EthernetDriver 能力边界适配真实网卡;当前标准实现是基于 rd-net 的 RdNetDriver。
1. 源码边界
源码位于 net/ax-net/src/,入口 lib.rs。Socket backend 包括 IP 类(tcp.rs、udp.rs、raw.rs,基于 smoltcp)、unix/(自包含 stream/dgram,不经 smoltcp)和可选的 vsock/(基于 rdif-vsock 驱动,含 connection manager 与 ring buffer)。
| 模块 | 角色 | 关键类型 |
|---|---|---|
lib.rs | public facade,初始化网络、启动 poll worker、导出 API | init_network, request_poll, net_poll_worker |
config.rs | 配置与接口信息类型 | InterfaceId, NetworkConfig, InterfaceInfo, DeviceBinding |
service.rs | 控制面 + 协议核心调度 | Service, NetControl, DhcpState |
router.rs | 路由表、有界队列、RX 元数据、网卡统计、smoltcp Device 适配 | Router, RouteTable, RxMetadata, NetDevStats |
wrapper.rs | 全局 SocketSet 包装与端口冲突仲裁 | SocketSetWrapper |
socket.rs | 统一 socket 抽象 | SocketOps, Socket, SocketAddrEx |
addr.rs | 共享地址 helper:临时端口分配(0xc000–0xffff)、listen 地址冲突判定 | allocate_ephemeral_port, listen_addrs_conflict |
ip_tos.rs | per-socket egress IP_TOS/traffic-class:smoltcp 不暴露 TOS 设置,在 Router 边界改写发出的 IP 包头 | EgressIpTosKey |
rx_meta.rs | 利用 smoltcp PacketMeta id 携带接收侧 QoS 元数据,供 recvmsg cmsg 上报 | ReceivedTrafficClass |
options.rs | socket 选项与 Configurable trait | GetSocketOption, SetSocketOption, TcpInfo |
general.rs | 通用 socket 选项、非阻塞/超时/poll helper | GeneralOptions |
state.rs | socket 状态机锁 | StateLock, StateGuard |
listen_table.rs | TCP listen/accept 表与 SYN 预创建 | ListenTable |
tcp.rs / udp.rs / raw.rs | IP socket 实现 | TcpSocket, UdpSocket, RawSocket |
orphan.rs | TCP orphan socket 回收(RFC 793 TIME_WAIT) | add_orphan, reap_orphans |
dhcp_server.rs | 最简 DHCP 服务器(SoftAP 模式) | DhcpServer |
unix/ | Unix domain socket | UnixSocket, Transport |
vsock/ | 可选 vsock 支持(vsock feature) | VsockSocket, VsockStreamTransport |
device/ | loopback、Ethernet、rd-net、vsock 设备适配 | Device, EthernetDevice, RdNetDriver |
consts.rs | 缓冲区大小等常量 | STANDARD_MTU, SOCKET_BUFFER_SIZE |
源码边界表显示核心状态集中在 ax-net,而 runtime 与 StarryOS 只承担设备接入和 ABI 适配。能力矩阵将基于这些真实所有者区分主路径与限制,避免从依赖名称推断尚未接入的功能。
2. 能力矩阵
能力矩阵区分当前主路径、受限能力和仅由特定 transport 提供的功能,避免把 smoltcp 编译 feature 等同于完整 OS 支持。每一项都对应 Service、具体 socket backend、设备层或 StarryOS ABI 的代码锚点,扩展能力时应同步更新实现状态和限制说明。
| 能力 | 实现方式 | 状态 |
|---|---|---|
| TCP | smoltcp socket::tcp,含 keep-alive、Nagle、保守的 TCP_INFO、SYN pre-create | 主路径可用 |
| UDP | smoltcp socket::udp,含 MSG_MORE corking、SO_REUSEPORT 共同绑定和 close 前 egress flush | 主路径可用 |
| Raw IP/ICMP | smoltcp socket::raw,含 IPv4 ping datagram 和 loopback ICMP echo reply 模拟 | 主路径可用 |
| Unix domain stream | 自包含,ringbuf 双向通道 + cmsg 管道 + peer credentials | 完整 |
| Unix domain datagram / seqpacket | 自包含,async_channel 无界消息队列 + cloneable cmsg + SO_PASSCRED/SO_TIMESTAMP | 主路径可用 |
| Vsock stream | rdif-vsock 驱动 + connection manager + ring buffer stream | 需要 vsock feature |
| DHCPv4 client | 内核态 DhcpState 状态机,per-interface,启动阻塞等待 | 基础完成 |
| DNS resolver | smoltcp socket::dns,自动过滤不可路由 server,5s 超时 | 完整 |
| ARP | EthernetDevice 内部 neighbors: HashMap(已解析条目, 300s TTL)+ pending_neighbors: HashMap(等待 ARP reply 条目, 1s 重试) + pending_packets: PacketBuffer(暂存待 ARP 解析后发送的包) | 完整 |
| 多 NIC 路由 | RouteTable 最长前缀匹配 + metric 排序 + per-interface 替换 | 完整 |
| IRQ 感知 | EthernetIrqRegistrar + EthernetIrqAction + IRQ→wake 转换 | 完整 |
| Loopback | 零状态 LoopbackDevice + Router::dispatch() 快速路径 inline 注入 rx_buffer,不经设备 worker 和队列分配 | 完整 |
| TCP orphan 回收 | orphan.rs:Drop 后保留 smoltcp socket 直到 FIN/TIME_WAIT 完成,RFC 793 合规 | 完整 |
| DHCP 服务器(SoftAP) | dhcp_server.rs:最简单的单客户端 DHCP 服务器,仅支持 Discover→Offer、Request→Ack 交换,不维护租约数据库、不做冲突检测,仅回复配置接口收到的 DHCP 包 | 基础完成 |
| OOB RX(SDIO Wi-Fi) | EthernetDevice::new_oob_rx() + wake_net_task_irq() + 现有 net-poll/设备 RX worker 唤醒链路 | 完整 |
| 动态设备注册 | register_device_with_config() 运行时添加静态 IP 设备(Wi-Fi AP) | 完整 |
| Wi-Fi STA/AP 重配 | register_wifi_control() 保存无线控制面句柄,reconfigure_wifi() 原子切换 STA DHCP 或 SoftAP 静态地址/DHCP server | 基础完成 |
| QoS/TOS 兼容 | IP_TOS 发包时在 Router 边界改写 IP header;IP_RECVTOS/IPV6_RECVTCLASS 通过 smoltcp PacketMeta 返回 cmsg;SO_PRIORITY 仅保存兼容值 | 基础完成 |
| 运行期 IPv4 地址 | set_interface_ipv4() / remove_interface_ipv4() 原子更新接口、connected route 和 DHCP 状态 | 每接口仅一个 IPv4,无运行期 gateway 参数 |
| 网卡统计 | NetDevStats 汇总 L2 包/字节、错误和丢包,供 StarryOS /proc/net/dev 使用 | 累计统计,不含硬件专属计数器 |
矩阵中的“支持”意味着存在可用实现路径,“受限”则需要结合后文章节理解范围。设计原则说明这些取舍为何围绕单协议核心、多设备 Router 和有界资源展开。
3. 设计原则
ax-net 的设计原则围绕单协议核心、多设备适配和明确所有权展开,目标是在保留普通多宿主 socket 语义的同时隔离可能阻塞的设备 I/O。以下原则分别落实到 Service、Router、NetControl、有界队列和 PollOwnership,是评审结构变更时的基本约束。
- 单协议栈语义优先:所有 TCP/UDP/raw socket 共享一个 smoltcp
Interface和SocketSet,端口冲突、listen 聚合、wildcard bind 等语义自然正确。 - 控制面与数据面分离:接口查询(
interfaces()、interface_by_name())走只读NetControl,不进入设备锁或 smoltcp poll。 - 异步 poll 解耦热路径:普通 socket 操作只调用轻量
request_poll()唤醒 worker;UDP 析构为保证“send 后立即 close”不丢最后一个 datagram,会通过flush_egress()等待协议核心所有权并同步排空。 - 能力边界隔离:
ax-net通过EthernetDrivertrait 对接网卡驱动,不直接依赖 FDT、PCI、MMIO、DMA 或平台 IRQ ABI。 - Linux ABI 友好:
InterfaceId直接映射 Linux ifindex,DeviceBinding对应SO_BINDTODEVICE,socket option 覆盖主流getsockopt/setsockopt语义。
原则列表把状态所有权、队列和轮询请求放在同一个设计框架中,任何局部优化都不能破坏这些边界。线程锁模型进一步说明哪些部分实际并行,哪些部分仍必须串行推进。