diff options
| author | David Ahern <dsahern@gmail.com> | 2018-04-17 20:33:09 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2018-04-17 23:41:15 -0400 |
| commit | 43b059a312f35799ef7e3a49aba4f1e0128e30ca (patch) | |
| tree | 469124c550d223a2283e2482137bbf629f411d5f /drivers/net/vrf.c | |
| parent | 3940746d867f2f0390342dcb7ac06f1ed0e68027 (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.c | 25 |
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; | |||
| 48 | struct net_vrf { | 48 | struct 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 | ||
| 967 | static void vrf_ip6_input_dst(struct sk_buff *skb, struct net_device *vrf_dev, | 954 | static void vrf_ip6_input_dst(struct sk_buff *skb, struct net_device *vrf_dev, |
