From: Vladimir Oltean <olteanv@gmail.com>
To: Pawel Dembicki <paweldembicki@gmail.com>
Cc: netdev@vger.kernel.org, Dan Carpenter <dan.carpenter@linaro.org>,
Simon Horman <simon.horman@corigine.com>,
Andrew Lunn <andrew@lunn.ch>,
Florian Fainelli <f.fainelli@gmail.com>,
"David S. Miller" <davem@davemloft.net>,
Eric Dumazet <edumazet@google.com>,
Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
Russell King <linux@armlinux.org.uk>,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH net-next v3 6/8] net: dsa: vsc73xx: introduce tag 8021q for vsc73xx
Date: Wed, 13 Sep 2023 00:39:37 +0300 [thread overview]
Message-ID: <20230912213937.wqwiex32ojlojnue@skbuf> (raw)
In-Reply-To: <20230912122201.3752918-7-paweldembicki@gmail.com> <20230912122201.3752918-7-paweldembicki@gmail.com>
Hi Pawel,
On Tue, Sep 12, 2023 at 02:22:00PM +0200, Pawel Dembicki wrote:
> This commit introduces a new tagger based on 802.1q tagging.
> It's designed for the vsc73xx driver. The VSC73xx family doesn't have
> any tag support for the RGMII port, but it could be based on VLANs.
>
> Signed-off-by: Pawel Dembicki <paweldembicki@gmail.com>
> ---
> diff --git a/net/dsa/tag_vsc73xx_8021q.c b/net/dsa/tag_vsc73xx_8021q.c
> new file mode 100644
> index 000000000000..9093a71e6eb0
> --- /dev/null
> +++ b/net/dsa/tag_vsc73xx_8021q.c
> @@ -0,0 +1,91 @@
> +// SPDX-License-Identifier: GPL-2.0 OR MIT
> +/* Copyright (C) 2022 Pawel Dembicki <paweldembicki@gmail.com>
2022-2023 by now, maybe?
> + * Based on tag_sja1105.c:
> + * Copyright (c) 2019, Vladimir Oltean <olteanv@gmail.com>
> + */
> +#include <linux/dsa/8021q.h>
> +
> +#include "tag.h"
> +#include "tag_8021q.h"
> +
> +#define VSC73XX_8021Q_NAME "vsc73xx-8021q"
> +
> +static struct sk_buff *vsc73xx_xmit(struct sk_buff *skb, struct net_device *netdev)
> +{
> + struct dsa_port *dp = dsa_slave_to_port(netdev);
> + u16 queue_mapping = skb_get_queue_mapping(skb);
> + u16 tx_vid = dsa_tag_8021q_standalone_vid(dp);
> + u8 pcp;
> +
> + if (skb->offload_fwd_mark) {
> + unsigned int bridge_num = dsa_port_bridge_num_get(dp);
> + struct net_device *br = dsa_port_bridge_dev_get(dp);
> +
> + if (br_vlan_enabled(br))
> + return skb;
> +
> + tx_vid = dsa_tag_8021q_bridge_vid(bridge_num);
> + }
> +
> + pcp = netdev_txq_to_tc(netdev, queue_mapping);
> +
> + return dsa_8021q_xmit(skb, netdev, ETH_P_8021Q,
> + ((pcp << VLAN_PRIO_SHIFT) | tx_vid));
> +}
> +
> +static void vsc73xx_vlan_rcv(struct sk_buff *skb, int *source_port,
> + int *switch_id, int *vbid, u16 *vid)
> +{
> + if (vid_is_dsa_8021q(skb_vlan_tag_get(skb) & VLAN_VID_MASK))
> + return dsa_8021q_rcv(skb, source_port, switch_id, vbid);
> +
> + /* Try our best with imprecise RX */
> + *vid = skb_vlan_tag_get(skb) & VLAN_VID_MASK;
> +}
> +
> +static struct sk_buff *vsc73xx_rcv(struct sk_buff *skb, struct net_device *netdev)
> +{
> + int src_port = -1, switch_id = -1, vbid = -1;
> + u16 vid;
> +
> + if (skb_vlan_tag_present(skb)) {
> + /* Normal traffic path. */
> + vsc73xx_vlan_rcv(skb, &src_port, &switch_id, &vbid, &vid);
> + } else {
> + netdev_warn(netdev, "Couldn't decode source port\n");
> + return NULL;
> + }
> +
> + if (vbid >= 1)
> + skb->dev = dsa_tag_8021q_find_port_by_vbid(netdev, vbid);
> + else if (src_port == -1 || switch_id == -1)
> + skb->dev = dsa_find_designated_bridge_port_by_vid(netdev, vid);
> + else
> + skb->dev = dsa_master_find_slave(netdev, switch_id, src_port);
Hmm, this isn't looking too good.
I think the fact that you had to add my copyright on what should be such
a simple thing as a VLAN-based tagger is a bad sign :)
It's time to consolidate some more stuff that currently lives in
tag_sja1105 and move it into tag_8021q so that you can reuse it more
easily.
I've prepared some (only compile-tested) patches on this branch here:
https://github.com/vladimiroltean/linux/commits/pawel-dembicki-vsc73xx-v3
I need to double-check that they don't introduce regressions, and we
should discuss the merging strategy. Probably you're going to submit
them together with your patch set.
With that, you can drop my part of the copyright :) The remainder should
look like straightforward use of API which can be written in only a
limited number of ways.
> + if (!skb->dev) {
> + netdev_warn(netdev, "Couldn't decode source port\n");
> + return NULL;
> + }
> +
> + dsa_default_offload_fwd_mark(skb);
> +
> + if (dsa_port_is_vlan_filtering(dsa_slave_to_port(skb->dev)) &&
> + eth_hdr(skb)->h_proto == htons(ETH_P_8021Q))
> + __vlan_hwaccel_clear_tag(skb);
Why do you need to do this? We send VLAN-tagged packets to the
VLAN-aware bridge intentionally, so that it knows what VLAN they come
from (in the dsa_find_designated_bridge_port_by_vid() case). So don't
strip it if it's not causing a problem.
> +
> + return skb;
> +}
next prev parent reply other threads:[~2023-09-12 21:39 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-09-12 12:21 [PATCH net-next v3 0/8] net: dsa: vsc73xx: Make vsc73xx usable Pawel Dembicki
2023-09-12 12:21 ` [PATCH net-next v3 1/8] net: dsa: vsc73xx: use read_poll_timeout instead delay loop Pawel Dembicki
2023-09-12 12:21 ` [PATCH net-next v3 2/8] net: dsa: vsc73xx: convert to PHYLINK Pawel Dembicki
2023-09-12 16:49 ` Russell King (Oracle)
2023-09-26 23:03 ` Vladimir Oltean
2023-10-03 20:45 ` Paweł Dembicki
2023-10-03 21:14 ` Vladimir Oltean
2023-10-03 21:32 ` Andrew Lunn
2023-10-03 21:50 ` Paweł Dembicki
2023-09-12 12:21 ` [PATCH net-next v3 3/8] net: dsa: vsc73xx: Add define for max num of ports Pawel Dembicki
2023-09-12 12:21 ` [PATCH net-next v3 4/8] net: dsa: vsc73xx: add port_stp_state_set function Pawel Dembicki
2023-09-12 14:48 ` Vladimir Oltean
2023-09-12 15:27 ` Paweł Dembicki
2023-09-12 15:42 ` Vladimir Oltean
2023-09-12 12:21 ` [PATCH net-next v3 5/8] net: dsa: vsc73xx: Add vlan filtering Pawel Dembicki
2023-09-12 16:17 ` Vladimir Oltean
2023-09-22 14:26 ` Paweł Dembicki
2023-09-26 23:58 ` Vladimir Oltean
2023-10-03 21:14 ` Paweł Dembicki
2023-10-03 21:27 ` Vladimir Oltean
2023-09-12 12:22 ` [PATCH net-next v3 6/8] net: dsa: vsc73xx: introduce tag 8021q for vsc73xx Pawel Dembicki
2023-09-12 21:39 ` Vladimir Oltean [this message]
2023-09-25 20:55 ` Paweł Dembicki
2023-09-27 0:11 ` Vladimir Oltean
2023-09-12 12:22 ` [PATCH net-next v3 7/8] net: dsa: vsc73xx: Implement vsc73xx 8021q tagger Pawel Dembicki
2023-09-12 12:22 ` [PATCH net-next v3 8/8] net: dsa: vsc73xx: Add bridge support Pawel Dembicki
2023-09-12 22:23 ` Vladimir Oltean
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=20230912213937.wqwiex32ojlojnue@skbuf \
--to=olteanv@gmail.com \
--cc=andrew@lunn.ch \
--cc=dan.carpenter@linaro.org \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=f.fainelli@gmail.com \
--cc=kuba@kernel.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 \
--cc=simon.horman@corigine.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