Skip to content

Commit

Permalink
net: dsa: allow switches to work without tagging
Browse files Browse the repository at this point in the history
In case switch port tagging is disabled (voluntarily, or the switch just
does not support it), allow us to continue using the defined set of
dsa_device_ops in net/dsa/slave.c.

We introduce dsa_protocol_is_tagged() to check whether we need to
override skb->protocol and go through the DSA-specifif packet_type
function, or if we just go on and receive the SKB through the normal
path.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Florian Fainelli authored and David S. Miller committed Aug 28, 2014
1 parent 0d8bcdd commit 5aed85c
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 4 deletions.
6 changes: 3 additions & 3 deletions include/linux/netdevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -1784,10 +1784,10 @@ void dev_net_set(struct net_device *dev, struct net *net)
static inline bool netdev_uses_dsa(struct net_device *dev)
{
#ifdef CONFIG_NET_DSA
return dev->dsa_ptr != NULL;
#else
return false;
if (dev->dsa_ptr != NULL)
return dsa_uses_tagged_protocol(dev->dsa_ptr);
#endif
return false;
}

/**
Expand Down
5 changes: 5 additions & 0 deletions include/net/dsa.h
Original file line number Diff line number Diff line change
Expand Up @@ -198,4 +198,9 @@ static inline void *ds_to_priv(struct dsa_switch *ds)
return (void *)(ds + 1);
}

static inline bool dsa_uses_tagged_protocol(struct dsa_switch_tree *dst)
{
return dst->tag_protocol != 0;
}

#endif
19 changes: 18 additions & 1 deletion net/dsa/slave.c
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,17 @@ static netdev_tx_t dsa_slave_xmit(struct sk_buff *skb, struct net_device *dev)
return dst->ops->xmit(skb, dev);
}

static netdev_tx_t dsa_slave_notag_xmit(struct sk_buff *skb,
struct net_device *dev)
{
struct dsa_slave_priv *p = netdev_priv(dev);

skb->dev = p->parent->dst->master_netdev;
dev_queue_xmit(skb);

return NETDEV_TX_OK;
}


/* ethtool operations *******************************************************/
static int
Expand Down Expand Up @@ -314,6 +325,11 @@ static const struct net_device_ops dsa_slave_netdev_ops = {
.ndo_do_ioctl = dsa_slave_ioctl,
};

static const struct dsa_device_ops notag_netdev_ops = {
.xmit = dsa_slave_notag_xmit,
.rcv = NULL,
};

static void dsa_slave_adjust_link(struct net_device *dev)
{
struct dsa_slave_priv *p = netdev_priv(dev);
Expand Down Expand Up @@ -415,7 +431,8 @@ dsa_slave_create(struct dsa_switch *ds, struct device *parent,
break;
#endif
default:
BUG();
ds->dst->ops = &notag_netdev_ops;
break;
}

SET_NETDEV_DEV(slave_dev, parent);
Expand Down

0 comments on commit 5aed85c

Please sign in to comment.