aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/vrf.c
diff options
context:
space:
mode:
authorDavid Ahern <dsahern@gmail.com>2018-04-17 20:33:09 -0400
committerDavid S. Miller <davem@davemloft.net>2018-04-17 23:41:15 -0400
commit43b059a312f35799ef7e3a49aba4f1e0128e30ca (patch)
tree469124c550d223a2283e2482137bbf629f411d5f /drivers/net/vrf.c
parent3940746d867f2f0390342dcb7ac06f1ed0e68027 (diff)
vrf: Move fib6_table into net_vrf
A later patch removes rt6i_table from rt6_info. Save the ipv6 table for a VRF in net_vrf. fib tables can not be deleted so no reference counting or locking is required. Signed-off-by: David Ahern <dsahern@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/vrf.c')
-rw-r--r--drivers/net/vrf.c25
1 files changed, 6 insertions, 19 deletions
diff --git a/drivers/net/vrf.c b/drivers/net/vrf.c
index 0a2b180d138a..90b5f3900c22 100644
--- a/drivers/net/vrf.c
+++ b/drivers/net/vrf.c
@@ -48,6 +48,9 @@ static unsigned int vrf_net_id;
48struct net_vrf { 48struct net_vrf {
49 struct rtable __rcu *rth; 49 struct rtable __rcu *rth;
50 struct rt6_info __rcu *rt6; 50 struct rt6_info __rcu *rt6;
51#if IS_ENABLED(CONFIG_IPV6)
52 struct fib6_table *fib6_table;
53#endif
51 u32 tb_id; 54 u32 tb_id;
52}; 55};
53 56
@@ -496,7 +499,6 @@ static int vrf_rt6_create(struct net_device *dev)
496 int flags = DST_HOST | DST_NOPOLICY | DST_NOXFRM; 499 int flags = DST_HOST | DST_NOPOLICY | DST_NOXFRM;
497 struct net_vrf *vrf = netdev_priv(dev); 500 struct net_vrf *vrf = netdev_priv(dev);
498 struct net *net = dev_net(dev); 501 struct net *net = dev_net(dev);
499 struct fib6_table *rt6i_table;
500 struct rt6_info *rt6; 502 struct rt6_info *rt6;
501 int rc = -ENOMEM; 503 int rc = -ENOMEM;
502 504
@@ -504,8 +506,8 @@ static int vrf_rt6_create(struct net_device *dev)
504 if (!ipv6_mod_enabled()) 506 if (!ipv6_mod_enabled())
505 return 0; 507 return 0;
506 508
507 rt6i_table = fib6_new_table(net, vrf->tb_id); 509 vrf->fib6_table = fib6_new_table(net, vrf->tb_id);
508 if (!rt6i_table) 510 if (!vrf->fib6_table)
509 goto out; 511 goto out;
510 512
511 /* create a dst for routing packets out a VRF device */ 513 /* create a dst for routing packets out a VRF device */
@@ -513,7 +515,6 @@ static int vrf_rt6_create(struct net_device *dev)
513 if (!rt6) 515 if (!rt6)
514 goto out; 516 goto out;
515 517
516 rt6->rt6i_table = rt6i_table;
517 rt6->dst.output = vrf_output6; 518 rt6->dst.output = vrf_output6;
518 519
519 rcu_assign_pointer(vrf->rt6, rt6); 520 rcu_assign_pointer(vrf->rt6, rt6);
@@ -946,22 +947,8 @@ static struct rt6_info *vrf_ip6_route_lookup(struct net *net,
946 int flags) 947 int flags)
947{ 948{
948 struct net_vrf *vrf = netdev_priv(dev); 949 struct net_vrf *vrf = netdev_priv(dev);
949 struct fib6_table *table = NULL;
950 struct rt6_info *rt6;
951
952 rcu_read_lock();
953
954 /* fib6_table does not have a refcnt and can not be freed */
955 rt6 = rcu_dereference(vrf->rt6);
956 if (likely(rt6))
957 table = rt6->rt6i_table;
958
959 rcu_read_unlock();
960
961 if (!table)
962 return NULL;
963 950
964 return ip6_pol_route(net, table, ifindex, fl6, skb, flags); 951 return ip6_pol_route(net, vrf->fib6_table, ifindex, fl6, skb, flags);
965} 952}
966 953
967static void vrf_ip6_input_dst(struct sk_buff *skb, struct net_device *vrf_dev, 954static void vrf_ip6_input_dst(struct sk_buff *skb, struct net_device *vrf_dev,