介绍
ARM平台下无线通信一般都是点对点的,这次需求是要实现无线网卡的三跳,即实现A主机发送信息通过B主机中转后在发送给C,不能是直接从A到C,这里就涉及到了一个最基本的路由转发协议。其实早就有了开源的协议-AODV协议,该协议已经能够完美的解决我的需求了。
AODV(Ad hoc On-demand Distance Vector Routing)是一种按需路由协议。实现细节这里不做过多的介绍,后期慢慢研究源代码。
软硬件平台介绍
目标平台:Tiny4412,linux 3.5.0
宿主机:ubuntu14.04
工具链:arm-linux-gcc-4.5.1
Aodv版本:AODV-UU-0.9.6
移植
由于Aodv-uu-0.9.6协议是基于linux2.6版本编写的,现如今linux版本已经更新到了4.8了,所以与最新的linux内核存在不兼容的问题,因此移植需要修改Aodv源码的接口函数。网络上的许多资料都是基于linux内核2.6进行编译移植的,并没有见多基于3.0以上的,在这过程中遇到了很多的问题,特此记录。
编译
linux内核配置
由于aodv协议是和linux内核的netfilter模块进行通信的,所以首先必须确保你的linux内核当初编译的时候包含了此模块,否则这里也是编译不过去的,为了确保没有错误还是再次配置下内核模块。
解压源码后切换到源码根目录执行命令:
make menuconfig
接着就会启动图形化的配置界面,按照以下部分进行勾选:
Networking support —> Networking options —>
Networking packet filtering framework (Netfilter) —>
IP: Netfilter configuration —>
<*> IP Userspace queueing via NETLINK (OBSOLETE)
配置完成后编译内核,如果你的内核之前已经编译好了,没有必要全部编译一次,只需要按模块编译即可:
make modules
编译完成后会生成相应的这个模块。
aodvy源码修改
下载aodv源码并解压,进入到根目录,打开Makefile文件进行修改:
打开lkx/kaodv-debug.h文件进行修改:
打开lnx/kaodv-netlink.c文件进行修改:
打开lnx/Makefile进行修改:
编译
以上部分就是关于aodv协议的一些配置,需要修改的地方都用红色圈起来了。先忙切换到源码主目录进行编译:
make arm
编译完成后会生成2个文件:aodvd和kaodv.ko文件,如下图所示:
运行
网卡配置
ifconfig wlan0 down
iwconfig wlan0 mode ad-hoc essid “wifi-adhoc”
iwconfig wlan0 channel 10
ifconfig wlan0 192.168.3.101 up
模块加载
测试
将生成的2个文件拷贝到开发板上后将无线网卡先配置成ad-hoc模式,设置IP地址,使的都在同一个网段内。我这里使用衰减器,使开发板A和开发板C不通,A和B能通,B和C能通,然后各自运行aodv协议,在开发板ApingC就能ping通,查看A的路由表确实已经改变了: