net: dsa: create a helper that strips EtherType DSA headers on RX
authorVladimir Oltean <vladimir.oltean@nxp.com>
Tue, 10 Aug 2021 13:13:53 +0000 (16:13 +0300)
committerDavid S. Miller <davem@davemloft.net>
Wed, 11 Aug 2021 13:44:58 +0000 (14:44 +0100)
All header taggers open-code a memmove that is fairly not all that
obvious, and we can hide the details behind a helper function, since the
only thing specific to the driver is the length of the header tag.

Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/dsa/dsa_priv.h
net/dsa/tag_brcm.c
net/dsa/tag_dsa.c
net/dsa/tag_lan9303.c
net/dsa/tag_mtk.c
net/dsa/tag_qca.c
net/dsa/tag_rtl4_a.c
net/dsa/tag_sja1105.c

index 9575cabd3ec348249edd12e19ad581edea59188c..8a12ec1f9d219ac01af115763f27c27b7682bbf0 100644 (file)
@@ -452,6 +452,32 @@ static inline void dsa_default_offload_fwd_mark(struct sk_buff *skb)
        skb->offload_fwd_mark = !!(dp->bridge_dev);
 }
 
+/* Helper for removing DSA header tags from packets in the RX path.
+ * Must not be called before skb_pull(len).
+ *                                                                 skb->data
+ *                                                                         |
+ *                                                                         v
+ * |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
+ * +-----------------------+-----------------------+---------------+-------+
+ * |    Destination MAC    |      Source MAC       |  DSA header   | EType |
+ * +-----------------------+-----------------------+---------------+-------+
+ *                                                 |               |
+ * <----- len ----->                               <----- len ----->
+ *                 |
+ *       >>>>>>>   v
+ *       >>>>>>>   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
+ *       >>>>>>>   +-----------------------+-----------------------+-------+
+ *       >>>>>>>   |    Destination MAC    |      Source MAC       | EType |
+ *                 +-----------------------+-----------------------+-------+
+ *                                                                         ^
+ *                                                                         |
+ *                                                                 skb->data
+ */
+static inline void dsa_strip_etype_header(struct sk_buff *skb, int len)
+{
+       memmove(skb->data - ETH_HLEN, skb->data - ETH_HLEN - len, 2 * ETH_ALEN);
+}
+
 /* switch.c */
 int dsa_switch_register_notifier(struct dsa_switch *ds);
 void dsa_switch_unregister_notifier(struct dsa_switch *ds);
index 96e93b544a0d80ad1eb958f55ebd96cc07ffd92c..2fc546b31ad87e1288a162481abcd34698b15190 100644 (file)
@@ -190,10 +190,7 @@ static struct sk_buff *brcm_tag_rcv(struct sk_buff *skb, struct net_device *dev)
        if (!nskb)
                return nskb;
 
-       /* Move the Ethernet DA and SA */
-       memmove(nskb->data - ETH_HLEN,
-               nskb->data - ETH_HLEN - BRCM_TAG_LEN,
-               2 * ETH_ALEN);
+       dsa_strip_etype_header(skb, BRCM_TAG_LEN);
 
        return nskb;
 }
@@ -270,10 +267,7 @@ static struct sk_buff *brcm_leg_tag_rcv(struct sk_buff *skb,
 
        dsa_default_offload_fwd_mark(skb);
 
-       /* Move the Ethernet DA and SA */
-       memmove(skb->data - ETH_HLEN,
-               skb->data - ETH_HLEN - BRCM_LEG_TAG_LEN,
-               2 * ETH_ALEN);
+       dsa_strip_etype_header(skb, BRCM_LEG_TAG_LEN);
 
        return skb;
 }
index e32f8160e895b0e861a8db2f433069560e922bed..ad9c841c998f5b0d4de2509c17f77569794ed7ab 100644 (file)
@@ -312,14 +312,10 @@ static struct sk_buff *dsa_rcv_ll(struct sk_buff *skb, struct net_device *dev,
                memcpy(dsa_header, new_header, DSA_HLEN);
 
                if (extra)
-                       memmove(skb->data - ETH_HLEN,
-                               skb->data - ETH_HLEN - extra,
-                               2 * ETH_ALEN);
+                       dsa_strip_etype_header(skb, extra);
        } else {
                skb_pull_rcsum(skb, DSA_HLEN);
-               memmove(skb->data - ETH_HLEN,
-                       skb->data - ETH_HLEN - DSA_HLEN - extra,
-                       2 * ETH_ALEN);
+               dsa_strip_etype_header(skb, DSA_HLEN + extra);
        }
 
        return skb;
index 58d3a0e712d217e364a2971b860c235817de0faf..af13c0a9cb416b41b20e92499dcedef3e9080159 100644 (file)
@@ -112,8 +112,9 @@ static struct sk_buff *lan9303_rcv(struct sk_buff *skb, struct net_device *dev)
         * and the current ethertype field.
         */
        skb_pull_rcsum(skb, 2 + 2);
-       memmove(skb->data - ETH_HLEN, skb->data - (ETH_HLEN + LAN9303_TAG_LEN),
-               2 * ETH_ALEN);
+
+       dsa_strip_etype_header(skb, LAN9303_TAG_LEN);
+
        if (!(lan9303_tag1 & LAN9303_TAG_RX_TRAPPED_TO_CPU))
                dsa_default_offload_fwd_mark(skb);
 
index bbf37c031d4475f3a4f3542970b231f30b7da5d1..6a78e9f146e57f8308bfd5a78305d50668505f12 100644 (file)
@@ -80,9 +80,7 @@ static struct sk_buff *mtk_tag_rcv(struct sk_buff *skb, struct net_device *dev)
        /* Remove MTK tag and recalculate checksum. */
        skb_pull_rcsum(skb, MTK_HDR_LEN);
 
-       memmove(skb->data - ETH_HLEN,
-               skb->data - ETH_HLEN - MTK_HDR_LEN,
-               2 * ETH_ALEN);
+       dsa_strip_etype_header(skb, MTK_HDR_LEN);
 
        /* Get source port information */
        port = (hdr & MTK_HDR_RECV_SOURCE_PORT_MASK);
index 6e31369904917316ed49859b52749a8e9a70d3d0..f9fc881da591bceba3ade83a6b906416d4749c09 100644 (file)
@@ -72,8 +72,7 @@ static struct sk_buff *qca_tag_rcv(struct sk_buff *skb, struct net_device *dev)
 
        /* Remove QCA tag and recalculate checksum */
        skb_pull_rcsum(skb, QCA_HDR_LEN);
-       memmove(skb->data - ETH_HLEN, skb->data - ETH_HLEN - QCA_HDR_LEN,
-               ETH_HLEN - QCA_HDR_LEN);
+       dsa_strip_etype_header(skb, QCA_HDR_LEN);
 
        /* Get source port information */
        port = (hdr & QCA_HDR_RECV_SOURCE_PORT_MASK);
index aaddca3c0245c94d4500f965282111c5b5127bd5..ff8707ff0c5bce107ae373a218e0006e48a4d45a 100644 (file)
@@ -108,10 +108,7 @@ static struct sk_buff *rtl4a_tag_rcv(struct sk_buff *skb,
        /* Remove RTL4 tag and recalculate checksum */
        skb_pull_rcsum(skb, RTL4_A_HDR_LEN);
 
-       /* Move ethernet DA and SA in front of the data */
-       memmove(skb->data - ETH_HLEN,
-               skb->data - ETH_HLEN - RTL4_A_HDR_LEN,
-               2 * ETH_ALEN);
+       dsa_strip_etype_header(skb, RTL4_A_HDR_LEN);
 
        dsa_default_offload_fwd_mark(skb);
 
index 38b2792f971d425f8c83739da8bcb33323fb20ff..33fbd3d025e70e749338ba6374987aac71975fa2 100644 (file)
@@ -532,9 +532,7 @@ static struct sk_buff *sja1110_rcv_inband_control_extension(struct sk_buff *skb,
        /* Advance skb->data past the DSA header */
        skb_pull_rcsum(skb, SJA1110_HEADER_LEN);
 
-       /* Remove the DSA header */
-       memmove(skb->data - ETH_HLEN, skb->data - ETH_HLEN - SJA1110_HEADER_LEN,
-               2 * ETH_ALEN);
+       dsa_strip_etype_header(skb, SJA1110_HEADER_LEN);
 
        /* With skb->data in its final place, update the MAC header
         * so that eth_hdr() continues to works properly.