wpa_supplicant的移植和可能遇到的問題

在本週的最後一個工作日的最後一個小時裏,一個困擾了我幾天的問題在近乎絕望的調試中突然通過了!人生真是充滿驚喜啊


本來已經接近放棄了,抱着最後一試的打算,居然成功了。陽光果然就在50米開外的拐角處啊,堅持到底不放棄,奇蹟就會出現!


========================================================

正文

========================================================


因爲現在的無線wifi網絡大多是wpa加密。所以需要移植wpa_supplicant工具。

一、下載源碼
        http://hostap.epitest.fi/wpa_supplicant/



        下載wpa_supplicant-0.7.3.tar.gz (openssl用到0.7.3提供的補丁)
                #tar xvfz wpa_supplicant-0.7.3.tar.gz
        下載www.openssl.org/source/openssl-0.9.8e.tar.gz
                #tar zxvf openssl-0.9.8e.tar.gz

二、編譯openssl庫
將wpa_supplicant中的補丁拷貝到openssl中 
        # cp wpa_supplicant-0.7.3/patches/openssl-0.9.8e-tls-extensions.patch openssl-0.9.8e/
        #cd openssl-0.9.8e
        #mkdir /usr/local/ssl
        #vim Makefile
                CC= arm-linux-gnu-gcc
                AR= arm-linux-gnu-ar $(ARFLAGS) r
                RANLIB= arm-linux-gnu-ranlib
                INSTALLTOP=/usr/local/ssl
                OPENSSLDIR=/usr/local/ssl
        #make 
        #make install

在/usr/local/ssl目錄下安裝了ssl庫
 #ls /usr/local/ssl
 #bin  certs  include  lib  man  misc  openssl.cnf  private

後面編譯wpa_supplicant要依賴openssl中的lib和include

三、編譯wpa_supplicant 
進入wpa_supplicant-0.7.3.tar.gz解壓生成的wpa_supplicant-0.7.3/wpa_supplicant目錄中:
        #cp defconfig        .config
        #vim .config
                CC=arm-linux-gcc  -L/usr/local/ssl/lib/
          #CC=/opt/brcm/hndtools-mipsel-uclibc/bin/mipsel-uclibc-gcc
CFLAGS += -I/usr/local/ssl/include
#CPPFLAGS += -I../src/include -I../../src/router/openssl/include
LIBS += -L/usr/local/ssl/lib
        #make


/*注:這裏可能出現很多編譯錯誤!不過不要慌張,認真看下到底是什麼錯誤!基本上都是缺少函數聲明,

不知道作者爲什麼會犯這樣的錯誤。比如在wpa_supplicant.c中對某個函數沒有定義,這時應該用grep

或者cscope等工具查找該函數名,找到在頭文件裏的定義,然後將頭文件寫入該文件中就可以了!

*/

經過編譯後的wpa_supplicant源程序可以看到兩個主要的可執行工具:wpa_supplicant和wpa_cli。wpa_supplicant是核心程序,它和wpa_cli的關係就是服務和客戶端的關係:後臺運行wpa_supplicant,使用wpa_cli來搜索、設置、和連接網絡。


四、配置wpa_supplicant

在板子根目錄nfsroot/etc中建立wpa_supplicant.conf文件


文件內容如下

ctrl_interface=/var/run/wpa_supplicant


network={
                ssid="max"     //填寫無線網絡的的用戶名
                key_mgmt=WPA-PSK
                proto=WPA
                pairwise=TKIP
                group=TKIP
                psk="1234567890" //填寫密碼
}

注意要與你的無線路由中的設置對應。


另外要注意的是,無線路由中的模式應該設爲 :  11bg mixed

否則會出現些腦殘情況!


五、測試

insmod zd1211rw.ko

ifconfig wlan0 up

iwconfig wlan0 essid  max

wpa_passphrase ssid名 密碼 >> /etc/wpa_supplicant.conf


之後wpa_supplicant.conf中會添加以下內容,然後把最後面的經過加密的密碼修改到上面去,再把下面的內容刪掉!

network={
      ssid="max"
      #psk="1234567890"
      psk=4b2bc7cbb3710e9ea43f09e8d57e8bdb3b2a2127af44960d73216c3612f6baba
}

如:

network={

                ssid="max"     //填寫無線網絡的的用戶名
                key_mgmt=WPA-PSK
                proto=WPA
                pairwise=TKIP
                group=TKIP

                psk=4b2bc7cbb3710e9ea43f09e8d57e8bdb3b2a2127af44960d73216c3612f6baba               

                #psk="1234567890" //填寫密碼
}


鏈接AP

wpa_supplicant -iwlan0 -c/etc/wpa_supplicant.conf -B

當時我遇到的問題就是怎麼都連不上,會打出以下信息

cfg80211: Calling CRDA to update world regulatory domain

不斷的反覆的出現

用dmesg查看後臺,發現有該信息打出:

zd1211rw 2-1:1.0: zd_usb_rfwrite() value 0x0100077 bits 24
zd1211rw 2-1:1.0: zd_usb_rfwrite() value 0x0200998 bits 24
zd1211rw 2-1:1.0: zd_usb_rfwrite() value 0x034644d bits 24
zd1211rw 2-1:1.0: zd_usb_rfwrite() value 0x0025f98 bits 24
zd1211rw 2-1:1.0: zd_usb_rfwrite() value 0x0025f9a bits 24

經過無比煎熬的google,終於發現一個阿根廷人和一個德國人的對話,說這完全是正常情況,只是debug信息!

看到這裏,我重新編譯內核,將zd1211的debug選項去掉,再執行連接,發現順利通過了!!


在執行udhcpc -i wlan0 可以順利獲取ip











發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章