OSDN Git Service

net/ipv6: Pass net namespace to route functions
[uclinux-h8/linux.git] / net / ipv6 / route.c
index 0a99cda..045811a 100644 (file)
@@ -850,13 +850,13 @@ int rt6_route_rcv(struct net_device *dev, u8 *opt, int len,
        }
 
        if (rinfo->prefix_len == 0)
-               rt = rt6_get_dflt_router(gwaddr, dev);
+               rt = rt6_get_dflt_router(net, gwaddr, dev);
        else
                rt = rt6_get_route_info(net, prefix, rinfo->prefix_len,
                                        gwaddr, dev);
 
        if (rt && !lifetime) {
-               ip6_del_rt(rt);
+               ip6_del_rt(net, rt);
                rt = NULL;
        }
 
@@ -1014,9 +1014,9 @@ static int __ip6_ins_rt(struct rt6_info *rt, struct nl_info *info,
        return err;
 }
 
-int ip6_ins_rt(struct rt6_info *rt)
+int ip6_ins_rt(struct net *net, struct rt6_info *rt)
 {
-       struct nl_info info = { .nl_net = dev_net(rt->dst.dev), };
+       struct nl_info info = { .nl_net = net, };
        struct mx6_config mxc = { .mx = NULL, };
 
        /* Hold dst to account for the reference from the fib6 tree */
@@ -1121,14 +1121,13 @@ static struct rt6_info *rt6_get_pcpu_route(struct rt6_info *rt)
        return pcpu_rt;
 }
 
-static struct rt6_info *rt6_make_pcpu_route(struct rt6_info *rt)
+static struct rt6_info *rt6_make_pcpu_route(struct net *net,
+                                           struct rt6_info *rt)
 {
        struct rt6_info *pcpu_rt, *prev, **p;
 
        pcpu_rt = ip6_rt_pcpu_alloc(rt);
        if (!pcpu_rt) {
-               struct net *net = dev_net(rt->dst.dev);
-
                dst_hold(&net->ipv6.ip6_null_entry->dst);
                return net->ipv6.ip6_null_entry;
        }
@@ -1787,7 +1786,7 @@ uncached_rt_out:
                                /* No dst_hold() on rt is needed because grabbing
                                 * rt->rt6i_ref makes sure rt can't be released.
                                 */
-                               pcpu_rt = rt6_make_pcpu_route(rt);
+                               pcpu_rt = rt6_make_pcpu_route(net, rt);
                                rt6_release(rt);
                        } else {
                                /* rt is already removed from tree */
@@ -2088,7 +2087,7 @@ static struct dst_entry *ip6_negative_advice(struct dst_entry *dst)
        if (rt) {
                if (rt->rt6i_flags & RTF_CACHE) {
                        if (rt6_check_expired(rt)) {
-                               ip6_del_rt(rt);
+                               ip6_del_rt(dev_net(dst->dev), rt);
                                dst = NULL;
                        }
                } else {
@@ -2109,7 +2108,7 @@ static void ip6_link_failure(struct sk_buff *skb)
        if (rt) {
                if (rt->rt6i_flags & RTF_CACHE) {
                        if (dst_hold_safe(&rt->dst))
-                               ip6_del_rt(rt);
+                               ip6_del_rt(dev_net(rt->dst.dev), rt);
                } else {
                        struct fib6_node *fn;
 
@@ -3018,9 +3017,9 @@ out:
 
 static int __ip6_del_rt(struct rt6_info *rt, struct nl_info *info)
 {
-       int err;
+       struct net *net = info->nl_net;
        struct fib6_table *table;
-       struct net *net = dev_net(rt->dst.dev);
+       int err;
 
        if (rt == net->ipv6.ip6_null_entry) {
                err = -ENOENT;
@@ -3037,11 +3036,10 @@ out:
        return err;
 }
 
-int ip6_del_rt(struct rt6_info *rt)
+int ip6_del_rt(struct net *net, struct rt6_info *rt)
 {
-       struct nl_info info = {
-               .nl_net = dev_net(rt->dst.dev),
-       };
+       struct nl_info info = { .nl_net = net };
+
        return __ip6_del_rt(rt, &info);
 }
 
@@ -3376,13 +3374,15 @@ static struct rt6_info *rt6_add_route_info(struct net *net,
 }
 #endif
 
-struct rt6_info *rt6_get_dflt_router(const struct in6_addr *addr, struct net_device *dev)
+struct rt6_info *rt6_get_dflt_router(struct net *net,
+                                    const struct in6_addr *addr,
+                                    struct net_device *dev)
 {
        u32 tb_id = l3mdev_fib_table(dev) ? : RT6_TABLE_DFLT;
        struct rt6_info *rt;
        struct fib6_table *table;
 
-       table = fib6_get_table(dev_net(dev), tb_id);
+       table = fib6_get_table(net, tb_id);
        if (!table)
                return NULL;
 
@@ -3399,7 +3399,8 @@ struct rt6_info *rt6_get_dflt_router(const struct in6_addr *addr, struct net_dev
        return rt;
 }
 
-struct rt6_info *rt6_add_dflt_router(const struct in6_addr *gwaddr,
+struct rt6_info *rt6_add_dflt_router(struct net *net,
+                                    const struct in6_addr *gwaddr,
                                     struct net_device *dev,
                                     unsigned int pref)
 {
@@ -3412,7 +3413,7 @@ struct rt6_info *rt6_add_dflt_router(const struct in6_addr *gwaddr,
                .fc_protocol = RTPROT_RA,
                .fc_nlinfo.portid = 0,
                .fc_nlinfo.nlh = NULL,
-               .fc_nlinfo.nl_net = dev_net(dev),
+               .fc_nlinfo.nl_net = net,
        };
 
        cfg.fc_gateway = *gwaddr;
@@ -3425,10 +3426,11 @@ struct rt6_info *rt6_add_dflt_router(const struct in6_addr *gwaddr,
                        table->flags |= RT6_TABLE_HAS_DFLT_ROUTER;
        }
 
-       return rt6_get_dflt_router(gwaddr, dev);
+       return rt6_get_dflt_router(net, gwaddr, dev);
 }
 
-static void __rt6_purge_dflt_routers(struct fib6_table *table)
+static void __rt6_purge_dflt_routers(struct net *net,
+                                    struct fib6_table *table)
 {
        struct rt6_info *rt;
 
@@ -3439,7 +3441,7 @@ restart:
                    (!rt->rt6i_idev || rt->rt6i_idev->cnf.accept_ra != 2)) {
                        if (dst_hold_safe(&rt->dst)) {
                                rcu_read_unlock();
-                               ip6_del_rt(rt);
+                               ip6_del_rt(net, rt);
                        } else {
                                rcu_read_unlock();
                        }
@@ -3463,7 +3465,7 @@ void rt6_purge_dflt_routers(struct net *net)
                head = &net->ipv6.fib_table_hash[h];
                hlist_for_each_entry_rcu(table, head, tb6_hlist) {
                        if (table->flags & RT6_TABLE_HAS_DFLT_ROUTER)
-                               __rt6_purge_dflt_routers(table);
+                               __rt6_purge_dflt_routers(net, table);
                }
        }
 
@@ -3583,12 +3585,12 @@ static int ip6_pkt_prohibit_out(struct net *net, struct sock *sk, struct sk_buff
  *     Allocate a dst for local (unicast / anycast) address.
  */
 
-struct rt6_info *addrconf_dst_alloc(struct inet6_dev *idev,
+struct rt6_info *addrconf_dst_alloc(struct net *net,
+                                   struct inet6_dev *idev,
                                    const struct in6_addr *addr,
                                    bool anycast)
 {
        u32 tb_id;
-       struct net *net = dev_net(idev->dev);
        struct net_device *dev = idev->dev;
        struct rt6_info *rt;