Commit caafb250 authored by Ido Schimmel's avatar Ido Schimmel Committed by David S. Miller

ipv6: Remove old route notifications and convert listeners

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: default avatarIdo Schimmel <idosch@mellanox.com>
Reviewed-by: default avatarJiri Pirko <jiri@mellanox.com>
Reviewed-by: default avatarDavid Ahern <dsahern@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent dacad7b3
...@@ -5966,7 +5966,7 @@ static void mlxsw_sp_router_fib6_event_work(struct work_struct *work) ...@@ -5966,7 +5966,7 @@ static void mlxsw_sp_router_fib6_event_work(struct work_struct *work)
mlxsw_sp_span_respin(mlxsw_sp); mlxsw_sp_span_respin(mlxsw_sp);
switch (fib_work->event) { switch (fib_work->event) {
case FIB_EVENT_ENTRY_REPLACE_TMP: case FIB_EVENT_ENTRY_REPLACE:
err = mlxsw_sp_router_fib6_replace(mlxsw_sp, err = mlxsw_sp_router_fib6_replace(mlxsw_sp,
fib_work->fib6_work.rt_arr, fib_work->fib6_work.rt_arr,
fib_work->fib6_work.nrt6); fib_work->fib6_work.nrt6);
...@@ -5982,7 +5982,7 @@ static void mlxsw_sp_router_fib6_event_work(struct work_struct *work) ...@@ -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_fib_abort(mlxsw_sp);
mlxsw_sp_router_fib6_work_fini(&fib_work->fib6_work); mlxsw_sp_router_fib6_work_fini(&fib_work->fib6_work);
break; break;
case FIB_EVENT_ENTRY_DEL_TMP: case FIB_EVENT_ENTRY_DEL:
mlxsw_sp_router_fib6_del(mlxsw_sp, mlxsw_sp_router_fib6_del(mlxsw_sp,
fib_work->fib6_work.rt_arr, fib_work->fib6_work.rt_arr,
fib_work->fib6_work.nrt6); fib_work->fib6_work.nrt6);
...@@ -6068,9 +6068,9 @@ static int mlxsw_sp_router_fib6_event(struct mlxsw_sp_fib_event_work *fib_work, ...@@ -6068,9 +6068,9 @@ static int mlxsw_sp_router_fib6_event(struct mlxsw_sp_fib_event_work *fib_work,
int err; int err;
switch (fib_work->event) { 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_APPEND: /* fall through */
case FIB_EVENT_ENTRY_DEL_TMP: case FIB_EVENT_ENTRY_DEL:
fen6_info = container_of(info, struct fib6_entry_notifier_info, fen6_info = container_of(info, struct fib6_entry_notifier_info,
info); info);
err = mlxsw_sp_router_fib6_work_init(&fib_work->fib6_work, 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, ...@@ -6174,7 +6174,6 @@ static int mlxsw_sp_router_fib_event(struct notifier_block *nb,
return notifier_from_errno(err); return notifier_from_errno(err);
case FIB_EVENT_ENTRY_ADD: /* fall through */ case FIB_EVENT_ENTRY_ADD: /* fall through */
case FIB_EVENT_ENTRY_REPLACE: /* fall through */ case FIB_EVENT_ENTRY_REPLACE: /* fall through */
case FIB_EVENT_ENTRY_REPLACE_TMP: /* fall through */
case FIB_EVENT_ENTRY_APPEND: case FIB_EVENT_ENTRY_APPEND:
if (router->aborted) { if (router->aborted) {
NL_SET_ERR_MSG_MOD(info->extack, "FIB offload was aborted. Not configuring route"); NL_SET_ERR_MSG_MOD(info->extack, "FIB offload was aborted. Not configuring route");
......
...@@ -178,7 +178,6 @@ static int nsim_fib_event_nb(struct notifier_block *nb, unsigned long event, ...@@ -178,7 +178,6 @@ static int nsim_fib_event_nb(struct notifier_block *nb, unsigned long event,
break; break;
case FIB_EVENT_ENTRY_REPLACE: /* fall through */ case FIB_EVENT_ENTRY_REPLACE: /* fall through */
case FIB_EVENT_ENTRY_ADD: /* fall through */
case FIB_EVENT_ENTRY_DEL: case FIB_EVENT_ENTRY_DEL:
err = nsim_fib_event(data, info, event != FIB_EVENT_ENTRY_DEL); err = nsim_fib_event(data, info, event != FIB_EVENT_ENTRY_DEL);
break; break;
......
...@@ -23,8 +23,6 @@ enum fib_event_type { ...@@ -23,8 +23,6 @@ enum fib_event_type {
FIB_EVENT_NH_DEL, FIB_EVENT_NH_DEL,
FIB_EVENT_VIF_ADD, FIB_EVENT_VIF_ADD,
FIB_EVENT_VIF_DEL, FIB_EVENT_VIF_DEL,
FIB_EVENT_ENTRY_REPLACE_TMP,
FIB_EVENT_ENTRY_DEL_TMP,
}; };
struct fib_notifier_ops { struct fib_notifier_ops {
......
...@@ -423,8 +423,7 @@ int call_fib6_entry_notifiers_replace(struct net *net, struct fib6_info *rt) ...@@ -423,8 +423,7 @@ int call_fib6_entry_notifiers_replace(struct net *net, struct fib6_info *rt)
}; };
rt->fib6_table->fib_seq++; rt->fib6_table->fib_seq++;
return call_fib6_notifiers(net, FIB_EVENT_ENTRY_REPLACE_TMP, return call_fib6_notifiers(net, FIB_EVENT_ENTRY_REPLACE, &info.info);
&info.info);
} }
struct fib6_dump_arg { struct fib6_dump_arg {
...@@ -435,15 +434,7 @@ 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) static int fib6_rt_dump(struct fib6_info *rt, struct fib6_dump_arg *arg)
{ {
if (rt == arg->net->ipv6.fib6_null_entry) enum fib_event_type fib_event = FIB_EVENT_ENTRY_REPLACE;
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;
int err; int err;
if (!rt || rt == arg->net->ipv6.fib6_null_entry) 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) ...@@ -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) static int fib6_node_dump(struct fib6_walker *w)
{ {
struct fib6_info *rt; int err;
int err = 0;
err = fib6_rt_dump_tmp(w->leaf, w->args);
if (err)
goto out;
for_each_fib6_walker_rt(w) { err = fib6_rt_dump(w->leaf, w->args);
err = fib6_rt_dump(rt, w->args);
if (err)
break;
}
out:
w->leaf = NULL; w->leaf = NULL;
return err; return err;
} }
...@@ -1220,25 +1201,21 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct fib6_info *rt, ...@@ -1220,25 +1201,21 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct fib6_info *rt,
add: add:
nlflags |= NLM_F_CREATE; 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; enum fib_event_type fib_event;
if (notify_sibling_rt) if (notify_sibling_rt)
fib_event = FIB_EVENT_ENTRY_APPEND; fib_event = FIB_EVENT_ENTRY_APPEND;
else else
fib_event = FIB_EVENT_ENTRY_REPLACE_TMP; fib_event = FIB_EVENT_ENTRY_REPLACE;
/* 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);
err = call_fib6_entry_notifiers(info->nl_net, err = call_fib6_entry_notifiers(info->nl_net,
FIB_EVENT_ENTRY_ADD, fib_event, rt,
rt, extack); extack);
if (err) { if (err) {
struct fib6_info *sibling, *next_sibling; struct fib6_info *sibling, *next_sibling;
...@@ -1282,14 +1259,7 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct fib6_info *rt, ...@@ -1282,14 +1259,7 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct fib6_info *rt,
return -ENOENT; return -ENOENT;
} }
if (!info->skip_notify_kernel) { if (!info->skip_notify_kernel && ins == &fn->leaf) {
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);
err = call_fib6_entry_notifiers(info->nl_net, err = call_fib6_entry_notifiers(info->nl_net,
FIB_EVENT_ENTRY_REPLACE, FIB_EVENT_ENTRY_REPLACE,
rt, extack); rt, extack);
...@@ -2007,11 +1977,10 @@ static void fib6_del_route(struct fib6_table *table, struct fib6_node *fn, ...@@ -2007,11 +1977,10 @@ static void fib6_del_route(struct fib6_table *table, struct fib6_node *fn,
if (!info->skip_notify_kernel) { if (!info->skip_notify_kernel) {
if (notify_del) if (notify_del)
call_fib6_entry_notifiers(net, FIB_EVENT_ENTRY_DEL_TMP, call_fib6_entry_notifiers(net, FIB_EVENT_ENTRY_DEL,
rt, NULL); rt, NULL);
else if (replace_rt) else if (replace_rt)
call_fib6_entry_notifiers_replace(net, 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) if (!info->skip_notify)
inet6_rt_notify(RTM_DELROUTE, rt, info, 0); inet6_rt_notify(RTM_DELROUTE, rt, info, 0);
......
...@@ -3787,15 +3787,10 @@ static int __ip6_del_rt_siblings(struct fib6_info *rt, struct fib6_config *cfg) ...@@ -3787,15 +3787,10 @@ static int __ip6_del_rt_siblings(struct fib6_info *rt, struct fib6_config *cfg)
replace_rt); replace_rt);
else else
call_fib6_multipath_entry_notifiers(net, call_fib6_multipath_entry_notifiers(net,
FIB_EVENT_ENTRY_DEL_TMP, FIB_EVENT_ENTRY_DEL,
rt, rt->fib6_nsiblings, rt, rt->fib6_nsiblings,
NULL); NULL);
} }
call_fib6_multipath_entry_notifiers(net,
FIB_EVENT_ENTRY_DEL,
rt,
rt->fib6_nsiblings,
NULL);
list_for_each_entry_safe(sibling, next_sibling, list_for_each_entry_safe(sibling, next_sibling,
&rt->fib6_siblings, &rt->fib6_siblings,
fib6_siblings) { fib6_siblings) {
...@@ -5074,7 +5069,6 @@ static int ip6_route_multipath_add(struct fib6_config *cfg, ...@@ -5074,7 +5069,6 @@ static int ip6_route_multipath_add(struct fib6_config *cfg,
{ {
struct fib6_info *rt_notif = NULL, *rt_last = NULL; struct fib6_info *rt_notif = NULL, *rt_last = NULL;
struct nl_info *info = &cfg->fc_nlinfo; struct nl_info *info = &cfg->fc_nlinfo;
enum fib_event_type event_type;
struct fib6_config r_cfg; struct fib6_config r_cfg;
struct rtnexthop *rtnh; struct rtnexthop *rtnh;
struct fib6_info *rt; struct fib6_info *rt;
...@@ -5210,7 +5204,7 @@ static int ip6_route_multipath_add(struct fib6_config *cfg, ...@@ -5210,7 +5204,7 @@ static int ip6_route_multipath_add(struct fib6_config *cfg,
if (rt_notif->fib6_nsiblings != nhn - 1) if (rt_notif->fib6_nsiblings != nhn - 1)
fib_event = FIB_EVENT_ENTRY_APPEND; fib_event = FIB_EVENT_ENTRY_APPEND;
else else
fib_event = FIB_EVENT_ENTRY_REPLACE_TMP; fib_event = FIB_EVENT_ENTRY_REPLACE;
err = call_fib6_multipath_entry_notifiers(info->nl_net, err = call_fib6_multipath_entry_notifiers(info->nl_net,
fib_event, rt_notif, fib_event, rt_notif,
...@@ -5221,14 +5215,6 @@ static int ip6_route_multipath_add(struct fib6_config *cfg, ...@@ -5221,14 +5215,6 @@ static int ip6_route_multipath_add(struct fib6_config *cfg,
goto add_errout; 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 */ /* success ... tell user about new route */
ip6_route_mpath_notify(rt_notif, rt_last, info, nlflags); ip6_route_mpath_notify(rt_notif, rt_last, info, nlflags);
......
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