当前位置:首页 » 硬件·内核·Shell·监测 » Linux 4.0+內核對硬件交換模塊的支持(HW Switch Offload)

Linux 4.0+內核對硬件交換模塊的支持(HW Switch Offload)命令

Linux內核最近躍進到了4.x時代,初看沒啥大的動作,但是對於我而言,最令人興奮的還是它對硬交換模塊的支持。這也是為全面迎合SDN做好準備的第一步。

Linux上的路由與交換
Linux誕生於網絡,天生對網絡擁有全面且強大的支持,即便再復雜的協議,再封閉的技術,幾乎都可以找到對應的Linux實現。然而這並不是說Linux網絡就天下無敵了,它存在很多不合理的地方。
       Linux擁有對路由的強大支持,在數據平面,你可以很輕松地實現一種路由查找算法,在控制平面,你也可以在用戶態實現任何已有的或者你自己設計的路由協議,然而,這一切都是軟的,也就是說,都是CPU來完成的。
       當我們知道路由和交換的區別之後,就會發現,Linux一直以來都沒有實現真正的交換,起碼在通用接口層面上沒有一個合理的解決方案。Linux的bridge模塊?算了吧,它只是實現了一個軟網橋,和真正交換機不沾邊的。

Linux對硬件交換的支持
記得去年的時候,我曾經拿到過一塊交換板,可以直接插在主板的PCI-E上,當時必須使用廠商特定的驅動程序以及配合VLAN技術才能將其用起來。其實很多的交換機可能都采用了Linux作為管理平面和控制平面,然後配置自己的定制硬件和定制驅動來使用。
       我曾經想過一種辦法用Netfilter技術實現對硬件交換模塊的支持,但是,CPU還是要被中斷的,整個流程是CPU將數據包拉到bridge或者ip 層,然後再交回硬件...正確的方式是根本不用中斷CPU,完全通過硬件來轉發數據包,只有數據和本地協議棧相關的時候,才中斷CPU。而這個思路,意味 著你必須重寫驅動。
       總之,沒有一個統一的接口,這就意味著如果你自己想設計一塊交換板,沒有比較好的標準可循,即便有,可能你也要自己編寫或者復制粘貼大量的驅動代碼,這將嚴重影響研發效率。

Linux 4.0的switchdev
一切壞消息在Linux 4.0內核中終結。
       Linux 4.0引入了一個switchdev框架,它代表一類擁有“交換”能力芯片的多網口設備的抽象。其中每一個網口就是一個port,在switchdev框 架中被註冊成一個net_device。除此之外,內核中自帶了一個rocker driver,演示了一個實際的設備驅動的實現。整個switchdev的示意圖如下所示:





wKiom1VYMJCS7LVWAAJX8N0ThsQ134.jpg

註意,理想化的實現中,OpenFlow控制器可以直接將流表註入到設備中,從而指導設備直接進行數據包交換。流表的內容超級復雜,不是本文的目標,但是相信在後一個內核版本中會出現相關的Document。
       采用了硬件交換模塊的Linux BOX和原來的截然不同了,它更像是一個高端的專業網絡設備,類似Cisco那樣的。它看起來就是下面的樣子:



wKiom1VYMIHjLFdjAAJbQPZpvpo359.jpg