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: 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>
这个提交包含在:
Ido Schimmel
2019-12-23 15:28:20 +02:00
提交者 David S. Miller
父节点 dacad7b34b
当前提交 caafb2509f
修改 5 个文件,包含 21 行新增70 行删除

查看文件

@@ -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;
int err;
err = fib6_rt_dump_tmp(w->leaf, w->args);
if (err)
goto out;
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);

查看文件

@@ -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);