On Tue, Dec 01, 2020 at 23:24, Vladimir Oltean <olte...@gmail.com> wrote: > 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.
This is exactly the same treatment that the return code from gro_cells_receive gets just a few lines down. They return the same set of codes (NET_RX_{SUCCESS,DROP}). Looking through the source base, there are a few callers that look at the return value (the overwhelming majority ignore it). Actions vary from printing warnings (without rate-limit, yikes), setting variables that are otherwise unused, or bumping a counter (the only reasonable thing I have seen). But looking through enqueue_to_backlog, it seems like there already is a counter for this that is accessible from /proc/net/softnet_data. >> + } >> + >> + p = netdev_priv(skb->dev); >> + >> if (unlikely(cpu_dp->ds->untag_bridge_pvid)) { >> nskb = dsa_untag_bridge_pvid(skb); >> if (!nskb) {