diff options
author | YOSHIFUJI Hideaki / 吉藤英明 <yoshfuji@linux-ipv6.org> | 2013-01-13 00:02:45 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-01-13 20:17:14 -0500 |
commit | dd3332bfcb2223458f553f341d3388cb84040e6a (patch) | |
tree | d48ba8b295ee3d08c4b4b4f8d924038ccec2c5eb /net/ipv6 | |
parent | 2b464f61f036f7fb9cbc34710c9b2390499e87d0 (diff) |
ipv6: Store Router Alert option in IP6CB directly.
Router Alert option is very small and we can store the value
itself in the skb.
Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6')
-rw-r--r-- | net/ipv6/exthdrs.c | 3 | ||||
-rw-r--r-- | net/ipv6/ip6_input.c | 5 |
2 files changed, 4 insertions, 4 deletions
diff --git a/net/ipv6/exthdrs.c b/net/ipv6/exthdrs.c index 473f628f9f20..07a7d65a7cb6 100644 --- a/net/ipv6/exthdrs.c +++ b/net/ipv6/exthdrs.c | |||
@@ -553,7 +553,8 @@ static bool ipv6_hop_ra(struct sk_buff *skb, int optoff) | |||
553 | const unsigned char *nh = skb_network_header(skb); | 553 | const unsigned char *nh = skb_network_header(skb); |
554 | 554 | ||
555 | if (nh[optoff + 1] == 2) { | 555 | if (nh[optoff + 1] == 2) { |
556 | IP6CB(skb)->ra = optoff; | 556 | IP6CB(skb)->flags |= IP6SKB_ROUTERALERT; |
557 | memcpy(&IP6CB(skb)->ra, nh + optoff + 2, sizeof(IP6CB(skb)->ra)); | ||
557 | return true; | 558 | return true; |
558 | } | 559 | } |
559 | LIMIT_NETDEBUG(KERN_DEBUG "ipv6_hop_ra: wrong RA length %d\n", | 560 | LIMIT_NETDEBUG(KERN_DEBUG "ipv6_hop_ra: wrong RA length %d\n", |
diff --git a/net/ipv6/ip6_input.c b/net/ipv6/ip6_input.c index 2ccd35ec3628..4ac5bf30e16a 100644 --- a/net/ipv6/ip6_input.c +++ b/net/ipv6/ip6_input.c | |||
@@ -280,9 +280,8 @@ int ip6_mc_input(struct sk_buff *skb) | |||
280 | struct inet6_skb_parm *opt = IP6CB(skb); | 280 | struct inet6_skb_parm *opt = IP6CB(skb); |
281 | 281 | ||
282 | /* Check for MLD */ | 282 | /* Check for MLD */ |
283 | if (unlikely(opt->ra)) { | 283 | if (unlikely(opt->flags & IP6SKB_ROUTERALERT)) { |
284 | /* Check if this is a mld message */ | 284 | /* Check if this is a mld message */ |
285 | u8 *ptr = skb_network_header(skb) + opt->ra; | ||
286 | u8 nexthdr = hdr->nexthdr; | 285 | u8 nexthdr = hdr->nexthdr; |
287 | __be16 frag_off; | 286 | __be16 frag_off; |
288 | int offset; | 287 | int offset; |
@@ -290,7 +289,7 @@ int ip6_mc_input(struct sk_buff *skb) | |||
290 | /* Check if the value of Router Alert | 289 | /* Check if the value of Router Alert |
291 | * is for MLD (0x0000). | 290 | * is for MLD (0x0000). |
292 | */ | 291 | */ |
293 | if ((ptr[2] | ptr[3]) == 0) { | 292 | if (opt->ra == htons(IPV6_OPT_ROUTERALERT_MLD)) { |
294 | deliver = false; | 293 | deliver = false; |
295 | 294 | ||
296 | if (!ipv6_ext_hdr(nexthdr)) { | 295 | if (!ipv6_ext_hdr(nexthdr)) { |