On Mon, Nov 30, 2020 at 03:06:10PM +0100, Tobias Waldekranz wrote: > Packets ingressing on a LAG that egress on the CPU port, which are not > classified as management, will have a FORWARD tag that does not > contain the normal source device/port tuple. Instead the trunk bit > will be set, and the port field holds the LAG id. > > Since the exact source port information is not available in the tag, > frames are injected directly on the LAG interface and thus do never > pass through any DSA port interface on ingress. > > Management frames (TO_CPU) are not affected and will pass through the > DSA port interface as usual. > > Signed-off-by: Tobias Waldekranz <tob...@waldekranz.com> > --- > net/dsa/dsa.c | 12 +++++++++++- > net/dsa/tag_dsa.c | 17 ++++++++++++++++- > 2 files changed, 27 insertions(+), 2 deletions(-) > > diff --git a/net/dsa/dsa.c b/net/dsa/dsa.c > index a1b1dc8a4d87..7325bf4608e9 100644 > --- a/net/dsa/dsa.c > +++ b/net/dsa/dsa.c > @@ -219,11 +219,21 @@ static int dsa_switch_rcv(struct sk_buff *skb, struct > net_device *dev, > } > > skb = nskb; > - p = netdev_priv(skb->dev); > skb_push(skb, ETH_HLEN); > skb->pkt_type = PACKET_HOST; > skb->protocol = eth_type_trans(skb, skb->dev); > > + if (unlikely(!dsa_slave_dev_check(skb->dev))) { > + /* Packet is to be injected directly on an upper > + * device, e.g. a team/bond, so skip all DSA-port > + * specific actions. > + */ > + netif_rx(skb); > + return 0;
netif_rx returns an int code, it seems odd to ignore it. > + } > + > + p = netdev_priv(skb->dev); > + > if (unlikely(cpu_dp->ds->untag_bridge_pvid)) { > nskb = dsa_untag_bridge_pvid(skb); > if (!nskb) {