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

[NETNS]: Correctly fill fib_config data.

Acked-by: default avatarBenjamin Thery <benjamin.thery@bull.net>
Acked-by: default avatarDaniel Lezcano <dlezcano@fr.ibm.com>
Signed-off-by: default avatarDenis V. Lunev <den@openvz.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 6bd48fcf
...@@ -305,14 +305,14 @@ static int put_rtax(struct nlattr *mx, int len, int type, u32 value) ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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] = { ...@@ -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, ...@@ -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 ...@@ -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 ...@@ -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 @@ static int inet_dump_fib(struct sk_buff *skb, struct netlink_callback *cb) ...@@ -667,6 +667,7 @@ static int inet_dump_fib(struct sk_buff *skb, struct netlink_callback *cb)
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 ...@@ -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;
......
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