158dd7a8dSBenedikt Spranger.. SPDX-License-Identifier: GPL-2.0
258dd7a8dSBenedikt Spranger
358dd7a8dSBenedikt Spranger=======================================
458dd7a8dSBenedikt SprangerDSA switch configuration from userspace
558dd7a8dSBenedikt Spranger=======================================
658dd7a8dSBenedikt Spranger
758dd7a8dSBenedikt SprangerThe DSA switch configuration is not integrated into the main userspace
858dd7a8dSBenedikt Sprangernetwork configuration suites by now and has to be performed manualy.
958dd7a8dSBenedikt Spranger
1058dd7a8dSBenedikt Spranger.. _dsa-config-showcases:
1158dd7a8dSBenedikt Spranger
1258dd7a8dSBenedikt SprangerConfiguration showcases
1358dd7a8dSBenedikt Spranger-----------------------
1458dd7a8dSBenedikt Spranger
1558dd7a8dSBenedikt SprangerTo configure a DSA switch a couple of commands need to be executed. In this
1658dd7a8dSBenedikt Sprangerdocumentation some common configuration scenarios are handled as showcases:
1758dd7a8dSBenedikt Spranger
1858dd7a8dSBenedikt Spranger*single port*
1958dd7a8dSBenedikt Spranger  Every switch port acts as a different configurable Ethernet port
2058dd7a8dSBenedikt Spranger
2158dd7a8dSBenedikt Spranger*bridge*
2258dd7a8dSBenedikt Spranger  Every switch port is part of one configurable Ethernet bridge
2358dd7a8dSBenedikt Spranger
2458dd7a8dSBenedikt Spranger*gateway*
2558dd7a8dSBenedikt Spranger  Every switch port except one upstream port is part of a configurable
2658dd7a8dSBenedikt Spranger  Ethernet bridge.
2758dd7a8dSBenedikt Spranger  The upstream port acts as different configurable Ethernet port.
2858dd7a8dSBenedikt Spranger
2958dd7a8dSBenedikt SprangerAll configurations are performed with tools from iproute2, which is available
3058dd7a8dSBenedikt Sprangerat https://www.kernel.org/pub/linux/utils/net/iproute2/
3158dd7a8dSBenedikt Spranger
3258dd7a8dSBenedikt SprangerThrough DSA every port of a switch is handled like a normal linux Ethernet
3358dd7a8dSBenedikt Sprangerinterface. The CPU port is the switch port connected to an Ethernet MAC chip.
3458dd7a8dSBenedikt SprangerThe corresponding linux Ethernet interface is called the master interface.
3558dd7a8dSBenedikt SprangerAll other corresponding linux interfaces are called slave interfaces.
3658dd7a8dSBenedikt Spranger
3758dd7a8dSBenedikt SprangerThe slave interfaces depend on the master interface. They can only brought up,
3858dd7a8dSBenedikt Sprangerwhen the master interface is up.
3958dd7a8dSBenedikt Spranger
4058dd7a8dSBenedikt SprangerIn this documentation the following Ethernet interfaces are used:
4158dd7a8dSBenedikt Spranger
4258dd7a8dSBenedikt Spranger*eth0*
4358dd7a8dSBenedikt Spranger  the master interface
4458dd7a8dSBenedikt Spranger
4558dd7a8dSBenedikt Spranger*lan1*
4658dd7a8dSBenedikt Spranger  a slave interface
4758dd7a8dSBenedikt Spranger
4858dd7a8dSBenedikt Spranger*lan2*
4958dd7a8dSBenedikt Spranger  another slave interface
5058dd7a8dSBenedikt Spranger
5158dd7a8dSBenedikt Spranger*lan3*
5258dd7a8dSBenedikt Spranger  a third slave interface
5358dd7a8dSBenedikt Spranger
5458dd7a8dSBenedikt Spranger*wan*
5558dd7a8dSBenedikt Spranger  A slave interface dedicated for upstream traffic
5658dd7a8dSBenedikt Spranger
5758dd7a8dSBenedikt SprangerFurther Ethernet interfaces can be configured similar.
5858dd7a8dSBenedikt SprangerThe configured IPs and networks are:
5958dd7a8dSBenedikt Spranger
6058dd7a8dSBenedikt Spranger*single port*
6158dd7a8dSBenedikt Spranger  * lan1: 192.0.2.1/30 (192.0.2.0 - 192.0.2.3)
6258dd7a8dSBenedikt Spranger  * lan2: 192.0.2.5/30 (192.0.2.4 - 192.0.2.7)
6358dd7a8dSBenedikt Spranger  * lan3: 192.0.2.9/30 (192.0.2.8 - 192.0.2.11)
6458dd7a8dSBenedikt Spranger
6558dd7a8dSBenedikt Spranger*bridge*
6658dd7a8dSBenedikt Spranger  * br0: 192.0.2.129/25 (192.0.2.128 - 192.0.2.255)
6758dd7a8dSBenedikt Spranger
6858dd7a8dSBenedikt Spranger*gateway*
6958dd7a8dSBenedikt Spranger  * br0: 192.0.2.129/25 (192.0.2.128 - 192.0.2.255)
7058dd7a8dSBenedikt Spranger  * wan: 192.0.2.1/30 (192.0.2.0 - 192.0.2.3)
7158dd7a8dSBenedikt Spranger
7258dd7a8dSBenedikt Spranger.. _dsa-tagged-configuration:
7358dd7a8dSBenedikt Spranger
7458dd7a8dSBenedikt SprangerConfiguration with tagging support
7558dd7a8dSBenedikt Spranger----------------------------------
7658dd7a8dSBenedikt Spranger
7758dd7a8dSBenedikt SprangerThe tagging based configuration is desired and supported by the majority of
7858dd7a8dSBenedikt SprangerDSA switches. These switches are capable to tag incoming and outgoing traffic
7958dd7a8dSBenedikt Sprangerwithout using a VLAN based configuration.
8058dd7a8dSBenedikt Spranger
81*e322bacbSVladimir Oltean*single port*
8258dd7a8dSBenedikt Spranger  .. code-block:: sh
8358dd7a8dSBenedikt Spranger
8458dd7a8dSBenedikt Spranger    # configure each interface
8558dd7a8dSBenedikt Spranger    ip addr add 192.0.2.1/30 dev lan1
8658dd7a8dSBenedikt Spranger    ip addr add 192.0.2.5/30 dev lan2
8758dd7a8dSBenedikt Spranger    ip addr add 192.0.2.9/30 dev lan3
8858dd7a8dSBenedikt Spranger
8958dd7a8dSBenedikt Spranger    # The master interface needs to be brought up before the slave ports.
9058dd7a8dSBenedikt Spranger    ip link set eth0 up
9158dd7a8dSBenedikt Spranger
9258dd7a8dSBenedikt Spranger    # bring up the slave interfaces
9358dd7a8dSBenedikt Spranger    ip link set lan1 up
9458dd7a8dSBenedikt Spranger    ip link set lan2 up
9558dd7a8dSBenedikt Spranger    ip link set lan3 up
9658dd7a8dSBenedikt Spranger
97*e322bacbSVladimir Oltean*bridge*
9858dd7a8dSBenedikt Spranger  .. code-block:: sh
9958dd7a8dSBenedikt Spranger
10058dd7a8dSBenedikt Spranger    # The master interface needs to be brought up before the slave ports.
10158dd7a8dSBenedikt Spranger    ip link set eth0 up
10258dd7a8dSBenedikt Spranger
10358dd7a8dSBenedikt Spranger    # bring up the slave interfaces
10458dd7a8dSBenedikt Spranger    ip link set lan1 up
10558dd7a8dSBenedikt Spranger    ip link set lan2 up
10658dd7a8dSBenedikt Spranger    ip link set lan3 up
10758dd7a8dSBenedikt Spranger
10858dd7a8dSBenedikt Spranger    # create bridge
10958dd7a8dSBenedikt Spranger    ip link add name br0 type bridge
11058dd7a8dSBenedikt Spranger
11158dd7a8dSBenedikt Spranger    # add ports to bridge
11258dd7a8dSBenedikt Spranger    ip link set dev lan1 master br0
11358dd7a8dSBenedikt Spranger    ip link set dev lan2 master br0
11458dd7a8dSBenedikt Spranger    ip link set dev lan3 master br0
11558dd7a8dSBenedikt Spranger
11658dd7a8dSBenedikt Spranger    # configure the bridge
11758dd7a8dSBenedikt Spranger    ip addr add 192.0.2.129/25 dev br0
11858dd7a8dSBenedikt Spranger
11958dd7a8dSBenedikt Spranger    # bring up the bridge
12058dd7a8dSBenedikt Spranger    ip link set dev br0 up
12158dd7a8dSBenedikt Spranger
122*e322bacbSVladimir Oltean*gateway*
12358dd7a8dSBenedikt Spranger  .. code-block:: sh
12458dd7a8dSBenedikt Spranger
12558dd7a8dSBenedikt Spranger    # The master interface needs to be brought up before the slave ports.
12658dd7a8dSBenedikt Spranger    ip link set eth0 up
12758dd7a8dSBenedikt Spranger
12858dd7a8dSBenedikt Spranger    # bring up the slave interfaces
12958dd7a8dSBenedikt Spranger    ip link set wan up
13058dd7a8dSBenedikt Spranger    ip link set lan1 up
13158dd7a8dSBenedikt Spranger    ip link set lan2 up
13258dd7a8dSBenedikt Spranger
13358dd7a8dSBenedikt Spranger    # configure the upstream port
13458dd7a8dSBenedikt Spranger    ip addr add 192.0.2.1/30 dev wan
13558dd7a8dSBenedikt Spranger
13658dd7a8dSBenedikt Spranger    # create bridge
13758dd7a8dSBenedikt Spranger    ip link add name br0 type bridge
13858dd7a8dSBenedikt Spranger
13958dd7a8dSBenedikt Spranger    # add ports to bridge
14058dd7a8dSBenedikt Spranger    ip link set dev lan1 master br0
14158dd7a8dSBenedikt Spranger    ip link set dev lan2 master br0
14258dd7a8dSBenedikt Spranger
14358dd7a8dSBenedikt Spranger    # configure the bridge
14458dd7a8dSBenedikt Spranger    ip addr add 192.0.2.129/25 dev br0
14558dd7a8dSBenedikt Spranger
14658dd7a8dSBenedikt Spranger    # bring up the bridge
14758dd7a8dSBenedikt Spranger    ip link set dev br0 up
14858dd7a8dSBenedikt Spranger
14958dd7a8dSBenedikt Spranger.. _dsa-vlan-configuration:
15058dd7a8dSBenedikt Spranger
15158dd7a8dSBenedikt SprangerConfiguration without tagging support
15258dd7a8dSBenedikt Spranger-------------------------------------
15358dd7a8dSBenedikt Spranger
15458dd7a8dSBenedikt SprangerA minority of switches are not capable to use a taging protocol
15558dd7a8dSBenedikt Spranger(DSA_TAG_PROTO_NONE). These switches can be configured by a VLAN based
15658dd7a8dSBenedikt Sprangerconfiguration.
15758dd7a8dSBenedikt Spranger
158*e322bacbSVladimir Oltean*single port*
15958dd7a8dSBenedikt Spranger  The configuration can only be set up via VLAN tagging and bridge setup.
16058dd7a8dSBenedikt Spranger
16158dd7a8dSBenedikt Spranger  .. code-block:: sh
16258dd7a8dSBenedikt Spranger
16358dd7a8dSBenedikt Spranger    # tag traffic on CPU port
16458dd7a8dSBenedikt Spranger    ip link add link eth0 name eth0.1 type vlan id 1
16558dd7a8dSBenedikt Spranger    ip link add link eth0 name eth0.2 type vlan id 2
16658dd7a8dSBenedikt Spranger    ip link add link eth0 name eth0.3 type vlan id 3
16758dd7a8dSBenedikt Spranger
16858dd7a8dSBenedikt Spranger    # The master interface needs to be brought up before the slave ports.
16958dd7a8dSBenedikt Spranger    ip link set eth0 up
17058dd7a8dSBenedikt Spranger    ip link set eth0.1 up
17158dd7a8dSBenedikt Spranger    ip link set eth0.2 up
17258dd7a8dSBenedikt Spranger    ip link set eth0.3 up
17358dd7a8dSBenedikt Spranger
17458dd7a8dSBenedikt Spranger    # bring up the slave interfaces
17558dd7a8dSBenedikt Spranger    ip link set lan1 up
176af0ae997SPaul Barker    ip link set lan2 up
17758dd7a8dSBenedikt Spranger    ip link set lan3 up
17858dd7a8dSBenedikt Spranger
17958dd7a8dSBenedikt Spranger    # create bridge
18058dd7a8dSBenedikt Spranger    ip link add name br0 type bridge
18158dd7a8dSBenedikt Spranger
18258dd7a8dSBenedikt Spranger    # activate VLAN filtering
18358dd7a8dSBenedikt Spranger    ip link set dev br0 type bridge vlan_filtering 1
18458dd7a8dSBenedikt Spranger
18558dd7a8dSBenedikt Spranger    # add ports to bridges
18658dd7a8dSBenedikt Spranger    ip link set dev lan1 master br0
18758dd7a8dSBenedikt Spranger    ip link set dev lan2 master br0
18858dd7a8dSBenedikt Spranger    ip link set dev lan3 master br0
18958dd7a8dSBenedikt Spranger
19058dd7a8dSBenedikt Spranger    # tag traffic on ports
19158dd7a8dSBenedikt Spranger    bridge vlan add dev lan1 vid 1 pvid untagged
19258dd7a8dSBenedikt Spranger    bridge vlan add dev lan2 vid 2 pvid untagged
19358dd7a8dSBenedikt Spranger    bridge vlan add dev lan3 vid 3 pvid untagged
19458dd7a8dSBenedikt Spranger
19558dd7a8dSBenedikt Spranger    # configure the VLANs
19658dd7a8dSBenedikt Spranger    ip addr add 192.0.2.1/30 dev eth0.1
19758dd7a8dSBenedikt Spranger    ip addr add 192.0.2.5/30 dev eth0.2
19858dd7a8dSBenedikt Spranger    ip addr add 192.0.2.9/30 dev eth0.3
19958dd7a8dSBenedikt Spranger
20058dd7a8dSBenedikt Spranger    # bring up the bridge devices
20158dd7a8dSBenedikt Spranger    ip link set br0 up
20258dd7a8dSBenedikt Spranger
20358dd7a8dSBenedikt Spranger
204*e322bacbSVladimir Oltean*bridge*
20558dd7a8dSBenedikt Spranger  .. code-block:: sh
20658dd7a8dSBenedikt Spranger
20758dd7a8dSBenedikt Spranger    # tag traffic on CPU port
20858dd7a8dSBenedikt Spranger    ip link add link eth0 name eth0.1 type vlan id 1
20958dd7a8dSBenedikt Spranger
21058dd7a8dSBenedikt Spranger    # The master interface needs to be brought up before the slave ports.
21158dd7a8dSBenedikt Spranger    ip link set eth0 up
21258dd7a8dSBenedikt Spranger    ip link set eth0.1 up
21358dd7a8dSBenedikt Spranger
21458dd7a8dSBenedikt Spranger    # bring up the slave interfaces
21558dd7a8dSBenedikt Spranger    ip link set lan1 up
21658dd7a8dSBenedikt Spranger    ip link set lan2 up
21758dd7a8dSBenedikt Spranger    ip link set lan3 up
21858dd7a8dSBenedikt Spranger
21958dd7a8dSBenedikt Spranger    # create bridge
22058dd7a8dSBenedikt Spranger    ip link add name br0 type bridge
22158dd7a8dSBenedikt Spranger
22258dd7a8dSBenedikt Spranger    # activate VLAN filtering
22358dd7a8dSBenedikt Spranger    ip link set dev br0 type bridge vlan_filtering 1
22458dd7a8dSBenedikt Spranger
22558dd7a8dSBenedikt Spranger    # add ports to bridge
22658dd7a8dSBenedikt Spranger    ip link set dev lan1 master br0
22758dd7a8dSBenedikt Spranger    ip link set dev lan2 master br0
22858dd7a8dSBenedikt Spranger    ip link set dev lan3 master br0
22958dd7a8dSBenedikt Spranger    ip link set eth0.1 master br0
23058dd7a8dSBenedikt Spranger
23158dd7a8dSBenedikt Spranger    # tag traffic on ports
23258dd7a8dSBenedikt Spranger    bridge vlan add dev lan1 vid 1 pvid untagged
23358dd7a8dSBenedikt Spranger    bridge vlan add dev lan2 vid 1 pvid untagged
23458dd7a8dSBenedikt Spranger    bridge vlan add dev lan3 vid 1 pvid untagged
23558dd7a8dSBenedikt Spranger
23658dd7a8dSBenedikt Spranger    # configure the bridge
23758dd7a8dSBenedikt Spranger    ip addr add 192.0.2.129/25 dev br0
23858dd7a8dSBenedikt Spranger
23958dd7a8dSBenedikt Spranger    # bring up the bridge
24058dd7a8dSBenedikt Spranger    ip link set dev br0 up
24158dd7a8dSBenedikt Spranger
242*e322bacbSVladimir Oltean*gateway*
24358dd7a8dSBenedikt Spranger  .. code-block:: sh
24458dd7a8dSBenedikt Spranger
24558dd7a8dSBenedikt Spranger    # tag traffic on CPU port
24658dd7a8dSBenedikt Spranger    ip link add link eth0 name eth0.1 type vlan id 1
24758dd7a8dSBenedikt Spranger    ip link add link eth0 name eth0.2 type vlan id 2
24858dd7a8dSBenedikt Spranger
24958dd7a8dSBenedikt Spranger    # The master interface needs to be brought up before the slave ports.
25058dd7a8dSBenedikt Spranger    ip link set eth0 up
25158dd7a8dSBenedikt Spranger    ip link set eth0.1 up
25258dd7a8dSBenedikt Spranger    ip link set eth0.2 up
25358dd7a8dSBenedikt Spranger
25458dd7a8dSBenedikt Spranger    # bring up the slave interfaces
25558dd7a8dSBenedikt Spranger    ip link set wan up
25658dd7a8dSBenedikt Spranger    ip link set lan1 up
25758dd7a8dSBenedikt Spranger    ip link set lan2 up
25858dd7a8dSBenedikt Spranger
25958dd7a8dSBenedikt Spranger    # create bridge
26058dd7a8dSBenedikt Spranger    ip link add name br0 type bridge
26158dd7a8dSBenedikt Spranger
26258dd7a8dSBenedikt Spranger    # activate VLAN filtering
26358dd7a8dSBenedikt Spranger    ip link set dev br0 type bridge vlan_filtering 1
26458dd7a8dSBenedikt Spranger
26558dd7a8dSBenedikt Spranger    # add ports to bridges
26658dd7a8dSBenedikt Spranger    ip link set dev wan master br0
26758dd7a8dSBenedikt Spranger    ip link set eth0.1 master br0
26858dd7a8dSBenedikt Spranger    ip link set dev lan1 master br0
26958dd7a8dSBenedikt Spranger    ip link set dev lan2 master br0
27058dd7a8dSBenedikt Spranger
27158dd7a8dSBenedikt Spranger    # tag traffic on ports
27258dd7a8dSBenedikt Spranger    bridge vlan add dev lan1 vid 1 pvid untagged
27358dd7a8dSBenedikt Spranger    bridge vlan add dev lan2 vid 1 pvid untagged
27458dd7a8dSBenedikt Spranger    bridge vlan add dev wan vid 2 pvid untagged
27558dd7a8dSBenedikt Spranger
27658dd7a8dSBenedikt Spranger    # configure the VLANs
27758dd7a8dSBenedikt Spranger    ip addr add 192.0.2.1/30 dev eth0.2
27858dd7a8dSBenedikt Spranger    ip addr add 192.0.2.129/25 dev br0
27958dd7a8dSBenedikt Spranger
28058dd7a8dSBenedikt Spranger    # bring up the bridge devices
28158dd7a8dSBenedikt Spranger    ip link set br0 up
282