Commit 87e5e094 authored by David S. Miller's avatar David S. Miller

Merge branch 'nexthop-blackhole'

Ido Schimmel says:

====================
nexthop: Do not flush blackhole nexthops when loopback goes down

Patch #1 prevents blackhole nexthops from being flushed when the
loopback device goes down given that as far as user space is concerned,
these nexthops do not have a nexthop device.

Patch #2 adds a test case.

There are no regressions in fib_nexthops.sh with this change:

 # ./fib_nexthops.sh
 ...
 Tests passed: 165
 Tests failed:   0
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents d93ef301 3a1099d3
...@@ -1399,7 +1399,7 @@ static int insert_nexthop(struct net *net, struct nexthop *new_nh, ...@@ -1399,7 +1399,7 @@ static int insert_nexthop(struct net *net, struct nexthop *new_nh,
/* rtnl */ /* rtnl */
/* remove all nexthops tied to a device being deleted */ /* remove all nexthops tied to a device being deleted */
static void nexthop_flush_dev(struct net_device *dev) static void nexthop_flush_dev(struct net_device *dev, unsigned long event)
{ {
unsigned int hash = nh_dev_hashfn(dev->ifindex); unsigned int hash = nh_dev_hashfn(dev->ifindex);
struct net *net = dev_net(dev); struct net *net = dev_net(dev);
...@@ -1411,6 +1411,10 @@ static void nexthop_flush_dev(struct net_device *dev) ...@@ -1411,6 +1411,10 @@ static void nexthop_flush_dev(struct net_device *dev)
if (nhi->fib_nhc.nhc_dev != dev) if (nhi->fib_nhc.nhc_dev != dev)
continue; continue;
if (nhi->reject_nh &&
(event == NETDEV_DOWN || event == NETDEV_CHANGE))
continue;
remove_nexthop(net, nhi->nh_parent, NULL); remove_nexthop(net, nhi->nh_parent, NULL);
} }
} }
...@@ -2189,11 +2193,11 @@ static int nh_netdev_event(struct notifier_block *this, ...@@ -2189,11 +2193,11 @@ static int nh_netdev_event(struct notifier_block *this,
switch (event) { switch (event) {
case NETDEV_DOWN: case NETDEV_DOWN:
case NETDEV_UNREGISTER: case NETDEV_UNREGISTER:
nexthop_flush_dev(dev); nexthop_flush_dev(dev, event);
break; break;
case NETDEV_CHANGE: case NETDEV_CHANGE:
if (!(dev_get_flags(dev) & (IFF_RUNNING | IFF_LOWER_UP))) if (!(dev_get_flags(dev) & (IFF_RUNNING | IFF_LOWER_UP)))
nexthop_flush_dev(dev); nexthop_flush_dev(dev, event);
break; break;
case NETDEV_CHANGEMTU: case NETDEV_CHANGEMTU:
info_ext = ptr; info_ext = ptr;
......
...@@ -1524,6 +1524,14 @@ basic() ...@@ -1524,6 +1524,14 @@ basic()
run_cmd "$IP nexthop replace id 2 blackhole dev veth1" run_cmd "$IP nexthop replace id 2 blackhole dev veth1"
log_test $? 2 "Blackhole nexthop with other attributes" log_test $? 2 "Blackhole nexthop with other attributes"
# blackhole nexthop should not be affected by the state of the loopback
# device
run_cmd "$IP link set dev lo down"
check_nexthop "id 2" "id 2 blackhole"
log_test $? 0 "Blackhole nexthop with loopback device down"
run_cmd "$IP link set dev lo up"
# #
# groups # groups
# #
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment