• Xin Long's avatar
    ipv6: set rt6i_protocol properly in the route when it is installed · b91d5329
    Xin Long authored
    After commit c2ed1880 ("net: ipv6: check route protocol when
    deleting routes"), ipv6 route checks rt protocol when trying to
    remove a rt entry.
    
    It introduced a side effect causing 'ip -6 route flush cache' not
    to work well. When flushing caches with iproute, all route caches
    get dumped from kernel then removed one by one by sending DELROUTE
    requests to kernel for each cache.
    
    The thing is iproute sends the request with the cache whose proto
    is set with RTPROT_REDIRECT by rt6_fill_node() when kernel dumps
    it. But in kernel the rt_cache protocol is still 0, which causes
    the cache not to be matched and removed.
    
    So the real reason is rt6i_protocol in the route is not set when
    it is allocated. As David Ahern's suggestion, this patch is to
    set rt6i_protocol properly in the route when it is installed and
    remove the codes setting rtm_protocol according to rt6i_flags in
    rt6_fill_node.
    
    This is also an improvement to keep rt6i_protocol consistent with
    rtm_protocol.
    
    Fixes: c2ed1880 ("net: ipv6: check route protocol when deleting routes")
    Reported-by: default avatarJianlin Shi <jishi@redhat.com>
    Suggested-by: default avatarDavid Ahern <dsahern@gmail.com>
    Signed-off-by: default avatarXin Long <lucien.xin@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    b91d5329
route.c 101 KB