aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/icmpv6.h9
-rw-r--r--net/ipv6/datagram.c2
-rw-r--r--net/ipv6/icmp.c8
-rw-r--r--net/ipv6/mcast.c6
-rw-r--r--net/ipv6/ndisc.c2
5 files changed, 18 insertions, 9 deletions
diff --git a/include/linux/icmpv6.h b/include/linux/icmpv6.h
index 68d3526c3a05..0b5ba5eb7ed2 100644
--- a/include/linux/icmpv6.h
+++ b/include/linux/icmpv6.h
@@ -75,6 +75,15 @@ struct icmp6hdr {
75#define icmp6_router_pref icmp6_dataun.u_nd_ra.router_pref 75#define icmp6_router_pref icmp6_dataun.u_nd_ra.router_pref
76}; 76};
77 77
78#ifdef __KERNEL__
79#include <linux/skbuff.h>
80
81static inline struct icmp6hdr *icmp6_hdr(const struct sk_buff *skb)
82{
83 return (struct icmp6hdr *)skb->h.raw;
84}
85#endif
86
78#define ICMPV6_ROUTER_PREF_LOW 0x3 87#define ICMPV6_ROUTER_PREF_LOW 0x3
79#define ICMPV6_ROUTER_PREF_MEDIUM 0x0 88#define ICMPV6_ROUTER_PREF_MEDIUM 0x0
80#define ICMPV6_ROUTER_PREF_HIGH 0x1 89#define ICMPV6_ROUTER_PREF_HIGH 0x1
diff --git a/net/ipv6/datagram.c b/net/ipv6/datagram.c
index f429290c2c37..feba6b197fe9 100644
--- a/net/ipv6/datagram.c
+++ b/net/ipv6/datagram.c
@@ -209,7 +209,7 @@ void ipv6_icmp_error(struct sock *sk, struct sk_buff *skb, int err,
209 __be16 port, u32 info, u8 *payload) 209 __be16 port, u32 info, u8 *payload)
210{ 210{
211 struct ipv6_pinfo *np = inet6_sk(sk); 211 struct ipv6_pinfo *np = inet6_sk(sk);
212 struct icmp6hdr *icmph = (struct icmp6hdr *)skb->h.raw; 212 struct icmp6hdr *icmph = icmp6_hdr(skb);
213 struct sock_exterr_skb *serr; 213 struct sock_exterr_skb *serr;
214 214
215 if (!np->recverr) 215 if (!np->recverr)
diff --git a/net/ipv6/icmp.c b/net/ipv6/icmp.c
index 3a01effda695..d3edc3cf1ce9 100644
--- a/net/ipv6/icmp.c
+++ b/net/ipv6/icmp.c
@@ -222,7 +222,7 @@ static int icmpv6_push_pending_frames(struct sock *sk, struct flowi *fl, struct
222 if ((skb = skb_peek(&sk->sk_write_queue)) == NULL) 222 if ((skb = skb_peek(&sk->sk_write_queue)) == NULL)
223 goto out; 223 goto out;
224 224
225 icmp6h = (struct icmp6hdr*) skb->h.raw; 225 icmp6h = icmp6_hdr(skb);
226 memcpy(icmp6h, thdr, sizeof(struct icmp6hdr)); 226 memcpy(icmp6h, thdr, sizeof(struct icmp6hdr));
227 icmp6h->icmp6_cksum = 0; 227 icmp6h->icmp6_cksum = 0;
228 228
@@ -476,7 +476,7 @@ static void icmpv6_echo_reply(struct sk_buff *skb)
476 struct inet6_dev *idev; 476 struct inet6_dev *idev;
477 struct ipv6_pinfo *np; 477 struct ipv6_pinfo *np;
478 struct in6_addr *saddr = NULL; 478 struct in6_addr *saddr = NULL;
479 struct icmp6hdr *icmph = (struct icmp6hdr *) skb->h.raw; 479 struct icmp6hdr *icmph = icmp6_hdr(skb);
480 struct icmp6hdr tmp_hdr; 480 struct icmp6hdr tmp_hdr;
481 struct flowi fl; 481 struct flowi fl;
482 struct icmpv6_msg msg; 482 struct icmpv6_msg msg;
@@ -651,7 +651,7 @@ static int icmpv6_rcv(struct sk_buff **pskb)
651 if (!pskb_pull(skb, sizeof(struct icmp6hdr))) 651 if (!pskb_pull(skb, sizeof(struct icmp6hdr)))
652 goto discard_it; 652 goto discard_it;
653 653
654 hdr = (struct icmp6hdr *) skb->h.raw; 654 hdr = icmp6_hdr(skb);
655 655
656 type = hdr->icmp6_type; 656 type = hdr->icmp6_type;
657 657
@@ -677,7 +677,7 @@ static int icmpv6_rcv(struct sk_buff **pskb)
677 */ 677 */
678 if (!pskb_may_pull(skb, sizeof(struct ipv6hdr))) 678 if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))
679 goto discard_it; 679 goto discard_it;
680 hdr = (struct icmp6hdr *) skb->h.raw; 680 hdr = icmp6_hdr(skb);
681 orig_hdr = (struct ipv6hdr *) (hdr + 1); 681 orig_hdr = (struct ipv6hdr *) (hdr + 1);
682 rt6_pmtu_discovery(&orig_hdr->daddr, &orig_hdr->saddr, dev, 682 rt6_pmtu_discovery(&orig_hdr->daddr, &orig_hdr->saddr, dev,
683 ntohl(hdr->icmp6_mtu)); 683 ntohl(hdr->icmp6_mtu));
diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c
index b2b37ba48b9c..1f2a3be9308a 100644
--- a/net/ipv6/mcast.c
+++ b/net/ipv6/mcast.c
@@ -988,7 +988,7 @@ int ipv6_is_mld(struct sk_buff *skb, int nexthdr)
988 if (!pskb_may_pull(skb, sizeof(struct icmp6hdr))) 988 if (!pskb_may_pull(skb, sizeof(struct icmp6hdr)))
989 return 0; 989 return 0;
990 990
991 pic = (struct icmp6hdr *)skb->h.raw; 991 pic = icmp6_hdr(skb);
992 992
993 switch (pic->icmp6_type) { 993 switch (pic->icmp6_type) {
994 case ICMPV6_MGM_QUERY: 994 case ICMPV6_MGM_QUERY:
@@ -1179,7 +1179,7 @@ int igmp6_event_query(struct sk_buff *skb)
1179 if (idev == NULL) 1179 if (idev == NULL)
1180 return 0; 1180 return 0;
1181 1181
1182 hdr = (struct icmp6hdr *) skb->h.raw; 1182 hdr = icmp6_hdr(skb);
1183 group = (struct in6_addr *) (hdr + 1); 1183 group = (struct in6_addr *) (hdr + 1);
1184 group_type = ipv6_addr_type(group); 1184 group_type = ipv6_addr_type(group);
1185 1185
@@ -1300,7 +1300,7 @@ int igmp6_event_report(struct sk_buff *skb)
1300 if (!pskb_may_pull(skb, sizeof(struct in6_addr))) 1300 if (!pskb_may_pull(skb, sizeof(struct in6_addr)))
1301 return -EINVAL; 1301 return -EINVAL;
1302 1302
1303 hdr = (struct icmp6hdr*) skb->h.raw; 1303 hdr = icmp6_hdr(skb);
1304 1304
1305 /* Drop reports with not link local source */ 1305 /* Drop reports with not link local source */
1306 addr_type = ipv6_addr_type(&ipv6_hdr(skb)->saddr); 1306 addr_type = ipv6_addr_type(&ipv6_hdr(skb)->saddr);
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c
index 00feb4c4d98b..8b946f56287a 100644
--- a/net/ipv6/ndisc.c
+++ b/net/ipv6/ndisc.c
@@ -1366,7 +1366,7 @@ static void ndisc_redirect_rcv(struct sk_buff *skb)
1366 return; 1366 return;
1367 } 1367 }
1368 1368
1369 icmph = (struct icmp6hdr *) skb->h.raw; 1369 icmph = icmp6_hdr(skb);
1370 target = (struct in6_addr *) (icmph + 1); 1370 target = (struct in6_addr *) (icmph + 1);
1371 dest = target + 1; 1371 dest = target + 1;
1372 1372