Commit 7c550daf authored by Jiri Pirko's avatar Jiri Pirko Committed by David S. Miller

net: fib_notifier: make FIB notifier per-netns

Currently all users of FIB notifier only cares about events in init_net.
Later in this patchset, users get interested in other namespaces too.
However, for every registered block user is interested only about one
namespace. Make the FIB notifier registration per-netns and avoid
unnecessary calls of notifier block for other namespaces.
Signed-off-by: default avatarJiri Pirko <jiri@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a5facc4c
...@@ -248,9 +248,6 @@ static int mlx5_lag_fib_event(struct notifier_block *nb, ...@@ -248,9 +248,6 @@ static int mlx5_lag_fib_event(struct notifier_block *nb,
struct net_device *fib_dev; struct net_device *fib_dev;
struct fib_info *fi; struct fib_info *fi;
if (!net_eq(info->net, &init_net))
return NOTIFY_DONE;
if (info->family != AF_INET) if (info->family != AF_INET)
return NOTIFY_DONE; return NOTIFY_DONE;
...@@ -311,7 +308,7 @@ int mlx5_lag_mp_init(struct mlx5_lag *ldev) ...@@ -311,7 +308,7 @@ int mlx5_lag_mp_init(struct mlx5_lag *ldev)
return 0; return 0;
mp->fib_nb.notifier_call = mlx5_lag_fib_event; mp->fib_nb.notifier_call = mlx5_lag_fib_event;
err = register_fib_notifier(&mp->fib_nb, err = register_fib_notifier(&init_net, &mp->fib_nb,
mlx5_lag_fib_event_flush); mlx5_lag_fib_event_flush);
if (err) if (err)
mp->fib_nb.notifier_call = NULL; mp->fib_nb.notifier_call = NULL;
...@@ -326,6 +323,6 @@ void mlx5_lag_mp_cleanup(struct mlx5_lag *ldev) ...@@ -326,6 +323,6 @@ void mlx5_lag_mp_cleanup(struct mlx5_lag *ldev)
if (!mp->fib_nb.notifier_call) if (!mp->fib_nb.notifier_call)
return; return;
unregister_fib_notifier(&mp->fib_nb); unregister_fib_notifier(&init_net, &mp->fib_nb);
mp->fib_nb.notifier_call = NULL; mp->fib_nb.notifier_call = NULL;
} }
...@@ -6213,7 +6213,7 @@ static int mlxsw_sp_router_fib_rule_event(unsigned long event, ...@@ -6213,7 +6213,7 @@ static int mlxsw_sp_router_fib_rule_event(unsigned long event,
rule = fr_info->rule; rule = fr_info->rule;
/* Rule only affects locally generated traffic */ /* Rule only affects locally generated traffic */
if (rule->iifindex == info->net->loopback_dev->ifindex) if (rule->iifindex == init_net.loopback_dev->ifindex)
return 0; return 0;
switch (info->family) { switch (info->family) {
...@@ -6250,8 +6250,7 @@ static int mlxsw_sp_router_fib_event(struct notifier_block *nb, ...@@ -6250,8 +6250,7 @@ static int mlxsw_sp_router_fib_event(struct notifier_block *nb,
struct mlxsw_sp_router *router; struct mlxsw_sp_router *router;
int err; int err;
if (!net_eq(info->net, &init_net) || if ((info->family != AF_INET && info->family != AF_INET6 &&
(info->family != AF_INET && info->family != AF_INET6 &&
info->family != RTNL_FAMILY_IPMR && info->family != RTNL_FAMILY_IPMR &&
info->family != RTNL_FAMILY_IP6MR)) info->family != RTNL_FAMILY_IP6MR))
return NOTIFY_DONE; return NOTIFY_DONE;
...@@ -8155,7 +8154,7 @@ int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp) ...@@ -8155,7 +8154,7 @@ int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp)
goto err_dscp_init; goto err_dscp_init;
mlxsw_sp->router->fib_nb.notifier_call = mlxsw_sp_router_fib_event; mlxsw_sp->router->fib_nb.notifier_call = mlxsw_sp_router_fib_event;
err = register_fib_notifier(&mlxsw_sp->router->fib_nb, err = register_fib_notifier(&init_net, &mlxsw_sp->router->fib_nb,
mlxsw_sp_router_fib_dump_flush); mlxsw_sp_router_fib_dump_flush);
if (err) if (err)
goto err_register_fib_notifier; goto err_register_fib_notifier;
...@@ -8195,7 +8194,7 @@ int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp) ...@@ -8195,7 +8194,7 @@ int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp)
void mlxsw_sp_router_fini(struct mlxsw_sp *mlxsw_sp) void mlxsw_sp_router_fini(struct mlxsw_sp *mlxsw_sp)
{ {
unregister_fib_notifier(&mlxsw_sp->router->fib_nb); unregister_fib_notifier(&init_net, &mlxsw_sp->router->fib_nb);
unregister_netevent_notifier(&mlxsw_sp->router->netevent_nb); unregister_netevent_notifier(&mlxsw_sp->router->netevent_nb);
mlxsw_sp_neigh_fini(mlxsw_sp); mlxsw_sp_neigh_fini(mlxsw_sp);
mlxsw_sp_vrs_fini(mlxsw_sp); mlxsw_sp_vrs_fini(mlxsw_sp);
......
...@@ -2189,9 +2189,6 @@ static int rocker_router_fib_event(struct notifier_block *nb, ...@@ -2189,9 +2189,6 @@ static int rocker_router_fib_event(struct notifier_block *nb,
struct rocker_fib_event_work *fib_work; struct rocker_fib_event_work *fib_work;
struct fib_notifier_info *info = ptr; struct fib_notifier_info *info = ptr;
if (!net_eq(info->net, &init_net))
return NOTIFY_DONE;
if (info->family != AF_INET) if (info->family != AF_INET)
return NOTIFY_DONE; return NOTIFY_DONE;
...@@ -2994,7 +2991,7 @@ static int rocker_probe(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -2994,7 +2991,7 @@ static int rocker_probe(struct pci_dev *pdev, const struct pci_device_id *id)
* the device, so no need to pass a callback. * the device, so no need to pass a callback.
*/ */
rocker->fib_nb.notifier_call = rocker_router_fib_event; rocker->fib_nb.notifier_call = rocker_router_fib_event;
err = register_fib_notifier(&rocker->fib_nb, NULL); err = register_fib_notifier(&init_net, &rocker->fib_nb, NULL);
if (err) if (err)
goto err_register_fib_notifier; goto err_register_fib_notifier;
...@@ -3021,7 +3018,7 @@ static int rocker_probe(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -3021,7 +3018,7 @@ static int rocker_probe(struct pci_dev *pdev, const struct pci_device_id *id)
err_register_switchdev_blocking_notifier: err_register_switchdev_blocking_notifier:
unregister_switchdev_notifier(&rocker_switchdev_notifier); unregister_switchdev_notifier(&rocker_switchdev_notifier);
err_register_switchdev_notifier: err_register_switchdev_notifier:
unregister_fib_notifier(&rocker->fib_nb); unregister_fib_notifier(&init_net, &rocker->fib_nb);
err_register_fib_notifier: err_register_fib_notifier:
rocker_remove_ports(rocker); rocker_remove_ports(rocker);
err_probe_ports: err_probe_ports:
...@@ -3057,7 +3054,7 @@ static void rocker_remove(struct pci_dev *pdev) ...@@ -3057,7 +3054,7 @@ static void rocker_remove(struct pci_dev *pdev)
unregister_switchdev_blocking_notifier(nb); unregister_switchdev_blocking_notifier(nb);
unregister_switchdev_notifier(&rocker_switchdev_notifier); unregister_switchdev_notifier(&rocker_switchdev_notifier);
unregister_fib_notifier(&rocker->fib_nb); unregister_fib_notifier(&init_net, &rocker->fib_nb);
rocker_remove_ports(rocker); rocker_remove_ports(rocker);
rocker_write32(rocker, CONTROL, ROCKER_CONTROL_RESET); rocker_write32(rocker, CONTROL, ROCKER_CONTROL_RESET);
destroy_workqueue(rocker->rocker_owq); destroy_workqueue(rocker->rocker_owq);
......
...@@ -182,9 +182,6 @@ static int nsim_fib_event_nb(struct notifier_block *nb, unsigned long event, ...@@ -182,9 +182,6 @@ static int nsim_fib_event_nb(struct notifier_block *nb, unsigned long event,
struct fib_notifier_info *info = ptr; struct fib_notifier_info *info = ptr;
int err = 0; int err = 0;
if (!net_eq(info->net, &init_net))
return NOTIFY_DONE;
switch (event) { switch (event) {
case FIB_EVENT_RULE_ADD: /* fall through */ case FIB_EVENT_RULE_ADD: /* fall through */
case FIB_EVENT_RULE_DEL: case FIB_EVENT_RULE_DEL:
...@@ -258,7 +255,8 @@ struct nsim_fib_data *nsim_fib_create(struct devlink *devlink) ...@@ -258,7 +255,8 @@ struct nsim_fib_data *nsim_fib_create(struct devlink *devlink)
data->ipv6.rules.max = (u64)-1; data->ipv6.rules.max = (u64)-1;
data->fib_nb.notifier_call = nsim_fib_event_nb; data->fib_nb.notifier_call = nsim_fib_event_nb;
err = register_fib_notifier(&data->fib_nb, nsim_fib_dump_inconsistent); err = register_fib_notifier(&init_net, &data->fib_nb,
nsim_fib_dump_inconsistent);
if (err) { if (err) {
pr_err("Failed to register fib notifier\n"); pr_err("Failed to register fib notifier\n");
goto err_out; goto err_out;
...@@ -297,6 +295,6 @@ void nsim_fib_destroy(struct devlink *devlink, struct nsim_fib_data *data) ...@@ -297,6 +295,6 @@ void nsim_fib_destroy(struct devlink *devlink, struct nsim_fib_data *data)
NSIM_RESOURCE_IPV4_FIB_RULES); NSIM_RESOURCE_IPV4_FIB_RULES);
devlink_resource_occ_get_unregister(devlink, devlink_resource_occ_get_unregister(devlink,
NSIM_RESOURCE_IPV4_FIB); NSIM_RESOURCE_IPV4_FIB);
unregister_fib_notifier(&data->fib_nb); unregister_fib_notifier(&init_net, &data->fib_nb);
kfree(data); kfree(data);
} }
...@@ -47,7 +47,6 @@ struct vif_entry_notifier_info { ...@@ -47,7 +47,6 @@ struct vif_entry_notifier_info {
}; };
static inline int mr_call_vif_notifier(struct notifier_block *nb, static inline int mr_call_vif_notifier(struct notifier_block *nb,
struct net *net,
unsigned short family, unsigned short family,
enum fib_event_type event_type, enum fib_event_type event_type,
struct vif_device *vif, struct vif_device *vif,
...@@ -56,7 +55,6 @@ static inline int mr_call_vif_notifier(struct notifier_block *nb, ...@@ -56,7 +55,6 @@ static inline int mr_call_vif_notifier(struct notifier_block *nb,
struct vif_entry_notifier_info info = { struct vif_entry_notifier_info info = {
.info = { .info = {
.family = family, .family = family,
.net = net,
}, },
.dev = vif->dev, .dev = vif->dev,
.vif_index = vif_index, .vif_index = vif_index,
...@@ -64,7 +62,7 @@ static inline int mr_call_vif_notifier(struct notifier_block *nb, ...@@ -64,7 +62,7 @@ static inline int mr_call_vif_notifier(struct notifier_block *nb,
.tb_id = tb_id, .tb_id = tb_id,
}; };
return call_fib_notifier(nb, net, event_type, &info.info); return call_fib_notifier(nb, event_type, &info.info);
} }
static inline int mr_call_vif_notifiers(struct net *net, static inline int mr_call_vif_notifiers(struct net *net,
...@@ -77,7 +75,6 @@ static inline int mr_call_vif_notifiers(struct net *net, ...@@ -77,7 +75,6 @@ static inline int mr_call_vif_notifiers(struct net *net,
struct vif_entry_notifier_info info = { struct vif_entry_notifier_info info = {
.info = { .info = {
.family = family, .family = family,
.net = net,
}, },
.dev = vif->dev, .dev = vif->dev,
.vif_index = vif_index, .vif_index = vif_index,
...@@ -173,7 +170,6 @@ struct mfc_entry_notifier_info { ...@@ -173,7 +170,6 @@ struct mfc_entry_notifier_info {
}; };
static inline int mr_call_mfc_notifier(struct notifier_block *nb, static inline int mr_call_mfc_notifier(struct notifier_block *nb,
struct net *net,
unsigned short family, unsigned short family,
enum fib_event_type event_type, enum fib_event_type event_type,
struct mr_mfc *mfc, u32 tb_id) struct mr_mfc *mfc, u32 tb_id)
...@@ -181,13 +177,12 @@ static inline int mr_call_mfc_notifier(struct notifier_block *nb, ...@@ -181,13 +177,12 @@ static inline int mr_call_mfc_notifier(struct notifier_block *nb,
struct mfc_entry_notifier_info info = { struct mfc_entry_notifier_info info = {
.info = { .info = {
.family = family, .family = family,
.net = net,
}, },
.mfc = mfc, .mfc = mfc,
.tb_id = tb_id .tb_id = tb_id
}; };
return call_fib_notifier(nb, net, event_type, &info.info); return call_fib_notifier(nb, event_type, &info.info);
} }
static inline int mr_call_mfc_notifiers(struct net *net, static inline int mr_call_mfc_notifiers(struct net *net,
...@@ -199,7 +194,6 @@ static inline int mr_call_mfc_notifiers(struct net *net, ...@@ -199,7 +194,6 @@ static inline int mr_call_mfc_notifiers(struct net *net,
struct mfc_entry_notifier_info info = { struct mfc_entry_notifier_info info = {
.info = { .info = {
.family = family, .family = family,
.net = net,
}, },
.mfc = mfc, .mfc = mfc,
.tb_id = tb_id .tb_id = tb_id
......
...@@ -8,7 +8,6 @@ ...@@ -8,7 +8,6 @@
struct module; struct module;
struct fib_notifier_info { struct fib_notifier_info {
struct net *net;
int family; int family;
struct netlink_ext_ack *extack; struct netlink_ext_ack *extack;
}; };
...@@ -35,14 +34,14 @@ struct fib_notifier_ops { ...@@ -35,14 +34,14 @@ struct fib_notifier_ops {
struct rcu_head rcu; struct rcu_head rcu;
}; };
int call_fib_notifier(struct notifier_block *nb, struct net *net, int call_fib_notifier(struct notifier_block *nb,
enum fib_event_type event_type, enum fib_event_type event_type,
struct fib_notifier_info *info); struct fib_notifier_info *info);
int call_fib_notifiers(struct net *net, enum fib_event_type event_type, int call_fib_notifiers(struct net *net, enum fib_event_type event_type,
struct fib_notifier_info *info); struct fib_notifier_info *info);
int register_fib_notifier(struct notifier_block *nb, int register_fib_notifier(struct net *net, struct notifier_block *nb,
void (*cb)(struct notifier_block *nb)); void (*cb)(struct notifier_block *nb));
int unregister_fib_notifier(struct notifier_block *nb); int unregister_fib_notifier(struct net *net, struct notifier_block *nb);
struct fib_notifier_ops * struct fib_notifier_ops *
fib_notifier_ops_register(const struct fib_notifier_ops *tmpl, struct net *net); fib_notifier_ops_register(const struct fib_notifier_ops *tmpl, struct net *net);
void fib_notifier_ops_unregister(struct fib_notifier_ops *ops); void fib_notifier_ops_unregister(struct fib_notifier_ops *ops);
......
...@@ -478,7 +478,7 @@ struct ipv6_route_iter { ...@@ -478,7 +478,7 @@ struct ipv6_route_iter {
extern const struct seq_operations ipv6_route_seq_ops; extern const struct seq_operations ipv6_route_seq_ops;
int call_fib6_notifier(struct notifier_block *nb, struct net *net, int call_fib6_notifier(struct notifier_block *nb,
enum fib_event_type event_type, enum fib_event_type event_type,
struct fib_notifier_info *info); struct fib_notifier_info *info);
int call_fib6_notifiers(struct net *net, enum fib_event_type event_type, int call_fib6_notifiers(struct net *net, enum fib_event_type event_type,
......
...@@ -219,7 +219,7 @@ struct fib_nh_notifier_info { ...@@ -219,7 +219,7 @@ struct fib_nh_notifier_info {
struct fib_nh *fib_nh; struct fib_nh *fib_nh;
}; };
int call_fib4_notifier(struct notifier_block *nb, struct net *net, int call_fib4_notifier(struct notifier_block *nb,
enum fib_event_type event_type, enum fib_event_type event_type,
struct fib_notifier_info *info); struct fib_notifier_info *info);
int call_fib4_notifiers(struct net *net, enum fib_event_type event_type, int call_fib4_notifiers(struct net *net, enum fib_event_type event_type,
......
...@@ -12,17 +12,15 @@ static unsigned int fib_notifier_net_id; ...@@ -12,17 +12,15 @@ static unsigned int fib_notifier_net_id;
struct fib_notifier_net { struct fib_notifier_net {
struct list_head fib_notifier_ops; struct list_head fib_notifier_ops;
struct atomic_notifier_head fib_chain;
}; };
static ATOMIC_NOTIFIER_HEAD(fib_chain); int call_fib_notifier(struct notifier_block *nb,
int call_fib_notifier(struct notifier_block *nb, struct net *net,
enum fib_event_type event_type, enum fib_event_type event_type,
struct fib_notifier_info *info) struct fib_notifier_info *info)
{ {
int err; int err;
info->net = net;
err = nb->notifier_call(nb, event_type, info); err = nb->notifier_call(nb, event_type, info);
return notifier_to_errno(err); return notifier_to_errno(err);
} }
...@@ -31,35 +29,29 @@ EXPORT_SYMBOL(call_fib_notifier); ...@@ -31,35 +29,29 @@ EXPORT_SYMBOL(call_fib_notifier);
int call_fib_notifiers(struct net *net, enum fib_event_type event_type, int call_fib_notifiers(struct net *net, enum fib_event_type event_type,
struct fib_notifier_info *info) struct fib_notifier_info *info)
{ {
struct fib_notifier_net *fn_net = net_generic(net, fib_notifier_net_id);
int err; int err;
info->net = net; err = atomic_notifier_call_chain(&fn_net->fib_chain, event_type, info);
err = atomic_notifier_call_chain(&fib_chain, event_type, info);
return notifier_to_errno(err); return notifier_to_errno(err);
} }
EXPORT_SYMBOL(call_fib_notifiers); EXPORT_SYMBOL(call_fib_notifiers);
static unsigned int fib_seq_sum(void) static unsigned int fib_seq_sum(struct net *net)
{ {
struct fib_notifier_net *fn_net; struct fib_notifier_net *fn_net = net_generic(net, fib_notifier_net_id);
struct fib_notifier_ops *ops; struct fib_notifier_ops *ops;
unsigned int fib_seq = 0; unsigned int fib_seq = 0;
struct net *net;
rtnl_lock(); rtnl_lock();
down_read(&net_rwsem); rcu_read_lock();
for_each_net(net) { list_for_each_entry_rcu(ops, &fn_net->fib_notifier_ops, list) {
fn_net = net_generic(net, fib_notifier_net_id); if (!try_module_get(ops->owner))
rcu_read_lock(); continue;
list_for_each_entry_rcu(ops, &fn_net->fib_notifier_ops, list) { fib_seq += ops->fib_seq_read(net);
if (!try_module_get(ops->owner)) module_put(ops->owner);
continue;
fib_seq += ops->fib_seq_read(net);
module_put(ops->owner);
}
rcu_read_unlock();
} }
up_read(&net_rwsem); rcu_read_unlock();
rtnl_unlock(); rtnl_unlock();
return fib_seq; return fib_seq;
...@@ -69,68 +61,66 @@ static int fib_net_dump(struct net *net, struct notifier_block *nb) ...@@ -69,68 +61,66 @@ static int fib_net_dump(struct net *net, struct notifier_block *nb)
{ {
struct fib_notifier_net *fn_net = net_generic(net, fib_notifier_net_id); struct fib_notifier_net *fn_net = net_generic(net, fib_notifier_net_id);
struct fib_notifier_ops *ops; struct fib_notifier_ops *ops;
int err = 0;
rcu_read_lock();
list_for_each_entry_rcu(ops, &fn_net->fib_notifier_ops, list) { list_for_each_entry_rcu(ops, &fn_net->fib_notifier_ops, list) {
int err;
if (!try_module_get(ops->owner)) if (!try_module_get(ops->owner))
continue; continue;
err = ops->fib_dump(net, nb); err = ops->fib_dump(net, nb);
module_put(ops->owner); module_put(ops->owner);
if (err) if (err)
return err; goto unlock;
} }
return 0; unlock:
rcu_read_unlock();
return err;
} }
static bool fib_dump_is_consistent(struct notifier_block *nb, static bool fib_dump_is_consistent(struct net *net, struct notifier_block *nb,
void (*cb)(struct notifier_block *nb), void (*cb)(struct notifier_block *nb),
unsigned int fib_seq) unsigned int fib_seq)
{ {
atomic_notifier_chain_register(&fib_chain, nb); struct fib_notifier_net *fn_net = net_generic(net, fib_notifier_net_id);
if (fib_seq == fib_seq_sum())
atomic_notifier_chain_register(&fn_net->fib_chain, nb);
if (fib_seq == fib_seq_sum(net))
return true; return true;
atomic_notifier_chain_unregister(&fib_chain, nb); atomic_notifier_chain_unregister(&fn_net->fib_chain, nb);
if (cb) if (cb)
cb(nb); cb(nb);
return false; return false;
} }
#define FIB_DUMP_MAX_RETRIES 5 #define FIB_DUMP_MAX_RETRIES 5
int register_fib_notifier(struct notifier_block *nb, int register_fib_notifier(struct net *net, struct notifier_block *nb,
void (*cb)(struct notifier_block *nb)) void (*cb)(struct notifier_block *nb))
{ {
int retries = 0; int retries = 0;
int err; int err;
do { do {
unsigned int fib_seq = fib_seq_sum(); unsigned int fib_seq = fib_seq_sum(net);
struct net *net;
err = fib_net_dump(net, nb);
rcu_read_lock(); if (err)
for_each_net_rcu(net) { return err;
err = fib_net_dump(net, nb);
if (err) if (fib_dump_is_consistent(net, nb, cb, fib_seq))
goto err_fib_net_dump;
}
rcu_read_unlock();
if (fib_dump_is_consistent(nb, cb, fib_seq))
return 0; return 0;
} while (++retries < FIB_DUMP_MAX_RETRIES); } while (++retries < FIB_DUMP_MAX_RETRIES);
return -EBUSY; return -EBUSY;
err_fib_net_dump:
rcu_read_unlock();
return err;
} }
EXPORT_SYMBOL(register_fib_notifier); EXPORT_SYMBOL(register_fib_notifier);
int unregister_fib_notifier(struct notifier_block *nb) int unregister_fib_notifier(struct net *net, struct notifier_block *nb)
{ {
return atomic_notifier_chain_unregister(&fib_chain, nb); struct fib_notifier_net *fn_net = net_generic(net, fib_notifier_net_id);
return atomic_notifier_chain_unregister(&fn_net->fib_chain, nb);
} }
EXPORT_SYMBOL(unregister_fib_notifier); EXPORT_SYMBOL(unregister_fib_notifier);
...@@ -181,6 +171,7 @@ static int __net_init fib_notifier_net_init(struct net *net) ...@@ -181,6 +171,7 @@ static int __net_init fib_notifier_net_init(struct net *net)
struct fib_notifier_net *fn_net = net_generic(net, fib_notifier_net_id); struct fib_notifier_net *fn_net = net_generic(net, fib_notifier_net_id);
INIT_LIST_HEAD(&fn_net->fib_notifier_ops); INIT_LIST_HEAD(&fn_net->fib_notifier_ops);
ATOMIC_INIT_NOTIFIER_HEAD(&fn_net->fib_chain);
return 0; return 0;
} }
......
...@@ -321,7 +321,7 @@ int fib_rules_lookup(struct fib_rules_ops *ops, struct flowi *fl, ...@@ -321,7 +321,7 @@ int fib_rules_lookup(struct fib_rules_ops *ops, struct flowi *fl,
} }
EXPORT_SYMBOL_GPL(fib_rules_lookup); EXPORT_SYMBOL_GPL(fib_rules_lookup);
static int call_fib_rule_notifier(struct notifier_block *nb, struct net *net, static int call_fib_rule_notifier(struct notifier_block *nb,
enum fib_event_type event_type, enum fib_event_type event_type,
struct fib_rule *rule, int family) struct fib_rule *rule, int family)
{ {
...@@ -330,7 +330,7 @@ static int call_fib_rule_notifier(struct notifier_block *nb, struct net *net, ...@@ -330,7 +330,7 @@ static int call_fib_rule_notifier(struct notifier_block *nb, struct net *net,
.rule = rule, .rule = rule,
}; };
return call_fib_notifier(nb, net, event_type, &info.info); return call_fib_notifier(nb, event_type, &info.info);
} }
static int call_fib_rule_notifiers(struct net *net, static int call_fib_rule_notifiers(struct net *net,
...@@ -359,8 +359,7 @@ int fib_rules_dump(struct net *net, struct notifier_block *nb, int family) ...@@ -359,8 +359,7 @@ int fib_rules_dump(struct net *net, struct notifier_block *nb, int family)
if (!ops) if (!ops)
return -EAFNOSUPPORT; return -EAFNOSUPPORT;
list_for_each_entry_rcu(rule, &ops->rules_list, list) list_for_each_entry_rcu(rule, &ops->rules_list, list)
call_fib_rule_notifier(nb, net, FIB_EVENT_RULE_ADD, rule, call_fib_rule_notifier(nb, FIB_EVENT_RULE_ADD, rule, family);
family);
rules_ops_put(ops); rules_ops_put(ops);
return 0; return 0;
......
...@@ -9,12 +9,12 @@ ...@@ -9,12 +9,12 @@
#include <net/netns/ipv4.h> #include <net/netns/ipv4.h>
#include <net/ip_fib.h> #include <net/ip_fib.h>
int call_fib4_notifier(struct notifier_block *nb, struct net *net, int call_fib4_notifier(struct notifier_block *nb,
enum fib_event_type event_type, enum fib_event_type event_type,
struct fib_notifier_info *info) struct fib_notifier_info *info)
{ {
info->family = AF_INET; info->family = AF_INET;
return call_fib_notifier(nb, net, event_type, info); return call_fib_notifier(nb, event_type, info);
} }
int call_fib4_notifiers(struct net *net, enum fib_event_type event_type, int call_fib4_notifiers(struct net *net, enum fib_event_type event_type,
......
...@@ -74,7 +74,7 @@ ...@@ -74,7 +74,7 @@
#include <trace/events/fib.h> #include <trace/events/fib.h>
#include "fib_lookup.h" #include "fib_lookup.h"
static int call_fib_entry_notifier(struct notifier_block *nb, struct net *net, static int call_fib_entry_notifier(struct notifier_block *nb,
enum fib_event_type event_type, u32 dst, enum fib_event_type event_type, u32 dst,
int dst_len, struct fib_alias *fa) int dst_len, struct fib_alias *fa)
{ {
...@@ -86,7 +86,7 @@ static int call_fib_entry_notifier(struct notifier_block *nb, struct net *net, ...@@ -86,7 +86,7 @@ static int call_fib_entry_notifier(struct notifier_block *nb, struct net *net,
.type = fa->fa_type, .type = fa->fa_type,
.tb_id = fa->tb_id, .tb_id = fa->tb_id,
}; };
return call_fib4_notifier(nb, net, event_type, &info.info); return call_fib4_notifier(nb, event_type, &info.info);
} }
static int call_fib_entry_notifiers(struct net *net, static int call_fib_entry_notifiers(struct net *net,
...@@ -2015,8 +2015,8 @@ void fib_info_notify_update(struct net *net, struct nl_info *info) ...@@ -2015,8 +2015,8 @@ void fib_info_notify_update(struct net *net, struct nl_info *info)
} }
} }
static void fib_leaf_notify(struct net *net, struct key_vector *l, static void fib_leaf_notify(struct key_vector *l, struct fib_table *tb,
struct fib_table *tb, struct notifier_block *nb) struct notifier_block *nb)
{ {
struct fib_alias *fa; struct fib_alias *fa;
...@@ -2032,20 +2032,19 @@ static void fib_leaf_notify(struct net *net, struct key_vector *l, ...@@ -2032,20 +2032,19 @@ static void fib_leaf_notify(struct net *net, struct key_vector *l,
if (tb->tb_id != fa->tb_id) if (tb->tb_id != fa->tb_id)
continue; continue;
call_fib_entry_notifier(nb, net, FIB_EVENT_ENTRY_ADD, l->key, call_fib_entry_notifier(nb, FIB_EVENT_ENTRY_ADD, l->key,
KEYLENGTH - fa->fa_slen, fa); KEYLENGTH - fa->fa_slen, fa);
} }
} }
static void fib_table_notify(struct net *net, struct fib_table *tb, static void fib_table_notify(struct fib_table *tb, struct notifier_block *nb)
struct notifier_block *nb)
{ {
struct trie *t = (struct trie *)tb->tb_data; struct trie *t = (struct trie *)tb->tb_data;
struct key_vector *l, *tp = t->kv; struct key_vector *l, *tp = t->kv;
t_key key = 0; t_key key = 0;
while ((l = leaf_walk_rcu(&tp, key)) != NULL) { while ((l = leaf_walk_rcu(&tp, key)) != NULL) {
fib_leaf_notify(net, l, tb, nb); fib_leaf_notify(l, tb, nb);
key = l->key + 1; key = l->key + 1;
/* stop in case of wrap around */ /* stop in case of wrap around */
...@@ -2063,7 +2062,7 @@ void fib_notify(struct net *net, struct notifier_block *nb) ...@@ -2063,7 +2062,7 @@ void fib_notify(struct net *net, struct notifier_block *nb)
struct fib_table *tb; struct fib_table *tb;
hlist_for_each_entry_rcu(tb, head, tb_hlist) hlist_for_each_entry_rcu(tb, head, tb_hlist)
fib_table_notify(net, tb, nb); fib_table_notify(tb, nb);
} }
} }
......
...@@ -409,7 +409,7 @@ int mr_dump(struct net *net, struct notifier_block *nb, unsigned short family, ...@@ -409,7 +409,7 @@ int mr_dump(struct net *net, struct notifier_block *nb, unsigned short family,
if (!v->dev) if (!v->dev)
continue; continue;
mr_call_vif_notifier(nb, net, family, mr_call_vif_notifier(nb, family,
FIB_EVENT_VIF_ADD, FIB_EVENT_VIF_ADD,
v, vifi, mrt->id); v, vifi, mrt->id);
} }
...@@ -417,7 +417,7 @@ int mr_dump(struct net *net, struct notifier_block *nb, unsigned short family, ...@@ -417,7 +417,7 @@ int mr_dump(struct net *net, struct notifier_block *nb, unsigned short family,
/* Notify on table MFC entries */ /* Notify on table MFC entries */
list_for_each_entry_rcu(mfc, &mrt->mfc_cache_list, list) list_for_each_entry_rcu(mfc, &mrt->mfc_cache_list, list)
mr_call_mfc_notifier(nb, net, family, mr_call_mfc_notifier(nb, family,
FIB_EVENT_ENTRY_ADD, FIB_EVENT_ENTRY_ADD,
mfc, mrt->id); mfc, mrt->id);
} }
......
...@@ -7,12 +7,12 @@ ...@@ -7,12 +7,12 @@
#include <net/netns/ipv6.h> #include <net/netns/ipv6.h>
#include <net/ip6_fib.h> #include <net/ip6_fib.h>
int call_fib6_notifier(struct notifier_block *nb, struct net *net, int call_fib6_notifier(struct notifier_block *nb,
enum fib_event_type event_type, enum fib_event_type event_type,
struct fib_notifier_info *info) struct fib_notifier_info *info)
{ {
info->family = AF_INET6; info->family = AF_INET6;
return call_fib_notifier(nb, net, event_type, info); return call_fib_notifier(nb, event_type, info);
} }
int call_fib6_notifiers(struct net *net, enum fib_event_type event_type, int call_fib6_notifiers(struct net *net, enum fib_event_type event_type,
......
...@@ -357,7 +357,7 @@ unsigned int fib6_tables_seq_read(struct net *net) ...@@ -357,7 +357,7 @@ unsigned int fib6_tables_seq_read(struct net *net)
return fib_seq; return fib_seq;
} }
static int call_fib6_entry_notifier(struct notifier_block *nb, struct net *net, static int call_fib6_entry_notifier(struct notifier_block *nb,
enum fib_event_type event_type, enum fib_event_type event_type,
struct fib6_info *rt) struct fib6_info *rt)
{ {
...@@ -365,7 +365,7 @@ static int call_fib6_entry_notifier(struct notifier_block *nb, struct net *net, ...@@ -365,7 +365,7 @@ static int call_fib6_entry_notifier(struct notifier_block *nb, struct net *net,
.rt = rt, .rt = rt,
}; };
return call_fib6_notifier(nb, net, event_type, &info.info); return call_fib6_notifier(nb, event_type, &info.info);
} }
int call_fib6_entry_notifiers(struct net *net, int call_fib6_entry_notifiers(struct net *net,
...@@ -407,7 +407,7 @@ static void fib6_rt_dump(struct fib6_info *rt, struct fib6_dump_arg *arg) ...@@ -407,7 +407,7 @@ static void fib6_rt_dump(struct fib6_info *rt, struct fib6_dump_arg *arg)
{ {
if (rt == arg->net->ipv6.fib6_null_entry) if (rt == arg->net->ipv6.fib6_null_entry)
return; return;
call_fib6_entry_notifier(arg->nb, arg->net, FIB_EVENT_ENTRY_ADD, rt); call_fib6_entry_notifier(arg->nb, FIB_EVENT_ENTRY_ADD, rt);
} }
static int fib6_node_dump(struct fib6_walker *w) static int fib6_node_dump(struct fib6_walker *w)
......
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