linux DSA 开发(一)
linux DSA 開發(fā)(一)
本文主要是翻譯,原文鏈接如下:https://www.kernel.org/doc/html/latest/networking/dsa/dsa.html
綱要
本文檔描述了**分布式交換機(jī)架構(gòu) (DSA)**子系統(tǒng)的設(shè)計(jì)原則、限制、與其他子系統(tǒng)的交互、如何為該子系統(tǒng)開發(fā)驅(qū)動(dòng)程序
設(shè)計(jì)原則
分布式交換機(jī)架構(gòu)最早是用于支持使用 Linux 的 Marvell 以太網(wǎng)交換機(jī)的子系統(tǒng)(MV88E6xxx),但此后也發(fā)展為支持其他供應(yīng)商。
這種設(shè)計(jì)背后的原始理念是能夠使用未經(jīng)修改的 Linux 工具(如bridge、iproute2、ifconfig)直接用來(lái)配置/查詢交換機(jī)端口網(wǎng)絡(luò)設(shè)備。
以太網(wǎng)交換機(jī)通常由多個(gè)前面板端口和一個(gè)或多個(gè) CPU (管理) 端口組成。DSA 子系統(tǒng)目前依賴于管理端口的存在,管理端口連接到以太網(wǎng)控制器,該控制器能夠從交換機(jī)接收以太網(wǎng)幀。對(duì)于小型家庭和辦公產(chǎn)品中的各種以太網(wǎng)交換機(jī)來(lái)說(shuō),這是一種非常常見(jiàn)的設(shè)置:路由器、網(wǎng)關(guān),甚至是機(jī)架式交換機(jī)。此主機(jī)以太網(wǎng)控制器稍后將在 DSA 術(shù)語(yǔ)和代碼中稱為“主控”和“cpu”。
DSA 中的 D 代表分布式(Distributed),因?yàn)樵撟酉到y(tǒng)的設(shè)計(jì)能夠配置和管理級(jí)聯(lián)交換機(jī)(上游和下游相互連接的多個(gè)交換機(jī))。這些特定端口在 DSA 術(shù)語(yǔ)和代碼中稱為 dsa port。相互連接的多個(gè)交換機(jī)的集合稱為“交換機(jī)樹”(switch tree)
對(duì)于交換機(jī)每個(gè)前面板端口,DSA 將創(chuàng)建專門的網(wǎng)絡(luò)設(shè)備( 對(duì)應(yīng)于 lan*),用作 Linux 網(wǎng)絡(luò)堆棧中的控制和數(shù)據(jù)流端點(diǎn),這些專用網(wǎng)絡(luò)接口在 DSA 術(shù)語(yǔ)和代碼中被稱為“slave”網(wǎng)絡(luò)接口
使用 DSA 的理想情況是當(dāng)以太網(wǎng)交換機(jī)支持“交換機(jī)標(biāo)簽(switch tag )”時(shí),(這是一種硬件功能,需要硬件支持。)switch tag 用于使交換機(jī)為它從特定端口接收/發(fā)送的每個(gè)以太網(wǎng)幀插入一個(gè)特定的標(biāo)簽,以讓管理接口知道:
- 這個(gè)幀來(lái)自哪個(gè)端口
- 這個(gè)幀被轉(zhuǎn)發(fā)的原因是什么
- 如何將 CPU 發(fā)起的流量發(fā)送到特定端口
不過(guò),該子系統(tǒng)確實(shí)支持無(wú)法插入/剝離標(biāo)簽的交換機(jī),但在這種情況下,功能可能會(huì)受到輕微限制(流量分離依賴于基于端口的 VLAN ID)。
請(qǐng)注意,DSA 當(dāng)前不會(huì)為“cpu”和“dsa”端口創(chuàng)建網(wǎng)絡(luò)接口,因?yàn)?#xff1a;
- “cpu”端口是管理控制器面向以太網(wǎng)交換機(jī)的一側(cè),創(chuàng)建的話您將獲得同一管道的兩個(gè)接口:master netdev和“cpu”netdev , 造成重復(fù),這是不必要的
- “dsa”端口只是兩個(gè)或多個(gè)交換機(jī)之間的管道,因此不能真正用作適當(dāng)?shù)木W(wǎng)絡(luò)接口
switch-tag 協(xié)議
DSA 支持許多特定于供應(yīng)商的標(biāo)記協(xié)議、一種軟件定義的標(biāo)記協(xié)議以及一種無(wú)標(biāo)記模式 ( DSA_TAG_PROTO_NONE)。
標(biāo)簽協(xié)議的確切格式是特定于供應(yīng)商的,但總的來(lái)說(shuō),它們都包含以下內(nèi)容:
- 標(biāo)識(shí)以太網(wǎng)幀來(lái)自/應(yīng)該發(fā)送到哪個(gè)端口
- 提供將此幀轉(zhuǎn)發(fā)到管理接口的原因
所有的標(biāo)記協(xié)議都在net/dsa/tag_*.c文件中,并實(shí)現(xiàn)了結(jié)構(gòu)的方法,下面詳述。struct dsa_device_ops
標(biāo)記協(xié)議通常屬于以下三類之一:
查看 switch-tag 協(xié)議類型
root@OpenWrt:/# cat /sys/class/net/eth0/dsa/tagging trailer主控網(wǎng)絡(luò)設(shè)備(master netdev )
主網(wǎng)絡(luò)設(shè)備通常是常規(guī)以太網(wǎng)接口,無(wú)需對(duì)驅(qū)動(dòng)做特殊修改。DSA 子系統(tǒng)已被證明可以與行業(yè)標(biāo)準(zhǔn)驅(qū)動(dòng)程序一起使用: e1000e, mv643xx_eth等等,而無(wú)需對(duì)這些驅(qū)動(dòng)程序進(jìn)行修改。這種網(wǎng)絡(luò)設(shè)備也經(jīng)常被稱為管道網(wǎng)絡(luò)設(shè)備,因?yàn)樗鼈兂洚?dāng)主機(jī)處理器和硬件以太網(wǎng)交換機(jī)之間的管道。
網(wǎng)絡(luò)協(xié)議棧中的鉤子函數(shù)
當(dāng) master netdev 與 DSA 一起使用時(shí),在網(wǎng)絡(luò)堆棧中放置一個(gè)鉤子函數(shù),以便讓 DSA 子系統(tǒng)處理以太網(wǎng)交換機(jī)特定的標(biāo)記協(xié)議。典型的以太網(wǎng)幀接收序列如下所示:
主控網(wǎng)絡(luò)設(shè)備(例如:e1000e):
接收中斷觸發(fā):
- 接收函數(shù)被調(diào)用
- 完成基本的數(shù)據(jù)包處理:獲取長(zhǎng)度、狀態(tài)等。
- 數(shù)據(jù)包準(zhǔn)備由以太網(wǎng)層通過(guò)調(diào)用 eth_type_trans
net/ethernet/eth.c:
eth_type_trans(skb, dev)if (dev->dsa_ptr != NULL)-> skb->protocol = ETH_P_XDSAdrivers/net/ethernet/*:
netif_receive_skb(skb)-> iterate over registered packet_type-> invoke handler for ETH_P_XDSA, calls dsa_switch_rcv()net/dsa/dsa.c:
-> dsa_switch_rcv()-> invoke switch tag specific protocol handler in 'net/dsa/tag_*.c'net/dsa/tag_*.c:
- inspect and strip switch tag protocol to determine originating port
- locate per-port network device
- invoke eth_type_trans() with the DSA slave network device
- invoked netif_receive_skb()
到了這一步,DSA 的 slave netdev (lan*)會(huì)收到一個(gè)常規(guī)以太網(wǎng)幀。
從屬網(wǎng)絡(luò)設(shè)備 (slave netdev)
DSA 創(chuàng)建的從網(wǎng)絡(luò)設(shè)備堆疊在其主網(wǎng)絡(luò)設(shè)備的頂部( 例如 lan1@eth0),這些網(wǎng)絡(luò)接口中負(fù)責(zé)作為交換機(jī)每個(gè)前面板端口的控制和數(shù)據(jù)流端點(diǎn)。這些接口專門用于:
- 在向/從特定交換機(jī)端口發(fā)送/接收流量時(shí)插入/刪除交換機(jī)標(biāo)簽協(xié)議
- 查詢交換機(jī)的 ethtool 操作:統(tǒng)計(jì)信息、鏈接狀態(tài)、LAN 喚醒、register dumps …
- 外部/內(nèi)部 PHY 管理:鏈接、自動(dòng)協(xié)商等。
這些從屬網(wǎng)絡(luò)設(shè)備具有自定義的 net_device_ops 和 ethtool_ops 函數(shù)指針,它們?cè)试S DSA 在網(wǎng)絡(luò)堆棧/ethtool 和交換機(jī)驅(qū)動(dòng)程序?qū)崿F(xiàn)之間引入一個(gè)分層級(jí)別。
在從這些從屬網(wǎng)絡(luò)設(shè)備傳輸幀時(shí),DSA 將查找當(dāng)前向這些網(wǎng)絡(luò)設(shè)備注冊(cè)的交換機(jī)標(biāo)記協(xié)議,并調(diào)用特定的傳輸例程,負(fù)責(zé)在以太網(wǎng)幀中添加相關(guān)的交換機(jī)標(biāo)記。
然后,這些幀將排隊(duì)等待使用主網(wǎng)絡(luò)設(shè)備ndo_start_xmit()功能進(jìn)行傳輸 ,因?yàn)樗鼈儼m當(dāng)?shù)慕粨Q機(jī)標(biāo)簽,以太網(wǎng)交換機(jī)將能夠處理這些來(lái)自管理接口的傳入幀,并將這些幀傳送到物理交換機(jī)端口。
圖示
總結(jié)一下,從網(wǎng)絡(luò)設(shè)備的角度來(lái)看,DSA 基本上是這樣子:
Unaware applicationopens and binds socket| ^| |+-----------v--|--------------------+|+------+ +------+ +------+ +------+||| swp0 | | swp1 | | swp2 | | swp3 |||+------+-+------+-+------+-+------+|| DSA switch driver |+-----------------------------------+| ^Tag added by | | Tag consumed byswitch driver | | switch driverv |+-----------------------------------+| Unmodified host interface driver | Software --------+-----------------------------------+------------| Host interface (eth0) | Hardware+-----------------------------------+| ^Tag consumed by | | Tag added byswitch hardware | | switch hardwarev |+-----------------------------------+| Switch ||+------+ +------+ +------+ +------+||| swp0 | | swp1 | | swp2 | | swp3 ||++------+-+------+-+------+-+------++slave MDIO 總線
略
數(shù)據(jù)結(jié)構(gòu)
DSA 數(shù)據(jù)結(jié)構(gòu)在include/net/dsa.h以及 中定義net/dsa/dsa_priv.h:
略
總結(jié)
以上是生活随笔為你收集整理的linux DSA 开发(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python做游戏脚本被监测_一个监视C
- 下一篇: VINS-Mono 代码解析六、边缘化(