]> git.proxmox.com Git - mirror_ovs.git/commit - acinclude.m4
datapath: Fixups for MPLS GSO
authorYi-Hung Wei <yihung.wei@gmail.com>
Mon, 1 May 2017 17:24:31 +0000 (10:24 -0700)
committerSimon Horman <simon.horman@netronome.com>
Wed, 3 May 2017 15:49:13 +0000 (17:49 +0200)
commit65590144c9de852fd1793d30c00e585c6acd5e72
treebbd1de73980eee1ef054f4589e2d3ef5686f1c92
parentd81af5eb38e81f423127a6e841cf09104575d51b
datapath: Fixups for MPLS GSO

This patch backports the following two upstream commits to fix MPLS GSO in
ovs datapath. Starting from upstream commit 48d2ab609b6b ("net: mpls: Fixups
for GSO"), the mpls_gso kernel module relies on the fact that
skb_network_header() points to the mpls header and skb_inner_network_header()
points to the L3 header so that it can derive the length of mpls header
correctly, and the upstream commit updates how ovs datapath marks the skb
header when push and pop mpls. However, the old mpls_gso kernel module
assumes that the skb_network_header() points to the L3 header, and the old
mpls_gso kernel module will misbehave if the ovs datapath marks the
skb_network_header() in the new way since it will treat mpls header as the L3
header.

Because of the functional signature of mpls_gso_segment() does not change,
this backport patch uses the new mpls_hdr() to determine if the kernel that
ovs datapath is compiled with has the new or legacy mpls_gso kernel module.
It has been tested on kernel 4.4 and 4.9.

Upstream commit:
    commit 48d2ab609b6bbecb7698487c8579bc40de9d6dfa
    Author: David Ahern <dsa@cumulusnetworks.com>
    Date:   Wed Aug 24 20:10:44 2016 -0700

    net: mpls: Fixups for GSO

    As reported by Lennert the MPLS GSO code is failing to properly segment
    large packets. There are a couple of problems:

    1. the inner protocol is not set so the gso segment functions for inner
       protocol layers are not getting run, and

    2  MPLS labels for packets that use the "native" (non-OVS) MPLS code
       are not properly accounted for in mpls_gso_segment.

    The MPLS GSO code was added for OVS. It is re-using skb_mac_gso_segment
    to call the gso segment functions for the higher layer protocols. That
    means skb_mac_gso_segment is called twice -- once with the network
    protocol set to MPLS and again with the network protocol set to the
    inner protocol.

    This patch sets the inner skb protocol addressing item 1 above and sets
    the network_header and inner_network_header to mark where the MPLS labels
    start and end. The MPLS code in OVS is also updated to set the two
    network markers.

    >From there the MPLS GSO code uses the difference between the network
    header and the inner network header to know the size of the MPLS header
    that was pushed. It then pulls the MPLS header, resets the mac_len and
    protocol for the inner protocol and then calls skb_mac_gso_segment
    to segment the skb.

    Afterward the inner protocol segmentation is done the skb protocol
    is set to mpls for each segment and the network and mac headers
    restored.

Reported-by: Lennert Buytenhek <buytenh@wantstofly.org>
Signed-off-by: David Ahern <dsa@cumulusnetworks.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Upstream commit:
    commit 85de4a2101acb85c3b1dde465e84596ccca99f2c
    Author: Jiri Benc <jbenc@redhat.com>
    Date:   Fri Sep 30 19:08:07 2016 +0200

    openvswitch: use mpls_hdr

    skb_mpls_header is equivalent to mpls_hdr now. Use the existing helper
    instead.

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>
Signed-off-by: Yi-Hung Wei <yihung.wei@gmail.com>
Signed-off-by: Simon Horman <simon.horman@netronome.com>
acinclude.m4
datapath/actions.c
datapath/linux/compat/include/net/mpls.h