net: ipv6: new arg skip_notify to ip6_rt_del
authorRoopa Prabhu <roopa@cumulusnetworks.com>
Mon, 27 Apr 2020 20:56:45 +0000 (13:56 -0700)
committerDavid S. Miller <davem@davemloft.net>
Tue, 28 Apr 2020 19:50:37 +0000 (12:50 -0700)
Used in subsequent work to skip route delete
notifications on nexthop deletes.

Suggested-by: David Ahern <dsahern@gmail.com>
Signed-off-by: Roopa Prabhu <roopa@cumulusnetworks.com>
Reviewed-by: David Ahern <dsahern@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/ip6_route.h
include/net/ipv6_stubs.h
net/ipv4/nexthop.c
net/ipv6/addrconf.c
net/ipv6/addrconf_core.c
net/ipv6/anycast.c
net/ipv6/ndisc.c
net/ipv6/route.c

index 9947eb1e9eb67ebacd567616c29c767df407524b..e525f003e61972e7c51eca5522046a02586ab17c 100644 (file)
@@ -123,7 +123,7 @@ int ipv6_route_ioctl(struct net *net, unsigned int cmd, void __user *arg);
 int ip6_route_add(struct fib6_config *cfg, gfp_t gfp_flags,
                  struct netlink_ext_ack *extack);
 int ip6_ins_rt(struct net *net, struct fib6_info *f6i);
-int ip6_del_rt(struct net *net, struct fib6_info *f6i);
+int ip6_del_rt(struct net *net, struct fib6_info *f6i, bool skip_notify);
 
 void rt6_flush_exceptions(struct fib6_info *f6i);
 void rt6_age_exceptions(struct fib6_info *f6i, struct fib6_gc_args *gc_args,
index 3e7d2c0e79ca15ab990847ee9d9cf1a547f155e8..a5f7c12c326a8972f3e157f2f76528f9bb38f835 100644 (file)
@@ -48,7 +48,7 @@ struct ipv6_stub {
                            struct netlink_ext_ack *extack);
        void (*fib6_nh_release)(struct fib6_nh *fib6_nh);
        void (*fib6_update_sernum)(struct net *net, struct fib6_info *rt);
-       int (*ip6_del_rt)(struct net *net, struct fib6_info *rt);
+       int (*ip6_del_rt)(struct net *net, struct fib6_info *rt, bool skip_notify);
        void (*fib6_rt_update)(struct net *net, struct fib6_info *rt,
                               struct nl_info *info);
 
index fdfca534d0942016a61174ab1e99fc056d6bc65c..9999687ad6dc94e40431602a26e9402677eb8742 100644 (file)
@@ -784,7 +784,7 @@ static void __remove_nexthop_fib(struct net *net, struct nexthop *nh)
        list_for_each_entry_safe(f6i, tmp, &nh->f6i_list, nh_list) {
                /* __ip6_del_rt does a release, so do a hold here */
                fib6_info_hold(f6i);
-               ipv6_stub->ip6_del_rt(net, f6i);
+               ipv6_stub->ip6_del_rt(net, f6i, false);
        }
 }
 
index 27b4fb6e452b85f6fdcb4b3dd344e7497206b0df..2c4f20ec1e2ae12e8e39bac90b36f4c6ef705080 100644 (file)
@@ -1238,7 +1238,7 @@ cleanup_prefix_route(struct inet6_ifaddr *ifp, unsigned long expires,
                                        ifp->idev->dev, 0, RTF_DEFAULT, true);
        if (f6i) {
                if (del_rt)
-                       ip6_del_rt(dev_net(ifp->idev->dev), f6i);
+                       ip6_del_rt(dev_net(ifp->idev->dev), f6i, false);
                else {
                        if (!(f6i->fib6_flags & RTF_EXPIRES))
                                fib6_set_expires(f6i, expires);
@@ -2718,7 +2718,7 @@ void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len, bool sllao)
                if (rt) {
                        /* Autoconf prefix route */
                        if (valid_lft == 0) {
-                               ip6_del_rt(net, rt);
+                               ip6_del_rt(net, rt, false);
                                rt = NULL;
                        } else if (addrconf_finite_timeout(rt_expires)) {
                                /* not infinity */
@@ -3813,7 +3813,7 @@ restart:
                spin_unlock_bh(&ifa->lock);
 
                if (rt)
-                       ip6_del_rt(net, rt);
+                       ip6_del_rt(net, rt, false);
 
                if (state != INET6_IFADDR_STATE_DEAD) {
                        __ipv6_ifa_notify(RTM_DELADDR, ifa);
@@ -4652,7 +4652,7 @@ static int modify_prefix_route(struct inet6_ifaddr *ifp,
        prio = ifp->rt_priority ? : IP6_RT_PRIO_ADDRCONF;
        if (f6i->fib6_metric != prio) {
                /* delete old one */
-               ip6_del_rt(dev_net(ifp->idev->dev), f6i);
+               ip6_del_rt(dev_net(ifp->idev->dev), f6i, false);
 
                /* add new one */
                addrconf_prefix_route(modify_peer ? &ifp->peer_addr : &ifp->addr,
@@ -6073,10 +6073,10 @@ static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp)
                                                       ifp->idev->dev, 0, 0,
                                                       false);
                        if (rt)
-                               ip6_del_rt(net, rt);
+                               ip6_del_rt(net, rt, false);
                }
                if (ifp->rt) {
-                       ip6_del_rt(net, ifp->rt);
+                       ip6_del_rt(net, ifp->rt, false);
                        ifp->rt = NULL;
                }
                rt_genid_bump_ipv6(net);
index ea00ce3d4117b792df8fc99ced0b16e355fcd8e2..9ebf3fe0d2b1fbee3812579a190540639aec1284 100644 (file)
@@ -185,7 +185,8 @@ static int eafnosupport_fib6_nh_init(struct net *net, struct fib6_nh *fib6_nh,
        return -EAFNOSUPPORT;
 }
 
-static int eafnosupport_ip6_del_rt(struct net *net, struct fib6_info *rt)
+static int eafnosupport_ip6_del_rt(struct net *net, struct fib6_info *rt,
+                                  bool skip_notify)
 {
        return -EAFNOSUPPORT;
 }
index fed91ab7ec46181e7122bed2cff77607137cbe43..893261230ffc0a0a3e0e207db4ba9c7c8b3ef1f2 100644 (file)
@@ -364,7 +364,7 @@ int __ipv6_dev_ac_dec(struct inet6_dev *idev, const struct in6_addr *addr)
        ipv6_del_acaddr_hash(aca);
        addrconf_leave_solict(idev, &aca->aca_addr);
 
-       ip6_del_rt(dev_net(idev->dev), aca->aca_rt);
+       ip6_del_rt(dev_net(idev->dev), aca->aca_rt, false);
 
        aca_put(aca);
        return 0;
@@ -393,7 +393,7 @@ void ipv6_ac_destroy_dev(struct inet6_dev *idev)
 
                addrconf_leave_solict(idev, &aca->aca_addr);
 
-               ip6_del_rt(dev_net(idev->dev), aca->aca_rt);
+               ip6_del_rt(dev_net(idev->dev), aca->aca_rt, false);
 
                aca_put(aca);
 
index 1ecd4e9b0bdf022bdf14ea9b5a1c75384eb391d7..2d09c4da03ee765d3dd50334f0c38050eebbbbb8 100644 (file)
@@ -1302,7 +1302,7 @@ static void ndisc_router_discovery(struct sk_buff *skb)
                }
        }
        if (rt && lifetime == 0) {
-               ip6_del_rt(net, rt);
+               ip6_del_rt(net, rt, false);
                rt = NULL;
        }
 
index 310cbddaa533fcefc14c8fe3566afab494b64bc0..486c36a14f2405191a747be10c517f2c13b2a94b 100644 (file)
@@ -984,7 +984,7 @@ int rt6_route_rcv(struct net_device *dev, u8 *opt, int len,
                                        gwaddr, dev);
 
        if (rt && !lifetime) {
-               ip6_del_rt(net, rt);
+               ip6_del_rt(net, rt, false);
                rt = NULL;
        }
 
@@ -3729,9 +3729,12 @@ out:
        return err;
 }
 
-int ip6_del_rt(struct net *net, struct fib6_info *rt)
+int ip6_del_rt(struct net *net, struct fib6_info *rt, bool skip_notify)
 {
-       struct nl_info info = { .nl_net = net };
+       struct nl_info info = {
+               .nl_net = net,
+               .skip_notify = skip_notify
+       };
 
        return __ip6_del_rt(rt, &info);
 }
@@ -4252,7 +4255,7 @@ restart:
                    (!idev || idev->cnf.accept_ra != 2) &&
                    fib6_info_hold_safe(rt)) {
                        rcu_read_unlock();
-                       ip6_del_rt(net, rt);
+                       ip6_del_rt(net, rt, false);
                        goto restart;
                }
        }