6lowpan: add udp warning for elided checksum
authorAlexander Aring <alex.aring@gmail.com>
Tue, 17 Dec 2013 13:21:25 +0000 (14:21 +0100)
committerMarcel Holtmann <marcel@holtmann.org>
Tue, 17 Dec 2013 14:16:48 +0000 (06:16 -0800)
Bit 5 of "UDP LOWPAN_NHC Format" indicate that the checksum can be
elided.
The host need to calculate the udp checksum afterwards but this isn't
supported right now.

See:
http://tools.ietf.org/html/rfc6282#section-4.3.3
Signed-off-by: Alexander Aring <alex.aring@gmail.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
net/ieee802154/6lowpan.h
net/ieee802154/6lowpan_iphc.c

index 4981bf8..2b835db 100644 (file)
 #define LOWPAN_NHC_UDP_CS_P_10 0xF2 /* source = 0xF0 + 8bit inline,
                                        dest = 16 bit inline */
 #define LOWPAN_NHC_UDP_CS_P_11 0xF3 /* source & dest = 0xF0B + 4bit inline */
+#define LOWPAN_NHC_UDP_CS_C    0x04 /* checksum elided */
 
 #ifdef DEBUG
 /* print data in line */
index 02bf74d..a70fa66 100644 (file)
@@ -309,9 +309,14 @@ uncompress_udp_header(struct sk_buff *skb, struct udphdr *uh)
                pr_debug("uncompressed UDP ports: src = %d, dst = %d\n",
                         ntohs(uh->source), ntohs(uh->dest));
 
-               /* copy checksum */
-               memcpy(&uh->check, &skb->data[0], 2);
-               skb_pull(skb, 2);
+               /* checksum */
+               if (tmp & LOWPAN_NHC_UDP_CS_C) {
+                       pr_debug_ratelimited("checksum elided currently not supported\n");
+                       goto err;
+               } else {
+                       memcpy(&uh->check, &skb->data[0], 2);
+                       skb_pull(skb, 2);
+               }
 
                /*
                 * UDP lenght needs to be infered from the lower layers