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:
parent
4076c693d3
commit
52015366e3
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user