第二章 网络接口配置:从物理层到链路层的实战

好,咱们进入第二章。网络接口配置,说白了就是让VxWorks知道「用哪块网卡、怎么用」。我刚开始接触VxWorks网络栈时,觉得这步很简单——不就是配个IP地址嘛。结果第一次在嵌入式设备上调试,网口死活不通,折腾了两天才发现是接口类型选错了。嗯,从那以后我再也不敢小看这章内容了。

2.1 网络接口类型:你面对的是哪种网卡?

VxWorks支持的网络接口类型,其实就三大类。我按实际项目中遇到的频率排个序:

  • END (Enhanced Network Driver):这是最常用的。说白了就是标准以太网控制器,比如Intel的I210、Broadcom的BCM57xx。我做过的一个电力网关项目,用的就是END驱动。
  • VxBus + END:VxWorks 6.x以后的主流方式。设备树自动枚举,驱动加载更智能。我个人习惯在新项目里优先用这个。
  • MUX (Multiplexer) 接口:这玩意儿比较特殊。它是在END之上再抽象一层,支持虚拟接口、VLAN等。你想想看,一个物理网口要拆成多个逻辑接口,就得靠MUX。

怎么判断当前系统支持哪些接口?我一般用这个命令:

-> iShow

它会列出所有已加载的驱动。如果看到"end"字样的设备,那就是END接口。我曾经在一个老项目里发现驱动没加载,折腾半天,结果就是BSP配置里少了个宏定义。

我的小技巧: 新项目建议直接用VxBus方式。虽然学习曲线陡一点,但后期维护省心太多。我踩过的坑,不想你再踩一遍。

2.2 ifconfig命令详解:不只是配个IP

很多人以为ifconfig就是配IP地址的。其实它的功能远不止这些。我把它拆成三个层次来讲:

2.2.1 基础用法:查看接口状态

-> ifconfig
gei0: flags=0x1008863<UP,BROADCAST,NOTRAILERS,RUNNING,SIMPLEX,MULTICAST>
      mtu 1500
      inet 192.168.1.100 netmask 0xffffff00 broadcast 192.168.1.255
      ether 00:30:48:12:34:56

这里有个细节:flags字段。我见过不少工程师只看IP地址,忽略了接口状态。如果UPRUNNING没同时出现,那接口就是有问题的。有一次现场反馈网口不通,我远程一看,flags里只有UP没有RUNNING——物理层没起来,网线松了。

2.2.2 配置参数:不只是IP

ifconfig能配的参数,我列个表:

参数 作用 我踩过的坑
inet IP地址 注意字节序,VxWorks用网络字节序
netmask 子网掩码 十六进制格式,0xffffff00别写错
mtu 最大传输单元 默认1500,但有些工业协议要求改小
ether MAC地址 可以改,但别乱改,会冲突

举个例子,配一个静态IP:

-> ifconfig gei0 inet 192.168.1.100 netmask 0xffffff00

配完记得检查:

-> ifconfig gei0
注意: 我曾经在生产环境上直接敲ifconfig改IP,结果网络瞬间断了。因为VxWorks不像Linux那样有网络管理守护进程。改配置前,最好先确认当前网络负载不大。

2.3 网络接口参数配置:那些容易被忽略的细节

除了IP地址,还有几个参数我建议你重点关注:

2.3.1 MTU:别小看这个值

MTU默认1500字节。但有些场景需要改:

  • 工业以太网:比如Profinet,要求MTU不能超过1500,但有些设备只支持1024。我遇到过因为MTU不匹配导致丢包的情况。
  • VPN隧道:加了IPSec头部后,实际载荷会变小。不改MTU会导致分片,性能下降。

改MTU的命令:

-> ifconfig gei0 mtu 1400

2.3.2 混杂模式:抓包必备

调试网络问题时,我经常用混杂模式:

-> ifconfig gei0 promisc

这样网卡会接收所有经过的数据包,不管目标MAC是不是自己。配合tcpdump或Wireshark,基本能定位90%的网络问题。

避坑指南: 我曾经在客户现场开了混杂模式忘了关,结果CPU负载飙升。因为所有无关包都进了协议栈。记得调试完马上关掉:ifconfig gei0 -promisc

2.4 链路聚合配置:从单链路到高可用

链路聚合,说白了就是把多个物理网口绑成一个逻辑口。好处有两个:带宽叠加、冗余备份。我在一个轨道交通项目里用过,要求网络7x24小时不中断。

2.4.1 聚合模式选择

VxWorks支持两种模式:

  • Active-Backup(主备模式):一个口工作,另一个口待命。切换时间大约1-2秒。我建议对实时性要求不高的场景用这个。
  • Load Balance(负载均衡):两个口同时收发。但要注意,VxWorks的负载均衡是基于源MAC+目的MAC的哈希,不是简单的轮询。

2.4.2 配置步骤

假设你有两个物理口gei0和gei1,要绑成lag0:

-> muxBind "lag0", "gei0"
-> muxBind "lag0", "gei1"
-> ifconfig lag0 inet 192.168.1.100 netmask 0xffffff00

这里有个关键点:muxBind的顺序决定了主备模式下的主口。第一个绑定的就是主口。我曾经因为顺序搞反,导致主备切换后性能下降。

2.4.3 验证聚合状态

-> muxShow

这个命令会显示每个聚合口的成员状态。如果某个成员显示DOWN,说明链路断了。我一般会写个脚本定期检查,一旦发现成员异常就告警。

重要提醒: 链路聚合要求交换机也做相应配置。如果交换机没配LACP或静态聚合,那VxWorks这边配了也没用。我见过最坑的一次,现场工程师只配了设备端,交换机没动,结果网络时通时断。

2.5 实战经验总结

最后,我把自己这些年积累的几个要点列出来:

  1. 先确认物理层:配任何网络参数前,先看网口灯亮不亮。灯不亮,配什么都没用。
  2. 配置要持久化:VxWorks的ifconfig配置默认只存在内存里,重启就丢了。记得写到启动脚本或配置文件中。
  3. 调试用最小配置:遇到网络问题,先把所有聚合、VLAN去掉,用最简配置测试。我80%的问题都是这样定位的。
  4. 日志要打开:在BSP配置里打开网络驱动的调试日志。很多问题看日志就能找到原因,不用抓包。

嗯,这章内容就到这里。网络接口配置看似基础,但恰恰是很多问题的根源。下一章我们讲IP层配置,到时候会涉及路由、多网卡等更复杂的内容。记得把今天的内容练熟,后面用得上。