4. 网络接口配置与初始化

在 VxWorks 中,网络接口的配置与初始化是设备联网的第一步。与 Linux 不同,VxWorks 的网络接口管理由内核网络协议栈和底层 END(Enhanced Network Driver)驱动共同完成,配置手段既可以通过命令行交互完成,也可以写入启动脚本实现上电自动配置。本节围绕 ifconfig 命令、网络地址设置、接口状态管理、多网卡配置以及启动脚本编写五个方面展开,帮助读者建立从“手动调试”到“自动部署”的完整能力。

一、ifconfig 命令的基本用法

VxWorks 提供的 ifconfig 命令用于查看和修改网络接口参数,其语法与 BSD 系统类似。常用形式如下:

ifconfig "ifname" [address [mask]]
ifconfig "ifname" up|down
ifconfig "ifname" netmask "mask"
ifconfig "ifname" hw ether "mac"

其中 ifname 是接口名,例如 gei0、fei0、motetsec0 等,具体名称取决于驱动注册时使用的字符串。执行 ifconfig 不带参数时,会列出当前所有已注册接口的状态、IP 地址、子网掩码、MAC 地址和收发统计信息。例如:

-> ifconfig
gei0  Link type:ETHERNET  Link speed:1000 Mbps
      inet addr:192.168.1.10  Bcast:192.168.1.255  Mask:255.255.255.0
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:0 errors:0 dropped:0
      TX packets:0 errors:0 dropped:0

从输出中可以判断接口是否已 UP、地址是否已生效、链路速率是否协商成功。若接口未注册,则不会出现在列表中,此时需要先确认驱动是否已加载。

二、网络地址设置

设置 IP 地址最直接的方式是:

ifconfig "gei0" 192.168.1.10 netmask 255.255.255.0 up

该命令一次性完成地址、掩码和接口启用。需要注意,VxWorks 的 ifconfig 不会自动添加默认路由,若需要访问其他网段,还需执行:

route add "0.0.0.0" "192.168.1.1"

此外,VxWorks 还提供 ifAddrSet()、ifMaskSet() 等 C 函数接口,可在应用程序中动态设置地址。例如:

ifAddrSet("gei0", "192.168.1.10");
ifMaskSet("gei0", "255.255.255.0");

这些函数适合在启动脚本或初始化代码中调用,便于参数化配置。

三、接口状态管理

接口状态主要包括 UP、DOWN、RUNNING 和 STOPPED。使用 ifconfig "gei0" down 可以关闭接口,ifconfig "gei0" up 则重新启用。关闭接口会停止收发数据,但不会清除已配置的 IP 地址。若需要彻底复位,可先 down 再重新设置地址。

在调试阶段,常通过 ifconfig 观察 RX/TX errors 和 dropped 计数。若 errors 持续增长,通常说明链路质量差、双工不匹配或驱动异常;若 dropped 增长,则可能是缓冲区不足或中断处理不及时。这些计数是判断接口健康状态的重要依据。

四、多网卡配置

许多 VxWorks 设备具备多个以太网口,例如 gei0 和 gei1。多网卡配置的关键是:每个接口必须位于不同子网,否则路由表会出现冲突。典型配置如下:

ifconfig "gei0" 192.168.1.10 netmask 255.255.255.0 up
ifconfig "gei1" 10.0.0.10 netmask 255.255.255.0 up
route add "0.0.0.0" "192.168.1.1"

此时 gei0 作为管理口,gei1 作为数据口。若两个接口需要同时工作,应确保驱动已正确注册,且中断号、DMA 通道不冲突。可通过 ifconfig 分别查看两个接口的统计信息,确认各自独立收发。

VxWorks 多网卡配置与启动脚本初始化流程 启动脚本 (startup.c / usrConfig.c) 1. 加载 END 驱动 2. ifconfig "gei0" 192.168.1.10 3. ifconfig "gei1" 10.0.0.10 4. route add 默认网关 5. 启动应用任务 上电自动执行,无需人工干预 VxWorks 网络协议栈 IP / ARP / ICMP MUX / END 接口层 路由表 / 接口表 gei0 — 管理口 IP: 192.168.1.10/24 状态: UP RUNNING gei1 — 数据口 IP: 10.0.0.10/24 状态: UP RUNNING 接口状态管理与调试判断 UP 接口启用,可收发 DOWN 接口关闭,停止收发 RUNNING 链路已建立 STOPPED 驱动已加载未启动 错误计数 RX/TX errors down up 链路断开 异常 提示:多网卡必须位于不同子网,默认路由只能有一条,否则路由表冲突

五、启动脚本编写

VxWorks 的启动脚本通常位于 usrConfig.c 或独立的 startup.c 中,由 usrInit 调用。一个典型的多网卡初始化片段如下:

/* 加载驱动 */
gei0Init();
gei1Init();

/* 配置接口 */
ifAddrSet("gei0", "192.168.1.10");
ifMaskSet("gei0", "255.255.255.0");
ifAddrSet("gei1", "10.0.0.10");
ifMaskSet("gei1", "255.255.255.0");

/* 启用接口 */
ifconfig("gei0 up");
ifconfig("gei1 up");

/* 添加默认路由 */
routeAdd("0.0.0.0", "192.168.1.1");

编写启动脚本时需注意三点:第一,驱动初始化必须在 ifAddrSet 之前完成,否则接口不存在;第二,ifconfig up 应在地址设置之后执行,确保地址生效;第三,默认路由只能添加一条,若存在多条默认路由,后添加的会覆盖先前的。若需要策略路由,应使用 routeAdd 指定目标网段而非默认路由。

调试建议:在启动脚本中加入 ifconfig 打印语句,可在串口日志中直接观察每个接口的最终状态。若接口未出现,优先检查驱动注册函数是否被调用、PCI 枚举是否成功、中断向量是否冲突。
常见问题:多网卡场景下,若两个接口配置了相同子网,VxWorks 会拒绝第二条地址设置并返回错误。此时应检查子网划分,确保每个接口的网段互不重叠。

综上,VxWorks 网络接口配置的核心在于“先驱动、后地址、再启用、最后路由”的顺序。掌握 ifconfig 的交互调试能力,再将其固化为启动脚本,即可实现设备上电后的自动联网,为后续的 socket 通信、协议栈应用和远程管理打下基础。