1. 06 5月, 2015 1 次提交
  2. 23 4月, 2015 2 次提交
    • R
      mpls: Per-device enabling of packet input · 37bde799
      Robert Shearman 提交于
      An MPLS network is a single trust domain where the edges must be in
      control of what labels make their way into the core. The simplest way
      of ensuring this is for the edge device to always impose the labels,
      and not allow forward labeled traffic from untrusted neighbours. This
      is achieved by allowing a per-device configuration of whether MPLS
      traffic input from that interface should be processed or not.
      
      To be secure by default, the default state is changed to MPLS being
      disabled on all interfaces unless explicitly enabled and no global
      option is provided to change the default. Whilst this differs from
      other protocols (e.g. IPv6), network operators are used to explicitly
      enabling MPLS forwarding on interfaces, and with the number of links
      to the MPLS core typically fairly low this doesn't present too much of
      a burden on operators.
      
      Cc: "Eric W. Biederman" <ebiederm@xmission.com>
      Signed-off-by: NRobert Shearman <rshearma@brocade.com>
      Reviewed-by: N"Eric W. Biederman" <ebiederm@xmission.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      37bde799
    • R
      mpls: Per-device MPLS state · 03c57747
      Robert Shearman 提交于
      Add per-device MPLS state to supported interfaces. Use the presence of
      this state in mpls_route_add to determine that this is a supported
      interface.
      
      Use the presence of mpls_dev to drop packets that arrived on an
      unsupported interface - previously they were allowed through.
      
      Cc: "Eric W. Biederman" <ebiederm@xmission.com>
      Signed-off-by: NRobert Shearman <rshearma@brocade.com>
      Reviewed-by: N"Eric W. Biederman" <ebiederm@xmission.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      03c57747
  3. 04 3月, 2015 2 次提交
    • E
      mpls: Functions for reading and wrinting mpls labels over netlink · 966bae33
      Eric W. Biederman 提交于
      Reading and writing addresses in network byte order in netlink is
      traditional and I see no reason to change that.  MPLS is interesting
      as effectively it has variabely length addresses (the MPLS label
      stack).  To represent these variable length addresses in netlink
      I use a valid MPLS label stack (complete with stop bit).
      
      This achieves two things: a well defined existing format is used,
      and the data can be interpreted without looking at it's length.
      
      Not needed to look at the length to decode the variable length
      network representation allows existing userspace functions
      such as inet_ntop to be used without needed to change their
      prototype.
      Signed-off-by: N"Eric W. Biederman" <ebiederm@xmission.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      966bae33
    • E
      mpls: Basic routing support · 0189197f
      Eric W. Biederman 提交于
      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: N"Eric W. Biederman" <ebiederm@xmission.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      0189197f