linux DSA 开发(一)
linux DSA 開發(一)
本文主要是翻譯,原文鏈接如下:https://www.kernel.org/doc/html/latest/networking/dsa/dsa.html
綱要
本文檔描述了**分布式交換機架構 (DSA)**子系統的設計原則、限制、與其他子系統的交互、如何為該子系統開發驅動程序
設計原則
分布式交換機架構最早是用于支持使用 Linux 的 Marvell 以太網交換機的子系統(MV88E6xxx),但此后也發展為支持其他供應商。
這種設計背后的原始理念是能夠使用未經修改的 Linux 工具(如bridge、iproute2、ifconfig)直接用來配置/查詢交換機端口網絡設備。
以太網交換機通常由多個前面板端口和一個或多個 CPU (管理) 端口組成。DSA 子系統目前依賴于管理端口的存在,管理端口連接到以太網控制器,該控制器能夠從交換機接收以太網幀。對于小型家庭和辦公產品中的各種以太網交換機來說,這是一種非常常見的設置:路由器、網關,甚至是機架式交換機。此主機以太網控制器稍后將在 DSA 術語和代碼中稱為“主控”和“cpu”。
DSA 中的 D 代表分布式(Distributed),因為該子系統的設計能夠配置和管理級聯交換機(上游和下游相互連接的多個交換機)。這些特定端口在 DSA 術語和代碼中稱為 dsa port。相互連接的多個交換機的集合稱為“交換機樹”(switch tree)
對于交換機每個前面板端口,DSA 將創建專門的網絡設備( 對應于 lan*),用作 Linux 網絡堆棧中的控制和數據流端點,這些專用網絡接口在 DSA 術語和代碼中被稱為“slave”網絡接口
使用 DSA 的理想情況是當以太網交換機支持“交換機標簽(switch tag )”時,(這是一種硬件功能,需要硬件支持。)switch tag 用于使交換機為它從特定端口接收/發送的每個以太網幀插入一個特定的標簽,以讓管理接口知道:
- 這個幀來自哪個端口
- 這個幀被轉發的原因是什么
- 如何將 CPU 發起的流量發送到特定端口
不過,該子系統確實支持無法插入/剝離標簽的交換機,但在這種情況下,功能可能會受到輕微限制(流量分離依賴于基于端口的 VLAN ID)。
請注意,DSA 當前不會為“cpu”和“dsa”端口創建網絡接口,因為:
- “cpu”端口是管理控制器面向以太網交換機的一側,創建的話您將獲得同一管道的兩個接口:master netdev和“cpu”netdev , 造成重復,這是不必要的
- “dsa”端口只是兩個或多個交換機之間的管道,因此不能真正用作適當的網絡接口
switch-tag 協議
DSA 支持許多特定于供應商的標記協議、一種軟件定義的標記協議以及一種無標記模式 ( DSA_TAG_PROTO_NONE)。
標簽協議的確切格式是特定于供應商的,但總的來說,它們都包含以下內容:
- 標識以太網幀來自/應該發送到哪個端口
- 提供將此幀轉發到管理接口的原因
所有的標記協議都在net/dsa/tag_*.c文件中,并實現了結構的方法,下面詳述。struct dsa_device_ops
標記協議通常屬于以下三類之一:
查看 switch-tag 協議類型
root@OpenWrt:/# cat /sys/class/net/eth0/dsa/tagging trailer主控網絡設備(master netdev )
主網絡設備通常是常規以太網接口,無需對驅動做特殊修改。DSA 子系統已被證明可以與行業標準驅動程序一起使用: e1000e, mv643xx_eth等等,而無需對這些驅動程序進行修改。這種網絡設備也經常被稱為管道網絡設備,因為它們充當主機處理器和硬件以太網交換機之間的管道。
網絡協議棧中的鉤子函數
當 master netdev 與 DSA 一起使用時,在網絡堆棧中放置一個鉤子函數,以便讓 DSA 子系統處理以太網交換機特定的標記協議。典型的以太網幀接收序列如下所示:
主控網絡設備(例如:e1000e):
接收中斷觸發:
- 接收函數被調用
- 完成基本的數據包處理:獲取長度、狀態等。
- 數據包準備由以太網層通過調用 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*)會收到一個常規以太網幀。
從屬網絡設備 (slave netdev)
DSA 創建的從網絡設備堆疊在其主網絡設備的頂部( 例如 lan1@eth0),這些網絡接口中負責作為交換機每個前面板端口的控制和數據流端點。這些接口專門用于:
- 在向/從特定交換機端口發送/接收流量時插入/刪除交換機標簽協議
- 查詢交換機的 ethtool 操作:統計信息、鏈接狀態、LAN 喚醒、register dumps …
- 外部/內部 PHY 管理:鏈接、自動協商等。
這些從屬網絡設備具有自定義的 net_device_ops 和 ethtool_ops 函數指針,它們允許 DSA 在網絡堆棧/ethtool 和交換機驅動程序實現之間引入一個分層級別。
在從這些從屬網絡設備傳輸幀時,DSA 將查找當前向這些網絡設備注冊的交換機標記協議,并調用特定的傳輸例程,負責在以太網幀中添加相關的交換機標記。
然后,這些幀將排隊等待使用主網絡設備ndo_start_xmit()功能進行傳輸 ,因為它們包含適當的交換機標簽,以太網交換機將能夠處理這些來自管理接口的傳入幀,并將這些幀傳送到物理交換機端口。
圖示
總結一下,從網絡設備的角度來看,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 總線
略
數據結構
DSA 數據結構在include/net/dsa.h以及 中定義net/dsa/dsa_priv.h:
略
總結
以上是生活随笔為你收集整理的linux DSA 开发(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python做游戏脚本被监测_一个监视C
- 下一篇: Linux下__attribute__(