11 Sep, 2016

4 commits

  • No longer needed

    Signed-off-by: David Ahern
    Signed-off-by: David S. Miller

    David Ahern
     
  • No longer needed

    Signed-off-by: David Ahern
    Signed-off-by: David S. Miller

    David Ahern
     
  • Flip the IPv6 output path to use the l3mdev tx out hook. The VRF dst
    is not returned on the first FIB lookup. Instead, the dst on the
    skb is switched at the beginning of the IPv6 output processing to
    send the packet to the VRF driver on xmit.

    Link scope addresses (linklocal and multicast) need special handling:
    specifically the oif the flow struct can not be changed because we
    want the lookup tied to the enslaved interface. ie., the source address
    and the returned route MUST point to the interface scope passed in.
    Convert the existing vrf_get_rt6_dst to handle only link scope addresses.

    Signed-off-by: David Ahern
    Signed-off-by: David S. Miller

    David Ahern
     
  • Add l3mdev hook to set FLOWI_FLAG_SKIP_NH_OIF flag and update oif/iif
    in flow struct if its oif or iif points to a device enslaved to an L3
    Master device. Only 1 needs to be converted to match the l3mdev FIB
    rule. This moves the flow adjustment for l3mdev to a single point
    catching all lookups. It is redundant for existing hooks (those are
    removed in later patches) but is needed for missed lookups such as
    PMTU updates.

    Signed-off-by: David Ahern
    Signed-off-by: David S. Miller

    David Ahern
     

18 Jun, 2016

1 commit

  • IPv6 source address selection needs to consider the real egress route.
    Similar to IPv4 implement a get_saddr6 method which is called if
    source address has not been set. The get_saddr6 method does a full
    lookup which means pulling a route from the VRF FIB table and properly
    considering linklocal/multicast destination addresses. Lookup failures
    (eg., unreachable) then cause the source address selection to fail
    which gets propagated back to the caller.

    Signed-off-by: David Ahern
    Signed-off-by: David S. Miller

    David Ahern
     

16 Jun, 2016

1 commit


09 Jun, 2016

1 commit

  • Currently, VRFs require 1 oif and 1 iif rule per address family per
    VRF. As the number of VRF devices increases it brings scalability
    issues with the increasing rule list. All of the VRF rules have the
    same format with the exception of the specific table id to direct the
    lookup. Since the table id is available from the oif or iif in the
    loopup, the VRF rules can be consolidated to a single rule that pulls
    the table from the VRF device.

    This patch introduces a new rule attribute l3mdev. The l3mdev rule
    means the table id used for the lookup is pulled from the L3 master
    device (e.g., VRF) rather than being statically defined. With the
    l3mdev rule all of the basic VRF FIB rules are reduced to 1 l3mdev
    rule per address family (IPv4 and IPv6).

    If an admin wishes to insert higher priority rules for specific VRFs
    those rules will co-exist with the l3mdev rule. This capability means
    current VRF scripts will co-exist with this new simpler implementation.

    Currently, the rules list for both ipv4 and ipv6 look like this:
    $ ip ru ls
    1000: from all oif vrf1 lookup 1001
    1000: from all iif vrf1 lookup 1001
    1000: from all oif vrf2 lookup 1002
    1000: from all iif vrf2 lookup 1002
    1000: from all oif vrf3 lookup 1003
    1000: from all iif vrf3 lookup 1003
    1000: from all oif vrf4 lookup 1004
    1000: from all iif vrf4 lookup 1004
    1000: from all oif vrf5 lookup 1005
    1000: from all iif vrf5 lookup 1005
    1000: from all oif vrf6 lookup 1006
    1000: from all iif vrf6 lookup 1006
    1000: from all oif vrf7 lookup 1007
    1000: from all iif vrf7 lookup 1007
    1000: from all oif vrf8 lookup 1008
    1000: from all iif vrf8 lookup 1008
    ...
    32765: from all lookup local
    32766: from all lookup main
    32767: from all lookup default

    With the l3mdev rule the list is just the following regardless of the
    number of VRFs:
    $ ip ru ls
    1000: from all lookup [l3mdev table]
    32765: from all lookup local
    32766: from all lookup main
    32767: from all lookup default

    (Note: the above pretty print of the rule is based on an iproute2
    prototype. Actual verbage may change)

    Signed-off-by: David Ahern
    Signed-off-by: David S. Miller

    David Ahern
     

10 May, 2016

2 commits

  • Allow udp and raw sockets to send by oif that is an enslaved interface
    versus the l3mdev/VRF device. For example, this allows BFD to use ifindex
    from IP_PKTINFO on a receive to send a response without the need to
    convert to the VRF index. It also allows ping and ping6 to work when
    specifying an enslaved interface (e.g., ping -I swp1 ) which is
    a natural use case.

    Signed-off-by: David Ahern
    Signed-off-by: David S. Miller

    David Ahern
     
  • Move l3mdev_rt6_dst_by_oif and l3mdev_get_saddr to l3mdev.c. Collapse
    l3mdev_get_rt6_dst into l3mdev_rt6_dst_by_oif since it is the only
    user and keep the l3mdev_get_rt6_dst name for consistency with other
    hooks.

    A follow-on patch adds more code to these functions making them long
    for inlined functions.

    Signed-off-by: David Ahern
    Signed-off-by: David S. Miller

    David Ahern
     

27 Feb, 2016

1 commit

  • David Lamparter noted a use case where the source address selection fails
    to pick an address from a VRF interface - unnumbered interfaces.

    Relevant commands from his script:
    ip addr add 9.9.9.9/32 dev lo
    ip link set lo up

    ip link add name vrf0 type vrf table 101
    ip rule add oif vrf0 table 101
    ip rule add iif vrf0 table 101
    ip link set vrf0 up
    ip addr add 10.0.0.3/32 dev vrf0

    ip link add name dummy2 type dummy
    ip link set dummy2 master vrf0 up

    --> note dummy2 has no address - unnumbered device

    ip route add 10.2.2.2/32 dev dummy2 table 101
    ip neigh add 10.2.2.2 dev dummy2 lladdr 02:00:00:00:00:02

    tcpdump -ni dummy2 &

    And using ping instead of his socat example:
    $ ping -I vrf0 -c1 10.2.2.2
    ping: Warning: source address might be selected on device other than vrf0.
    PING 10.2.2.2 (10.2.2.2) from 9.9.9.9 vrf0: 56(84) bytes of data.

    >From tcpdump:
    12:57:29.449128 IP 9.9.9.9 > 10.2.2.2: ICMP echo request, id 2491, seq 1, length 64

    Note the source address is from lo and is not a VRF local address. With
    this patch:

    $ ping -I vrf0 -c1 10.2.2.2
    PING 10.2.2.2 (10.2.2.2) from 10.0.0.3 vrf0: 56(84) bytes of data.

    >From tcpdump:
    12:59:25.096426 IP 10.0.0.3 > 10.2.2.2: ICMP echo request, id 2113, seq 1, length 64

    Now the source address comes from vrf0.

    The ipv4 function for selecting source address takes a const argument.
    Removing the const requires touching a lot of places, so instead
    l3mdev_master_ifindex_rcu is changed to take a const argument and then
    do the typecast to non-const as required by netdev_master_upper_dev_get_rcu.
    This is similar to what l3mdev_fib_table_rcu does.

    IPv6 for unnumbered interfaces appears to be selecting the addresses
    properly.

    Cc: David Lamparter
    Signed-off-by: David Ahern
    Signed-off-by: David S. Miller

    David Ahern
     

07 Oct, 2015

1 commit

  • IPv6 addrconf keys off of IFF_SLAVE so can not use it for L3 slave.
    Add a new private flag and add netif_is_l3_slave function for checking
    it.

    Signed-off-by: David Ahern
    Signed-off-by: David S. Miller

    David Ahern
     

30 Sep, 2015

1 commit

  • L3 master devices allow users of the abstraction to influence FIB lookups
    for enslaved devices. Current API provides a means for the master device
    to return a specific FIB table for an enslaved device, to return an
    rtable/custom dst and influence the OIF used for fib lookups.

    Signed-off-by: David Ahern
    Signed-off-by: David S. Miller

    David Ahern