ipv6: Remove old route notifications and convert listeners
authorIdo Schimmel <idosch@mellanox.com>
Mon, 23 Dec 2019 13:28:20 +0000 (15:28 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 25 Dec 2019 06:37:30 +0000 (22:37 -0800)
Now that mlxsw is converted to use the new FIB notifications it is
possible to delete the old ones and use the new replace / append /
delete notifications.

Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Reviewed-by: Jiri Pirko <jiri@mellanox.com>
Reviewed-by: David Ahern <dsahern@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
drivers/net/netdevsim/fib.c
include/net/fib_notifier.h
net/ipv6/ip6_fib.c
net/ipv6/route.c

index 295cdcb..f62e8d6 100644 (file)
@@ -5966,7 +5966,7 @@ static void mlxsw_sp_router_fib6_event_work(struct work_struct *work)
        mlxsw_sp_span_respin(mlxsw_sp);
 
        switch (fib_work->event) {
-       case FIB_EVENT_ENTRY_REPLACE_TMP:
+       case FIB_EVENT_ENTRY_REPLACE:
                err = mlxsw_sp_router_fib6_replace(mlxsw_sp,
                                                   fib_work->fib6_work.rt_arr,
                                                   fib_work->fib6_work.nrt6);
@@ -5982,7 +5982,7 @@ static void mlxsw_sp_router_fib6_event_work(struct work_struct *work)
                        mlxsw_sp_router_fib_abort(mlxsw_sp);
                mlxsw_sp_router_fib6_work_fini(&fib_work->fib6_work);
                break;
-       case FIB_EVENT_ENTRY_DEL_TMP:
+       case FIB_EVENT_ENTRY_DEL:
                mlxsw_sp_router_fib6_del(mlxsw_sp,
                                         fib_work->fib6_work.rt_arr,
                                         fib_work->fib6_work.nrt6);
@@ -6068,9 +6068,9 @@ static int mlxsw_sp_router_fib6_event(struct mlxsw_sp_fib_event_work *fib_work,
        int err;
 
        switch (fib_work->event) {
-       case FIB_EVENT_ENTRY_REPLACE_TMP: /* fall through */
+       case FIB_EVENT_ENTRY_REPLACE: /* fall through */
        case FIB_EVENT_ENTRY_APPEND: /* fall through */
-       case FIB_EVENT_ENTRY_DEL_TMP:
+       case FIB_EVENT_ENTRY_DEL:
                fen6_info = container_of(info, struct fib6_entry_notifier_info,
                                         info);
                err = mlxsw_sp_router_fib6_work_init(&fib_work->fib6_work,
@@ -6174,7 +6174,6 @@ static int mlxsw_sp_router_fib_event(struct notifier_block *nb,
                return notifier_from_errno(err);
        case FIB_EVENT_ENTRY_ADD: /* fall through */
        case FIB_EVENT_ENTRY_REPLACE: /* fall through */
-       case FIB_EVENT_ENTRY_REPLACE_TMP: /* fall through */
        case FIB_EVENT_ENTRY_APPEND:
                if (router->aborted) {
                        NL_SET_ERR_MSG_MOD(info->extack, "FIB offload was aborted. Not configuring route");
index 4e02a42..b5df308 100644 (file)
@@ -178,7 +178,6 @@ static int nsim_fib_event_nb(struct notifier_block *nb, unsigned long event,
                break;
 
        case FIB_EVENT_ENTRY_REPLACE:  /* fall through */
-       case FIB_EVENT_ENTRY_ADD:  /* fall through */
        case FIB_EVENT_ENTRY_DEL:
                err = nsim_fib_event(data, info, event != FIB_EVENT_ENTRY_DEL);
                break;
index b3c5432..6d59221 100644 (file)
@@ -23,8 +23,6 @@ enum fib_event_type {
        FIB_EVENT_NH_DEL,
        FIB_EVENT_VIF_ADD,
        FIB_EVENT_VIF_DEL,
-       FIB_EVENT_ENTRY_REPLACE_TMP,
-       FIB_EVENT_ENTRY_DEL_TMP,
 };
 
 struct fib_notifier_ops {
index 67ddee5..b1e9a10 100644 (file)
@@ -423,8 +423,7 @@ int call_fib6_entry_notifiers_replace(struct net *net, struct fib6_info *rt)
        };
 
        rt->fib6_table->fib_seq++;
-       return call_fib6_notifiers(net, FIB_EVENT_ENTRY_REPLACE_TMP,
-                                  &info.info);
+       return call_fib6_notifiers(net, FIB_EVENT_ENTRY_REPLACE, &info.info);
 }
 
 struct fib6_dump_arg {
@@ -435,15 +434,7 @@ struct fib6_dump_arg {
 
 static int fib6_rt_dump(struct fib6_info *rt, struct fib6_dump_arg *arg)
 {
-       if (rt == arg->net->ipv6.fib6_null_entry)
-               return 0;
-       return call_fib6_entry_notifier(arg->nb, FIB_EVENT_ENTRY_ADD,
-                                       rt, arg->extack);
-}
-
-static int fib6_rt_dump_tmp(struct fib6_info *rt, struct fib6_dump_arg *arg)
-{
-       enum fib_event_type fib_event = FIB_EVENT_ENTRY_REPLACE_TMP;
+       enum fib_event_type fib_event = FIB_EVENT_ENTRY_REPLACE;
        int err;
 
        if (!rt || rt == arg->net->ipv6.fib6_null_entry)
@@ -463,19 +454,9 @@ static int fib6_rt_dump_tmp(struct fib6_info *rt, struct fib6_dump_arg *arg)
 
 static int fib6_node_dump(struct fib6_walker *w)
 {
-       struct fib6_info *rt;
-       int err = 0;
-
-       err = fib6_rt_dump_tmp(w->leaf, w->args);
-       if (err)
-               goto out;
+       int err;
 
-       for_each_fib6_walker_rt(w) {
-               err = fib6_rt_dump(rt, w->args);
-               if (err)
-                       break;
-       }
-out:
+       err = fib6_rt_dump(w->leaf, w->args);
        w->leaf = NULL;
        return err;
 }
@@ -1220,25 +1201,21 @@ next_iter:
 add:
                nlflags |= NLM_F_CREATE;
 
-               if (!info->skip_notify_kernel) {
+               /* The route should only be notified if it is the first
+                * route in the node or if it is added as a sibling
+                * route to the first route in the node.
+                */
+               if (!info->skip_notify_kernel &&
+                   (notify_sibling_rt || ins == &fn->leaf)) {
                        enum fib_event_type fib_event;
 
                        if (notify_sibling_rt)
                                fib_event = FIB_EVENT_ENTRY_APPEND;
                        else
-                               fib_event = FIB_EVENT_ENTRY_REPLACE_TMP;
-                       /* The route should only be notified if it is the first
-                        * route in the node or if it is added as a sibling
-                        * route to the first route in the node.
-                        */
-                       if (notify_sibling_rt || ins == &fn->leaf)
-                               err = call_fib6_entry_notifiers(info->nl_net,
-                                                               fib_event, rt,
-                                                               extack);
-
+                               fib_event = FIB_EVENT_ENTRY_REPLACE;
                        err = call_fib6_entry_notifiers(info->nl_net,
-                                                       FIB_EVENT_ENTRY_ADD,
-                                                       rt, extack);
+                                                       fib_event, rt,
+                                                       extack);
                        if (err) {
                                struct fib6_info *sibling, *next_sibling;
 
@@ -1282,14 +1259,7 @@ add:
                        return -ENOENT;
                }
 
-               if (!info->skip_notify_kernel) {
-                       enum fib_event_type fib_event;
-
-                       fib_event = FIB_EVENT_ENTRY_REPLACE_TMP;
-                       if (ins == &fn->leaf)
-                               err = call_fib6_entry_notifiers(info->nl_net,
-                                                               fib_event, rt,
-                                                               extack);
+               if (!info->skip_notify_kernel && ins == &fn->leaf) {
                        err = call_fib6_entry_notifiers(info->nl_net,
                                                        FIB_EVENT_ENTRY_REPLACE,
                                                        rt, extack);
@@ -2007,11 +1977,10 @@ static void fib6_del_route(struct fib6_table *table, struct fib6_node *fn,
 
        if (!info->skip_notify_kernel) {
                if (notify_del)
-                       call_fib6_entry_notifiers(net, FIB_EVENT_ENTRY_DEL_TMP,
+                       call_fib6_entry_notifiers(net, FIB_EVENT_ENTRY_DEL,
                                                  rt, NULL);
                else if (replace_rt)
                        call_fib6_entry_notifiers_replace(net, replace_rt);
-               call_fib6_entry_notifiers(net, FIB_EVENT_ENTRY_DEL, rt, NULL);
        }
        if (!info->skip_notify)
                inet6_rt_notify(RTM_DELROUTE, rt, info, 0);
index 646716a..4b8659e 100644 (file)
@@ -3787,15 +3787,10 @@ static int __ip6_del_rt_siblings(struct fib6_info *rt, struct fib6_config *cfg)
                                                                  replace_rt);
                        else
                                call_fib6_multipath_entry_notifiers(net,
-                                                      FIB_EVENT_ENTRY_DEL_TMP,
+                                                      FIB_EVENT_ENTRY_DEL,
                                                       rt, rt->fib6_nsiblings,
                                                       NULL);
                }
-               call_fib6_multipath_entry_notifiers(net,
-                                                   FIB_EVENT_ENTRY_DEL,
-                                                   rt,
-                                                   rt->fib6_nsiblings,
-                                                   NULL);
                list_for_each_entry_safe(sibling, next_sibling,
                                         &rt->fib6_siblings,
                                         fib6_siblings) {
@@ -5074,7 +5069,6 @@ static int ip6_route_multipath_add(struct fib6_config *cfg,
 {
        struct fib6_info *rt_notif = NULL, *rt_last = NULL;
        struct nl_info *info = &cfg->fc_nlinfo;
-       enum fib_event_type event_type;
        struct fib6_config r_cfg;
        struct rtnexthop *rtnh;
        struct fib6_info *rt;
@@ -5210,7 +5204,7 @@ static int ip6_route_multipath_add(struct fib6_config *cfg,
                if (rt_notif->fib6_nsiblings != nhn - 1)
                        fib_event = FIB_EVENT_ENTRY_APPEND;
                else
-                       fib_event = FIB_EVENT_ENTRY_REPLACE_TMP;
+                       fib_event = FIB_EVENT_ENTRY_REPLACE;
 
                err = call_fib6_multipath_entry_notifiers(info->nl_net,
                                                          fib_event, rt_notif,
@@ -5221,14 +5215,6 @@ static int ip6_route_multipath_add(struct fib6_config *cfg,
                        goto add_errout;
                }
        }
-       event_type = replace ? FIB_EVENT_ENTRY_REPLACE : FIB_EVENT_ENTRY_ADD;
-       err = call_fib6_multipath_entry_notifiers(info->nl_net, event_type,
-                                                 rt_notif, nhn - 1, extack);
-       if (err) {
-               /* Delete all the siblings that were just added */
-               err_nh = NULL;
-               goto add_errout;
-       }
 
        /* success ... tell user about new route */
        ip6_route_mpath_notify(rt_notif, rt_last, info, nlflags);