在Arm上移植PPPoE
隨著嵌入式開發(fā)的流行,不少協(xié)議配置的內(nèi)容通通都可以搬上開發(fā)板試試。這次我們就來分享一位網(wǎng)友Arm板上移植pppoe的經(jīng)驗吧。在Arm上成功移植pppoe,其中經(jīng)歷了很多波折,因此把過程寫下來,給自己也給他人提供一些參考。閑話少說,直接步驟吧:
對了,先要在編譯內(nèi)核時把含有ppp和pppoe的選項選上,不過含有ppp的我沒有全選,這個視個人情況而定吧。
1、交叉編譯libcap-0.9.1 <代碼來源于www.tcpdump.org>
./configure --host=arm-linux --prefix=/usr --with-pcap=linux-2.4.10(這個根據(jù)自己的內(nèi)核版本來定,如果不指明編譯時會報錯,但指明了在后面也會出一點問題。也因為這個問題,有人強制在configure里刪除了配置with-pcap那一段,我懶得刪所以先留著了,呵呵)
make :這個時候報錯:No rule to make target 'pcap-linux-2.4.10' ,needed by 'libcap.a'。這個問題就是由configure時--with-pcap那一項配置引起的。我查看了一下Makefile,發(fā)現(xiàn)包含有l(wèi)inux-2.4.10關(guān)鍵字的地方只有PSRC=pcap-linux-2.4.10.C那一項,于是我將其改為PSRC=pcap.C,再次make,編譯成功,不過只生成了libpcap.a。再打開Makefile,找到libpcap.so:$(OBJ)……那一段,將ld改為arm-linux-ld,然后執(zhí)行:make libpcap.so,最后報了一個pcap.o有錯。我想還是因為with-pcap那一項的問題,再回到Makefile,將PSRC=pcap.c那一行改為PSRC=pcap-linux.c,重新make,接著make libpcap.so,終于成功了,哈哈!將libpcap.so copy 至arm板root(newroot)下的lib目錄,又做了兩個鏈接libpcap.so.0 和libpcap.so.0.9.1。
2、交叉編譯 ppp-2.4.1
源碼下載:ftp://ftp.samba.org/pub/ppp
解壓縮,進(jìn)入ppp-2.4.1目錄,執(zhí)行下面兩步:
./configure --prefix = /usr
make CC = arm-linux-gcc
很遺憾,一大堆錯誤,而且都是莫名其妙的錯誤。據(jù)經(jīng)驗估計應(yīng)該是工具鏈的原因。但是因為之前曾經(jīng)吃過換工具鏈引起庫不兼容出了段錯誤的虧,所以這次沒敢輕易換工具鏈。改了好幾個小時還是沒有改完,沒辦法,菜鳥就是這樣,呵呵。只好妥協(xié),換了arm-linux-gcc.3.3.2,一編譯,果然通過。雖然心中竊喜,不過還是有點擔(dān)心,怕怕哦。
再將pppd、chat等四個可執(zhí)行程序copy到newroot下的usr/sbin目錄,還有scripts目錄下的幾個腳本也拷過去。
進(jìn)入newroot下的dev,執(zhí)行:mknod ppp c 108 0
3、交叉編譯rp-pppoe,我用的是3.7版本
./configure --host=arm-linux --prefix=/usr
make
最終將pppd pppoe pppoe-setup pppoe-start pppoe-stop等copy到/newroot/usr/sbin下,也可以自己make install。
其中pppoe是可執(zhí)行文件,pppoe-xxx是腳本。
最后將文件系統(tǒng)燒入flash,運行pppoe-setup,根據(jù)自己的實際情況輸入用戶名密碼DNS等信息。然后運行pppoe-start腳本。如果這步一切正常就可以了。可惜我挺不幸的,不僅自動生成的腳本pppoe-connect也有問題,而且我的文件系統(tǒng)里面shell配置太簡單,expr、printf等命令都沒有,沒辦法,只好改腳本了。怎么改就不再一一敘述了,不過因為改pppoe-connect腳本時太大意,用了一個全部替換命令將echo都替換成$ECHO,換完也沒檢查,把pppd的一個參數(shù)里面含有的echo也給換掉了,后來看DEGBUG出來的腳本還對著那個錯誤納悶了半天。腳本的錯誤清除了,但還是撥號成功不了,而且一點兒輸出信息都沒有,出錯信息沒有。
后來直接運行pppd,Segmentation Default ——段錯誤!剛開始以為是工具鏈的原因,只好又用原來的工具鏈3.2.1來編譯,參考了網(wǎng)上一個人的方法,把arm-linux/sys-include/route.h替換為include下的route.h,重新編譯通過了,但還是段錯誤。郁悶了好幾天,狂google了一通,終于找到了錯誤所在,原來是mmap函數(shù)的問題,把ppp-2.4.1/pppd下面Makefile里的-DHAVE_MMAP去掉重新編譯就可以運行了。
去掉了段錯誤,松了一口氣,但還是連不上,我那個氣呀,真是別人遇到的問題我遇到了,別人沒遇到的問題我也遇到了!沒辦法,還得慢慢來唄。于是運行DEBUG=1 pppoe-start,通過看DEBUG的報告,發(fā)現(xiàn)是地址族不被協(xié)議支持的問題。再重新編譯內(nèi)核,將含有ipv6的那一項選上,但還是不行。仔細(xì)看錯誤,其描述如下……Socket:Session 0:Address Family not supported by protocol!其中的Socket一詞引起了我的興趣,想了想,再次重新編譯內(nèi)核,把含有Socket的選項Packet Socket,Packet Socket:mmapped IO,Socket Filtering也選上,再次運行pppoe-start,ping www.baidu.com ,終于ping通了,可以用adsl上網(wǎng)了,移植pppoe大功告成。