lkml.org 
[lkml]   [2015]   [Dec]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.2 018/124] ipv4: update RTNH_F_LINKDOWN flag on UP event
    Date
    4.2-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Julian Anastasov <ja@ssi.bg>

    [ Upstream commit c9b3292eeb52c6834e972eb5b8fe38914771ed12 ]

    When nexthop is part of multipath route we should clear the
    LINKDOWN flag when link goes UP or when first address is added.
    This is needed because we always set LINKDOWN flag when DEAD flag
    was set but now on UP the nexthop is not dead anymore. Examples when
    LINKDOWN bit can be forgotten when no NETDEV_CHANGE is delivered:

    - link goes down (LINKDOWN is set), then link goes UP and device
    shows carrier OK but LINKDOWN remains set

    - last address is deleted (LINKDOWN is set), then address is
    added and device shows carrier OK but LINKDOWN remains set

    Steps to reproduce:
    modprobe dummy
    ifconfig dummy0 192.168.168.1 up

    here add a multipath route where one nexthop is for dummy0:

    ip route add 1.2.3.4 nexthop dummy0 nexthop SOME_OTHER_DEVICE
    ifconfig dummy0 down
    ifconfig dummy0 up

    now ip route shows nexthop that is not dead. Now set the sysctl var:

    echo 1 > /proc/sys/net/ipv4/conf/dummy0/ignore_routes_with_linkdown

    now ip route will show a dead nexthop because the forgotten
    RTNH_F_LINKDOWN is propagated as RTNH_F_DEAD.

    Fixes: 8a3d03166f19 ("net: track link-status of ipv4 nexthops")
    Signed-off-by: Julian Anastasov <ja@ssi.bg>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    net/ipv4/fib_semantics.c | 7 +++++++
    1 file changed, 7 insertions(+)

    --- a/net/ipv4/fib_semantics.c
    +++ b/net/ipv4/fib_semantics.c
    @@ -1296,6 +1296,13 @@ int fib_sync_up(struct net_device *dev,
    if (!(dev->flags & IFF_UP))
    return 0;

    + if (nh_flags & RTNH_F_DEAD) {
    + unsigned int flags = dev_get_flags(dev);
    +
    + if (flags & (IFF_RUNNING | IFF_LOWER_UP))
    + nh_flags |= RTNH_F_LINKDOWN;
    + }
    +
    prev_fi = NULL;
    hash = fib_devindex_hashfn(dev->ifindex);
    head = &fib_info_devhash[hash];



    \
     
     \ /
      Last update: 2015-12-07 17:21    [W:4.304 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site