• Hannes Frederic Sowa's avatar
    ipv6: fix route selection if kernel is not compiled with CONFIG_IPV6_ROUTER_PREF · afc154e9
    Hannes Frederic Sowa authored
    This is a follow-up patch to 3630d400
    ("ipv6: rt6_check_neigh should successfully verify neigh if no NUD
    information are available").
    
    Since the removal of rt->n in rt6_info we can end up with a dst ==
    NULL in rt6_check_neigh. In case the kernel is not compiled with
    CONFIG_IPV6_ROUTER_PREF we should also select a route with unkown
    NUD state but we must not avoid doing round robin selection on routes
    with the same target. So introduce and pass down a boolean ``do_rr'' to
    indicate when we should update rt->rr_ptr. As soon as no route is valid
    we do backtracking and do a lookup on a higher level in the fib trie.
    
    v2:
    a) Improved rt6_check_neigh logic (no need to create neighbour there)
       and documented return values.
    
    v3:
    a) Introduce enum rt6_nud_state to get rid of the magic numbers
       (thanks to David Miller).
    b) Update and shorten commit message a bit to actualy reflect
       the source.
    Reported-by: default avatarPierre Emeriaud <petrus.lt@gmail.com>
    Cc: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
    Signed-off-by: default avatarHannes Frederic Sowa <hannes@stressinduktion.org>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    afc154e9
route.c 75.5 KB