These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / net / 6lowpan / nhc_udp.c
index c6bcaeb..69537a2 100644 (file)
 
 #include "nhc.h"
 
-#define LOWPAN_NHC_UDP_IDLEN   1
+#define LOWPAN_NHC_UDP_MASK            0xF8
+#define LOWPAN_NHC_UDP_ID              0xF0
+#define LOWPAN_NHC_UDP_IDLEN           1
+
+#define LOWPAN_NHC_UDP_4BIT_PORT       0xF0B0
+#define LOWPAN_NHC_UDP_4BIT_MASK       0xFFF0
+#define LOWPAN_NHC_UDP_8BIT_PORT       0xF000
+#define LOWPAN_NHC_UDP_8BIT_MASK       0xFF00
+
+/* values for port compression, _with checksum_ ie bit 5 set to 0 */
+
+/* all inline */
+#define LOWPAN_NHC_UDP_CS_P_00 0xF0
+/* source 16bit inline, dest = 0xF0 + 8 bit inline */
+#define LOWPAN_NHC_UDP_CS_P_01 0xF1
+/* source = 0xF0 + 8bit inline, dest = 16 bit inline */
+#define LOWPAN_NHC_UDP_CS_P_10 0xF2
+/* source & dest = 0xF0B + 4bit inline */
+#define LOWPAN_NHC_UDP_CS_P_11 0xF3
+/* checksum elided */
+#define LOWPAN_NHC_UDP_CS_C    0x04
 
 static int udp_uncompress(struct sk_buff *skb, size_t needed)
 {
@@ -71,7 +91,18 @@ static int udp_uncompress(struct sk_buff *skb, size_t needed)
         * here, we obtain the hint from the remaining size of the
         * frame
         */
-       uh.len = htons(skb->len + sizeof(struct udphdr));
+       switch (lowpan_priv(skb->dev)->lltype) {
+       case LOWPAN_LLTYPE_IEEE802154:
+               if (lowpan_802154_cb(skb)->d_size)
+                       uh.len = htons(lowpan_802154_cb(skb)->d_size -
+                                      sizeof(struct ipv6hdr));
+               else
+                       uh.len = htons(skb->len + sizeof(struct udphdr));
+               break;
+       default:
+               uh.len = htons(skb->len + sizeof(struct udphdr));
+               break;
+       }
        pr_debug("uncompressed UDP length: src = %d", ntohs(uh.len));
 
        /* replace the compressed UDP head by the uncompressed UDP