• Ido Schimmel's avatar
    ipv4: Fix incorrect route flushing when source address is deleted · f96a3d74
    Ido Schimmel authored
    Cited commit added the table ID to the FIB info structure, but did not
    prevent structures with different table IDs from being consolidated.
    This can lead to routes being flushed from a VRF when an address is
    deleted from a different VRF.
    
    Fix by taking the table ID into account when looking for a matching FIB
    info. This is already done for FIB info structures backed by a nexthop
    object in fib_find_info_nh().
    
    Add test cases that fail before the fix:
    
     # ./fib_tests.sh -t ipv4_del_addr
    
     IPv4 delete address route tests
         Regular FIB info
         TEST: Route removed from VRF when source address deleted            [ OK ]
         TEST: Route in default VRF not removed                              [ OK ]
         TEST: Route removed in default VRF when source address deleted      [ OK ]
         TEST: Route in VRF is not removed by address delete                 [ OK ]
         Identical FIB info with different table ID
         TEST: Route removed from VRF when source address deleted            [FAIL]
         TEST: Route in default VRF not removed                              [ OK ]
     RTNETLINK answers: File exists
         TEST: Route removed in default VRF when source address deleted      [ OK ]
         TEST: Route in VRF is not removed by address delete                 [FAIL]
    
     Tests passed:   6
     Tests failed:   2
    
    And pass after:
    
     # ./fib_tests.sh -t ipv4_del_addr
    
     IPv4 delete address route tests
         Regular FIB info
         TEST: Route removed from VRF when source address deleted            [ OK ]
         TEST: Route in default VRF not removed                              [ OK ]
         TEST: Route removed in default VRF when source address deleted      [ OK ]
         TEST: Route in VRF is not removed by address delete                 [ OK ]
         Identical FIB info with different table ID
         TEST: Route removed from VRF when source address deleted            [ OK ]
         TEST: Route in default VRF not removed                              [ OK ]
         TEST: Route removed in default VRF when source address deleted      [ OK ]
         TEST: Route in VRF is not removed by address delete                 [ OK ]
    
     Tests passed:   8
     Tests failed:   0
    
    Fixes: 5a56a0b3 ("net: Don't delete routes in different VRFs")
    Signed-off-by: default avatarIdo Schimmel <idosch@nvidia.com>
    Reviewed-by: default avatarDavid Ahern <dsahern@kernel.org>
    Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    f96a3d74
fib_semantics.c 53.1 KB