Message ID | 20190624034913.40328-1-yuehaibing@huawei.com |
---|---|
State | Changes Requested |
Delegated to: | David Miller |
Headers | show |
Series | [v2] flow_dissector: Fix vlan header offset in __skb_flow_dissect | expand |
From: YueHaibing <yuehaibing@huawei.com> Date: Mon, 24 Jun 2019 11:49:13 +0800 > @@ -998,6 +998,9 @@ bool __skb_flow_dissect(const struct net *net, > skb && skb_vlan_tag_present(skb)) { > proto = skb->protocol; > } else { > + if (dissector_vlan == FLOW_DISSECTOR_KEY_MAX) > + nhoff -= sizeof(*vlan); > + But this is wrong when we are being called via eth_get_headlen(), in that case nhoff will be sizeof(struct ethhdr).
Thu, Jun 27, 2019 at 04:28:29AM CEST, davem@davemloft.net wrote: >From: YueHaibing <yuehaibing@huawei.com> >Date: Mon, 24 Jun 2019 11:49:13 +0800 > >> @@ -998,6 +998,9 @@ bool __skb_flow_dissect(const struct net *net, >> skb && skb_vlan_tag_present(skb)) { >> proto = skb->protocol; >> } else { >> + if (dissector_vlan == FLOW_DISSECTOR_KEY_MAX) >> + nhoff -= sizeof(*vlan); >> + > >But this is wrong when we are being called via eth_get_headlen(), in >that case nhoff will be sizeof(struct ethhdr). This patch was replaced by: [PATCH] bonding: Always enable vlan tx offload http://patchwork.ozlabs.org/patch/1122886/
diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c index 01ad60b..ff85934 100644 --- a/net/core/flow_dissector.c +++ b/net/core/flow_dissector.c @@ -998,6 +998,9 @@ bool __skb_flow_dissect(const struct net *net, skb && skb_vlan_tag_present(skb)) { proto = skb->protocol; } else { + if (dissector_vlan == FLOW_DISSECTOR_KEY_MAX) + nhoff -= sizeof(*vlan); + vlan = __skb_header_pointer(skb, nhoff, sizeof(_vlan), data, hlen, &_vlan); if (!vlan) {
We build vlan on top of bonding interface, which vlan offload is off, bond mode is 802.3ad (LACP) and xmit_hash_policy is BOND_XMIT_POLICY_ENCAP34. __skb_flow_dissect() fails to get information from protocol headers encapsulated within vlan, because 'nhoff' is points to IP header, so bond hashing is based on layer 2 info, which fails to distribute packets across slaves. Fixes: d5709f7ab776 ("flow_dissector: For stripped vlan, get vlan info from skb->vlan_tci") Signed-off-by: YueHaibing <yuehaibing@huawei.com> --- v2: remove redundant spaces --- net/core/flow_dissector.c | 3 +++ 1 file changed, 3 insertions(+)