From: Vladimir Oltean <olteanv@gmail.com>
To: Florian Fainelli <f.fainelli@gmail.com>
Cc: Pawel Dembicki <paweldembicki@gmail.com>,
netdev@vger.kernel.org, Linus Walleij <linus.walleij@linaro.org>,
Simon Horman <horms@kernel.org>, Andrew Lunn <andrew@lunn.ch>,
"David S. Miller" <davem@davemloft.net>,
Eric Dumazet <edumazet@google.com>,
Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
Claudiu Manoil <claudiu.manoil@nxp.com>,
Alexandre Belloni <alexandre.belloni@bootlin.com>,
UNGLinuxDriver@microchip.com,
Russell King <linux@armlinux.org.uk>,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH net-next v6 07/16] net: dsa: vsc73xx: Add vlan filtering
Date: Fri, 8 Mar 2024 15:09:29 +0200 [thread overview]
Message-ID: <20240308130929.4kgctmtzecbpajao@skbuf> (raw)
In-Reply-To: <20e792ad-33ce-43a6-8ed0-8db6e1a25c27@gmail.com>
On Tue, Mar 05, 2024 at 03:51:11PM -0800, Florian Fainelli wrote:
> On 3/1/24 14:16, Pawel Dembicki wrote:
> > This patch implements VLAN filtering for the vsc73xx driver.
> >
> > After starting VLAN filtering, the switch is reconfigured from QinQ to
> > a simple VLAN aware mode. This is required because VSC73XX chips do not
> > support inner VLAN tag filtering.
> >
> > Signed-off-by: Pawel Dembicki <paweldembicki@gmail.com>
> > ---
>
> [snip]
>
> > +static size_t
> > +vsc73xx_bridge_vlan_num_untagged(struct vsc73xx *vsc, int port, u16 ignored_vid)
> > +{
> > + struct vsc73xx_bridge_vlan *vlan;
> > + size_t num_untagged = 0;
> > +
> > + list_for_each_entry(vlan, &vsc->vlans, list)
> > + if ((vlan->portmask & BIT(port)) &&
> > + (vlan->untagged & BIT(port)) &&
> > + vlan->vid != ignored_vid)
> > + num_untagged++;
> > +
> > + return num_untagged;
> > +}
>
> You always use both helpers at the same time, so I would suggest returning
> num_tagged and num_untagged by reference to have a single linked list
> lookup.
vsc73xx_port_vlan_filtering() calls vsc73xx_bridge_vlan_num_untagged()
but not vsc73xx_bridge_vlan_num_tagged(). Doing as you suggest, while
keeping the code otherwise the same, would imply adding a dummy
num_tagged variable in vlan_filtering().
Though I agree it is generally confusing, because "port_vlan_conf" is
assigned based on inconsistent conditions in vsc73xx_port_vlan_filtering()
vs vsc73xx_port_vlan_add() vs vsc73xx_port_vlan_del(). Namely the number
of tagged VLANs is taken into consideration only on vlan_add(), and of
remaining tagged VLANs on vlan_del(), respectively.
Maybe something like this could help?
struct vsc73xx_vlan_summary {
size_t num_tagged;
size_t num_untagged;
};
static void vsc73xx_bridge_vlan_summary(struct vsc73xx *vsc, int port,
struct vsc73xx_vlan_summary *summary,
u16 ignored_vid)
{
size_t num_tagged = 0, num_untagged = 0;
struct vsc73xx_bridge_vlan *vlan;
list_for_each_entry(vlan, &vsc->vlans, list) {
if (!(vlan->portmask & BIT(port)) || vlan->vid == ignored_vid)
continue;
if (vlan->untagged & BIT(port))
num_untagged++;
else
num_tagged++;
}
summary->num_untagged = num_untagged;
summary->num_tagged = num_tagged;
}
.. and use what you need from the summary.
> > + }
> > +
> > + /* CPU port must be always tagged because port separation is based on
> > + * tag_8021q.
> > + */
> > + if (port != CPU_PORT) {
>
> Please reduce indentation here.
>
> Have to admit the logic is a bit hard to follow, but that is also because of
> my lack of understanding of the requirements surrounding the use of
> tag_8021q.
It's not only that. The code is also a bit hard on the brain for me.
An alternative coding pattern would be to observe that certain hardware
registers (the egress-untagged VLAN, the PVID) depend on a constellation
of N input variables (the bridge VLAN filtering state, the tag_8021q
active state, the bridge VLAN table). So, to make the code easier to
follow and to ensure correctness, in theory a central function could be
written, which embeds the same invariant logic of determining what to
program the registers with, depending on the N inputs. This invariant
function is called from every place that modifies any of the N inputs.
What Paweł did here was to have slightly different code paths for
modifying the hardware registers, each code path adjusted slightly on
the state change transition of individual inputs.
This was a design choice on which I commented very early on, stating
that it's unusual but that I can go along with it. It is probably very
ingrained with the choice of the untagged_storage[] and pvid_storage[]
arrays, the logic of swapping the storage with the hardware at VLAN
filtering state change, and thus very hard to change at this stage of
development.
next prev parent reply other threads:[~2024-03-08 13:09 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-03-01 22:16 [PATCH net-next v6 00/16] net: dsa: vsc73xx: Make vsc73xx usable Pawel Dembicki
2024-03-01 22:16 ` [PATCH net-next v6 01/16] net: dsa: vsc73xx: use read_poll_timeout instead delay loop Pawel Dembicki
2024-03-01 22:16 ` [PATCH net-next v6 02/16] net: dsa: vsc73xx: convert to PHYLINK Pawel Dembicki
2024-03-05 23:15 ` Florian Fainelli
2024-03-06 8:40 ` Linus Walleij
2024-03-06 8:46 ` Russell King (Oracle)
2024-03-01 22:16 ` [PATCH net-next v6 03/16] net: dsa: vsc73xx: use macros for rgmii recognition Pawel Dembicki
2024-03-06 8:47 ` Russell King (Oracle)
2024-03-01 22:16 ` [PATCH net-next v6 04/16] net: dsa: vsc73xx: Add define for max num of ports Pawel Dembicki
2024-03-01 23:39 ` Linus Walleij
2024-03-05 23:16 ` Florian Fainelli
2024-03-01 22:16 ` [PATCH net-next v6 05/16] net: dsa: vsc73xx: add structure descriptions Pawel Dembicki
2024-03-01 22:16 ` [PATCH net-next v6 06/16] net: dsa: vsc73xx: add port_stp_state_set function Pawel Dembicki
2024-03-05 22:42 ` Linus Walleij
2024-03-05 23:18 ` Florian Fainelli
2024-03-08 9:54 ` Vladimir Oltean
2024-03-01 22:16 ` [PATCH net-next v6 07/16] net: dsa: vsc73xx: Add vlan filtering Pawel Dembicki
2024-03-05 23:51 ` Florian Fainelli
2024-03-08 13:09 ` Vladimir Oltean [this message]
2024-03-25 20:42 ` Paweł Dembicki
2024-03-08 12:38 ` Vladimir Oltean
2024-03-01 22:16 ` [PATCH net-next v6 08/16] net: dsa: tag_sja1105: absorb logic for not overwriting precise info into dsa_8021q_rcv() Pawel Dembicki
2024-03-01 22:16 ` [PATCH net-next v6 09/16] net: dsa: tag_sja1105: absorb entire sja1105_vlan_rcv() " Pawel Dembicki
2024-03-01 22:16 ` [PATCH net-next v6 10/16] net: dsa: tag_sja1105: prefer precise source port info on SJA1110 too Pawel Dembicki
2024-03-01 22:16 ` [PATCH net-next v6 11/16] net: dsa: tag_sja1105: refactor skb->dev assignment to dsa_tag_8021q_find_user() Pawel Dembicki
2024-03-06 23:12 ` Florian Fainelli
2024-03-01 22:16 ` [PATCH net-next v6 12/16] net: dsa: vsc73xx: introduce tag 8021q for vsc73xx Pawel Dembicki
2024-03-06 23:14 ` Florian Fainelli
2024-03-08 9:45 ` Vladimir Oltean
2024-03-01 22:16 ` [PATCH net-next v6 13/16] net: dsa: vsc73xx: Implement the tag_8021q VLAN operations Pawel Dembicki
2024-03-01 22:16 ` [PATCH net-next v6 14/16] net: dsa: Define max num of bridges in tag8021q implementation Pawel Dembicki
2024-03-06 8:31 ` Linus Walleij
2024-03-01 22:16 ` [PATCH net-next v6 15/16] net: dsa: vsc73xx: Add bridge support Pawel Dembicki
2024-03-06 23:16 ` Florian Fainelli
2024-03-01 22:16 ` [PATCH net-next v6 16/16] net: dsa: vsc73xx: start treating the BR_LEARNING flag Pawel Dembicki
2024-03-06 8:36 ` Linus Walleij
2024-03-06 23:19 ` Florian Fainelli
2024-03-08 9:42 ` Vladimir Oltean
2024-03-05 22:45 ` [PATCH net-next v6 00/16] net: dsa: vsc73xx: Make vsc73xx usable Linus Walleij
2024-03-05 23:27 ` Florian Fainelli
2024-03-06 9:03 ` Linus Walleij
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240308130929.4kgctmtzecbpajao@skbuf \
--to=olteanv@gmail.com \
--cc=UNGLinuxDriver@microchip.com \
--cc=alexandre.belloni@bootlin.com \
--cc=andrew@lunn.ch \
--cc=claudiu.manoil@nxp.com \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=f.fainelli@gmail.com \
--cc=horms@kernel.org \
--cc=kuba@kernel.org \
--cc=linus.walleij@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@armlinux.org.uk \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=paweldembicki@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox