Re: minimum ICMPv6 message size vs. RPL's DIS
From: Hannes Frederic Sowa <hidden>
Date: 2013-08-01 05:48:45
Hi Werner! On Thu, Jul 25, 2013 at 07:30:49AM -0300, Werner Almesberger wrote:
quoted hunk ↗ jump to hunk
Hannes Frederic Sowa wrote:quoted
Hmm, maybe we should update the icmp header to something likeThat would be quite clean. Is it okay to introduce new names like that in a uapi/ header (uapi/linux/icmpv6.h) ?quoted
Hmm, there is a bug in this function, _hdr must not be a pointer.Oh, I didn't even notice that. Very good catch ! So on 32 bit system, it would actually work even with "short" ICMPv6 messages. Two wrongs sometimes do make a right :-) I've attached a revised patch that, according to quick testing, still works and doesn't break anything else. Thanks, - Werner ---------------------------------- cut here -----------------------------------diff --git a/include/uapi/linux/icmpv6.h b/include/uapi/linux/icmpv6.h index e0133c7..11eb5ff 100644 --- a/include/uapi/linux/icmpv6.h +++ b/include/uapi/linux/icmpv6.h@@ -5,11 +5,15 @@ #include <asm/byteorder.h> struct icmp6hdr { - - __u8 icmp6_type; - __u8 icmp6_code; - __sum16 icmp6_cksum; - + struct icmp6hdr_head { + __u8 type; + __u8 code; + __sum16 cksum; + } icmpv6_head; + +#define icmp6_type icmpv6_head.type +#define icmp6_code icmpv6_head.code +#define icmp6_cksum icmpv6_head.cksum union { __be32 un_data32[1];diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index c45f7a5..99ab06f 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c@@ -108,14 +108,14 @@ found: */ static int icmpv6_filter(const struct sock *sk, const struct sk_buff *skb) { - struct icmp6hdr *_hdr; - const struct icmp6hdr *hdr; + struct icmp6hdr_head _head; + const struct icmp6hdr_head *head; - hdr = skb_header_pointer(skb, skb_transport_offset(skb), - sizeof(_hdr), &_hdr); - if (hdr) { + head = skb_header_pointer(skb, skb_transport_offset(skb), + sizeof(_head), &_head); + if (head) { const __u32 *data = &raw6_sk(sk)->filter.data[0]; - unsigned int type = hdr->icmp6_type; + unsigned int type = head->type; return (data[type >> 5] & (1U << (type & 31))) != 0; }
I would go ahead and post this as an offical patch submission now and let David Miller have a look. Thanks, Hannes