net: vrf: Make add_fib_rules per network namespace flag
Subsystems (3)
PATCH 1/1 net: vrf: Make add_fib_rules per network namespace flag
Commit 1aa6c4f6b8cd8 ("net: vrf: Add l3mdev rules on first device create") adds the l3mdev FIB rule the first time a VRF device is created. However, it only creates the rule once and only in the namespace the first device is created - which may not be init_net. Fix by using the net_generic capability to make the add_fib_rules flag per network namespace.
--- drivers/net/vrf.c | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-)
drivers/net/vrf.c +32 -4
@@ -36,12 +36,14 @@#include <net/addrconf.h> #include <net/l3mdev.h> #include <net/fib_rules.h> +#include <net/netns/generic.h> #define DRV_NAME "vrf"#define DRV_VERSION "1.0"#define FIB_RULE_PREF 1000/* default preference for FIB rules */ -static bool add_fib_rules = true; + +static unsigned int vrf_net_id;struct net_vrf {struct rtable __rcu *rth;
@@ -1394,6 +1396,8 @@ static int vrf_newlink(struct net *src_net, struct net_device *dev, struct nlattr *tb[], struct nlattr *data[]) { struct net_vrf *vrf = netdev_priv(dev); +bool *add_fib_rules; +struct net *net;int err;if (!data || !data[IFLA_VRF_TABLE ])
@@ -1409,13 +1413,15 @@ static int vrf_newlink(struct net *src_net, struct net_device *dev,if (err) goto out; -if (add_fib_rules) { + net =dev_net (dev); + add_fib_rules =net_generic (net, vrf_net_id); +if (*add_fib_rules) { err =vrf_add_fib_rules (dev);if (err) {unregister_netdevice (dev); goto out; } - add_fib_rules = false; + *add_fib_rules = false; } out:
@@ -1498,16 +1504,38 @@ static struct notifier_block vrf_notifier_block __read_mostly = { .notifier_call = vrf_device_event, }; +/* Initialize per network namespace state */ +static int __net_init vrf_netns_init (struct net *net) +{ +bool *add_fib_rules =net_generic (net, vrf_net_id); + + *add_fib_rules = true; + +return 0 ; +} + +static struct pernet_operations vrf_net_ops__net_initdata = { + .init = vrf_netns_init, + .id = &vrf_net_id, + .size =sizeof (bool ), +}; +static int __init vrf_init_module (void ) {int rc;register_netdevice_notifier (&vrf_notifier_block); - rc =rtnl_link_register (&vrf_link_ops); + rc =register_pernet_subsys (&vrf_net_ops);if (rc <0 ) goto error; + rc =rtnl_link_register (&vrf_link_ops); +if (rc <0 ) { +unregister_pernet_subsys (&vrf_net_ops); + goto error; + } +return 0 ; error:
Signature · 1 line
2.11.0 (Apple Git-81)
David Miller
maintainerFrom: David Ahern <[email protected]>
Date: Thu, 8 Jun 2017 11:31:11 -0600
Quoted 9 lines
Commit
1aa6c4f6b8cd8("net: vrf: Add l3mdev rules on first device create") adds the l3mdev FIB rule the first time a VRF device is created. However, it only creates the rule once and only in the namespace the first device is created - which may not beinit_net. Fix by using thenet_genericcapability to make theadd_fib_rulesflag per network namespace.Fixes 1aa6c4f6b8cd8 ("net: vrf: Add l3mdev rules on first device create")Reported-by Petr Machata <[email protected]>Signed-off-by David Ahern <[email protected]>
Yeah that's not very helpful behavior.
Applied and queued up for -stable, thanks David.
Quoted 5 lines · David Ahern
Commit
1aa6c4f6b8cd8("net: vrf: Add l3mdev rules on first device create") adds the l3mdev FIB rule the first time a VRF device is created. However, it only creates the rule once and only in the namespace the first device is created - which may not beinit_net. Fix by using thenet_genericcapability to make theadd_fib_rulesflag per network namespace.
Works per my testing.
Thanks!
Petr