2
0
mirror of https://github.com/edk2-porting/linux-next.git synced 2024-12-22 12:14:01 +08:00

net: dsa: Implement flow dissection for tag_brcm.c

Provide a flow_dissect callback which returns the network offset and
where to find the skb protocol, given the tags structure a common
function works for both tagging formats that are supported.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
Reviewed-by: Vivien Didelot <vivien.didelot@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Florian Fainelli 2020-03-22 14:09:57 -07:00 committed by David S. Miller
parent 4076c693d3
commit 52015366e3

View File

@ -142,6 +142,27 @@ static struct sk_buff *brcm_tag_rcv_ll(struct sk_buff *skb,
return skb;
}
static int brcm_tag_flow_dissect(const struct sk_buff *skb, __be16 *proto,
int *offset)
{
/* We have been called on the DSA master network device after
* eth_type_trans() which pulled the Ethernet header already.
* Frames have one of these two layouts:
* -----------------------------------
* | MAC DA | MAC SA | 4b tag | Type | DSA_TAG_PROTO_BRCM
* -----------------------------------
* -----------------------------------
* | 4b tag | MAC DA | MAC SA | Type | DSA_TAG_PROTO_BRCM_PREPEND
* -----------------------------------
* skb->data points 2 bytes before the actual Ethernet type field and
* we have an offset of 4bytes between where skb->data and where the
* payload starts.
*/
*offset = BRCM_TAG_LEN;
*proto = ((__be16 *)skb->data)[1];
return 0;
}
#endif
#if IS_ENABLED(CONFIG_NET_DSA_TAG_BRCM)
@ -177,6 +198,7 @@ static const struct dsa_device_ops brcm_netdev_ops = {
.xmit = brcm_tag_xmit,
.rcv = brcm_tag_rcv,
.overhead = BRCM_TAG_LEN,
.flow_dissect = brcm_tag_flow_dissect,
};
DSA_TAG_DRIVER(brcm_netdev_ops);
@ -205,6 +227,7 @@ static const struct dsa_device_ops brcm_prepend_netdev_ops = {
.xmit = brcm_tag_xmit_prepend,
.rcv = brcm_tag_rcv_prepend,
.overhead = BRCM_TAG_LEN,
.flow_dissect = brcm_tag_flow_dissect,
};
DSA_TAG_DRIVER(brcm_prepend_netdev_ops);