欲工其事必先利其器,這種針對硬件的開發(fā)往往最令人頭大的就是搭開發(fā)環(huán)境,以前做單片機(jī)就深有體會。
這次用了兩臺PC機(jī),一臺硬件設(shè)備。PCA裝REDHAT,和設(shè)備通過PCIE對接,作為開發(fā)機(jī)和負(fù)載機(jī)。PCB裝XP作為測試機(jī)和網(wǎng)關(guān)。
聯(lián)機(jī)方式,PCB上插一片光卡,連接到設(shè)備的BGE0,光卡和無線網(wǎng)卡建一個(gè)網(wǎng)橋,作為INTERNET出口。
PCA的網(wǎng)卡連接到一個(gè)光電轉(zhuǎn)換器,光電轉(zhuǎn)換器的光纖連接到設(shè)備的BGE1上,作為負(fù)載機(jī)。
從周六開始搞,先是光電轉(zhuǎn)換器沒電源,想從里面焊條線出來,外殼居然打不開,昏倒~~。電源口是英制的3。5MM,找不到匹配的插頭,最后只好剪塊長條形的線路板插在插口中充當(dāng)負(fù)極,再從插口的芯子上焊出一條線來作為正極,連接到PCB的5V電源上。連接好,插上電,光口指示燈不亮,懷疑是壞了。
周日,突然想到,PCB缺少機(jī)箱電源,趕緊跑電腦市場買了一套。
周一一大早,快遞就送來了光卡,順豐的服務(wù)果然不是山寨快遞可以比的。
這光卡竟然和光電轉(zhuǎn)換器一樣,怎么搞,燈就是不亮,把卡上的兩個(gè)接口連接,燈亮了。說明卡是好的,問題出在光纖或模塊上,光纖沒問題,罪魁禍?zhǔn)拙褪枪饽K了,幸好拿了一大堆模塊回來,一個(gè)一個(gè)地試,終于有一個(gè),燈亮了,果然是模塊的兼容性。
突然想到,會不會光電轉(zhuǎn)換器也是相同的問題,把光電轉(zhuǎn)換器接到這塊模塊上,燈也亮了。
現(xiàn)在在手上有三臺光設(shè)備了,交換機(jī),光電轉(zhuǎn)換器和光網(wǎng)卡。
先試交換機(jī),光口和電口不通,搞不懂。
最后就確定了上面所說的方案。
環(huán)境搭好了,加上啃了兩天的文檔,寫代碼相對就比較輕松了。E文文檔,十多篇,回想當(dāng)年英文課睡覺睡到流口水,真是痛心疾首,悔恨莫及啊。
這個(gè)東西其實(shí)簡單的,每個(gè)核心可以綁多個(gè)線程,每個(gè)核心只能綁一個(gè)隊(duì)列。包收進(jìn)來放進(jìn)一個(gè)桶,桶就是一張HASH表了,可以按2層MAC、三層IP/端口、4層作為多維HASH存放,這個(gè)是NETIO的驅(qū)動實(shí)現(xiàn)的,不用管,按手冊做就是了。每個(gè)核心就從桶中取數(shù)據(jù)處理,NETIO提供一個(gè)阻塞函數(shù),偵聽數(shù)據(jù)包,由于核心與隊(duì)列綁定,整個(gè)處理過程是不用加鎖的。數(shù)據(jù)的處理類似于SOCKET。收到的數(shù)據(jù)是原汁原味的報(bào)文,可以直接扔到另一個(gè)隊(duì)列發(fā)送出去。剝掉網(wǎng)絡(luò)頭就是三層包,再剝掉三層頭,就是應(yīng)用層數(shù)據(jù),這個(gè)比內(nèi)核模塊方便多了,內(nèi)核的SKBUFF結(jié)構(gòu)還是相當(dāng)?shù)貜?fù)雜,加上每一個(gè)HOOK點(diǎn)的數(shù)據(jù)指向都在變化,足可令人吐血。
手冊上沒有提供雙網(wǎng)卡數(shù)據(jù)透傳的例程,按原先的設(shè)想,應(yīng)該就是偵聽兩個(gè)網(wǎng)卡,收到的數(shù)據(jù)扔到另一個(gè)網(wǎng)卡,就實(shí)現(xiàn)了ACCEPT,不扔過去,就是DROP了。
按架構(gòu)寫了個(gè)代碼,稍作調(diào)試,透傳成功了,就是速度慢,下載只有50-60K,懷疑是光連接有問題。
再層層剝?nèi)ヮ^部,打印出MAC和IP地址,包長度。
OK,至此,萬里長征總算邁出了第一步。