這幾天一直在作aodv協議的實現與組建ad-hoc網絡。php
根據不少前輩的經驗與本身實際操做的結果。作一個本身備份用的小的總結出來。linux
【此教程爲第一部分,是在已經配置好開發板aodv的狀況下,配置PC端AODV,配置開發板aodv在第二部分教程。】編程
測試目標:ubuntu
Linux下的pc端與開發板端組建ad-hoc網絡,並實現aodv路由協議,相互ping通網絡
測試環境:socket
1.物理主機ubuntu10.04(kernel: 2.6.25.7)ide
a) 【虛擬機下ubuntu10.04平臺:kernel 2.6.38.7也已測試經過】工具
2.開發板:FriendlyARM tiny210 V2 (開發板平臺:linux 2.6.35.7)測試
3.Aodv-uu版本:aodv-uu-0.9.6ui
4.交叉編譯工具:arm-linux-gcc 4.5.1
測試過程:
1.首先應編譯一個新的內核。
配置內核
在編譯內核以前首先要配置內核,也就是決定哪些功能編入內核,哪些功能編入模塊。編入內核的功能能夠直接被內核調用,編成模塊的功能使用前需將模塊掛載入內核。未編入內核和模塊的功能將不能使用。
(爲保證編譯過程的順利進行,首先需安裝編譯的基本環境。使用命令apt-get install build-essential kernel-package libncurses5-dev libqt3-headers。其中build-essential 爲基本的編程庫gcc, make等。kernel-package 爲Debian 系統裏生成 kernel-image 的一些配置文件和工具。libncurses5-dev 爲meke menuconfig要調用的。)
-------------------
Make menuconfig
手工定製內核,從新編譯內核將netfilter模塊加進去。
Networking support --->
Networking options --->
Networking packet filtering framework (Netfilter) --->
IP: Netfilter configuration --->
<*> IP Userspace queueing via NETLINK (OBSOLETE)
而後編譯,編譯內核過程請參考本人博客教程。
2.編譯好內核以後開始編譯aodv-uu-0.9.6
a) 解壓源代碼包
編譯前須要改動的信息:
在lnx/kaodv-debug.h程序中添加頭文件 #include
在lnx/kaodv-netlink.c中將 static DECLARE_MUTEX(kaodvnl_sem);
改成 static DEFINE_SEMAPHORE(kaodvnl_sem);
b) Make
c) Make install
這以後會把生成的kaodv.ko模塊放到/lib/modules/linux-2.6.35.7/aodv下。再之後要啓動aodv用戶態時,要先加載此目錄下的模塊到內核中。
3.組建ad-hoc網絡
【後來作的時候發現,把wifi模塊放到了PC機上,用iwconfig命令可以看到設備,ifconfig wlan1 up也可以起來,可是就是不可以iwlist wlan1 scan搜索到任何網絡,或者是ifconfig wlan1 up總提示不正常,資源暫時不能用之類的,這些都是沒有裝對應無線網卡驅動的問題。裝好驅動就沒事了。至於說的裝驅動,咱們測試平臺用的無線網卡爲rt3070,這個無線網卡用命令lsmod |grep rt* 已經能夠看到有rt2870sta的驅動和rt2800usb,因此咱們能夠用命令加載這個模塊,至於爲何會出現這種狀況,我暫時尚未研究,可參見文章http://ubuntuforums.org/showthread.php?t=2154070 便可解決此種問題。】
【一樣的,以前一直不是很清楚,若是隻有兩個終端,那麼還要aodv協議幹嗎用,因此只有兩臺設備的話,編譯aodv確實沒什麼用處。不用編譯aodv,直接組建上ad-hoc網絡也能夠。】
【這裏有一步很是重要,弄了好長時間,一直連不上ad-hoc,緣由在於pc端所採用的系統爲desktop系統,這裏就有了圖形用戶的界面,而在這個系統下會有兩種配置網絡的方式,一種爲network-manager,一種爲/etc/network/interfaces(/etc/init.d/networking),這兩種方式不可以同時進行,也就是說再用下邊的這種方法設置ip的狀況下,要把network-manager禁用掉,否則會衝突。】
停用network-manager便可。具體方法以下:
root@ubuntu :# /etc/init.d/network-manager stop
如以後想繼續使用network-manager,則 /etc/init.d/network-manager restart便可。
參考:http://www.linuxidc.com/Linux/2010-10/29031.htm
http://hi.baidu.com/tawnde/item/103a150d1e9abce6f45ba685
1.發起發:
iwconfig wlan0 mode ad-hoc
iwconfig wlan0 essid "aodv-adhoc"
ifconfig wlan0 up
ifconfig wlan0 192.168.1.1
2.接入方:
iwconfig wlan0 mode ad-hoc
ifconfig wlan0 up
ifconfig wlan0 192.168.1.3
iwlist wlan0 scan (確保能搜到aodv-adhoc網絡)
iwconfig wlan0 essid aodv-adhoc
iwconfig wlan0 查看cell是否爲iwlist搜出aodv-adhoc對應的cell,若是一致,則接入成功。
3.加載aodv模塊【兩端都須要加載】
insmod kaodv.ko
4.運行aodv協議【兩端都須要運行】
./aodvd
20:02:17.416 host_init: Attaching to rausb0, override with -i .
20:02:17.548 aodv_socket_init: RAW send socket buffer size set to 221184
20:02:17.548 aodv_socket_init: Receive buffer size set to 221184
20:02:17.548 main: In wait on reboot for 15000 milliseconds. Disable with "-D".
20:02:17.548 hello_start: Starting to send HELLOs!
20:02:20.217 neighbor_add: 192.168.1.1 new NEIGHBOR!
20:02:20.217 rt_table_insert: Inserting 192.168.1.1 (bucket 0) next hop 192.168.1.1
20:02:20.217 nl_send_add_route_msg: ADD/UPDATE: 192.168.1.1:192.168.1.1 ifindex=3
顯示發現鄰居192.168.1.1並將其添加到路由表中,協議運轉正常。