Hello, This the RFC v2 which does not register the CPU port based on net-next. I didn't manage to rewrite the driver and splitting it to common library-old-new but, i did reorganize the patches a bit based on Andrew's suggestions. Hopefully it's easier to read.
patch #1: Prepares headers files and move common code to cpsw_priv.h. patch #2: Adds functions to ALE for modifying VLANs/MDBs. patch #3: Prepares cpsw driver for switchdev mode, without changing any of the funtionality. patch #4: Adds new mode of operation based on switchdev. In order to enable this you need enable CONFIG_NET_SWITCHDEV, CONFIG_BRIDGE_VLAN_FILTERING, CONFIG_TI_CPSW_SWITCHDEV and add this to udev config: SUBSYSTEM=="net", ACTION=="add", ATTR{phys_switch_id}=="0f011900", \ ATTR{phys_port_name}!="", NAME="sw0$attr{phys_port_name}" Since the phys_switch_id is based on cpsw version, users with different version will need to do 'ip -d link show dev sw0p1 | grep switchid' and replace with the correct value. This patch creates 2 ports, sw0p1 and sw0p2 both connected to PHYs. Bridge setup: 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 dev sw0p1 up ip link set dev sw0p2 up ip link set dev sw0p1 master br0 ip link set dev sw0p2 master br0 ifconfig br0 up - VLAN config: untagged: bridge vlan add dev sw0p1 vid 100 pvid untagged master bridge vlan add dev sw0p2 vid 100 pvid untagged master tagged: bridge vlan add dev sw0p1 vid 100 master bridge vlan add dev sw0p2 vid 100 master IP address on br0: This will add VLAN 100 on the cpu port. bridge vlan add dev br0 vid 100 pvid untagged self udhcpc -i br0 - FDBs: FDBs are automatically added on the appropriate switch port uppon detection Manually adding FDBs: 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 - MDBs: MDBs are automatically added on the appropriate switch port uppon detection Manually adding MDBs: bridge mdb add dev br0 port sw0p1 grp 239.1.1.1 permanent vid 100 - Multicast testing client-port1(tagged on vlan 100) server-port1 switch-config is provided by TI (https://git.ti.com/switch-config) and is used to verify correct switch configuration. 1. switch-config output - type: vlan , vid = 100, untag_force = 0x4, reg_mcast = 0x6, unreg_mcast = 0x0, member_list = 0x6 Server running on sw0p2: iperf -s -u -B 239.1.1.1 -i 1 Client running on sw0p1: iperf -c 239.1.1.1 -u -b 990m -f m -i 5 -t 3600 No IGMP reaches the CPU port to add MDBs(since CPU does not receive unregistered multicast as programmed). If the MDB is added manually via: bridge mdb add dev br0 port sw0p2 grp 239.1.1.1 permanent vid 100 or unregistered flooding is enabled via: bridge link set dev sw0p2 mcast_flood on Multicast traffic is offloaded as expected. 2. switch-config output - type: vlan , vid = 100, untag_force = 0x7, reg_mcast = 0x7, unreg_mcast = 0x1, member_list = 0x7 In this case CPU port receives the IGMP message and programs the switch accordingly. tcpdump on br0 shows no packets. If the MDB entry is removed with "bridge mdb del dev br0 port sw0p1 grp 239.1.1.1 permanent" br0 is flooded with multicast packets correctly(since unreg multicast is set for the CPU port). If the the mdb entry is manually added tcpdump shows no packets and multicast offloading starts working again. root@ti:~# bridge mdb show dev br0 port sw0p1 grp ff02::fb temp offload vid 100 dev br0 port sw0p1 grp 239.1.1.1 temp offload vid 100 root@ti:~# switch-config -d type: mcast, vid = 100, addr = 01:00:5e:01:01:01, mcast_state = f, \ no super, port_mask = 0x2 - Multicast testing server-port0 client-port1 CPU port(port 0) does not show on bridge mdb show Using ti's switch-config to dump the switch status shows that the MDB is installed correctly. root@ti:~# switch-config -d type: mcast, vid = 100, addr = 01:00:5e:01:01:01, mcast_state = f, \ no super, port_mask = 0x1 - registered multicast: Setting on/off and IFF_MULTICAST (on eth0/eth1/br0) will affect registered multicast masks programmed in the switch(for port1, port2, cpu port respectively). This muct occur before adding VLANs on the interfaces. If you change the flag after the VLAN configuration you need to re-issue the VLAN config commands. If CPU port is participating the proper VLANs MDBs/FDBs will be offloaded by the switch as described in switchdev API. This will also be reflected on "bridge vlan/fdb/mdb show" command(in case the host sends the join the mdb entry won't show there, but ALE status confirms that it's added). - NFS: The only way for NFS to work is by chrooting to a minimal environment when switch configuration that will affect connectivity is needed. Assuming you are booting NFS with eth1 interface(the script is hacky and it's just there to prove NFS is doable). 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/run_nfs.sh run ./run_nfs.sh - Current issues/future work: 1. For this hardware and it's applications it's essential to control the CPU port individually. After removing the CPU port we lost the ability to control unregistered multicast traffic flags. This code unconditionally(if it participates on that VLAN) adds CPU port on the unregistered multicast mask, while for ports 1 and 2 this is configurable via: "bridge link set dev eth1 mcast_flood on/off" Petr Machata introduced a funtionality on VLANs(9c86ce2c1ae337fc10568a12aea812ed03de8319) where the command "bridge vlan add dev br0 vid 100 pvid untagged self" is propagated to the driver and allows us to configure the CPU port. Adding something similar for MDBs i.e "bridge link set dev br0 mcast_flood on self" that reaches the driver is an idea on how to control the CPU port independently and removing the need to add/remove the CPU port on the vlan group for this to happen. 2. VLAN CoS is always set to 0 3. Add support for ageing configuration 4. ALE_P0_UNI_FLOOD can be controlled via: "bridge link set dev br0 flood on self" if this propagates to the driver as well. 5. Add documentation for CPSW configuration on the patch - Changes since RFC v1: - Removed CPU port registration. User can now add CPU port VLANs with "bridge vlan add/del dev br0 vid 100 pvid untagged self". - Removing VLANs will modify registered/unregistered multicast port masks properly. - ALE_P0_UNI_FLOOD is controlled from bridge members. As long as the bridge has members(switch interfaces) this will be enabled. - added management for SWITCHDEV_OBJ_ID_HOST_MDB to control MDBs for the CPU port. - Added STP support. - Added multicast flood support. CPU port is always enabled for now. Ilias Apalodimas (4): net/cpsw: move common headers definitions to cpsw_priv.h net/cpsw_ale: add functions to modify VLANs/MDBs net/cpsw: prepare cpsw for switchdev support net/cpsw_switchdev: add switchdev mode of operation on cpsw driver drivers/net/ethernet/ti/Kconfig | 9 + drivers/net/ethernet/ti/Makefile | 1 + drivers/net/ethernet/ti/cpsw.c | 555 ++++++++++++++++++++++--------- drivers/net/ethernet/ti/cpsw_ale.c | 188 ++++++++++- drivers/net/ethernet/ti/cpsw_ale.h | 10 + drivers/net/ethernet/ti/cpsw_priv.h | 148 +++++++++ drivers/net/ethernet/ti/cpsw_switchdev.c | 418 +++++++++++++++++++++++ drivers/net/ethernet/ti/cpsw_switchdev.h | 4 + 8 files changed, 1167 insertions(+), 166 deletions(-) create mode 100644 drivers/net/ethernet/ti/cpsw_priv.h create mode 100644 drivers/net/ethernet/ti/cpsw_switchdev.c create mode 100644 drivers/net/ethernet/ti/cpsw_switchdev.h -- 2.7.4