Skip to content
  • Brenden Blanco's avatar
    ipvlan: read direct ifindex instead of iflink · 63b11e75
    Brenden Blanco authored
    
    
    In the ipv4 outbound path of an ipvlan device in l3 mode, the ifindex is
    being grabbed from dev_get_iflink. This works for the physical device
    case, since as the documentation of that function notes: "Physical
    interfaces have the same 'ifindex' and 'iflink' values.".  However, if
    the master device is a veth, and the pairs are in separate net
    namespaces, the route lookup will fail with -ENODEV due to outer veth
    pair being in a separate namespace from the ipvlan master/routing
    namespace.
    
      ns0    |   ns1    |   ns2
     veth0a--|--veth0b--|--ipvl0
    
    In ipvlan_process_v4_outbound(), a packet sent from ipvl0 in the above
    configuration will pass fl.flowi4_oif == veth0a to
    ip_route_output_flow(), but *net == ns1.
    
    Notice also that ipv6 processing is not using iflink. Since there is a
    discrepancy in usage, fixup both v4 and v6 case to use local dev
    variable.
    
    Tested this with l3 ipvlan on top of veth, as well as with single
    physical interface in the top namespace.
    
    Signed-off-by: default avatarBrenden Blanco <bblanco@plumgrid.com>
    Reviewed-by: default avatarJiri Benc <jbenc@redhat.com>
    Acked-by: default avatarMahesh Bandewar <maheshb@google.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    63b11e75