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