[NETNS]: Add namespace parameter to ip_options_compile.
ip_options_compile uses inet_addr_type which requires a namespace. The packet argument is optional, so parameter is the only way to obtain it. Pass the init_net there for now. 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
ffc31d3d77
commit
0e6bd4a1c6
@@ -347,7 +347,8 @@ extern int ip_forward(struct sk_buff *skb);
|
|||||||
extern void ip_options_build(struct sk_buff *skb, struct ip_options *opt, __be32 daddr, struct rtable *rt, int is_frag);
|
extern void ip_options_build(struct sk_buff *skb, struct ip_options *opt, __be32 daddr, struct rtable *rt, int is_frag);
|
||||||
extern int ip_options_echo(struct ip_options *dopt, struct sk_buff *skb);
|
extern int ip_options_echo(struct ip_options *dopt, struct sk_buff *skb);
|
||||||
extern void ip_options_fragment(struct sk_buff *skb);
|
extern void ip_options_fragment(struct sk_buff *skb);
|
||||||
extern int ip_options_compile(struct ip_options *opt, struct sk_buff *skb);
|
extern int ip_options_compile(struct net *net,
|
||||||
|
struct ip_options *opt, struct sk_buff *skb);
|
||||||
extern int ip_options_get(struct ip_options **optp,
|
extern int ip_options_get(struct ip_options **optp,
|
||||||
unsigned char *data, int optlen);
|
unsigned char *data, int optlen);
|
||||||
extern int ip_options_get_from_user(struct ip_options **optp,
|
extern int ip_options_get_from_user(struct ip_options **optp,
|
||||||
|
@@ -286,7 +286,7 @@ static inline int ip_rcv_options(struct sk_buff *skb)
|
|||||||
opt = &(IPCB(skb)->opt);
|
opt = &(IPCB(skb)->opt);
|
||||||
opt->optlen = iph->ihl*4 - sizeof(struct iphdr);
|
opt->optlen = iph->ihl*4 - sizeof(struct iphdr);
|
||||||
|
|
||||||
if (ip_options_compile(opt, skb)) {
|
if (ip_options_compile(&init_net, opt, skb)) {
|
||||||
IP_INC_STATS_BH(IPSTATS_MIB_INHDRERRORS);
|
IP_INC_STATS_BH(IPSTATS_MIB_INHDRERRORS);
|
||||||
goto drop;
|
goto drop;
|
||||||
}
|
}
|
||||||
|
@@ -248,7 +248,8 @@ void ip_options_fragment(struct sk_buff * skb)
|
|||||||
* If opt == NULL, then skb->data should point to IP header.
|
* If opt == NULL, then skb->data should point to IP header.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int ip_options_compile(struct ip_options * opt, struct sk_buff * skb)
|
int ip_options_compile(struct net *net,
|
||||||
|
struct ip_options * opt, struct sk_buff * skb)
|
||||||
{
|
{
|
||||||
int l;
|
int l;
|
||||||
unsigned char * iph;
|
unsigned char * iph;
|
||||||
@@ -389,7 +390,7 @@ int ip_options_compile(struct ip_options * opt, struct sk_buff * skb)
|
|||||||
{
|
{
|
||||||
__be32 addr;
|
__be32 addr;
|
||||||
memcpy(&addr, &optptr[optptr[2]-1], 4);
|
memcpy(&addr, &optptr[optptr[2]-1], 4);
|
||||||
if (inet_addr_type(&init_net, addr) == RTN_UNICAST)
|
if (inet_addr_type(net, addr) == RTN_UNICAST)
|
||||||
break;
|
break;
|
||||||
if (skb)
|
if (skb)
|
||||||
timeptr = (__be32*)&optptr[optptr[2]+3];
|
timeptr = (__be32*)&optptr[optptr[2]+3];
|
||||||
@@ -512,7 +513,7 @@ static int ip_options_get_finish(struct ip_options **optp,
|
|||||||
while (optlen & 3)
|
while (optlen & 3)
|
||||||
opt->__data[optlen++] = IPOPT_END;
|
opt->__data[optlen++] = IPOPT_END;
|
||||||
opt->optlen = optlen;
|
opt->optlen = optlen;
|
||||||
if (optlen && ip_options_compile(opt, NULL)) {
|
if (optlen && ip_options_compile(&init_net, opt, NULL)) {
|
||||||
kfree(opt);
|
kfree(opt);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user