Skip to content

Commit

Permalink
net: dsa: Factor bottom tag receive functions
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
ffainelli authored and davem330 committed Apr 8, 2017
1 parent 16c5dcb commit a86d8be
Show file tree
Hide file tree
Showing 9 changed files with 53 additions and 84 deletions.
2 changes: 1 addition & 1 deletion include/net/dsa.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
20 changes: 19 additions & 1 deletion net/dsa/dsa.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down Expand Up @@ -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);
Expand All @@ -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 = {
Expand Down
5 changes: 3 additions & 2 deletions net/dsa/dsa_priv.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
18 changes: 5 additions & 13 deletions net/dsa/tag_brcm.c
Original file line number Diff line number Diff line change
Expand Up @@ -92,8 +92,9 @@ static struct sk_buff *brcm_tag_xmit(struct sk_buff *skb, struct net_device *dev
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;
Expand Down Expand Up @@ -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 = {
Expand Down
18 changes: 5 additions & 13 deletions net/dsa/tag_dsa.c
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,9 @@ static struct sk_buff *dsa_xmit(struct sk_buff *skb, struct net_device *dev)
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;
Expand Down Expand Up @@ -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 = {
Expand Down
18 changes: 5 additions & 13 deletions net/dsa/tag_edsa.c
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,9 @@ static struct sk_buff *edsa_xmit(struct sk_buff *skb, struct net_device *dev)
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;
Expand Down Expand Up @@ -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 = {
Expand Down
20 changes: 5 additions & 15 deletions net/dsa/tag_mtk.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,9 @@ static struct sk_buff *mtk_tag_xmit(struct sk_buff *skb,
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;
Expand Down Expand Up @@ -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 = {
Expand Down
18 changes: 5 additions & 13 deletions net/dsa/tag_qca.c
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,9 @@ static struct sk_buff *qca_tag_xmit(struct sk_buff *skb, struct net_device *dev)
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;
Expand Down Expand Up @@ -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 = {
Expand Down
18 changes: 5 additions & 13 deletions net/dsa/tag_trailer.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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 = {
Expand Down

0 comments on commit a86d8be

Please sign in to comment.