Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1659208 > unrolled thread

[PATCH net-next 0/5] net: dsa: add cross-chip VLAN support

Started byVivien Didelot <vivien.didelot@savoirfairelinux.com>
First post2017-06-06 23:10 +0200
Last post2017-06-07 21:40 +0200
Articles 6 — 3 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH net-next 0/5] net: dsa: add cross-chip VLAN support Vivien Didelot <vivien.didelot@savoirfairelinux.com> - 2017-06-06 23:10 +0200
    [PATCH net-next 1/5] net: dsa: mv88e6xxx: define membership on VLAN add Vivien Didelot <vivien.didelot@savoirfairelinux.com> - 2017-06-06 23:10 +0200
      Re: [PATCH net-next 1/5] net: dsa: mv88e6xxx: define membership on  VLAN add Florian Fainelli <f.fainelli@gmail.com> - 2017-06-07 21:40 +0200
    [PATCH net-next 3/5] net: dsa: add CPU and DSA ports as VLAN members Vivien Didelot <vivien.didelot@savoirfairelinux.com> - 2017-06-06 23:10 +0200
      Re: [PATCH net-next 3/5] net: dsa: add CPU and DSA ports as VLAN  members David Miller <davem@davemloft.net> - 2017-06-07 21:10 +0200
      Re: [PATCH net-next 3/5] net: dsa: add CPU and DSA ports as VLAN  members Florian Fainelli <f.fainelli@gmail.com> - 2017-06-07 21:40 +0200

#1659208 — [PATCH net-next 0/5] net: dsa: add cross-chip VLAN support

FromVivien Didelot <vivien.didelot@savoirfairelinux.com>
Date2017-06-06 23:10 +0200
Subject[PATCH net-next 0/5] net: dsa: add cross-chip VLAN support
Message-ID<tPtK1-5mC-3@gated-at.bofh.it>
The current code in DSA does not support cross-chip VLAN. This means
that in a multi-chip environment such as this one (similar to ZII Rev B)

         [CPU].................... (mdio)
    (eth0) |   :       :          :
          _|_____    _______    _______
         [__sw0__]--[__sw1__]--[__sw2__]
          |  |  |    |  |  |    |  |  |
          v  v  v    v  v  v    v  v  v
          p1 p2 p3   p4 p5 p6   p7 p8 p9 

adding a VLAN to p9 won't be enough to reach the CPU, until at least one
port of sw0 and sw1 join the VLAN as well and become aware of the VID.

This patchset makes the DSA core program the VLAN on the CPU and DSA
links itself, which brings seamlessly cross-chip VLAN support to DSA.

With this series applied*, the hardware VLAN tables of a 3-switch setup
look like this after adding a VLAN to only one port of the end switch:

    # cat /sys/class/net/br0/bridge/default_pvid 
    42
    # cat /sys/kernel/debug/mv88e6xxx/sw{0,1,2}/vtu
    # ip link set up master br0 dev lan6
    # cat /sys/kernel/debug/mv88e6xxx/sw{0,1,2}/vtu
     VID  FID  SID  0  1  2  3  4  5  6
      42    1    0  x  x  x  x  x  =  =
     VID  FID  SID  0  1  2  3  4  5  6
      42    1    0  x  x  x  x  x  =  =
     VID  FID  SID  0  1  2  3  4  5  6  7  8  9
      42    1    0  u  x  x  x  x  x  x  x  x  =

('x' is excluded, 'u' is untagged, '=' is unmodified DSA and CPU ports.)

Completely removing a VLAN entry (which is currently the responsibility
of drivers anyway) is not supported yet since it requires some caching.

(*) the output is shown from this out-of-tree debugfs patch:
https://github.com/vivien/linux/commit/7b61a684b9d6b6a499135a587c7f62a1fddceb8b.patch

Vivien Didelot (5):
  net: dsa: mv88e6xxx: define membership on VLAN add
  net: dsa: check VLAN capability of every switch
  net: dsa: add CPU and DSA ports as VLAN members
  net: dsa: mv88e6xxx: exclude all ports in new VLAN
  net: dsa: mv88e6xxx: do not purge a VTU entry

 drivers/net/dsa/mv88e6xxx/chip.c | 38 +++++++++++++++-----------------------
 net/dsa/switch.c                 | 30 ++++++++++++++++++++----------
 2 files changed, 35 insertions(+), 33 deletions(-)

-- 
2.13.0

[toc] | [next] | [standalone]


#1659212 — [PATCH net-next 1/5] net: dsa: mv88e6xxx: define membership on VLAN add

FromVivien Didelot <vivien.didelot@savoirfairelinux.com>
Date2017-06-06 23:10 +0200
Subject[PATCH net-next 1/5] net: dsa: mv88e6xxx: define membership on VLAN add
Message-ID<tPtTI-5H7-13@gated-at.bofh.it>
In reply to#1659208
Define the target port membership of the VLAN entry in
mv88e6xxx_port_vlan_add where ds is scoped.

Allow the DSA core to call later the port_vlan_add operation for CPU or
DSA ports, by using the Unmodified membership for these ports, as in the
current behavior.

Signed-off-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com>
---
 drivers/net/dsa/mv88e6xxx/chip.c | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c
index 117f275e3fb6..93078bbe3cb5 100644
--- a/drivers/net/dsa/mv88e6xxx/chip.c
+++ b/drivers/net/dsa/mv88e6xxx/chip.c
@@ -1274,7 +1274,7 @@ mv88e6xxx_port_vlan_prepare(struct dsa_switch *ds, int port,
 }
 
 static int _mv88e6xxx_port_vlan_add(struct mv88e6xxx_chip *chip, int port,
-				    u16 vid, bool untagged)
+				    u16 vid, u8 member)
 {
 	struct mv88e6xxx_vtu_entry vlan;
 	int err;
@@ -1283,9 +1283,7 @@ static int _mv88e6xxx_port_vlan_add(struct mv88e6xxx_chip *chip, int port,
 	if (err)
 		return err;
 
-	vlan.member[port] = untagged ?
-		GLOBAL_VTU_DATA_MEMBER_TAG_UNTAGGED :
-		GLOBAL_VTU_DATA_MEMBER_TAG_TAGGED;
+	vlan.member[port] = member;
 
 	return mv88e6xxx_vtu_loadpurge(chip, &vlan);
 }
@@ -1297,15 +1295,23 @@ static void mv88e6xxx_port_vlan_add(struct dsa_switch *ds, int port,
 	struct mv88e6xxx_chip *chip = ds->priv;
 	bool untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED;
 	bool pvid = vlan->flags & BRIDGE_VLAN_INFO_PVID;
+	u8 member;
 	u16 vid;
 
 	if (!chip->info->max_vid)
 		return;
 
+	if (dsa_is_dsa_port(ds, port) || dsa_is_cpu_port(ds, port))
+		member = GLOBAL_VTU_DATA_MEMBER_TAG_UNMODIFIED;
+	else if (untagged)
+		member = GLOBAL_VTU_DATA_MEMBER_TAG_UNTAGGED;
+	else
+		member = GLOBAL_VTU_DATA_MEMBER_TAG_TAGGED;
+
 	mutex_lock(&chip->reg_lock);
 
 	for (vid = vlan->vid_begin; vid <= vlan->vid_end; ++vid)
-		if (_mv88e6xxx_port_vlan_add(chip, port, vid, untagged))
+		if (_mv88e6xxx_port_vlan_add(chip, port, vid, member))
 			netdev_err(ds->ports[port].netdev,
 				   "failed to add VLAN %d%c\n",
 				   vid, untagged ? 'u' : 't');
-- 
2.13.0

[toc] | [prev] | [next] | [standalone]


#1660140 — Re: [PATCH net-next 1/5] net: dsa: mv88e6xxx: define membership on VLAN add

FromFlorian Fainelli <f.fainelli@gmail.com>
Date2017-06-07 21:40 +0200
SubjectRe: [PATCH net-next 1/5] net: dsa: mv88e6xxx: define membership on VLAN add
Message-ID<tPOY9-2pK-9@gated-at.bofh.it>
In reply to#1659212
On 06/06/2017 01:56 PM, Vivien Didelot wrote:
> Define the target port membership of the VLAN entry in
> mv88e6xxx_port_vlan_add where ds is scoped.
> 
> Allow the DSA core to call later the port_vlan_add operation for CPU or
> DSA ports, by using the Unmodified membership for these ports, as in the
> current behavior.
> 
> Signed-off-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com>

Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
-- 
Florian

[toc] | [prev] | [next] | [standalone]


#1659214 — [PATCH net-next 3/5] net: dsa: add CPU and DSA ports as VLAN members

FromVivien Didelot <vivien.didelot@savoirfairelinux.com>
Date2017-06-06 23:10 +0200
Subject[PATCH net-next 3/5] net: dsa: add CPU and DSA ports as VLAN members
Message-ID<tPtTI-5H7-27@gated-at.bofh.it>
In reply to#1659208
In a multi-chip switch fabric, it is currently the responsibility of the
driver to add the CPU or DSA (interconnecting chips together) ports as
members of a new VLAN entry. This makes the drivers more complicated.

We want the DSA drivers to be stupid and the DSA core being the one
responsible for caring about the abstracted switch logic and topology.

Make the DSA core program the CPU and DSA ports as part of the VLAN.

This makes all chips of the data path to be aware of VIDs spanning the
the whole fabric and thus, seamlessly add support for cross-chip VLAN.

Signed-off-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com>
---
 net/dsa/switch.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/net/dsa/switch.c b/net/dsa/switch.c
index f235ae1e9777..f913cdfe6585 100644
--- a/net/dsa/switch.c
+++ b/net/dsa/switch.c
@@ -166,6 +166,9 @@ static int dsa_switch_vlan_add(struct dsa_switch *ds,
 	bitmap_zero(members, ds->num_ports);
 	if (ds->index == info->sw_index)
 		set_bit(info->port, members);
+	for (port = 0; port < ds->num_ports; ++port)
+		if (dsa_is_cpu_port(ds, port) || dsa_is_dsa_port(ds, port))
+			set_bit(port, members);
 
 	if (switchdev_trans_ph_prepare(trans)) {
 		if (!ds->ops->port_vlan_prepare || !ds->ops->port_vlan_add)
-- 
2.13.0

[toc] | [prev] | [next] | [standalone]


#1660115 — Re: [PATCH net-next 3/5] net: dsa: add CPU and DSA ports as VLAN members

FromDavid Miller <davem@davemloft.net>
Date2017-06-07 21:10 +0200
SubjectRe: [PATCH net-next 3/5] net: dsa: add CPU and DSA ports as VLAN members
Message-ID<tPOv7-2fF-1@gated-at.bofh.it>
In reply to#1659214
From: Vivien Didelot <vivien.didelot@savoirfairelinux.com>
Date: Tue,  6 Jun 2017 16:56:29 -0400

> @@ -166,6 +166,9 @@ static int dsa_switch_vlan_add(struct dsa_switch *ds,
>  	bitmap_zero(members, ds->num_ports);
>  	if (ds->index == info->sw_index)
>  		set_bit(info->port, members);
> +	for (port = 0; port < ds->num_ports; ++port)
> +		if (dsa_is_cpu_port(ds, port) || dsa_is_dsa_port(ds, port))
> +			set_bit(port, members);

Please use the more canonical "x++" post-increment in the for() statement.

Thank you.

[toc] | [prev] | [next] | [standalone]


#1660147 — Re: [PATCH net-next 3/5] net: dsa: add CPU and DSA ports as VLAN members

FromFlorian Fainelli <f.fainelli@gmail.com>
Date2017-06-07 21:40 +0200
SubjectRe: [PATCH net-next 3/5] net: dsa: add CPU and DSA ports as VLAN members
Message-ID<tPOYa-2pK-33@gated-at.bofh.it>
In reply to#1659214
On 06/06/2017 01:56 PM, Vivien Didelot wrote:
> In a multi-chip switch fabric, it is currently the responsibility of the
> driver to add the CPU or DSA (interconnecting chips together) ports as
> members of a new VLAN entry. This makes the drivers more complicated.
> 
> We want the DSA drivers to be stupid and the DSA core being the one
> responsible for caring about the abstracted switch logic and topology.
> 
> Make the DSA core program the CPU and DSA ports as part of the VLAN.
> 
> This makes all chips of the data path to be aware of VIDs spanning the
> the whole fabric and thus, seamlessly add support for cross-chip VLAN.
> 
> Signed-off-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com>

Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
-- 
Florian

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web