net: dsa: Factor bottom tag receive functions
authorFlorian Fainelli <f.fainelli@gmail.com>
Sat, 8 Apr 2017 15:55:23 +0000 (08:55 -0700)
committerDavid S. Miller <davem@davemloft.net>
Sat, 8 Apr 2017 20:49:36 +0000 (13:49 -0700)
All DSA tag receive functions do strictly the same thing after they have located
the originating source port from their tag specific protocol:

- push ETH_HLEN bytes
- set pkt_type to PACKET_HOST
- call eth_type_trans()
- bump up counters
- call netif_receive_skb()

Factor all of that into dsa_switch_rcv(). This also makes us return a pointer to
a sk_buff, which makes us symetric with the xmit function.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/dsa.h
net/dsa/dsa.c
net/dsa/dsa_priv.h
net/dsa/tag_brcm.c
net/dsa/tag_dsa.c
net/dsa/tag_edsa.c
net/dsa/tag_mtk.c
net/dsa/tag_qca.c
net/dsa/tag_trailer.c

index 7ba9b1fb565ca17696ab3e5bcd08855d733281ab..9b1c1eb4147a167c58f8fc5457ac66ced3db1a45 100644 (file)
@@ -124,7 +124,7 @@ struct dsa_switch_tree {
         * protocol to use.
         */
        struct net_device       *master_netdev;
-       int                     (*rcv)(struct sk_buff *skb,
+       struct sk_buff *        (*rcv)(struct sk_buff *skb,
                                       struct net_device *dev,
                                       struct packet_type *pt,
                                       struct net_device *orig_dev);
index d370c8bfa372f484676041f946fc4006fd3c7af8..1fb9cf7aaaf498b332ec9af913b0279c369a5605 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/sysfs.h>
 #include <linux/phy_fixed.h>
 #include <linux/gpio/consumer.h>
+#include <linux/etherdevice.h>
 #include <net/dsa.h>
 #include "dsa_priv.h"
 
@@ -900,6 +901,7 @@ static int dsa_switch_rcv(struct sk_buff *skb, struct net_device *dev,
                          struct packet_type *pt, struct net_device *orig_dev)
 {
        struct dsa_switch_tree *dst = dev->dsa_ptr;
+       struct sk_buff *nskb = NULL;
 
        if (unlikely(dst == NULL)) {
                kfree_skb(skb);
@@ -910,7 +912,23 @@ static int dsa_switch_rcv(struct sk_buff *skb, struct net_device *dev,
        if (!skb)
                return 0;
 
-       return dst->rcv(skb, dev, pt, orig_dev);
+       nskb = dst->rcv(skb, dev, pt, orig_dev);
+       if (!nskb) {
+               kfree_skb(skb);
+               return 0;
+       }
+
+       skb = nskb;
+       skb_push(skb, ETH_HLEN);
+       skb->pkt_type = PACKET_HOST;
+       skb->protocol = eth_type_trans(skb, skb->dev);
+
+       skb->dev->stats.rx_packets++;
+       skb->dev->stats.rx_bytes += skb->len;
+
+       netif_receive_skb(skb);
+
+       return 0;
 }
 
 static struct packet_type dsa_pack_type __read_mostly = {
index 2a31399218110c07984e9c6f723ec13dd4a0f5f0..107138a55bd8697f4bf741cf883b4b94093ac282 100644 (file)
@@ -17,8 +17,9 @@
 
 struct dsa_device_ops {
        struct sk_buff *(*xmit)(struct sk_buff *skb, struct net_device *dev);
-       int (*rcv)(struct sk_buff *skb, struct net_device *dev,
-                  struct packet_type *pt, struct net_device *orig_dev);
+       struct sk_buff *(*rcv)(struct sk_buff *skb, struct net_device *dev,
+                              struct packet_type *pt,
+                              struct net_device *orig_dev);
 };
 
 struct dsa_slave_priv {
index 263941769c88d3c63072830d9845e2d0f7be684d..2a9b52c5af86b5308d7d71a3340a0e48768bdb60 100644 (file)
@@ -92,8 +92,9 @@ out_free:
        return NULL;
 }
 
-static int brcm_tag_rcv(struct sk_buff *skb, struct net_device *dev,
-                       struct packet_type *pt, struct net_device *orig_dev)
+static struct sk_buff *brcm_tag_rcv(struct sk_buff *skb, struct net_device *dev,
+                                   struct packet_type *pt,
+                                   struct net_device *orig_dev)
 {
        struct dsa_switch_tree *dst = dev->dsa_ptr;
        struct dsa_switch *ds;
@@ -133,21 +134,12 @@ static int brcm_tag_rcv(struct sk_buff *skb, struct net_device *dev,
                skb->data - ETH_HLEN - BRCM_TAG_LEN,
                2 * ETH_ALEN);
 
-       skb_push(skb, ETH_HLEN);
-       skb->pkt_type = PACKET_HOST;
        skb->dev = ds->ports[source_port].netdev;
-       skb->protocol = eth_type_trans(skb, skb->dev);
 
-       skb->dev->stats.rx_packets++;
-       skb->dev->stats.rx_bytes += skb->len;
-
-       netif_receive_skb(skb);
-
-       return 0;
+       return skb;
 
 out_drop:
-       kfree_skb(skb);
-       return 0;
+       return NULL;
 }
 
 const struct dsa_device_ops brcm_netdev_ops = {
index b7032699eaadfa90d56bd88ee68ba921a73c017d..1c6633f0de01909f950a03349b1b4c08c2151839 100644 (file)
@@ -68,8 +68,9 @@ out_free:
        return NULL;
 }
 
-static int dsa_rcv(struct sk_buff *skb, struct net_device *dev,
-                  struct packet_type *pt, struct net_device *orig_dev)
+static struct sk_buff *dsa_rcv(struct sk_buff *skb, struct net_device *dev,
+                              struct packet_type *pt,
+                              struct net_device *orig_dev)
 {
        struct dsa_switch_tree *dst = dev->dsa_ptr;
        struct dsa_switch *ds;
@@ -158,20 +159,11 @@ static int dsa_rcv(struct sk_buff *skb, struct net_device *dev,
        }
 
        skb->dev = ds->ports[source_port].netdev;
-       skb_push(skb, ETH_HLEN);
-       skb->pkt_type = PACKET_HOST;
-       skb->protocol = eth_type_trans(skb, skb->dev);
 
-       skb->dev->stats.rx_packets++;
-       skb->dev->stats.rx_bytes += skb->len;
-
-       netif_receive_skb(skb);
-
-       return 0;
+       return skb;
 
 out_drop:
-       kfree_skb(skb);
-       return 0;
+       return NULL;
 }
 
 const struct dsa_device_ops dsa_netdev_ops = {
index b87009672b40a21b10f523e1c478b6ae5786a20f..d9c668aa5e54682914a0e61b3cb6373a71a0ee8b 100644 (file)
@@ -81,8 +81,9 @@ out_free:
        return NULL;
 }
 
-static int edsa_rcv(struct sk_buff *skb, struct net_device *dev,
-                   struct packet_type *pt, struct net_device *orig_dev)
+static struct sk_buff *edsa_rcv(struct sk_buff *skb, struct net_device *dev,
+                               struct packet_type *pt,
+                               struct net_device *orig_dev)
 {
        struct dsa_switch_tree *dst = dev->dsa_ptr;
        struct dsa_switch *ds;
@@ -177,20 +178,11 @@ static int edsa_rcv(struct sk_buff *skb, struct net_device *dev,
        }
 
        skb->dev = ds->ports[source_port].netdev;
-       skb_push(skb, ETH_HLEN);
-       skb->pkt_type = PACKET_HOST;
-       skb->protocol = eth_type_trans(skb, skb->dev);
 
-       skb->dev->stats.rx_packets++;
-       skb->dev->stats.rx_bytes += skb->len;
-
-       netif_receive_skb(skb);
-
-       return 0;
+       return skb;
 
 out_drop:
-       kfree_skb(skb);
-       return 0;
+       return NULL;
 }
 
 const struct dsa_device_ops edsa_netdev_ops = {
index d0a477084870821b58a2f7007c6f404da8ce441b..837cdddb53f093c6283451f7626612312008bd0d 100644 (file)
@@ -47,8 +47,9 @@ out_free:
        return NULL;
 }
 
-static int mtk_tag_rcv(struct sk_buff *skb, struct net_device *dev,
-                      struct packet_type *pt, struct net_device *orig_dev)
+static struct sk_buff *mtk_tag_rcv(struct sk_buff *skb, struct net_device *dev,
+                                  struct packet_type *pt,
+                                  struct net_device *orig_dev)
 {
        struct dsa_switch_tree *dst = dev->dsa_ptr;
        struct dsa_switch *ds;
@@ -85,23 +86,12 @@ static int mtk_tag_rcv(struct sk_buff *skb, struct net_device *dev,
        if (!ds->ports[port].netdev)
                goto out_drop;
 
-       /* Update skb & forward the frame accordingly */
-       skb_push(skb, ETH_HLEN);
-
-       skb->pkt_type = PACKET_HOST;
        skb->dev = ds->ports[port].netdev;
-       skb->protocol = eth_type_trans(skb, skb->dev);
-
-       skb->dev->stats.rx_packets++;
-       skb->dev->stats.rx_bytes += skb->len;
-
-       netif_receive_skb(skb);
 
-       return 0;
+       return skb;
 
 out_drop:
-       kfree_skb(skb);
-       return 0;
+       return NULL;
 }
 
 const struct dsa_device_ops mtk_netdev_ops = {
index d1324649808c0a2917f1606baa0e3d6740e9f0f6..3ba3f59f7a3433b3731a5b3dc501eb22660d7cce 100644 (file)
@@ -66,8 +66,9 @@ out_free:
        return NULL;
 }
 
-static int qca_tag_rcv(struct sk_buff *skb, struct net_device *dev,
-                      struct packet_type *pt, struct net_device *orig_dev)
+static struct sk_buff *qca_tag_rcv(struct sk_buff *skb, struct net_device *dev,
+                                  struct packet_type *pt,
+                                  struct net_device *orig_dev)
 {
        struct dsa_switch_tree *dst = dev->dsa_ptr;
        struct dsa_switch *ds;
@@ -108,21 +109,12 @@ static int qca_tag_rcv(struct sk_buff *skb, struct net_device *dev,
                goto out_drop;
 
        /* Update skb & forward the frame accordingly */
-       skb_push(skb, ETH_HLEN);
-       skb->pkt_type = PACKET_HOST;
        skb->dev = ds->ports[port].netdev;
-       skb->protocol = eth_type_trans(skb, skb->dev);
 
-       skb->dev->stats.rx_packets++;
-       skb->dev->stats.rx_bytes += skb->len;
-
-       netif_receive_skb(skb);
-
-       return 0;
+       return skb;
 
 out_drop:
-       kfree_skb(skb);
-       return 0;
+       return NULL;
 }
 
 const struct dsa_device_ops qca_netdev_ops = {
index 1fc0b221a70fd8def65755e0eae03d90d36a94d8..aafc2fc74c3067dd05c67c409e40e8ceef33cf0c 100644 (file)
@@ -58,8 +58,9 @@ static struct sk_buff *trailer_xmit(struct sk_buff *skb, struct net_device *dev)
        return nskb;
 }
 
-static int trailer_rcv(struct sk_buff *skb, struct net_device *dev,
-                      struct packet_type *pt, struct net_device *orig_dev)
+static struct sk_buff *trailer_rcv(struct sk_buff *skb, struct net_device *dev,
+                                  struct packet_type *pt,
+                                  struct net_device *orig_dev)
 {
        struct dsa_switch_tree *dst = dev->dsa_ptr;
        struct dsa_switch *ds;
@@ -83,20 +84,11 @@ static int trailer_rcv(struct sk_buff *skb, struct net_device *dev,
        pskb_trim_rcsum(skb, skb->len - 4);
 
        skb->dev = ds->ports[source_port].netdev;
-       skb_push(skb, ETH_HLEN);
-       skb->pkt_type = PACKET_HOST;
-       skb->protocol = eth_type_trans(skb, skb->dev);
 
-       skb->dev->stats.rx_packets++;
-       skb->dev->stats.rx_bytes += skb->len;
-
-       netif_receive_skb(skb);
-
-       return 0;
+       return skb;
 
 out_drop:
-       kfree_skb(skb);
-       return 0;
+       return NULL;
 }
 
 const struct dsa_device_ops trailer_netdev_ops = {