本文只是一個內核網絡協議的實踐的例子,先說明添加的目的,下篇開始具體的實現。
內核版本:2.6.34;在支持802.1主機上,報文的一般格式:
現在需要支持一種新的協議[二層] – BRCM協議,與IP等協議不同,它位於2層,擁有6字節的頭部和4字節的尾部 ,添加的層次決定了比起添加其它協議要復雜一些,新的報文格式如下,而我們的目的就是要網絡協議棧能正常處理這樣的報文 :
實際上BRCM是一種交換機的內部協議,用處是讓交換機管理端口能通過BRCM獲取報文來自於交換 機的哪個端口,或者指定報文從交換機哪個端口出去;當然,這不是我們關心的內容,我們只需要為它挑選一個協議號0x8744, 其余內容置0就可以了。因此,brcm頭部會填寫成 88 74 00 00 00 00,brcm尾部會填寫成 00 00。一個新協議的報文內容用 wireshark等捕包工具查看的形式如下:
[源/目的mac]02 03 04 05 06 07 10 11 12 13 14 15
[BRCM報頭]88 74 00 00 00 00
[Vlan報頭]81 00 00 01
[報文內容]……..
先從設備的概 念來看下添加BRCM協議後的層次圖:
eth1代表實際的B4401物理網卡;eth1.X/brcm0.x代表 VLAN創建的虛擬網卡,後面的數字X是vlan號;brcm0代表BRCM創建的虛擬網卡,數字0表示測試用;從圖中可以看到,brcm協議 的添加是通過添加brcmX虛擬網卡接口實現的。
如果BRCM協議添加正確,那麼最終的結果 應該是:
在接收報文時,通過虛擬設備BRCM會脫去brcm的6字節的頭部與4字節尾部,當然,協 議做的遠遠不只這些,但這是核心。
在發送報文時,通過虛擬設備BRCM會添加6字節的頭部與4 字節的尾部,當然,協議做的遠遠不只這些,但這是核心。
要做的工作大致是以下幾項 :
1. 確定brcm_dev的存儲數據結構
2. 編寫struct ptype_base brcm_packet_type
3. 添加ioctl調用供用戶空間調用,至少包括brcm_dev的創建和刪除
4. 添加notifier機制、netlink機制、proc機制
5. 添加編譯用的Kconfig, Makefile等,並修改Menuconfig
數據結構是核 心,每一步也是一個網絡協議模塊的核心。下一篇開始brcm協議的添加實現。