diff options
-rw-r--r-- | net/ipv4/route.c | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 674575b622ad..0576ff79c550 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
@@ -2248,7 +2248,8 @@ static inline int ip_mkroute_output(struct rtable **rp, | |||
2248 | * Major route resolver routine. | 2248 | * Major route resolver routine. |
2249 | */ | 2249 | */ |
2250 | 2250 | ||
2251 | static int ip_route_output_slow(struct rtable **rp, const struct flowi *oldflp) | 2251 | static int ip_route_output_slow(struct net *net, struct rtable **rp, |
2252 | const struct flowi *oldflp) | ||
2252 | { | 2253 | { |
2253 | u32 tos = RT_FL_TOS(oldflp); | 2254 | u32 tos = RT_FL_TOS(oldflp); |
2254 | struct flowi fl = { .nl_u = { .ip4_u = | 2255 | struct flowi fl = { .nl_u = { .ip4_u = |
@@ -2260,7 +2261,7 @@ static int ip_route_output_slow(struct rtable **rp, const struct flowi *oldflp) | |||
2260 | RT_SCOPE_UNIVERSE), | 2261 | RT_SCOPE_UNIVERSE), |
2261 | } }, | 2262 | } }, |
2262 | .mark = oldflp->mark, | 2263 | .mark = oldflp->mark, |
2263 | .iif = init_net.loopback_dev->ifindex, | 2264 | .iif = net->loopback_dev->ifindex, |
2264 | .oif = oldflp->oif }; | 2265 | .oif = oldflp->oif }; |
2265 | struct fib_result res; | 2266 | struct fib_result res; |
2266 | unsigned flags = 0; | 2267 | unsigned flags = 0; |
@@ -2282,7 +2283,7 @@ static int ip_route_output_slow(struct rtable **rp, const struct flowi *oldflp) | |||
2282 | goto out; | 2283 | goto out; |
2283 | 2284 | ||
2284 | /* It is equivalent to inet_addr_type(saddr) == RTN_LOCAL */ | 2285 | /* It is equivalent to inet_addr_type(saddr) == RTN_LOCAL */ |
2285 | dev_out = ip_dev_find(&init_net, oldflp->fl4_src); | 2286 | dev_out = ip_dev_find(net, oldflp->fl4_src); |
2286 | if (dev_out == NULL) | 2287 | if (dev_out == NULL) |
2287 | goto out; | 2288 | goto out; |
2288 | 2289 | ||
@@ -2322,7 +2323,7 @@ static int ip_route_output_slow(struct rtable **rp, const struct flowi *oldflp) | |||
2322 | 2323 | ||
2323 | 2324 | ||
2324 | if (oldflp->oif) { | 2325 | if (oldflp->oif) { |
2325 | dev_out = dev_get_by_index(&init_net, oldflp->oif); | 2326 | dev_out = dev_get_by_index(net, oldflp->oif); |
2326 | err = -ENODEV; | 2327 | err = -ENODEV; |
2327 | if (dev_out == NULL) | 2328 | if (dev_out == NULL) |
2328 | goto out; | 2329 | goto out; |
@@ -2356,15 +2357,15 @@ static int ip_route_output_slow(struct rtable **rp, const struct flowi *oldflp) | |||
2356 | fl.fl4_dst = fl.fl4_src = htonl(INADDR_LOOPBACK); | 2357 | fl.fl4_dst = fl.fl4_src = htonl(INADDR_LOOPBACK); |
2357 | if (dev_out) | 2358 | if (dev_out) |
2358 | dev_put(dev_out); | 2359 | dev_put(dev_out); |
2359 | dev_out = init_net.loopback_dev; | 2360 | dev_out = net->loopback_dev; |
2360 | dev_hold(dev_out); | 2361 | dev_hold(dev_out); |
2361 | fl.oif = init_net.loopback_dev->ifindex; | 2362 | fl.oif = net->loopback_dev->ifindex; |
2362 | res.type = RTN_LOCAL; | 2363 | res.type = RTN_LOCAL; |
2363 | flags |= RTCF_LOCAL; | 2364 | flags |= RTCF_LOCAL; |
2364 | goto make_route; | 2365 | goto make_route; |
2365 | } | 2366 | } |
2366 | 2367 | ||
2367 | if (fib_lookup(&init_net, &fl, &res)) { | 2368 | if (fib_lookup(net, &fl, &res)) { |
2368 | res.fi = NULL; | 2369 | res.fi = NULL; |
2369 | if (oldflp->oif) { | 2370 | if (oldflp->oif) { |
2370 | /* Apparently, routing tables are wrong. Assume, | 2371 | /* Apparently, routing tables are wrong. Assume, |
@@ -2403,7 +2404,7 @@ static int ip_route_output_slow(struct rtable **rp, const struct flowi *oldflp) | |||
2403 | fl.fl4_src = fl.fl4_dst; | 2404 | fl.fl4_src = fl.fl4_dst; |
2404 | if (dev_out) | 2405 | if (dev_out) |
2405 | dev_put(dev_out); | 2406 | dev_put(dev_out); |
2406 | dev_out = init_net.loopback_dev; | 2407 | dev_out = net->loopback_dev; |
2407 | dev_hold(dev_out); | 2408 | dev_hold(dev_out); |
2408 | fl.oif = dev_out->ifindex; | 2409 | fl.oif = dev_out->ifindex; |
2409 | if (res.fi) | 2410 | if (res.fi) |
@@ -2419,7 +2420,7 @@ static int ip_route_output_slow(struct rtable **rp, const struct flowi *oldflp) | |||
2419 | else | 2420 | else |
2420 | #endif | 2421 | #endif |
2421 | if (!res.prefixlen && res.type == RTN_UNICAST && !fl.oif) | 2422 | if (!res.prefixlen && res.type == RTN_UNICAST && !fl.oif) |
2422 | fib_select_default(&init_net, &fl, &res); | 2423 | fib_select_default(net, &fl, &res); |
2423 | 2424 | ||
2424 | if (!fl.fl4_src) | 2425 | if (!fl.fl4_src) |
2425 | fl.fl4_src = FIB_RES_PREFSRC(res); | 2426 | fl.fl4_src = FIB_RES_PREFSRC(res); |
@@ -2469,7 +2470,7 @@ int __ip_route_output_key(struct rtable **rp, const struct flowi *flp) | |||
2469 | } | 2470 | } |
2470 | rcu_read_unlock_bh(); | 2471 | rcu_read_unlock_bh(); |
2471 | 2472 | ||
2472 | return ip_route_output_slow(rp, flp); | 2473 | return ip_route_output_slow(&init_net, rp, flp); |
2473 | } | 2474 | } |
2474 | 2475 | ||
2475 | EXPORT_SYMBOL_GPL(__ip_route_output_key); | 2476 | EXPORT_SYMBOL_GPL(__ip_route_output_key); |