openvswitch: mpls: set network header correctly on key extract
After the48d2ab609b
("net: mpls: Fixups for GSO"), MPLS handling in openvswitch was changed to have network header pointing to the start of the MPLS headers and inner_network_header pointing after the MPLS headers. However, key_extract was missed by the mentioned commit, causing incorrect headers to be set when a MPLS packet just enters the bridge or after it is recirculated. Fixes:48d2ab609b
("net: mpls: Fixups for GSO") Signed-off-by: Jiri Benc <jbenc@redhat.com> Acked-by: Pravin B Shelar <pshelar@ovn.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
ab58070569
commit
f7d49bce8e
@ -633,12 +633,7 @@ static int key_extract(struct sk_buff *skb, struct sw_flow_key *key)
|
||||
} else if (eth_p_mpls(key->eth.type)) {
|
||||
size_t stack_len = MPLS_HLEN;
|
||||
|
||||
/* In the presence of an MPLS label stack the end of the L2
|
||||
* header and the beginning of the L3 header differ.
|
||||
*
|
||||
* Advance network_header to the beginning of the L3
|
||||
* header. mac_len corresponds to the end of the L2 header.
|
||||
*/
|
||||
skb_set_inner_network_header(skb, skb->mac_len);
|
||||
while (1) {
|
||||
__be32 lse;
|
||||
|
||||
@ -646,12 +641,12 @@ static int key_extract(struct sk_buff *skb, struct sw_flow_key *key)
|
||||
if (unlikely(error))
|
||||
return 0;
|
||||
|
||||
memcpy(&lse, skb_network_header(skb), MPLS_HLEN);
|
||||
memcpy(&lse, skb_inner_network_header(skb), MPLS_HLEN);
|
||||
|
||||
if (stack_len == MPLS_HLEN)
|
||||
memcpy(&key->mpls.top_lse, &lse, MPLS_HLEN);
|
||||
|
||||
skb_set_network_header(skb, skb->mac_len + stack_len);
|
||||
skb_set_inner_network_header(skb, skb->mac_len + stack_len);
|
||||
if (lse & htonl(MPLS_LS_S_MASK))
|
||||
break;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user