mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-26 04:16:39 +00:00
bd954b8260
It would be nice if tagging protocol drivers could include just the header they need, since they are (mostly) data path and isolated from most of the other DSA core code does. Create a tag.c and a tag.h file which are meant to support tagging protocol drivers. Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> Reviewed-by: Florian Fainelli <f.fainelli@gmail.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
66 lines
1.4 KiB
C
66 lines
1.4 KiB
C
// SPDX-License-Identifier: GPL-2.0+
|
|
/*
|
|
* XRS700x tag format handling
|
|
* Copyright (c) 2008-2009 Marvell Semiconductor
|
|
* Copyright (c) 2020 NovaTech LLC
|
|
*/
|
|
|
|
#include <linux/bitops.h>
|
|
|
|
#include "tag.h"
|
|
|
|
#define XRS700X_NAME "xrs700x"
|
|
|
|
static struct sk_buff *xrs700x_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
{
|
|
struct dsa_port *partner, *dp = dsa_slave_to_port(dev);
|
|
u8 *trailer;
|
|
|
|
trailer = skb_put(skb, 1);
|
|
trailer[0] = BIT(dp->index);
|
|
|
|
if (dp->hsr_dev)
|
|
dsa_hsr_foreach_port(partner, dp->ds, dp->hsr_dev)
|
|
if (partner != dp)
|
|
trailer[0] |= BIT(partner->index);
|
|
|
|
return skb;
|
|
}
|
|
|
|
static struct sk_buff *xrs700x_rcv(struct sk_buff *skb, struct net_device *dev)
|
|
{
|
|
int source_port;
|
|
u8 *trailer;
|
|
|
|
trailer = skb_tail_pointer(skb) - 1;
|
|
|
|
source_port = ffs((int)trailer[0]) - 1;
|
|
|
|
if (source_port < 0)
|
|
return NULL;
|
|
|
|
skb->dev = dsa_master_find_slave(dev, 0, source_port);
|
|
if (!skb->dev)
|
|
return NULL;
|
|
|
|
if (pskb_trim_rcsum(skb, skb->len - 1))
|
|
return NULL;
|
|
|
|
/* Frame is forwarded by hardware, don't forward in software. */
|
|
dsa_default_offload_fwd_mark(skb);
|
|
|
|
return skb;
|
|
}
|
|
|
|
static const struct dsa_device_ops xrs700x_netdev_ops = {
|
|
.name = XRS700X_NAME,
|
|
.proto = DSA_TAG_PROTO_XRS700X,
|
|
.xmit = xrs700x_xmit,
|
|
.rcv = xrs700x_rcv,
|
|
.needed_tailroom = 1,
|
|
};
|
|
|
|
MODULE_LICENSE("GPL");
|
|
MODULE_ALIAS_DSA_TAG_DRIVER(DSA_TAG_PROTO_XRS700X, XRS700X_NAME);
|
|
|
|
module_dsa_tag_driver(xrs700x_netdev_ops);
|