]> git.baikalelectronics.ru Git - kernel.git/commitdiff
net: 6lowpan: use array for find nhc id
authorAlexander Aring <aahringo@redhat.com>
Thu, 28 Apr 2022 03:05:33 +0000 (23:05 -0400)
committerStefan Schmidt <stefan@datenfreihafen.org>
Thu, 9 Jun 2022 19:53:28 +0000 (21:53 +0200)
This patch will remove the complete overengineered and overthinking rb data
structure for looking up the nhc by nhcid. Instead we using the existing
nhc next header array and iterate over it. It works now for 1 byte values
only. However there are only 1 byte nhc id values currently
supported and IANA also does not specify large than 1 byte values yet.
If there are 2 byte values for nhc ids specified we can revisit this
data structure and add support for it.

Signed-off-by: Alexander Aring <aahringo@redhat.com>
Reviewed-by: Stefan Schmidt <stefan@datenfreihafen.org>
Acked-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
Link: https://lore.kernel.org/r/20220428030534.3220410-3-aahringo@redhat.com
Signed-off-by: Stefan Schmidt <stefan@datenfreihafen.org>
15 files changed:
net/6lowpan/nhc.c
net/6lowpan/nhc.h
net/6lowpan/nhc_dest.c
net/6lowpan/nhc_fragment.c
net/6lowpan/nhc_ghc_ext_dest.c
net/6lowpan/nhc_ghc_ext_frag.c
net/6lowpan/nhc_ghc_ext_hop.c
net/6lowpan/nhc_ghc_ext_route.c
net/6lowpan/nhc_ghc_icmpv6.c
net/6lowpan/nhc_ghc_udp.c
net/6lowpan/nhc_hop.c
net/6lowpan/nhc_ipv6.c
net/6lowpan/nhc_mobility.c
net/6lowpan/nhc_routing.c
net/6lowpan/nhc_udp.c

index d6bbbd4ab38b0195dde0784a4788f26ccff599e2..019f121b2449e1ea601a46ea301aededc4d9eed6 100644 (file)
 
 #include "nhc.h"
 
-static struct rb_root rb_root = RB_ROOT;
 static struct lowpan_nhc *lowpan_nexthdr_nhcs[NEXTHDR_MAX + 1];
 static DEFINE_SPINLOCK(lowpan_nhc_lock);
 
-static int lowpan_nhc_insert(struct lowpan_nhc *nhc)
+static struct lowpan_nhc *lowpan_nhc_by_nhcid(struct sk_buff *skb)
 {
-       struct rb_node **new = &rb_root.rb_node, *parent = NULL;
-
-       /* Figure out where to put new node */
-       while (*new) {
-               struct lowpan_nhc *this = rb_entry(*new, struct lowpan_nhc,
-                                                  node);
-               int result, len_dif, len;
-
-               len_dif = nhc->idlen - this->idlen;
-
-               if (nhc->idlen < this->idlen)
-                       len = nhc->idlen;
-               else
-                       len = this->idlen;
-
-               result = memcmp(nhc->id, this->id, len);
-               if (!result)
-                       result = len_dif;
-
-               parent = *new;
-               if (result < 0)
-                       new = &((*new)->rb_left);
-               else if (result > 0)
-                       new = &((*new)->rb_right);
-               else
-                       return -EEXIST;
-       }
+       struct lowpan_nhc *nhc;
+       int i;
+       u8 id;
 
-       /* Add new node and rebalance tree. */
-       rb_link_node(&nhc->node, parent, new);
-       rb_insert_color(&nhc->node, &rb_root);
+       if (!pskb_may_pull(skb, 1))
+               return NULL;
 
-       return 0;
-}
+       id = *skb->data;
 
-static void lowpan_nhc_remove(struct lowpan_nhc *nhc)
-{
-       rb_erase(&nhc->node, &rb_root);
-}
+       for (i = 0; i < NEXTHDR_MAX + 1; i++) {
+               nhc = lowpan_nexthdr_nhcs[i];
+               if (!nhc)
+                       continue;
 
-static struct lowpan_nhc *lowpan_nhc_by_nhcid(const struct sk_buff *skb)
-{
-       struct rb_node *node = rb_root.rb_node;
-       const u8 *nhcid_skb_ptr = skb->data;
-
-       while (node) {
-               struct lowpan_nhc *nhc = rb_entry(node, struct lowpan_nhc,
-                                                 node);
-               u8 nhcid_skb_ptr_masked[LOWPAN_NHC_MAX_ID_LEN];
-               int result, i;
-
-               if (nhcid_skb_ptr + nhc->idlen > skb->data + skb->len)
-                       return NULL;
-
-               /* copy and mask afterwards the nhid value from skb */
-               memcpy(nhcid_skb_ptr_masked, nhcid_skb_ptr, nhc->idlen);
-               for (i = 0; i < nhc->idlen; i++)
-                       nhcid_skb_ptr_masked[i] &= nhc->idmask[i];
-
-               result = memcmp(nhcid_skb_ptr_masked, nhc->id, nhc->idlen);
-               if (result < 0)
-                       node = node->rb_left;
-               else if (result > 0)
-                       node = node->rb_right;
-               else
+               if ((id & nhc->idmask) == nhc->id)
                        return nhc;
        }
 
@@ -191,16 +140,7 @@ int lowpan_nhc_do_uncompression(struct sk_buff *skb,
 
 int lowpan_nhc_add(struct lowpan_nhc *nhc)
 {
-       int ret;
-
-       if (!nhc->idlen || !nhc->idsetup)
-               return -EINVAL;
-
-       WARN_ONCE(nhc->idlen > LOWPAN_NHC_MAX_ID_LEN,
-                 "LOWPAN_NHC_MAX_ID_LEN should be updated to %zd.\n",
-                 nhc->idlen);
-
-       nhc->idsetup(nhc);
+       int ret = 0;
 
        spin_lock_bh(&lowpan_nhc_lock);
 
@@ -209,10 +149,6 @@ int lowpan_nhc_add(struct lowpan_nhc *nhc)
                goto out;
        }
 
-       ret = lowpan_nhc_insert(nhc);
-       if (ret < 0)
-               goto out;
-
        lowpan_nexthdr_nhcs[nhc->nexthdr] = nhc;
 out:
        spin_unlock_bh(&lowpan_nhc_lock);
@@ -224,7 +160,6 @@ void lowpan_nhc_del(struct lowpan_nhc *nhc)
 {
        spin_lock_bh(&lowpan_nhc_lock);
 
-       lowpan_nhc_remove(nhc);
        lowpan_nexthdr_nhcs[nhc->nexthdr] = NULL;
 
        spin_unlock_bh(&lowpan_nhc_lock);
index 2ac7da388c4d55ef0d9ce0fe24f4d985cc4fb054..9df602a632bd70c4b1aa678fe9b1f6c16832fd10 100644 (file)
  * @_name: const char * of common header compression name.
  * @_nexthdr: ipv6 nexthdr field for the header compression.
  * @_nexthdrlen: ipv6 nexthdr len for the reserved space.
- * @_idsetup: callback to setup id and mask values.
- * @_idlen: len for the next header id and mask, should be always the same.
+ * @_id: one byte nhc id value.
+ * @_idmask: one byte nhc id mask value.
  * @_uncompress: callback for uncompression call.
  * @_compress: callback for compression call.
  */
 #define LOWPAN_NHC(__nhc, _name, _nexthdr,     \
-                  _hdrlen, _idsetup, _idlen,   \
+                  _hdrlen, _id, _idmask,       \
                   _uncompress, _compress)      \
-static u8 __nhc##_val[_idlen];                 \
-static u8 __nhc##_mask[_idlen];                        \
 static struct lowpan_nhc __nhc = {             \
        .name           = _name,                \
        .nexthdr        = _nexthdr,             \
        .nexthdrlen     = _hdrlen,              \
-       .id             = __nhc##_val,          \
-       .idmask         = __nhc##_mask,         \
-       .idlen          = _idlen,               \
-       .idsetup        = _idsetup,             \
+       .id             = _id,                  \
+       .idmask         = _idmask,              \
        .uncompress     = _uncompress,          \
        .compress       = _compress,            \
 }
@@ -53,27 +49,21 @@ module_exit(__nhc##_exit);
 /**
  * struct lowpan_nhc - hold 6lowpan next hdr compression ifnformation
  *
- * @node: holder for the rbtree.
  * @name: name of the specific next header compression
  * @nexthdr: next header value of the protocol which should be compressed.
  * @nexthdrlen: ipv6 nexthdr len for the reserved space.
- * @id: array for nhc id. Note this need to be in network byteorder.
- * @mask: array for nhc id mask. Note this need to be in network byteorder.
- * @len: the length of the next header id and mask.
- * @setup: callback to setup fill the next header id value and mask.
+ * @id: one byte nhc id value.
+ * @idmask: one byte nhc id mask value.
  * @compress: callback to do the header compression.
  * @uncompress: callback to do the header uncompression.
  */
 struct lowpan_nhc {
-       struct rb_node  node;
        const char      *name;
        u8              nexthdr;
        size_t          nexthdrlen;
-       u8              *id;
-       u8              *idmask;
-       size_t          idlen;
+       u8              id;
+       u8              idmask;
 
-       void            (*idsetup)(struct lowpan_nhc *nhc);
        int             (*uncompress)(struct sk_buff *skb, size_t needed);
        int             (*compress)(struct sk_buff *skb, u8 **hc_ptr);
 };
index 4768a945921250aa2d6ace67adc0bfb7d63c24cf..0cbcc7806469d965cdec8b78b07d23205f4ea416 100644 (file)
@@ -6,18 +6,11 @@
 
 #include "nhc.h"
 
-#define LOWPAN_NHC_DEST_IDLEN  1
 #define LOWPAN_NHC_DEST_ID_0   0xe6
 #define LOWPAN_NHC_DEST_MASK_0 0xfe
 
-static void dest_nhid_setup(struct lowpan_nhc *nhc)
-{
-       nhc->id[0] = LOWPAN_NHC_DEST_ID_0;
-       nhc->idmask[0] = LOWPAN_NHC_DEST_MASK_0;
-}
-
 LOWPAN_NHC(nhc_dest, "RFC6282 Destination Options", NEXTHDR_DEST, 0,
-          dest_nhid_setup, LOWPAN_NHC_DEST_IDLEN, NULL, NULL);
+          LOWPAN_NHC_DEST_ID_0, LOWPAN_NHC_DEST_MASK_0,  NULL, NULL);
 
 module_lowpan_nhc(nhc_dest);
 MODULE_DESCRIPTION("6LoWPAN next header RFC6282 Destination Options compression");
index be85f07715bd9d9473d854593711f6cd3d95b058..9414552df0ace72be9603d0cd1a164f43d56fdbd 100644 (file)
@@ -5,18 +5,11 @@
 
 #include "nhc.h"
 
-#define LOWPAN_NHC_FRAGMENT_IDLEN      1
 #define LOWPAN_NHC_FRAGMENT_ID_0       0xe4
 #define LOWPAN_NHC_FRAGMENT_MASK_0     0xfe
 
-static void fragment_nhid_setup(struct lowpan_nhc *nhc)
-{
-       nhc->id[0] = LOWPAN_NHC_FRAGMENT_ID_0;
-       nhc->idmask[0] = LOWPAN_NHC_FRAGMENT_MASK_0;
-}
-
 LOWPAN_NHC(nhc_fragment, "RFC6282 Fragment", NEXTHDR_FRAGMENT, 0,
-          fragment_nhid_setup, LOWPAN_NHC_FRAGMENT_IDLEN, NULL, NULL);
+          LOWPAN_NHC_FRAGMENT_ID_0, LOWPAN_NHC_FRAGMENT_MASK_0, NULL, NULL);
 
 module_lowpan_nhc(nhc_fragment);
 MODULE_DESCRIPTION("6LoWPAN next header RFC6282 Fragment compression");
index a9137f1733bec56a1c4a7222f9463cbf0639edc6..e4745ddd10a86a96516fb3582144a294f21a8db6 100644 (file)
@@ -5,18 +5,11 @@
 
 #include "nhc.h"
 
-#define LOWPAN_GHC_EXT_DEST_IDLEN      1
 #define LOWPAN_GHC_EXT_DEST_ID_0       0xb6
 #define LOWPAN_GHC_EXT_DEST_MASK_0     0xfe
 
-static void dest_ghid_setup(struct lowpan_nhc *nhc)
-{
-       nhc->id[0] = LOWPAN_GHC_EXT_DEST_ID_0;
-       nhc->idmask[0] = LOWPAN_GHC_EXT_DEST_MASK_0;
-}
-
 LOWPAN_NHC(ghc_ext_dest, "RFC7400 Destination Extension Header", NEXTHDR_DEST,
-          0, dest_ghid_setup, LOWPAN_GHC_EXT_DEST_IDLEN, NULL, NULL);
+          0, LOWPAN_GHC_EXT_DEST_ID_0, LOWPAN_GHC_EXT_DEST_MASK_0, NULL, NULL);
 
 module_lowpan_nhc(ghc_ext_dest);
 MODULE_DESCRIPTION("6LoWPAN generic header destination extension compression");
index d49b745918e0bdf51fc42e86e49fd146b117dcf0..220e5abfa946060391e62914a9480216b5316dac 100644 (file)
@@ -5,19 +5,12 @@
 
 #include "nhc.h"
 
-#define LOWPAN_GHC_EXT_FRAG_IDLEN      1
 #define LOWPAN_GHC_EXT_FRAG_ID_0       0xb4
 #define LOWPAN_GHC_EXT_FRAG_MASK_0     0xfe
 
-static void frag_ghid_setup(struct lowpan_nhc *nhc)
-{
-       nhc->id[0] = LOWPAN_GHC_EXT_FRAG_ID_0;
-       nhc->idmask[0] = LOWPAN_GHC_EXT_FRAG_MASK_0;
-}
-
 LOWPAN_NHC(ghc_ext_frag, "RFC7400 Fragmentation Extension Header",
-          NEXTHDR_FRAGMENT, 0, frag_ghid_setup,
-          LOWPAN_GHC_EXT_FRAG_IDLEN, NULL, NULL);
+          NEXTHDR_FRAGMENT, 0, LOWPAN_GHC_EXT_FRAG_ID_0,
+          LOWPAN_GHC_EXT_FRAG_MASK_0, NULL, NULL);
 
 module_lowpan_nhc(ghc_ext_frag);
 MODULE_DESCRIPTION("6LoWPAN generic header fragmentation extension compression");
index 3beedf5140a34aac18b5c28623d8ffc8c8488469..9b0de4da7379497ea1a4168628079b456a52a1ba 100644 (file)
@@ -5,18 +5,11 @@
 
 #include "nhc.h"
 
-#define LOWPAN_GHC_EXT_HOP_IDLEN       1
 #define LOWPAN_GHC_EXT_HOP_ID_0                0xb0
 #define LOWPAN_GHC_EXT_HOP_MASK_0      0xfe
 
-static void hop_ghid_setup(struct lowpan_nhc *nhc)
-{
-       nhc->id[0] = LOWPAN_GHC_EXT_HOP_ID_0;
-       nhc->idmask[0] = LOWPAN_GHC_EXT_HOP_MASK_0;
-}
-
 LOWPAN_NHC(ghc_ext_hop, "RFC7400 Hop-by-Hop Extension Header", NEXTHDR_HOP, 0,
-          hop_ghid_setup, LOWPAN_GHC_EXT_HOP_IDLEN, NULL, NULL);
+          LOWPAN_GHC_EXT_HOP_ID_0, LOWPAN_GHC_EXT_HOP_MASK_0, NULL, NULL);
 
 module_lowpan_nhc(ghc_ext_hop);
 MODULE_DESCRIPTION("6LoWPAN generic header hop-by-hop extension compression");
index 70dc0ea3cf66ef7c9466ce5c84e27da0c93dd9f4..3e86faec59c919a0f16c87204cddf35c09431862 100644 (file)
@@ -5,18 +5,11 @@
 
 #include "nhc.h"
 
-#define LOWPAN_GHC_EXT_ROUTE_IDLEN     1
 #define LOWPAN_GHC_EXT_ROUTE_ID_0      0xb2
 #define LOWPAN_GHC_EXT_ROUTE_MASK_0    0xfe
 
-static void route_ghid_setup(struct lowpan_nhc *nhc)
-{
-       nhc->id[0] = LOWPAN_GHC_EXT_ROUTE_ID_0;
-       nhc->idmask[0] = LOWPAN_GHC_EXT_ROUTE_MASK_0;
-}
-
 LOWPAN_NHC(ghc_ext_route, "RFC7400 Routing Extension Header", NEXTHDR_ROUTING,
-          0, route_ghid_setup, LOWPAN_GHC_EXT_ROUTE_IDLEN, NULL, NULL);
+          0, LOWPAN_GHC_EXT_ROUTE_ID_0, LOWPAN_GHC_EXT_ROUTE_MASK_0, NULL, NULL);
 
 module_lowpan_nhc(ghc_ext_route);
 MODULE_DESCRIPTION("6LoWPAN generic header routing extension compression");
index 339ceffc25a966dced38f369c1c9cce2222b4af5..1634f3eb0be801b0a195b17ca3b53ce56ffbafc0 100644 (file)
@@ -5,18 +5,11 @@
 
 #include "nhc.h"
 
-#define LOWPAN_GHC_ICMPV6_IDLEN                1
 #define LOWPAN_GHC_ICMPV6_ID_0         0xdf
 #define LOWPAN_GHC_ICMPV6_MASK_0       0xff
 
-static void icmpv6_ghid_setup(struct lowpan_nhc *nhc)
-{
-       nhc->id[0] = LOWPAN_GHC_ICMPV6_ID_0;
-       nhc->idmask[0] = LOWPAN_GHC_ICMPV6_MASK_0;
-}
-
 LOWPAN_NHC(ghc_icmpv6, "RFC7400 ICMPv6", NEXTHDR_ICMP, 0,
-          icmpv6_ghid_setup, LOWPAN_GHC_ICMPV6_IDLEN, NULL, NULL);
+          LOWPAN_GHC_ICMPV6_ID_0, LOWPAN_GHC_ICMPV6_MASK_0, NULL, NULL);
 
 module_lowpan_nhc(ghc_icmpv6);
 MODULE_DESCRIPTION("6LoWPAN generic header ICMPv6 compression");
index f47fec601e733f78a7270c64b6cffb3d797a0d7c..4ac4813b77ad434056582572f87e76a6b23b90f3 100644 (file)
@@ -5,18 +5,11 @@
 
 #include "nhc.h"
 
-#define LOWPAN_GHC_UDP_IDLEN   1
 #define LOWPAN_GHC_UDP_ID_0    0xd0
 #define LOWPAN_GHC_UDP_MASK_0  0xf8
 
-static void udp_ghid_setup(struct lowpan_nhc *nhc)
-{
-       nhc->id[0] = LOWPAN_GHC_UDP_ID_0;
-       nhc->idmask[0] = LOWPAN_GHC_UDP_MASK_0;
-}
-
 LOWPAN_NHC(ghc_udp, "RFC7400 UDP", NEXTHDR_UDP, 0,
-          udp_ghid_setup, LOWPAN_GHC_UDP_IDLEN, NULL, NULL);
+          LOWPAN_GHC_UDP_ID_0, LOWPAN_GHC_UDP_MASK_0, NULL, NULL);
 
 module_lowpan_nhc(ghc_udp);
 MODULE_DESCRIPTION("6LoWPAN generic header UDP compression");
index 158fc19063275a44bc65e171d0955828169184ff..182087dfd09d0e7700990676751cd4af115c081c 100644 (file)
@@ -5,18 +5,11 @@
 
 #include "nhc.h"
 
-#define LOWPAN_NHC_HOP_IDLEN   1
 #define LOWPAN_NHC_HOP_ID_0    0xe0
 #define LOWPAN_NHC_HOP_MASK_0  0xfe
 
-static void hop_nhid_setup(struct lowpan_nhc *nhc)
-{
-       nhc->id[0] = LOWPAN_NHC_HOP_ID_0;
-       nhc->idmask[0] = LOWPAN_NHC_HOP_MASK_0;
-}
-
 LOWPAN_NHC(nhc_hop, "RFC6282 Hop-by-Hop Options", NEXTHDR_HOP, 0,
-          hop_nhid_setup, LOWPAN_NHC_HOP_IDLEN, NULL, NULL);
+          LOWPAN_NHC_HOP_ID_0, LOWPAN_NHC_HOP_MASK_0, NULL, NULL);
 
 module_lowpan_nhc(nhc_hop);
 MODULE_DESCRIPTION("6LoWPAN next header RFC6282 Hop-by-Hop Options compression");
index 08b7589e5b3805efdf6a5c336252b4f095e6e5ed..20242360b1d4dc1beb55deb5aa490ab43c4e8c72 100644 (file)
@@ -5,18 +5,11 @@
 
 #include "nhc.h"
 
-#define LOWPAN_NHC_IPV6_IDLEN  1
 #define LOWPAN_NHC_IPV6_ID_0   0xee
 #define LOWPAN_NHC_IPV6_MASK_0 0xfe
 
-static void ipv6_nhid_setup(struct lowpan_nhc *nhc)
-{
-       nhc->id[0] = LOWPAN_NHC_IPV6_ID_0;
-       nhc->idmask[0] = LOWPAN_NHC_IPV6_MASK_0;
-}
-
-LOWPAN_NHC(nhc_ipv6, "RFC6282 IPv6", NEXTHDR_IPV6, 0, ipv6_nhid_setup,
-          LOWPAN_NHC_IPV6_IDLEN, NULL, NULL);
+LOWPAN_NHC(nhc_ipv6, "RFC6282 IPv6", NEXTHDR_IPV6, 0, LOWPAN_NHC_IPV6_ID_0,
+          LOWPAN_NHC_IPV6_MASK_0, NULL, NULL);
 
 module_lowpan_nhc(nhc_ipv6);
 MODULE_DESCRIPTION("6LoWPAN next header RFC6282 IPv6 compression");
index ac8fca68982815c8f2050d2cc8cfacc9cb7cae29..1c31d872c804c867ffae7cb0814400946acb5be2 100644 (file)
@@ -5,18 +5,11 @@
 
 #include "nhc.h"
 
-#define LOWPAN_NHC_MOBILITY_IDLEN      1
 #define LOWPAN_NHC_MOBILITY_ID_0       0xe8
 #define LOWPAN_NHC_MOBILITY_MASK_0     0xfe
 
-static void mobility_nhid_setup(struct lowpan_nhc *nhc)
-{
-       nhc->id[0] = LOWPAN_NHC_MOBILITY_ID_0;
-       nhc->idmask[0] = LOWPAN_NHC_MOBILITY_MASK_0;
-}
-
 LOWPAN_NHC(nhc_mobility, "RFC6282 Mobility", NEXTHDR_MOBILITY, 0,
-          mobility_nhid_setup, LOWPAN_NHC_MOBILITY_IDLEN, NULL, NULL);
+          LOWPAN_NHC_MOBILITY_ID_0, LOWPAN_NHC_MOBILITY_MASK_0, NULL, NULL);
 
 module_lowpan_nhc(nhc_mobility);
 MODULE_DESCRIPTION("6LoWPAN next header RFC6282 Mobility compression");
index 1c174023de42d1032dac0c1045870be9cce84dfd..dae03ebf702136579d449b5bedb7c7fe641667ea 100644 (file)
@@ -5,18 +5,11 @@
 
 #include "nhc.h"
 
-#define LOWPAN_NHC_ROUTING_IDLEN       1
 #define LOWPAN_NHC_ROUTING_ID_0                0xe2
 #define LOWPAN_NHC_ROUTING_MASK_0      0xfe
 
-static void routing_nhid_setup(struct lowpan_nhc *nhc)
-{
-       nhc->id[0] = LOWPAN_NHC_ROUTING_ID_0;
-       nhc->idmask[0] = LOWPAN_NHC_ROUTING_MASK_0;
-}
-
 LOWPAN_NHC(nhc_routing, "RFC6282 Routing", NEXTHDR_ROUTING, 0,
-          routing_nhid_setup, LOWPAN_NHC_ROUTING_IDLEN, NULL, NULL);
+          LOWPAN_NHC_ROUTING_ID_0, LOWPAN_NHC_ROUTING_MASK_0, NULL, NULL);
 
 module_lowpan_nhc(nhc_routing);
 MODULE_DESCRIPTION("6LoWPAN next header RFC6282 Routing compression");
index 33f17bd8cda717fa5e4d27a2d2add3a338c415d5..0a506c77283dded62c7b316ef0430313f596b0a8 100644 (file)
@@ -14,7 +14,6 @@
 
 #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
@@ -169,14 +168,8 @@ static int udp_compress(struct sk_buff *skb, u8 **hc_ptr)
        return 0;
 }
 
-static void udp_nhid_setup(struct lowpan_nhc *nhc)
-{
-       nhc->id[0] = LOWPAN_NHC_UDP_ID;
-       nhc->idmask[0] = LOWPAN_NHC_UDP_MASK;
-}
-
 LOWPAN_NHC(nhc_udp, "RFC6282 UDP", NEXTHDR_UDP, sizeof(struct udphdr),
-          udp_nhid_setup, LOWPAN_NHC_UDP_IDLEN, udp_uncompress, udp_compress);
+          LOWPAN_NHC_UDP_ID, LOWPAN_NHC_UDP_MASK, udp_uncompress, udp_compress);
 
 module_lowpan_nhc(nhc_udp);
 MODULE_DESCRIPTION("6LoWPAN next header RFC6282 UDP compression");