[NETNS]: Add netns parameter to fib_lookup.
Signed-off-by: Denis V. Lunev <den@openvz.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
ba93ef7465
commit
da0e28cb68
|
@ -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);
|
||||||
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,
|
||||||
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,
|
||||||
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)
|
||||||
}
|
}
|
||||||
#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,
|
||||||
/* 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)
|
||||||
|
|
||||||
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,
|
||||||
/*
|
/*
|
||||||
* 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)
|
||||||
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,
|
||||||
|
|
Loading…
Reference in New Issue