Texas Instruments CPSW 基於 switchdev 的乙太網驅動¶
- 版本:
2.0
埠重新命名¶
在舊版本的 udev 中,將 ethX 重新命名為 swXpY 將不會被自動支援
為了透過 udev 重新命名
ip -d link show dev sw0p1 | grep switchid
SUBSYSTEM=="net", ACTION=="add", ATTR{phys_switch_id}==<switchid>, \
ATTR{phys_port_name}!="", NAME="sw0$attr{phys_port_name}"
雙 MAC 模式¶
新的 (cpsw_new.c) 驅動程式預設以雙 emac 模式執行,因此作為 2 個獨立的網路介面工作。與舊版 CPSW 驅動程式的主要區別在於
最佳化的混雜模式:除了 ALLMULTI(當前埠)之外,還啟用了 P0_UNI_FLOOD(兩個埠),而不是 ALE_BYPASS。因此,混雜模式下的埠將保持組播和 VLAN 過濾的可能性,當埠連線到同一網橋時,這提供了顯著的好處,但無需啟用“交換機”模式或不同的網橋。
埠上停用學習,因為它對於隔離埠沒有太多意義 - 在硬體中不轉發。
啟用了對 devlink 的基本支援。
devlink dev show platform/48484000.switch devlink dev param show platform/48484000.switch: name switch_mode type driver-specific values: cmode runtime value false name ale_bypass type driver-specific values: cmode runtime value false
Devlink 配置引數¶
雙 MAC 模式下的橋接¶
dual_mac 模式需要為內部目的保留兩個 vid,預設情況下,vid 等於 CPSW 埠號。因此,必須以 VLAN 感知模式配置網橋,或者必須調整 default_pvid
ip link add name br0 type bridge
ip link set dev br0 type bridge vlan_filtering 0
echo 0 > /sys/class/net/br0/bridge/default_pvid
ip link set dev sw0p1 master br0
ip link set dev sw0p2 master br0
或
ip link add name br0 type bridge
ip link set dev br0 type bridge vlan_filtering 0
echo 100 > /sys/class/net/br0/bridge/default_pvid
ip link set dev br0 type bridge vlan_filtering 1
ip link set dev sw0p1 master br0
ip link set dev sw0p2 master br0
啟用“交換機”¶
可以透過將 devlink 驅動程式引數“switch_mode”配置為 1/true 來啟用交換機模式
devlink dev param set platform/48484000.switch \
name switch_mode value 1 cmode runtime
這可以在不考慮埠 netdev 裝置的狀態(UP/DOWN)的情況下完成,但在加入網橋之前,埠的 netdev 裝置必須處於 UP 狀態,以避免覆蓋網橋配置,因為當第一個埠將其狀態更改為 UP 時,CPSW 交換機驅動程式會完全重新載入其配置。
當兩個介面都加入網橋時 - CPSW 交換機驅動程式將啟用使用 offload_fwd_mark 標誌標記資料包,除非“ale_bypass=0”
所有配置都透過 switchdev API 實現。
網橋設定¶
devlink dev param set platform/48484000.switch \
name switch_mode value 1 cmode runtime
ip link add name br0 type bridge
ip link set dev br0 type bridge ageing_time 1000
ip link set dev sw0p1 up
ip link set dev sw0p2 up
ip link set dev sw0p1 master br0
ip link set dev sw0p2 master br0
[*] bridge vlan add dev br0 vid 1 pvid untagged self
[*] if vlan_filtering=1. where default_pvid=1
Note. Steps [*] are mandatory.
開啟/關閉 STP¶
ip link set dev BRDEV type bridge stp_state 1/0
VLAN 配置¶
bridge vlan add dev br0 vid 1 pvid untagged self <---- add cpu port to VLAN 1
注意。此步驟對於 bridge/default_pvid 是強制性的。
新增額外的 VLAN¶
未標記
bridge vlan add dev sw0p1 vid 100 pvid untagged master bridge vlan add dev sw0p2 vid 100 pvid untagged master bridge vlan add dev br0 vid 100 pvid untagged self <---- Add cpu port to VLAN100已標記
bridge vlan add dev sw0p1 vid 100 master bridge vlan add dev sw0p2 vid 100 master bridge vlan add dev br0 vid 100 pvid tagged self <---- Add cpu port to VLAN100
FDB¶
FDB 在檢測到時會自動新增到相應的交換機埠
手動新增 FDB
bridge fdb add aa:bb:cc:dd:ee:ff dev sw0p1 master vlan 100
bridge fdb add aa:bb:cc:dd:ee:fe dev sw0p2 master <---- Add on all VLANs
MDB¶
MDB 在檢測到時會自動新增到相應的交換機埠
手動新增 MDB
bridge mdb add dev br0 port sw0p1 grp 239.1.1.1 permanent vid 100
bridge mdb add dev br0 port sw0p1 grp 239.1.1.1 permanent <---- Add on all VLANs
組播泛洪¶
CPU 埠 mcast_flooding 始終開啟
開啟/關閉交換機埠上的泛洪:bridge link set dev sw0p1 mcast_flood on/off
接入和 Trunk 埠¶
bridge vlan add dev sw0p1 vid 100 pvid untagged master
bridge vlan add dev sw0p2 vid 100 master
bridge vlan add dev br0 vid 100 self
ip link add link br0 name br0.100 type vlan id 100
注意。在 Bridge 裝置本身上設定 PVID 僅適用於預設 VLAN (default_pvid)。
NFS¶
NFS 工作的唯一方法是在需要影響連線的交換機配置時 chroot 到最小環境。假設您使用 eth1 介面引導 NFS(該指令碼是 hacky 的,它只是為了證明 NFS 是可行的)。
setup.sh
#!/bin/sh
mkdir proc
mount -t proc none /proc
ifconfig br0 > /dev/null
if [ $? -ne 0 ]; then
echo "Setting up bridge"
ip link add name br0 type bridge
ip link set dev br0 type bridge ageing_time 1000
ip link set dev br0 type bridge vlan_filtering 1
ip link set eth1 down
ip link set eth1 name sw0p1
ip link set dev sw0p1 up
ip link set dev sw0p2 up
ip link set dev sw0p2 master br0
ip link set dev sw0p1 master br0
bridge vlan add dev br0 vid 1 pvid untagged self
ifconfig sw0p1 0.0.0.0
udhchc -i br0
fi
umount /proc
run_nfs.sh:
#!/bin/sh
mkdir /tmp/root/bin -p
mkdir /tmp/root/lib -p
cp -r /lib/ /tmp/root/
cp -r /bin/ /tmp/root/
cp /sbin/ip /tmp/root/bin
cp /sbin/bridge /tmp/root/bin
cp /sbin/ifconfig /tmp/root/bin
cp /sbin/udhcpc /tmp/root/bin
cp /path/to/setup.sh /tmp/root/bin
chroot /tmp/root/ busybox sh /bin/setup.sh
run ./run_nfs.sh