[PATCH]ipv6: fix the bug when we do not have a socket context
From: Duan Jiong <hidden>
Date: 2012-11-21 11:12:37
call the ip6_update_pmtu/ip6_redirect function to deal with ICMPV6 Error Messages and Redirect Message, when we do not have a socket context. Signed-off-by: Duan Jiong <redacted> --- net/ipv6/raw.c | 16 +++++++++++++++- 1 files changed, 15 insertions(+), 1 deletions(-)
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c
index d8e95c7..b10f478 100644
--- a/net/ipv6/raw.c
+++ b/net/ipv6/raw.c@@ -354,7 +354,9 @@ void raw6_icmp_error(struct sk_buff *skb, int nexthdr, const struct in6_addr *saddr, *daddr; struct net *net; + hash = nexthdr & (RAW_HTABLE_SIZE - 1); + net = dev_net(skb->dev); read_lock(&raw_v6_hashinfo.lock); sk = sk_head(&raw_v6_hashinfo.ht[hash]);
@@ -363,7 +365,6 @@ void raw6_icmp_error(struct sk_buff *skb, int nexthdr, const struct ipv6hdr *ip6h = (const struct ipv6hdr *)skb->data; saddr = &ip6h->saddr; daddr = &ip6h->daddr; - net = dev_net(skb->dev); while ((sk = __raw_v6_lookup(net, sk, nexthdr, saddr, daddr, IP6CB(skb)->iif))) {
@@ -371,6 +372,19 @@ void raw6_icmp_error(struct sk_buff *skb, int nexthdr, inner_offset, info); sk = sk_next(sk); } + } else { + switch (type) { + case ICMPV6_PKT_TOOBIG: + ip6_update_pmtu(skb, net, info, 0, 0); + break; + + case NDISC_REDIRECT: + ip6_redirect(skb, net, 0, 0); + break; + + default: + break; + } } read_unlock(&raw_v6_hashinfo.lock); }
--
1.7.1