Commit da0e28cb authored by Denis V. Lunev's avatar Denis V. Lunev Committed by David S. Miller

[NETNS]: Add netns parameter to fib_lookup.

Signed-off-by: default avatarDenis V. Lunev <den@openvz.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent ba93ef74
...@@ -178,15 +178,16 @@ static inline struct fib_table *fib_new_table(struct net *net, u32 id) ...@@ -178,15 +178,16 @@ static inline struct fib_table *fib_new_table(struct net *net, u32 id)
return fib_get_table(net, id); return fib_get_table(net, id);
} }
static inline int fib_lookup(const struct flowi *flp, struct fib_result *res) static inline int fib_lookup(struct net *net, const struct flowi *flp,
struct fib_result *res)
{ {
struct fib_table *table; struct fib_table *table;
table = fib_get_table(&init_net, RT_TABLE_LOCAL); table = fib_get_table(net, RT_TABLE_LOCAL);
if (!table->tb_lookup(table, flp, res)) if (!table->tb_lookup(table, flp, res))
return 0; return 0;
table = fib_get_table(&init_net, RT_TABLE_MAIN); table = fib_get_table(net, RT_TABLE_MAIN);
if (!table->tb_lookup(table, flp, res)) if (!table->tb_lookup(table, flp, res))
return 0; return 0;
return -ENETUNREACH; return -ENETUNREACH;
...@@ -208,7 +209,7 @@ extern void __net_exit fib4_rules_exit(struct net *net); ...@@ -208,7 +209,7 @@ extern void __net_exit fib4_rules_exit(struct net *net);
extern u32 fib_rules_tclass(struct fib_result *res); extern u32 fib_rules_tclass(struct fib_result *res);
#endif #endif
extern int fib_lookup(struct flowi *flp, struct fib_result *res); extern int fib_lookup(struct net *n, struct flowi *flp, struct fib_result *res);
extern struct fib_table *fib_new_table(struct net *net, u32 id); extern struct fib_table *fib_new_table(struct net *net, u32 id);
extern struct fib_table *fib_get_table(struct net *net, u32 id); extern struct fib_table *fib_get_table(struct net *net, u32 id);
......
...@@ -241,7 +241,7 @@ int fib_validate_source(__be32 src, __be32 dst, u8 tos, int oif, ...@@ -241,7 +241,7 @@ int fib_validate_source(__be32 src, __be32 dst, u8 tos, int oif,
if (in_dev == NULL) if (in_dev == NULL)
goto e_inval; goto e_inval;
if (fib_lookup(&fl, &res)) if (fib_lookup(&init_net, &fl, &res))
goto last_resort; goto last_resort;
if (res.type != RTN_UNICAST) if (res.type != RTN_UNICAST)
goto e_inval_res; goto e_inval_res;
...@@ -265,7 +265,7 @@ int fib_validate_source(__be32 src, __be32 dst, u8 tos, int oif, ...@@ -265,7 +265,7 @@ int fib_validate_source(__be32 src, __be32 dst, u8 tos, int oif,
fl.oif = dev->ifindex; fl.oif = dev->ifindex;
ret = 0; ret = 0;
if (fib_lookup(&fl, &res) == 0) { if (fib_lookup(&init_net, &fl, &res) == 0) {
if (res.type == RTN_UNICAST) { if (res.type == RTN_UNICAST) {
*spec_dst = FIB_RES_PREFSRC(res); *spec_dst = FIB_RES_PREFSRC(res);
ret = FIB_RES_NH(res).nh_scope >= RT_SCOPE_HOST; ret = FIB_RES_NH(res).nh_scope >= RT_SCOPE_HOST;
......
...@@ -54,14 +54,14 @@ u32 fib_rules_tclass(struct fib_result *res) ...@@ -54,14 +54,14 @@ u32 fib_rules_tclass(struct fib_result *res)
} }
#endif #endif
int fib_lookup(struct flowi *flp, struct fib_result *res) int fib_lookup(struct net *net, struct flowi *flp, struct fib_result *res)
{ {
struct fib_lookup_arg arg = { struct fib_lookup_arg arg = {
.result = res, .result = res,
}; };
int err; int err;
err = fib_rules_lookup(init_net.ipv4.rules_ops, flp, 0, &arg); err = fib_rules_lookup(net->ipv4.rules_ops, flp, 0, &arg);
res->r = arg.rule; res->r = arg.rule;
return err; return err;
......
...@@ -559,7 +559,7 @@ static int fib_check_nh(struct fib_config *cfg, struct fib_info *fi, ...@@ -559,7 +559,7 @@ static int fib_check_nh(struct fib_config *cfg, struct fib_info *fi,
/* It is not necessary, but requires a bit of thinking */ /* It is not necessary, but requires a bit of thinking */
if (fl.fl4_scope < RT_SCOPE_LINK) if (fl.fl4_scope < RT_SCOPE_LINK)
fl.fl4_scope = RT_SCOPE_LINK; fl.fl4_scope = RT_SCOPE_LINK;
if ((err = fib_lookup(&fl, &res)) != 0) if ((err = fib_lookup(&init_net, &fl, &res)) != 0)
return err; return err;
} }
err = -EINVAL; err = -EINVAL;
......
...@@ -1559,7 +1559,7 @@ void ip_rt_get_source(u8 *addr, struct rtable *rt) ...@@ -1559,7 +1559,7 @@ void ip_rt_get_source(u8 *addr, struct rtable *rt)
if (rt->fl.iif == 0) if (rt->fl.iif == 0)
src = rt->rt_src; src = rt->rt_src;
else if (fib_lookup(&rt->fl, &res) == 0) { else if (fib_lookup(&init_net, &rt->fl, &res) == 0) {
src = FIB_RES_PREFSRC(res); src = FIB_RES_PREFSRC(res);
fib_res_put(&res); fib_res_put(&res);
} else } else
...@@ -1911,7 +1911,7 @@ static int ip_route_input_slow(struct sk_buff *skb, __be32 daddr, __be32 saddr, ...@@ -1911,7 +1911,7 @@ static int ip_route_input_slow(struct sk_buff *skb, __be32 daddr, __be32 saddr,
/* /*
* Now we are ready to route packet. * Now we are ready to route packet.
*/ */
if ((err = fib_lookup(&fl, &res)) != 0) { if ((err = fib_lookup(&init_net, &fl, &res)) != 0) {
if (!IN_DEV_FORWARD(in_dev)) if (!IN_DEV_FORWARD(in_dev))
goto e_hostunreach; goto e_hostunreach;
goto no_route; goto no_route;
...@@ -2363,7 +2363,7 @@ static int ip_route_output_slow(struct rtable **rp, const struct flowi *oldflp) ...@@ -2363,7 +2363,7 @@ static int ip_route_output_slow(struct rtable **rp, const struct flowi *oldflp)
goto make_route; goto make_route;
} }
if (fib_lookup(&fl, &res)) { if (fib_lookup(&init_net, &fl, &res)) {
res.fi = NULL; res.fi = NULL;
if (oldflp->oif) { if (oldflp->oif) {
/* Apparently, routing tables are wrong. Assume, /* Apparently, routing tables are wrong. Assume,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment