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