• Stefano Brivio's avatar
    ipv4: Dump route exceptions if requested · ee28906f
    Stefano Brivio authored
    Since commit 4895c771 ("ipv4: Add FIB nexthop exceptions."), cached
    exception routes are stored as a separate entity, so they are not dumped
    on a FIB dump, even if the RTM_F_CLONED flag is passed.
    
    This implies that the command 'ip route list cache' doesn't return any
    result anymore.
    
    If the RTM_F_CLONED is passed, and strict checking requested, retrieve
    nexthop exception routes and dump them. If no strict checking is
    requested, filtering can't be performed consistently: dump everything in
    that case.
    
    With this, we need to add an argument to the netlink callback in order to
    track how many entries were already dumped for the last leaf included in
    a partial netlink dump.
    
    A single additional argument is sufficient, even if we traverse logically
    nested structures (nexthop objects, hash table buckets, bucket chains): it
    doesn't matter if we stop in the middle of any of those, because they are
    always traversed the same way. As an example, s_i values in [], s_fa
    values in ():
    
      node (fa) #1 [1]
        nexthop #1
        bucket #1 -> #0 in chain (1)
        bucket #2 -> #0 in chain (2) -> #1 in chain (3) -> #2 in chain (4)
        bucket #3 -> #0 in chain (5) -> #1 in chain (6)
    
        nexthop #2
        bucket #1 -> #0 in chain (7) -> #1 in chain (8)
        bucket #2 -> #0 in chain (9)
      --
      node (fa) #2 [2]
        nexthop #1
        bucket #1 -> #0 in chain (1) -> #1 in chain (2)
        bucket #2 -> #0 in chain (3)
    
    it doesn't matter if we stop at (3), (4), (7) for "node #1", or at (2)
    for "node #2": walking flattens all that.
    
    It would even be possible to drop the distinction between the in-tree
    (s_i) and in-node (s_fa) counter, but a further improvement might
    advise against this. This is only as accurate as the existing tracking
    mechanism for leaves: if a partial dump is restarted after exceptions
    are removed or expired, we might skip some non-dumped entries.
    
    To improve this, we could attach a 'sernum' attribute (similar to the
    one used for IPv6) to nexthop entities, and bump this counter whenever
    exceptions change: having a distinction between the two counters would
    make this more convenient.
    
    Listing of exception routes (modified routes pre-3.5) was tested against
    these versions of kernel and iproute2:
    
                        iproute2
    kernel         4.14.0   4.15.0   4.19.0   5.0.0   5.1.0
     3.5-rc4         +        +        +        +       +
     4.4
     4.9
     4.14
     4.15
     4.19
     5.0
     5.1
     fixed           +        +        +        +       +
    
    v7:
       - Move loop over nexthop objects to route.c, and pass struct fib_info
         and table ID to it, not a struct fib_alias (suggested by David Ahern)
       - While at it, note that the NULL check on fa->fa_info is redundant,
         and the check on RTNH_F_DEAD is also not consistent with what's done
         with regular route listing: just keep it for nhc_flags
       - Rename entry point function for dumping exceptions to
         fib_dump_info_fnhe(), and rearrange arguments for consistency with
         fib_dump_info()
       - Rename fnhe_dump_buckets() to fnhe_dump_bucket() and make it handle
         one bucket at a time
       - Expand commit message to describe why we can have a single "skip"
         counter for all exceptions stored in bucket chains in nexthop objects
         (suggested by David Ahern)
    
    v6:
       - Rebased onto net-next
       - Loop over nexthop paths too. Move loop over fnhe buckets to route.c,
         avoids need to export rt_fill_info() and to touch exceptions from
         fib_trie.c. Pass NULL as flow to rt_fill_info(), it now allows that
         (suggested by David Ahern)
    
    Fixes: 4895c771 ("ipv4: Add FIB nexthop exceptions.")
    Signed-off-by: default avatarStefano Brivio <sbrivio@redhat.com>
    Reviewed-by: default avatarDavid Ahern <dsahern@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    ee28906f
route.h 10.7 KB