Skip to content

Commit

Permalink
vrf: Move fib6_table into net_vrf
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
David Ahern authored and David S. Miller committed Apr 18, 2018
1 parent 3940746 commit 43b059a
Showing 1 changed file with 6 additions and 19 deletions.
25 changes: 6 additions & 19 deletions drivers/net/vrf.c
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,9 @@ static unsigned int vrf_net_id;
struct net_vrf {
struct rtable __rcu *rth;
struct rt6_info __rcu *rt6;
#if IS_ENABLED(CONFIG_IPV6)
struct fib6_table *fib6_table;
#endif
u32 tb_id;
};

Expand Down Expand Up @@ -496,24 +499,22 @@ static int vrf_rt6_create(struct net_device *dev)
int flags = DST_HOST | DST_NOPOLICY | DST_NOXFRM;
struct net_vrf *vrf = netdev_priv(dev);
struct net *net = dev_net(dev);
struct fib6_table *rt6i_table;
struct rt6_info *rt6;
int rc = -ENOMEM;

/* IPv6 can be CONFIG enabled and then disabled runtime */
if (!ipv6_mod_enabled())
return 0;

rt6i_table = fib6_new_table(net, vrf->tb_id);
if (!rt6i_table)
vrf->fib6_table = fib6_new_table(net, vrf->tb_id);
if (!vrf->fib6_table)
goto out;

/* create a dst for routing packets out a VRF device */
rt6 = ip6_dst_alloc(net, dev, flags);
if (!rt6)
goto out;

rt6->rt6i_table = rt6i_table;
rt6->dst.output = vrf_output6;

rcu_assign_pointer(vrf->rt6, rt6);
Expand Down Expand Up @@ -946,22 +947,8 @@ static struct rt6_info *vrf_ip6_route_lookup(struct net *net,
int flags)
{
struct net_vrf *vrf = netdev_priv(dev);
struct fib6_table *table = NULL;
struct rt6_info *rt6;

rcu_read_lock();

/* fib6_table does not have a refcnt and can not be freed */
rt6 = rcu_dereference(vrf->rt6);
if (likely(rt6))
table = rt6->rt6i_table;

rcu_read_unlock();

if (!table)
return NULL;

return ip6_pol_route(net, table, ifindex, fl6, skb, flags);
return ip6_pol_route(net, vrf->fib6_table, ifindex, fl6, skb, flags);
}

static void vrf_ip6_input_dst(struct sk_buff *skb, struct net_device *vrf_dev,
Expand Down

0 comments on commit 43b059a

Please sign in to comment.