• Robert Shearman's avatar
    ipv4: Avoid caching l3mdev dst on mismatched local route · b7c8487c
    Robert Shearman authored
    David reported that doing the following:
    
        ip li add red type vrf table 10
        ip link set dev eth1 vrf red
        ip addr add 127.0.0.1/8 dev red
        ip link set dev eth1 up
        ip li set red up
        ping -c1 -w1 -I red 127.0.0.1
        ip li del red
    
    when either policy routing IP rules are present or the local table
    lookup ip rule is before the l3mdev lookup results in a hang with
    these messages:
    
        unregister_netdevice: waiting for red to become free. Usage count = 1
    
    The problem is caused by caching the dst used for sending the packet
    out of the specified interface on a local route with a different
    nexthop interface. Thus the dst could stay around until the route in
    the table the lookup was done is deleted which may be never.
    
    Address the problem by not forcing output device to be the l3mdev in
    the flow's output interface if the lookup didn't use the l3mdev. This
    then results in the dst using the right device according to the route.
    
    Changes in v2:
     - make the dev_out passed in by __ip_route_output_key_hash correct
       instead of checking the nh dev if FLOWI_FLAG_SKIP_NH_OIF is set as
       suggested by David.
    
    Fixes: 5f02ce24 ("net: l3mdev: Allow the l3mdev to be a loopback")
    Reported-by: default avatarDavid Ahern <dsa@cumulusnetworks.com>
    Suggested-by: default avatarDavid Ahern <dsa@cumulusnetworks.com>
    Signed-off-by: default avatarRobert Shearman <rshearma@brocade.com>
    Acked-by: default avatarDavid Ahern <dsa@cumulusnetworks.com>
    Tested-by: default avatarDavid Ahern <dsa@cumulusnetworks.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    b7c8487c
route.c 72.7 KB