]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - net/ipv4/route.c
[NETNS]: Add namespace parameter to ip_route_output_slow.
[net-next-2.6.git] / net / ipv4 / route.c
index a7651c64bb48c62b84841462bbda9d383fcbed54..0576ff79c550a69d152f6a33a2fe6450d28a4ca5 100644 (file)
@@ -1559,7 +1559,7 @@ void ip_rt_get_source(u8 *addr, struct rtable *rt)
 
        if (rt->fl.iif == 0)
                src = rt->rt_src;
-       else if (fib_lookup(&init_net, &rt->fl, &res) == 0) {
+       else if (fib_lookup(rt->u.dst.dev->nd_net, &rt->fl, &res) == 0) {
                src = FIB_RES_PREFSRC(res);
                fib_res_put(&res);
        } else
@@ -1881,6 +1881,7 @@ static int ip_route_input_slow(struct sk_buff *skb, __be32 daddr, __be32 saddr,
        __be32          spec_dst;
        int             err = -EINVAL;
        int             free_res = 0;
+       struct net    * net = dev->nd_net;
 
        /* IP on this device is disabled. */
 
@@ -1911,7 +1912,7 @@ static int ip_route_input_slow(struct sk_buff *skb, __be32 daddr, __be32 saddr,
        /*
         *      Now we are ready to route packet.
         */
-       if ((err = fib_lookup(&init_net, &fl, &res)) != 0) {
+       if ((err = fib_lookup(net, &fl, &res)) != 0) {
                if (!IN_DEV_FORWARD(in_dev))
                        goto e_hostunreach;
                goto no_route;
@@ -1926,7 +1927,7 @@ static int ip_route_input_slow(struct sk_buff *skb, __be32 daddr, __be32 saddr,
        if (res.type == RTN_LOCAL) {
                int result;
                result = fib_validate_source(saddr, daddr, tos,
-                                            init_net.loopback_dev->ifindex,
+                                            net->loopback_dev->ifindex,
                                             dev, &spec_dst, &itag);
                if (result < 0)
                        goto martian_source;
@@ -1988,7 +1989,7 @@ local_input:
 #endif
        rth->rt_iif     =
        rth->fl.iif     = dev->ifindex;
-       rth->u.dst.dev  = init_net.loopback_dev;
+       rth->u.dst.dev  = net->loopback_dev;
        dev_hold(rth->u.dst.dev);
        rth->idev       = in_dev_get(rth->u.dst.dev);
        rth->rt_gateway = daddr;
@@ -2247,7 +2248,8 @@ static inline int ip_mkroute_output(struct rtable **rp,
  * Major route resolver routine.
  */
 
-static int ip_route_output_slow(struct rtable **rp, const struct flowi *oldflp)
+static int ip_route_output_slow(struct net *net, struct rtable **rp,
+                               const struct flowi *oldflp)
 {
        u32 tos = RT_FL_TOS(oldflp);
        struct flowi fl = { .nl_u = { .ip4_u =
@@ -2259,7 +2261,7 @@ static int ip_route_output_slow(struct rtable **rp, const struct flowi *oldflp)
                                                  RT_SCOPE_UNIVERSE),
                                      } },
                            .mark = oldflp->mark,
-                           .iif = init_net.loopback_dev->ifindex,
+                           .iif = net->loopback_dev->ifindex,
                            .oif = oldflp->oif };
        struct fib_result res;
        unsigned flags = 0;
@@ -2281,14 +2283,14 @@ static int ip_route_output_slow(struct rtable **rp, const struct flowi *oldflp)
                        goto out;
 
                /* It is equivalent to inet_addr_type(saddr) == RTN_LOCAL */
-               dev_out = ip_dev_find(oldflp->fl4_src);
+               dev_out = ip_dev_find(net, oldflp->fl4_src);
                if (dev_out == NULL)
                        goto out;
 
                /* I removed check for oif == dev_out->oif here.
                   It was wrong for two reasons:
-                  1. ip_dev_find(saddr) can return wrong iface, if saddr is
-                     assigned to multiple interfaces.
+                  1. ip_dev_find(net, saddr) can return wrong iface, if saddr
+                     is assigned to multiple interfaces.
                   2. Moreover, we are allowed to send packets with saddr
                      of another iface. --ANK
                 */
@@ -2321,7 +2323,7 @@ static int ip_route_output_slow(struct rtable **rp, const struct flowi *oldflp)
 
 
        if (oldflp->oif) {
-               dev_out = dev_get_by_index(&init_net, oldflp->oif);
+               dev_out = dev_get_by_index(net, oldflp->oif);
                err = -ENODEV;
                if (dev_out == NULL)
                        goto out;
@@ -2355,15 +2357,15 @@ static int ip_route_output_slow(struct rtable **rp, const struct flowi *oldflp)
                        fl.fl4_dst = fl.fl4_src = htonl(INADDR_LOOPBACK);
                if (dev_out)
                        dev_put(dev_out);
-               dev_out = init_net.loopback_dev;
+               dev_out = net->loopback_dev;
                dev_hold(dev_out);
-               fl.oif = init_net.loopback_dev->ifindex;
+               fl.oif = net->loopback_dev->ifindex;
                res.type = RTN_LOCAL;
                flags |= RTCF_LOCAL;
                goto make_route;
        }
 
-       if (fib_lookup(&init_net, &fl, &res)) {
+       if (fib_lookup(net, &fl, &res)) {
                res.fi = NULL;
                if (oldflp->oif) {
                        /* Apparently, routing tables are wrong. Assume,
@@ -2402,7 +2404,7 @@ static int ip_route_output_slow(struct rtable **rp, const struct flowi *oldflp)
                        fl.fl4_src = fl.fl4_dst;
                if (dev_out)
                        dev_put(dev_out);
-               dev_out = init_net.loopback_dev;
+               dev_out = net->loopback_dev;
                dev_hold(dev_out);
                fl.oif = dev_out->ifindex;
                if (res.fi)
@@ -2418,7 +2420,7 @@ static int ip_route_output_slow(struct rtable **rp, const struct flowi *oldflp)
        else
 #endif
        if (!res.prefixlen && res.type == RTN_UNICAST && !fl.oif)
-               fib_select_default(&fl, &res);
+               fib_select_default(net, &fl, &res);
 
        if (!fl.fl4_src)
                fl.fl4_src = FIB_RES_PREFSRC(res);
@@ -2468,7 +2470,7 @@ int __ip_route_output_key(struct rtable **rp, const struct flowi *flp)
        }
        rcu_read_unlock_bh();
 
-       return ip_route_output_slow(rp, flp);
+       return ip_route_output_slow(&init_net, rp, flp);
 }
 
 EXPORT_SYMBOL_GPL(__ip_route_output_key);