基于ZYNQ-7000 平台无线自组网按需距离矢量路由协议实现研究
2023-11-13刘玉梅马文进
刘玉梅,马文进
哈尔滨工程大学 信息与通信工程学院,黑龙江 哈尔滨 150001
随着物联网技术的发展,嵌入式系统在基础与应用研究领域越来越重要[1]。嵌入式软件系统的主要核心部件为微型嵌入式[2]处理器,硬件系统的框架主要包括硬件处理器、硬件存储器、应用软件和硬件I/O。嵌入式系统具有强大的实时性、系统内核小、功能专用性强、软件系统功能精简等优点,因此其应用已经深入到国防、科研以及日常生活等各个领域中[3]。
无线自组网按需距离矢量路由协议(Ad hoc on-demand distance vector routing,AODV)[4]是应用于无线Ad-Hoc 网络[5]中进行路由选择的路由协议,它能够实现单播和多播,同时该协议是Ad Hoc 网络中按需生成路由方式的典型协议,目前Ad Hoc 网络中的AODV 协议的性能主要利用NS2 仿真软件在理想环境中对该协议的端对端平均时延、路由开销等性能进行评估,但是只依靠仿真无法反应在实际通信场景中环境因素对协议通信过程中的丢包率、时延等指标的影响,因此需要对AODV 协议在实际应用中的性能进行统计测试[6]。
AODV[7]路由协议有多种的实现的版本,例如 Mad-Hoc[8]、 AODV-UCSB[9]、 AODV-UU[10]、Kernel-AODV[11]和AODV-UIUC。其中,AODV-UU协议是由瑞典乌普萨拉大学(Uppsala University)联合爱立信公司发布的一种路由协议,是一种稳定且开源的协议实现[12]。
AODV-UU 源代码能够在Linux-2.6[13]以及Linux-3.8 的内核版本中实现,但与当前主流的Linux-4.0 以上的版本不能兼容。本文在ZYNQ-7 000平台下,研究了将AODV-UU 协议在嵌入式Linux-4.14 内核系统上实现的关键技术。
1 软硬件平台设计
1.1 硬件设计方案
1)PYNQ-Z2 开发板。为了方便上层应用程序在功能扩展时需要增加外围设备的需求,在开发板的选型上选择了由处理系统(processing system,PS)以及可编程逻辑(progarmmable logic,PL)共2 部分所组成的PYNQ-Z2 开发板。PYNQZ2[14]采用的是ZYNQ-7000 系列[15]的XC7Z020-1CLG400C 型号的系统级芯片(system on chip,SOC),内部异构了双核ARM Cortex-A9 CPU 以及现场可编程门阵列(field programmable gate array,FPGA),具体的实现过程中用到了PS 部分中的USB、SD 卡、UART 以及Eth0 等接口[16],PYNQZ2 处理系统结构如图1 所示。
图1 PYNQ-Z2 处理系统结构
2)USB WiFi 网卡。网卡的选型需要与所工作的内核系统相适配,由于Linux-4.14 的内核系统可通过内部驱动支持RT5370 型号网卡,所以网卡最终选型为支持Ad Hoc 模式的RT5370。
3)Micro SD 卡。SD 作为内核镜像、启动文件、根文件系统以及协议可执行文件的存放载体,因此SD 卡需要能够进行高速的数据读写并且容量最小为16 GB。
1.2 软件设计方案
方案包括了硬件电路接口设计以及Linux 系统定制化设计2 个部分。使用Xilinx 公司的Vivado 软件对硬件电路接口进行设计,Petalinux集成开发工具对Linux 系统内核、根文件系统、设备树等完成定制化设计,避免了对各部分模块的单独设计与编译。图2 为软件设计方案。
图2 软件设计方案
硬件电路接口设计中根据所需功能对PYNQZ2 开发板中的各个接口进行用户设计。设计过程中针对开发板自身特性对PS 端的相关接口进行使能连通开发板中相关电路,对PL 端接口失能减少电路中的冗余部分,图3 为最终的硬件电路设计图。
图3 ZYNQ 处理系统实现
在Linux 系统的定制化中对内核系统、根文件系统以及设备树进行用户级设计。
1)内核系统。AODV 协议在实际应用时要在无线网络的环境中利用无线网卡进行通信。因此在进行内核系统设计时要支持IEEE 802.11 网络协议栈、无线局域网以及与RT5370 网卡相关的驱动和网络适配器。
2)根文件系统。根文件系统不仅能将初始化的进程从内核态引导入用户态中,还可以存储AODV 协议在实现过程中所用到的内核镜像、启动文件、网络配置工具等需要永久保存的文件信息。操作系统默认的启动方式是虚拟的根文件系统,因此需要将根文件系统的启动位置改为由SD 卡启动。
3)工程设备树。设备树的作用是对硬件中的外设进行驱动,设计过程中需要对开发板中的USB 接口进行驱动使得能够正常地使用RT5370 网卡,驱动方式选择了利用Petalinux 中的设备树文件对USB 接口进行驱动。同一个设备树文件可根据用户需求同时驱动多个外围设备,方便日后对外设驱动的扩展以及管理。
4)项目工程编译。在软件设计完成后对整个项目进行综合编译生成image.ub 镜像文件并对uboot、fsbl 等文件进行打包生成BOOT.BIN 启动文件。
2 AODV 协议实现
AODV-UU 是在Netfilter 功能框架的基础上实现的,分为用户层与内核层2 部分。路由功能模块和转发数据包模块分别在用户层和内核层实现,用户层与内核层之间通过Netlink socket 套接字进行数据的双向交互,运行机制如图4 所示。
2.1 用户层实现
用户层中的aodvd 守护进程来实现AODVUU 协议的路由功能模块,路由功能模块根据路由协议算法计算出正确的路由后通过核心应用程序接口(application programming interface,API)来维护内核路由表。可以在保持转发功能模块不变的情况下通过修改路由功能模块来实现AODV协议。
本次实现的嵌入式平台系统为Linux-4.14,生成的aodvd 可执行文件需要在该系统中运行,因此将用户层Makefile 中内核版本的路径改为用户所需的内核源码路径,编译工具选择使用交叉编译工具,修改完成后对用户模块进行编译生成aodvd 可执行文件,修改结果如图5 所示。
图5 Makefile 修改后文件
2.2 内核层实现
内核层的作用是对数据包进行通信管理,在进行发送或者转发之前会检查内核路由表中是否有该数据包的目的地址,有则直接发送数据,没有则向用户层的守护进程发起进行路由的查找请求,由守护进程发起路由查找。
内核层中的代码与移植的内核版本相关,根据内核版本的变动对内核层中的模块进行修改。与Linux-2.6 相比Linux-4.14 中负责用户空间与内核空间通信的libipq 模块被删除,在实现过程中使用队列来替代该模块功能,实现后内核与用户空间交互如图6 所示。
图6 通信交互机制
在代码层级的实现过程中,最重要的改变是对netlink 套接字处理函数以及进程控制函数的改动。其中一个是使用nlmsg_put 函数来代替NLMSG_PUT 函数,该函数的作用是将发送的数据放入套接字缓冲区中。另外proc_net_create 函数被proc_create 函数代替,该函数的作用是允许AODV-UU 应用程序访问内核中的路由表。最后根据内核版本的改动,删除和替换了相应宏函数以及宏定义等参数,例如对RW_LOCK_UNLOCK宏函数中的实参做出了修改等。
2.3 内核层编译
为了更好地兼容使用Petalinux 工具生成的内核镜像与启动文件,在进行内核层模块编译时同样使用Petalinux 工具对模块进行编译。首先在项目中创建1 个名称为kaodv 的模块。将AODVUU 中lnx 目录中的内核层源文件移植到kaodv 模块的file 文件夹中,修改kaodv.bb 文件以便将内核层中的源文件在编译过程中加载入该模块中,修改结果如图7 所示。
图7 kaodv.bb 实现
进入file 文件夹中,原本AODV-UU 内核层中的Makefile 文件与Petalinux 中动态模块的编译不兼容,需要对其模块中的Makefile 文件进行重写,重新定义导出模块的名称以及需要导出的测试源文件,修改完成后对新建模块进行编译生成kaodv.ko 动态加载模块,文件修改结果如图8所示。
图8 kaodv 模块中Makefile 实现
3 AODV 协议组网通信
3.1 WiFi 网卡配置
AODV 协议在实际应用中需运行在Ad Hoc 网络中,因此以节点C 为例对无线网卡进行以下配置:步骤1)、2)设置网卡模式与essid 分别为Ad Hoc 与aodv;步骤3)、4)设置网卡的IP 地址;步骤5)为检测无线网卡能否正常工作,网卡具体配置步骤为:
1) iwconfig wlan0 mode ad-hoc;
2) iwconfig wlan0 essid “aodv”;
3) ifconfig wlan0 up;
4) ifconfig wlan0 192.168.6.8;
5) iwlist wlan0 scanning aodv。
3.2 连通性测试
本次测试在Ad Hoc 网络中进行,其中节点A 为虚拟机,节点B 与节点C 为PYNQ-Z2 板卡。将节点设为同一局域网段后节点之间相互连通,此时的网络拓扑结构如图9 所示,由图10、11 可知3 个节点互相连通,并且TTL 为64 说明节点之间可以经过一跳到达。
图9 点对点单跳节点间连通
图10 节点A 与节点B、C 连通
图11 节点B 与节点C 连通
使用iptables 工具屏蔽节点A 与节点C 的物理地址,此时网络拓扑结构如图12 所示,节点A 再次对节点C 发送报文,此时2 个节点无法连通,如图13 所示。
图12 点对点单跳节点不连通
图13 节点A 与节点C 不连通
最后网络中各节点都运行AODV 协议,首先使用insmod kaodv.ko 命令加载kaodv.ko 模块,然后节点运行aodvd 程序,此时节点A 与节点C 会将邻居节点B 的IP 地址加入到内核路由表中,节点B 将邻居节点A、C 的IP 地址加入到内核路由表中,此时的网络拓扑结构如图14 所示。随后由节点A 向节点C 发送报文结果如图15 所示,此时节点A 与节点C 再次连通并且存活时间(time to live,TTL)值变为63,说明由节点A 经过两跳途经节点B 到达节点C,使用tracepath 命令进行路由追踪可知节点A 经过节点B 后到达节点C,路由信息如图16 所示,由测试结果可知AODV 协议在嵌入式Linux-4.14 系统中测试成功。
图14 运行AODV 协议后拓扑结构图
图15 运行aodvd 后节点A 与节点C 连通
图16 节点A 到节点C 的路由追踪
3.3 实际通信测试
在实际的通信测试中,通过上层应用程序由节点C 持续不断的向节点A 发送报文,在测试中每个时间段测试5 次取平均值得到网络中的平均丢包率、平均往返时间以及平均吞吐量等性能指标。
往返时延(round-trip time,RTT)指数据包由节点C 发送数据到节点C 接收到节点A 的确认总共经过的时延。图17 显示了节点之间各时间段内的平均往返时间保持在27 ms 左右。
图17 平均往返时间测试结果
吞吐量指节点A 在单位时间内接收到节点C 的数据量。图18 显示了网络中2 个节点之间各时间段内的平均吞吐量保持在70 kb/s 附近。
图18 平均吞吐量统计结果
丢包率指传输中所丢失数据包占所发送数据包的比率。图19 显示了网络中各时间段内的平均丢包率在500 s 之后逐渐趋近于0.4%。
图19 平均丢包率统计结果
4 结束语
本文概述了PYNQ-Z2 平台的软硬件性能,介绍了Petalinux 工具在移植过程中的作用,分析了AODV-UU 协议的运行机制并以PYNQ-Z2 为例研究了AODV 协议在嵌入式Linux-4.14 系统上的实现方案,解决了AODV 协议在当前嵌入式Linux系统中的实际应用问题,最后对协议在实际通信过程中的平均往返时间、平均丢包率等性能指标进行了测试,测试结果表明各性能指标良好具备实际应用价值。