文/黄腾 郑凯 姜孝伟
在TCP/IP世界中,以太网IP数据报的封装是在RFC 894[Hornig 1984]中定义的。前面12个字节是硬件地址(即MAC地址)。
对MAC地址的提取是IP隧道的关键技术。在Windows操作系统中,可以通过绑定底层适配器来提取服务端和客户端的MAC地址。但是,在VxWorks嵌入式实时操作系统中,没有相应的底层适配器应用函数。通过钩子函数可以钩取MAC地址,但钩子函数本身属于黑客机制,具有一定的风险。
本文通过开发SENS中的MUX层,对网卡底层原始数据进行提取,从而获取服务端与客户端的MAC地址,实现IP隧道技术。
SENS独立于硬件设备接口,由协议驱动程序、多元接口MUX层和END网络驱动程序组成。
协议驱动程序负责与上层网络传输协议交互。增强型网络驱动END(Enhanced Network Driver)是一个数据链路层驱动程序,它通过MUX层与网络协议层通信。MUX层作为数据链路层和网络协议层之间的接口,用于管理网络协议接口和底层硬件之间的交互,将硬件从网络协议的细节中隔离出来。它是为减弱数据链路层与网络协议层之间的耦合性、提升网络驱动程序与协议的通信效率而专门增加的一层协议。
VxWorks网络协议栈传输数据使用的内存,是在VxWorks操作系统启动进行网络协议初始化时申请的。VxWorks操作系统提供NetBufLib建立内存节点池,网络协议栈传输数据所需的内存都在这些内存节点池中申请,使用完毕后释放。
表1:IP隧道业务报文结构
表2:IP隧道应用软件抓取的MAC地址
NetBufLib使用三种数据结构处理网络协议栈传输的数据:mBlk、clBlk和cluster。其中,cluster保存的是实际的数据,mBlk和clBlk保存的是指向数据的指针,用于管理cluster中保存的数据。
在基于END驱动的VxWorks中,网络协议通过MUX接口与数据链路层进行通信,所有与网络接口相关的业务都在数据链路层驱动中处理,如数据的发送和接收。
在网卡之间搭建IP隧道,对每一个发送的IP报文封装IP隧道报头,对每一个接收的IP报文拆解IP隧道报头。业务报文结构如表1。
本文试验使用计算机和开发板搭建IP隧道。
试验准备阶段,在计算机上安装“业务模拟与分析系统”终端软件和UDP数据终端软件,用于和开发板之间进行数据包的收发。在开发板PPC上加载并运行IP隧道应用软件。
开机后,计算机和开发板网卡间会进行数据交互,IP隧道应用软件接收端会抓取开发板网卡收到的最原始数据。提取数据的前12个字节,开发板MAC地址在前(目的MAC地址),计算机MAC地址在后(源MAC地址)。试验数据如表2。
获取MAC地址后,在发送端封装IP隧道报头,处理时要把上述目的MAC和源MAC对调。
IP隧道应用软件接收来自“业务模拟与分析系统”终端软件的数据并通过UDP转发给UDP数据终端软件;同时,它通过UDP接收来自UDP数据终端软件的数据并转发给“业务模拟与分析系统”终端软件,从而形成测试回路。
我们进行了10000次开机试验,试验数据证明,本文通过开发MUX层抓取网卡底层最原始数据,对服务端与客户端MAC地址的提取成功率高达100%。同时,在“业务模拟与分析系统”终端软件中设置数据发送间隔为5ms情况下,回环测试的数据收、发丢包率为0%。试验数据表明,本文提出的通过开发MUX层实现网卡底层数据抓取的方法可以有效解决VxWorks嵌入式实时操作系统下IP隧道报文的收、发问题,从而保障无线通信。