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
    

雙 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

  1. 未標記

    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
    
  2. 已標記

    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