diff options
Diffstat (limited to 'net/core/flow_dissector.c')
| -rw-r--r-- | net/core/flow_dissector.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c index 0cc672aba1f0..5b5be9577257 100644 --- a/net/core/flow_dissector.c +++ b/net/core/flow_dissector.c | |||
| @@ -4,6 +4,7 @@ | |||
| 4 | #include <linux/ip.h> | 4 | #include <linux/ip.h> |
| 5 | #include <linux/ipv6.h> | 5 | #include <linux/ipv6.h> |
| 6 | #include <linux/if_vlan.h> | 6 | #include <linux/if_vlan.h> |
| 7 | #include <net/dsa.h> | ||
| 7 | #include <net/ip.h> | 8 | #include <net/ip.h> |
| 8 | #include <net/ipv6.h> | 9 | #include <net/ipv6.h> |
| 9 | #include <net/gre.h> | 10 | #include <net/gre.h> |
| @@ -440,6 +441,17 @@ bool __skb_flow_dissect(const struct sk_buff *skb, | |||
| 440 | skb->vlan_proto : skb->protocol; | 441 | skb->vlan_proto : skb->protocol; |
| 441 | nhoff = skb_network_offset(skb); | 442 | nhoff = skb_network_offset(skb); |
| 442 | hlen = skb_headlen(skb); | 443 | hlen = skb_headlen(skb); |
| 444 | if (unlikely(netdev_uses_dsa(skb->dev))) { | ||
| 445 | const struct dsa_device_ops *ops; | ||
| 446 | int offset; | ||
| 447 | |||
| 448 | ops = skb->dev->dsa_ptr->tag_ops; | ||
| 449 | if (ops->flow_dissect && | ||
| 450 | !ops->flow_dissect(skb, &proto, &offset)) { | ||
| 451 | hlen -= offset; | ||
| 452 | nhoff += offset; | ||
| 453 | } | ||
| 454 | } | ||
| 443 | } | 455 | } |
| 444 | 456 | ||
| 445 | /* It is ensured by skb_flow_dissector_init() that control key will | 457 | /* It is ensured by skb_flow_dissector_init() that control key will |
