配置参考
ax-net 的配置由结构化 NetworkConfig、Cargo feature、运行时设备注册参数和一组集中常量组成。配置目标是明确表达每个接口的意图,避免旧式单网口全局变量和隐式 eth0 假设。
核心源码:
| 配置域 | 源码 |
|---|---|
| feature | Cargo.toml |
| 接口配置模型 | config.rs |
| 初始化解析与校验 | lib.rs init_network() |
| 缓冲区/队列常量 | consts.rs |
| TCP keepalive / TCP_INFO 默认值 | tcp.rs |
| DHCP/DNS 默认值 | lib.rs, service.rs |
| Ethernet ARP 默认值 | device/ethernet.rs |
这些源码锚点分别拥有编译 feature、启动输入、运行期常量和协议默认值,配置变更应在对应所有者处完成。跨越多行的调整还需要验证 init_network() 如何把输入转换为控制面和设备运行时,而不是只修改文档中的示例值。
1. 构建配置
构建配置决定是否启用可选协议族。基础 TCP、UDP、raw、Unix domain socket、DNS、DHCP 和 Ethernet 能力不需要额外 feature。
1.1 Cargo Feature
Cargo feature 决定哪些 transport 和集成适配会进入编译结果,并直接影响 ax-net 的依赖边界。维护 feature 组合时需要同时核对 Cargo.toml、条件编译模块和上层 runtime,因为启用一个协议后端并不自动提供对应平台设备或 syscall ABI。
[features]
host-test = ["ax-hal/host-test", "axpoll/host-test", "ax-sync/host-test", "ax-task/host-test"]
vsock = ["dep:rdif-vsock"]
feature 声明只控制编译依赖与条件模块,实际对外能力还取决于 runtime 是否提供相应设备和初始化调用。下表进一步说明每个 feature 在测试或产品构建中的作用范围,避免把 host-test 带入 bare-metal 配置,或在没有 vsock 设 备时假定后端可用。
| feature | 作用 |
|---|---|
host-test | 在宿主机启用 ArceOS 调度、同步和 poll 测试后端,并开放 tests/std.rs 集成测试;不用于 bare-metal 产品构建 |
vsock | 启用 rdif-vsock 依赖、AF_VSOCK socket backend 和 vsock device 初始化 |
启用 vsock 后导出:
init_vsock(vsock_inputs, registrar, active_cpus)。vsock模块。Socket::Vsock变体。VsockDevice/VsockDeviceInput/VsockDeviceList和VsockRuntimeError。
VsockDeviceInput 必须包含已解析 IrqId 以及 driver 一次性转移的
VsockIrqEndpoints。feature 只决定编译能力,不允许无 IRQ 或 periodic poll 模式。
导出项列表说明 vsock feature 同时改变初始化 API 和 Socket 枚举,因此上层必须在
相同条件下编译调用代码。smoltcp feature 属于 IP 协议核心的固定能力,和这个可选
transport 边界分开维护。
1.2 smoltcp 能力
ax-net 固定启用的 smoltcp feature 决定协议核心能够编译哪些 socket 与介质能力,但不代表外围设备和 Linux ABI 已完整接入。维护这组能力时需要同时检查 Service、Router 和具体 backend,下面列出的 feature 才是当前构建实际依赖的集合。
alloclogasyncmedium-ethernetmedium-ipproto-ipv4proto-ipv6packetmeta-id(携带 RX 侧 ingress 元数据,供rx_meta模块传递接收侧 QoS)socket-rawsocket-icmpsocket-udpsocket-tcpsocket-dhcpv4socket-dnsauto-icmp-echo-replyiface-max-addr-count-8(允许Interface同时保存最多 8 个 IP 地址,支撑 loopback + 多 Ethernet 静态地址)
此外 Cargo.toml 中注释保留了 fragmentation-buffer-size / reassembly-buffer-size 等分片/重组能力,但当前未启用。
Router 对 smoltcp 暴露 Medium::Ip,Ethernet frame 处理在 EthernetDevice 中完成。
2. 启动配置模型
启动配置通过 NetworkConfig 传入 init_network()。它描述“哪些设备应该成为哪些接口,以及接口如何获得 IPv4/DNS/metric”。
2.1 网络配置
NetworkConfig 是启动阶段的顶层输入,按接口顺序或匹配规则组织静态地址、DHCP、metric 与 DNS 来源。init_network() 会先校验这一结构再构造全局控制面,因此错误配置必须在发 布 SERVICE 前失败,不能留给 queue executor 运行时猜测。
#[derive(Debug, Clone, Default)]
pub struct NetworkConfig {
pub interfaces: Vec<InterfaceConfig>,
pub default_dns_servers: Vec<Ipv4Addr>,
}
语义:
interfaces是显式接口配置列表。- 未显式匹配的 Ethernet 设备按默认策略注册。
default_dns_servers是 fallback DNS 来源,metric 为u32::MAX。lo固定由ax-net创建,不出现在NetworkConfig中。
顶层配置列表定义全局 fallback 和接口集合,单接口的名字、匹配与地址策略由 InterfaceConfig 进一步收敛。这样全局默认不会覆盖已经明确配置的设备角色。
2.2 接口配置
InterfaceConfig 描述单个发现设备应采用的名字、匹配条件和 IPv4 策略,并把路由优先级与 DNS 来源绑定到同一接口。该结构用于产生 NetInterface 和 RouteTable 初始规则,字段默认值变化会直接改变多网卡启动行为。
#[derive(Debug, Clone)]
pub struct InterfaceConfig {
pub name: String,
pub match_by: InterfaceMatcher,
pub static_ip: Option<StaticIpConfig>,
pub dhcp: bool,
pub metric: u32,
pub dns_servers: Vec<Ipv4Addr>,
}
字段语义:
| 字段 | 语义 |
|---|---|
name | 对外接口名,例如 eth0、uplink0 |
match_by | 将配置绑定到某个探测到的 Ethernet driver |
static_ip | 静态 IPv4 配置;与 dhcp 互斥 |
dhcp | 是否启用 DHCP client |
metric | 接口路由和接口级 DNS 优先级,值越小越优先 |
dns_servers | 绑定到该接口的静态 DNS server |
字段表说明 InterfaceConfig 把身份匹配、地址策略和路由偏好作为一个接口角色维护。下一节的 InterfaceMatcher 只负责找到设备,不应承载 IP 或 DNS fallback 等配置语义。
2.3 接口匹配
InterfaceMatcher 决定一项接口配置如何关联到实际 driver,可使用发现顺序、MAC 或驱动名等稳定属性。匹配结果必须唯一且可诊断,否则同一配置可能被多个设备消费,或设备落入默认 DHCP 策略而掩盖部署错误。
#[derive(Debug, Clone)]
pub enum InterfaceMatcher {
ByOrder(usize),
ByMac(EthernetAddress),
ByDriverName(String),
}
匹配规则:
ByOrder(0)匹配第一个发现的 Ethernet device。ByMac(mac)按 MAC 地址匹配。ByDriverName(name)按 driver 暴露的设备名匹配。- 同一设备不能被多个配置匹配。
- 每个显式配置必须匹配到一个设备。
匹配规则只回答“配置属于哪个设备”,其优先级和唯一性在初始化校验中确定。设备匹配成功后,静态地址结构才决定本地 CIDR、gateway 和 DNS 等网络属 性。
ByOrder 使用候选 Ethernet device 的原始发现顺序,不因 owner startup 剔除
不适用设备而重新编号。例如,原始 0 号设备缺失、1 号设备可用时,ByOrder(1)
仍匹配原始 1 号设备,ByOrder(0) 不会转而匹配它。init_network() 通过
NetworkQueueRuntime::discovery_order() 恢复该顺序;运行时句柄和普通接口缺省
名称使用发布端口列表的紧凑索引。
显式配置指向被剔除的设备时,仍会触发 ensure_all_interface_configs_used() 的
未匹配配置检查。安全跳过候选设备不等于自动忽略其配置;需要允许该设备缺失的
调用方不应同时提供必须匹配它的显式配置。
2.4 静态地址配置
StaticIpConfig 把 CIDR、可选 gateway 和 DNS server 作为一个完整静态网络角色提交。Router::ipv4_rules() 根据这些字段生成 connected/default route,因而 prefix、gateway 和本地地址必须在初始化校验阶段保持同一子网语义。
#[derive(Debug, Clone)]
pub struct StaticIpConfig {
pub ip: Ipv4Addr,
pub prefix_len: u8,
pub gateway: Ipv4Addr,
}
静态接口初始化会:
- 将
ip/prefix_len加入 smoltcpInterfaceaddress list。 - 安装直连路由。
- 如果
gateway != 0.0.0.0,安装默认路 由。 - 将
dns_servers记录为DnsSource::Static。
gateway = 0.0.0.0 表示不安装默认路由。
3. 初始化校验
init_network() 对配置执行 fail-fast 校验。启动阶段配置错误直接 panic,避免系统在半初始化网络状态下运行。
3.1 校验规则
初始化校验用于在后台 Worker 启动前拒绝歧义配置,覆盖接口匹配、地址前缀、重复名字和静态路由等约束。下表把输入字段与失败条件对应起来,维护 NetworkConfig::validate() 时应让错误信息保留具体接口和冲突来源。
| 配置项 | 规则 |
|---|---|
| 接口名 | 不能是 lo,不能重复 |
static_ip + dhcp | 不能同时启用 |
| 静态 IP | 不能是 0.0.0.0 |
| prefix | 不能大于 32 |
| gateway | 可以是 0.0.0.0,表示无默认路由 |
| DNS server | 不能是 0.0.0.0 |
| matcher | 每个显式配置必须匹配唯一设备 |
校验表中的规则都在全局状态发布前执行,因此失败不会留下部分接口或后台 Worker。通过校验后,未命中显式配置的设备才会进入下一节描述的统一默认策略。
3.2 默认策略
未显式匹配 InterfaceConfig 的 Ethernet 设备会落入确定的默认策略,而不是被忽略或猜测静态地址。该策略由初始化配置逻辑统一生成,保证新增普通 NIC 至少能以 DHCP 角色进入接口 registry,并具有可预测的名字和 metric。
- 名称为
eth{order};Wi-Fi 能力设备例外,改用驱动注册名(例如wlan0)。 InterfaceId = order + 2。- metric 为
100。 - 未显式配置时,普通 Ethernet 默认启用 DHCP;带 startup link policy 的 Wi-Fi 设备使用该策略的静态地址(SoftAP 场景不启用 DHCP client)。
- 无静态接口级 DNS。
loopback:
- 名称为
lo。 InterfaceId::LOOPBACK == 1。- 地址为
127.0.0.1/8。 - metric 为
0。 - flags 包含
UP | RUNNING | LOOPBACK。
默认策略确保未配置 NIC 仍能进入控制面,但不会凭空提供 fallback DNS 或静态 gateway。DNS 配置必须保留来源和 metric,才能与这些 DHCP 接口的动态 server 正确合并。
4. DNS 配置
DNS server registry 同时接收静态接口配置、DHCP lease 和 fallback 来源,并保留来源接口与 metric。NetControl::dns_servers() 会按路由优先级排序后去重,因此解析顺序与多网卡出口策略一致,而不是简单按配置出现顺序覆盖。
| 来源 |
|---|