[NETNS]: Correctly fill fib_config data.
Acked-by: Benjamin Thery <benjamin.thery@bull.net> Acked-by: Daniel Lezcano <dlezcano@fr.ibm.com> Signed-off-by: Denis V. Lunev <den@openvz.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
6bd48fcf73
commit
4b5d47d4d3
@@ -305,14 +305,14 @@ static int put_rtax(struct nlattr *mx, int len, int type, u32 value)
|
|||||||
return len + nla_total_size(4);
|
return len + nla_total_size(4);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int rtentry_to_fib_config(int cmd, struct rtentry *rt,
|
static int rtentry_to_fib_config(struct net *net, int cmd, struct rtentry *rt,
|
||||||
struct fib_config *cfg)
|
struct fib_config *cfg)
|
||||||
{
|
{
|
||||||
__be32 addr;
|
__be32 addr;
|
||||||
int plen;
|
int plen;
|
||||||
|
|
||||||
memset(cfg, 0, sizeof(*cfg));
|
memset(cfg, 0, sizeof(*cfg));
|
||||||
cfg->fc_nlinfo.nl_net = &init_net;
|
cfg->fc_nlinfo.nl_net = net;
|
||||||
|
|
||||||
if (rt->rt_dst.sa_family != AF_INET)
|
if (rt->rt_dst.sa_family != AF_INET)
|
||||||
return -EAFNOSUPPORT;
|
return -EAFNOSUPPORT;
|
||||||
@@ -373,7 +373,7 @@ static int rtentry_to_fib_config(int cmd, struct rtentry *rt,
|
|||||||
colon = strchr(devname, ':');
|
colon = strchr(devname, ':');
|
||||||
if (colon)
|
if (colon)
|
||||||
*colon = 0;
|
*colon = 0;
|
||||||
dev = __dev_get_by_name(&init_net, devname);
|
dev = __dev_get_by_name(net, devname);
|
||||||
if (!dev)
|
if (!dev)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
cfg->fc_oif = dev->ifindex;
|
cfg->fc_oif = dev->ifindex;
|
||||||
@@ -396,7 +396,7 @@ static int rtentry_to_fib_config(int cmd, struct rtentry *rt,
|
|||||||
if (rt->rt_gateway.sa_family == AF_INET && addr) {
|
if (rt->rt_gateway.sa_family == AF_INET && addr) {
|
||||||
cfg->fc_gw = addr;
|
cfg->fc_gw = addr;
|
||||||
if (rt->rt_flags & RTF_GATEWAY &&
|
if (rt->rt_flags & RTF_GATEWAY &&
|
||||||
inet_addr_type(&init_net, addr) == RTN_UNICAST)
|
inet_addr_type(net, addr) == RTN_UNICAST)
|
||||||
cfg->fc_scope = RT_SCOPE_UNIVERSE;
|
cfg->fc_scope = RT_SCOPE_UNIVERSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -453,7 +453,7 @@ int ip_rt_ioctl(unsigned int cmd, void __user *arg)
|
|||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
rtnl_lock();
|
rtnl_lock();
|
||||||
err = rtentry_to_fib_config(cmd, &rt, &cfg);
|
err = rtentry_to_fib_config(&init_net, cmd, &rt, &cfg);
|
||||||
if (err == 0) {
|
if (err == 0) {
|
||||||
struct fib_table *tb;
|
struct fib_table *tb;
|
||||||
|
|
||||||
@@ -494,8 +494,8 @@ const struct nla_policy rtm_ipv4_policy[RTA_MAX+1] = {
|
|||||||
[RTA_FLOW] = { .type = NLA_U32 },
|
[RTA_FLOW] = { .type = NLA_U32 },
|
||||||
};
|
};
|
||||||
|
|
||||||
static int rtm_to_fib_config(struct sk_buff *skb, struct nlmsghdr *nlh,
|
static int rtm_to_fib_config(struct net *net, struct sk_buff *skb,
|
||||||
struct fib_config *cfg)
|
struct nlmsghdr *nlh, struct fib_config *cfg)
|
||||||
{
|
{
|
||||||
struct nlattr *attr;
|
struct nlattr *attr;
|
||||||
int err, remaining;
|
int err, remaining;
|
||||||
@@ -519,7 +519,7 @@ static int rtm_to_fib_config(struct sk_buff *skb, struct nlmsghdr *nlh,
|
|||||||
|
|
||||||
cfg->fc_nlinfo.pid = NETLINK_CB(skb).pid;
|
cfg->fc_nlinfo.pid = NETLINK_CB(skb).pid;
|
||||||
cfg->fc_nlinfo.nlh = nlh;
|
cfg->fc_nlinfo.nlh = nlh;
|
||||||
cfg->fc_nlinfo.nl_net = &init_net;
|
cfg->fc_nlinfo.nl_net = net;
|
||||||
|
|
||||||
if (cfg->fc_type > RTN_MAX) {
|
if (cfg->fc_type > RTN_MAX) {
|
||||||
err = -EINVAL;
|
err = -EINVAL;
|
||||||
@@ -575,7 +575,7 @@ static int inet_rtm_delroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *ar
|
|||||||
if (net != &init_net)
|
if (net != &init_net)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
err = rtm_to_fib_config(skb, nlh, &cfg);
|
err = rtm_to_fib_config(net, skb, nlh, &cfg);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
goto errout;
|
goto errout;
|
||||||
|
|
||||||
@@ -600,7 +600,7 @@ static int inet_rtm_newroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *ar
|
|||||||
if (net != &init_net)
|
if (net != &init_net)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
err = rtm_to_fib_config(skb, nlh, &cfg);
|
err = rtm_to_fib_config(net, skb, nlh, &cfg);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
goto errout;
|
goto errout;
|
||||||
|
|
||||||
@@ -667,6 +667,7 @@ out:
|
|||||||
|
|
||||||
static void fib_magic(int cmd, int type, __be32 dst, int dst_len, struct in_ifaddr *ifa)
|
static void fib_magic(int cmd, int type, __be32 dst, int dst_len, struct in_ifaddr *ifa)
|
||||||
{
|
{
|
||||||
|
struct net *net = ifa->ifa_dev->dev->nd_net;
|
||||||
struct fib_table *tb;
|
struct fib_table *tb;
|
||||||
struct fib_config cfg = {
|
struct fib_config cfg = {
|
||||||
.fc_protocol = RTPROT_KERNEL,
|
.fc_protocol = RTPROT_KERNEL,
|
||||||
@@ -677,14 +678,14 @@ static void fib_magic(int cmd, int type, __be32 dst, int dst_len, struct in_ifad
|
|||||||
.fc_oif = ifa->ifa_dev->dev->ifindex,
|
.fc_oif = ifa->ifa_dev->dev->ifindex,
|
||||||
.fc_nlflags = NLM_F_CREATE | NLM_F_APPEND,
|
.fc_nlflags = NLM_F_CREATE | NLM_F_APPEND,
|
||||||
.fc_nlinfo = {
|
.fc_nlinfo = {
|
||||||
.nl_net = &init_net,
|
.nl_net = net,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
if (type == RTN_UNICAST)
|
if (type == RTN_UNICAST)
|
||||||
tb = fib_new_table(&init_net, RT_TABLE_MAIN);
|
tb = fib_new_table(net, RT_TABLE_MAIN);
|
||||||
else
|
else
|
||||||
tb = fib_new_table(&init_net, RT_TABLE_LOCAL);
|
tb = fib_new_table(net, RT_TABLE_LOCAL);
|
||||||
|
|
||||||
if (tb == NULL)
|
if (tb == NULL)
|
||||||
return;
|
return;
|
||||||
|
Reference in New Issue
Block a user