德州仪器 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 模式需要保留两个 vids 用于内部目的,默认情况下,这些 vids 等于 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 交换驱动程序会完全重新加载其配置。

当两个接口都加入网桥时,除非“ale_bypass=0”,否则 CPSW 交换驱动程序将启用使用 offload_fwd_mark 标志标记数据包。

所有配置都通过 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

访问端口和中继端口

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

注意。在网桥设备本身上设置 PVID 仅适用于默认 VLAN (default_pvid)。

NFS

NFS 工作的唯一方法是在需要影响连接的交换机配置时 chroot 到最小的环境。假设您正在使用 eth1 接口引导 NFS(该脚本是临时的,它只是为了证明 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