diff options
author | Jiri Benc <jbenc@redhat.com> | 2016-09-30 13:08:05 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-10-03 02:00:21 -0400 |
commit | f7d49bce8e741e1e6aa14ce4db1b6cea7e4be4e8 (patch) | |
tree | cdd0b8382ee068c406dfee9b0f329cc2c5c46c33 | |
parent | ab580705693d5af79663efa504a72248700766fc (diff) |
openvswitch: mpls: set network header correctly on key extract
After the 48d2ab609b6b ("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: 48d2ab609b6b ("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>
-rw-r--r-- | net/openvswitch/flow.c | 11 |
1 files changed, 3 insertions, 8 deletions
diff --git a/net/openvswitch/flow.c b/net/openvswitch/flow.c index 634cc10d6dee..c8c82e109c68 100644 --- a/net/openvswitch/flow.c +++ b/net/openvswitch/flow.c | |||
@@ -633,12 +633,7 @@ static int key_extract(struct sk_buff *skb, struct sw_flow_key *key) | |||
633 | } else if (eth_p_mpls(key->eth.type)) { | 633 | } else if (eth_p_mpls(key->eth.type)) { |
634 | size_t stack_len = MPLS_HLEN; | 634 | size_t stack_len = MPLS_HLEN; |
635 | 635 | ||
636 | /* In the presence of an MPLS label stack the end of the L2 | 636 | skb_set_inner_network_header(skb, skb->mac_len); |
637 | * header and the beginning of the L3 header differ. | ||
638 | * | ||
639 | * Advance network_header to the beginning of the L3 | ||
640 | * header. mac_len corresponds to the end of the L2 header. | ||
641 | */ | ||
642 | while (1) { | 637 | while (1) { |
643 | __be32 lse; | 638 | __be32 lse; |
644 | 639 | ||
@@ -646,12 +641,12 @@ static int key_extract(struct sk_buff *skb, struct sw_flow_key *key) | |||
646 | if (unlikely(error)) | 641 | if (unlikely(error)) |
647 | return 0; | 642 | return 0; |
648 | 643 | ||
649 | memcpy(&lse, skb_network_header(skb), MPLS_HLEN); | 644 | memcpy(&lse, skb_inner_network_header(skb), MPLS_HLEN); |
650 | 645 | ||
651 | if (stack_len == MPLS_HLEN) | 646 | if (stack_len == MPLS_HLEN) |
652 | memcpy(&key->mpls.top_lse, &lse, MPLS_HLEN); | 647 | memcpy(&key->mpls.top_lse, &lse, MPLS_HLEN); |
653 | 648 | ||
654 | skb_set_network_header(skb, skb->mac_len + stack_len); | 649 | skb_set_inner_network_header(skb, skb->mac_len + stack_len); |
655 | if (lse & htonl(MPLS_LS_S_MASK)) | 650 | if (lse & htonl(MPLS_LS_S_MASK)) |
656 | break; | 651 | break; |
657 | 652 | ||