diff options
Diffstat (limited to 'net/ipv6/icmp.c')
| -rw-r--r-- | net/ipv6/icmp.c | 6 | 
1 files changed, 6 insertions, 0 deletions
diff --git a/net/ipv6/icmp.c b/net/ipv6/icmp.c index fcf883183cef..21eb725e885f 100644 --- a/net/ipv6/icmp.c +++ b/net/ipv6/icmp.c  | |||
| @@ -42,6 +42,7 @@ | |||
| 42 | #include <linux/net.h> | 42 | #include <linux/net.h> | 
| 43 | #include <linux/skbuff.h> | 43 | #include <linux/skbuff.h> | 
| 44 | #include <linux/init.h> | 44 | #include <linux/init.h> | 
| 45 | #include <linux/netfilter.h> | ||
| 45 | 46 | ||
| 46 | #ifdef CONFIG_SYSCTL | 47 | #ifdef CONFIG_SYSCTL | 
| 47 | #include <linux/sysctl.h> | 48 | #include <linux/sysctl.h> | 
| @@ -255,6 +256,7 @@ out: | |||
| 255 | struct icmpv6_msg { | 256 | struct icmpv6_msg { | 
| 256 | struct sk_buff *skb; | 257 | struct sk_buff *skb; | 
| 257 | int offset; | 258 | int offset; | 
| 259 | uint8_t type; | ||
| 258 | }; | 260 | }; | 
| 259 | 261 | ||
| 260 | static int icmpv6_getfrag(void *from, char *to, int offset, int len, int odd, struct sk_buff *skb) | 262 | static int icmpv6_getfrag(void *from, char *to, int offset, int len, int odd, struct sk_buff *skb) | 
| @@ -266,6 +268,8 @@ static int icmpv6_getfrag(void *from, char *to, int offset, int len, int odd, st | |||
| 266 | csum = skb_copy_and_csum_bits(org_skb, msg->offset + offset, | 268 | csum = skb_copy_and_csum_bits(org_skb, msg->offset + offset, | 
| 267 | to, len, csum); | 269 | to, len, csum); | 
| 268 | skb->csum = csum_block_add(skb->csum, csum, odd); | 270 | skb->csum = csum_block_add(skb->csum, csum, odd); | 
| 271 | if (!(msg->type & ICMPV6_INFOMSG_MASK)) | ||
| 272 | nf_ct_attach(skb, org_skb); | ||
| 269 | return 0; | 273 | return 0; | 
| 270 | } | 274 | } | 
| 271 | 275 | ||
| @@ -403,6 +407,7 @@ void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info, | |||
| 403 | 407 | ||
| 404 | msg.skb = skb; | 408 | msg.skb = skb; | 
| 405 | msg.offset = skb->nh.raw - skb->data; | 409 | msg.offset = skb->nh.raw - skb->data; | 
| 410 | msg.type = type; | ||
| 406 | 411 | ||
| 407 | len = skb->len - msg.offset; | 412 | len = skb->len - msg.offset; | 
| 408 | len = min_t(unsigned int, len, IPV6_MIN_MTU - sizeof(struct ipv6hdr) -sizeof(struct icmp6hdr)); | 413 | len = min_t(unsigned int, len, IPV6_MIN_MTU - sizeof(struct ipv6hdr) -sizeof(struct icmp6hdr)); | 
| @@ -500,6 +505,7 @@ static void icmpv6_echo_reply(struct sk_buff *skb) | |||
| 500 | 505 | ||
| 501 | msg.skb = skb; | 506 | msg.skb = skb; | 
| 502 | msg.offset = 0; | 507 | msg.offset = 0; | 
| 508 | msg.type = ICMPV6_ECHO_REPLY; | ||
| 503 | 509 | ||
| 504 | err = ip6_append_data(sk, icmpv6_getfrag, &msg, skb->len + sizeof(struct icmp6hdr), | 510 | err = ip6_append_data(sk, icmpv6_getfrag, &msg, skb->len + sizeof(struct icmp6hdr), | 
| 505 | sizeof(struct icmp6hdr), hlimit, tclass, NULL, &fl, | 511 | sizeof(struct icmp6hdr), hlimit, tclass, NULL, &fl, | 
