22 Jul, 2015

1 commit

  • This implementation uses lwtunnel infrastructure to register
    hooks for mpls tunnel encaps.

    It picks cues from iptunnel_encaps infrastructure and previous
    mpls iptunnel RFC patches from Eric W. Biederman and Robert Shearman

    Signed-off-by: Roopa Prabhu
    Signed-off-by: David S. Miller

    Roopa Prabhu
     

12 Mar, 2015

1 commit

  • CONFIG_MPLS=m doesn't result in a kernel module being built because it
    applies to the net/mpls directory, rather than to .o files.

    So revert the MPLS menuitem to being a boolean and make MPLS_GSO and
    MPLS_ROUTING tristates to allow mpls_gso and mpls_router modules to be
    produced as desired.

    Cc: "Eric W. Biederman"
    Signed-off-by: Robert Shearman
    Signed-off-by: David S. Miller

    Robert Shearman
     

04 Mar, 2015

1 commit

  • This change adds a new Kconfig option MPLS_ROUTING.

    The core of this change is the code to look at an mpls packet received
    from another machine. Look that packet up in a routing table and
    forward the packet on.

    Support of MPLS over ATM is not considered or attempted here. This
    implemntation follows RFC3032 and implements the MPLS shim header that
    can pass over essentially any network.

    What RFC3021 refers to as the as the Incoming Label Map (ILM) I call
    net->mpls.platform_label[]. What RFC3031 refers to as the Next Label
    Hop Forwarding Entry (NHLFE) I call mpls_route. Though calling it the
    label fordwarding information base (lfib) might also be valid.

    Further the implemntation forwards packets as described in RFC3032.
    There is no need and given the original motivation for MPLS a strong
    discincentive to have a flexible label forwarding path. In essence
    the logic is the topmost label is read, looked up, removed, and
    replaced by 0 or more new lables and the sent out the specified
    interface to it's next hop.

    Quite a few optional features are not implemented here. Among them
    are generation of ICMP errors when the TTL is exceeded or the packet
    is larger than the next hop MTU (those conditions are detected and the
    packets are dropped instead of generating an icmp error). The traffic
    class field is always set to 0. The implementation focuses on IP over
    MPLS and does not handle egress of other kinds of protocols.

    Instead of implementing coordination with the neighbour table and
    sorting out how to input next hops in a different address family (for
    which there is value). I was lazy and implemented a next hop mac
    address instead. The code is simpler and there are flavor of MPLS
    such as MPLS-TP where neither an IPv4 nor an IPv6 next hop is
    appropriate so a next hop by mac address would need to be implemented
    at some point.

    Two new definitions AF_MPLS and PF_MPLS are exposed to userspace.

    Decoding the mpls header must be done by first byeswapping a 32bit bit
    endian word into the local cpu endian and then bit shifting to extract
    the pieces. There is no C bit-field that can represent a wire format
    mpls header on a little endian machine as the low bits of the 20bit
    label wind up in the wrong half of third byte. Therefore internally
    everything is deal with in cpu native byte order except when writing
    to and reading from a packet.

    For management simplicity if a label is configured to forward out
    an interface that is down the packet is dropped early. Similarly
    if an network interface is removed rt_dev is updated to NULL
    (so no reference is preserved) and any packets for that label
    are dropped. Keeping the label entries in the kernel allows
    the kernel label table to function as the definitive source
    of which labels are allocated and which are not.

    Signed-off-by: "Eric W. Biederman"
    Signed-off-by: David S. Miller

    Eric W. Biederman
     

01 Nov, 2014

1 commit


28 May, 2013

1 commit

  • In the case where a non-MPLS packet is received and an MPLS stack is
    added it may well be the case that the original skb is GSO but the
    NIC used for transmit does not support GSO of MPLS packets.

    The aim of this code is to provide GSO in software for MPLS packets
    whose skbs are GSO.

    SKB Usage:

    When an implementation adds an MPLS stack to a non-MPLS packet it should do
    the following to skb metadata:

    * Set skb->inner_protocol to the old non-MPLS ethertype of the packet.
    skb->inner_protocol is added by this patch.

    * Set skb->protocol to the new MPLS ethertype of the packet.

    * Set skb->network_header to correspond to the
    end of the L3 header, including the MPLS label stack.

    I have posted a patch, "[PATCH v3.29] datapath: Add basic MPLS support to
    kernel" which adds MPLS support to the kernel datapath of Open vSwtich.
    That patch sets the above requirements in datapath/actions.c:push_mpls()
    and was used to exercise this code. The datapath patch is against the Open
    vSwtich tree but it is intended that it be added to the Open vSwtich code
    present in the mainline Linux kernel at some point.

    Features:

    I believe that the approach that I have taken is at least partially
    consistent with the handling of other protocols. Jesse, I understand that
    you have some ideas here. I am more than happy to change my implementation.

    This patch adds dev->mpls_features which may be used by devices
    to advertise features supported for MPLS packets.

    A new NETIF_F_MPLS_GSO feature is added for devices which support
    hardware MPLS GSO offload. Currently no devices support this
    and MPLS GSO always falls back to software.

    Alternate Implementation:

    One possible alternate implementation is to teach netif_skb_features()
    and skb_network_protocol() about MPLS, in a similar way to their
    understanding of VLANs. I believe this would avoid the need
    for net/mpls/mpls_gso.c and in particular the calls to
    __skb_push() and __skb_push() in mpls_gso_segment().

    I have decided on the implementation in this patch as it should
    not introduce any overhead in the case where mpls_gso is not compiled
    into the kernel or inserted as a module.

    MPLS GSO suggested by Jesse Gross.
    Based in part on "v4 GRE: Add TCP segmentation offload for GRE"
    by Pravin B Shelar.

    Cc: Jesse Gross
    Cc: Pravin B Shelar
    Signed-off-by: Simon Horman
    Signed-off-by: David S. Miller

    Simon Horman