Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
6lowpan.c
Go to the documentation of this file.
1 /*
2  * Copyright 2011, Siemens AG
3  * written by Alexander Smirnov <[email protected]>
4  */
5 
6 /*
7  * Based on patches from Jon Smirl <[email protected]>
8  * Copyright (c) 2011 Jon Smirl <[email protected]>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License version 2
12  * as published by the Free Software Foundation.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License along
20  * with this program; if not, write to the Free Software Foundation, Inc.,
21  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22  */
23 
24 /* Jon's code is based on 6lowpan implementation for Contiki which is:
25  * Copyright (c) 2008, Swedish Institute of Computer Science.
26  * All rights reserved.
27  *
28  * Redistribution and use in source and binary forms, with or without
29  * modification, are permitted provided that the following conditions
30  * are met:
31  * 1. Redistributions of source code must retain the above copyright
32  * notice, this list of conditions and the following disclaimer.
33  * 2. Redistributions in binary form must reproduce the above copyright
34  * notice, this list of conditions and the following disclaimer in the
35  * documentation and/or other materials provided with the distribution.
36  * 3. Neither the name of the Institute nor the names of its contributors
37  * may be used to endorse or promote products derived from this software
38  * without specific prior written permission.
39  *
40  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
41  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
43  * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
44  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
45  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
46  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
48  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
49  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
50  * SUCH DAMAGE.
51  */
52 
53 #include <linux/bitops.h>
54 #include <linux/if_arp.h>
55 #include <linux/module.h>
56 #include <linux/moduleparam.h>
57 #include <linux/netdevice.h>
58 #include <net/af_ieee802154.h>
59 #include <net/ieee802154.h>
60 #include <net/ieee802154_netdev.h>
61 #include <net/ipv6.h>
62 
63 #include "6lowpan.h"
64 
65 /* TTL uncompression values */
66 static const u8 lowpan_ttl_values[] = {0, 1, 64, 255};
67 
68 static LIST_HEAD(lowpan_devices);
69 
70 /*
71  * Uncompression of linklocal:
72  * 0 -> 16 bytes from packet
73  * 1 -> 2 bytes from prefix - bunch of zeroes and 8 from packet
74  * 2 -> 2 bytes from prefix - zeroes + 2 from packet
75  * 3 -> 2 bytes from prefix - infer 8 bytes from lladdr
76  *
77  * NOTE: => the uncompress function does change 0xf to 0x10
78  * NOTE: 0x00 => no-autoconfig => unspecified
79  */
80 static const u8 lowpan_unc_llconf[] = {0x0f, 0x28, 0x22, 0x20};
81 
82 /*
83  * Uncompression of ctx-based:
84  * 0 -> 0 bits from packet [unspecified / reserved]
85  * 1 -> 8 bytes from prefix - bunch of zeroes and 8 from packet
86  * 2 -> 8 bytes from prefix - zeroes + 2 from packet
87  * 3 -> 8 bytes from prefix - infer 8 bytes from lladdr
88  */
89 static const u8 lowpan_unc_ctxconf[] = {0x00, 0x88, 0x82, 0x80};
90 
91 /*
92  * Uncompression of ctx-base
93  * 0 -> 0 bits from packet
94  * 1 -> 2 bytes from prefix - bunch of zeroes 5 from packet
95  * 2 -> 2 bytes from prefix - zeroes + 3 from packet
96  * 3 -> 2 bytes from prefix - infer 1 bytes from lladdr
97  */
98 static const u8 lowpan_unc_mxconf[] = {0x0f, 0x25, 0x23, 0x21};
99 
100 /* Link local prefix */
101 static const u8 lowpan_llprefix[] = {0xfe, 0x80};
102 
103 /* private device info */
105  struct net_device *real_dev; /* real WPAN device ptr */
106  struct mutex dev_list_mtx; /* mutex for list ops */
107 };
108 
110  struct net_device *ldev;
111  struct list_head list;
112 };
113 
115  struct sk_buff *skb; /* skb to be assembled */
116  u16 length; /* length to be assemled */
117  u32 bytes_rcv; /* bytes received */
118  u16 tag; /* current fragment tag */
119  struct timer_list timer; /* assembling timer */
120  struct list_head list; /* fragments list */
121 };
122 
123 static unsigned short fragment_tag;
124 static LIST_HEAD(lowpan_fragments);
125 static DEFINE_SPINLOCK(flist_lock);
126 
127 static inline struct
129 {
130  return netdev_priv(dev);
131 }
132 
133 static inline void lowpan_address_flip(u8 *src, u8 *dest)
134 {
135  int i;
136  for (i = 0; i < IEEE802154_ADDR_LEN; i++)
137  (dest)[IEEE802154_ADDR_LEN - i - 1] = (src)[i];
138 }
139 
140 /* list of all 6lowpan devices, uses for package delivering */
141 /* print data in line */
142 static inline void lowpan_raw_dump_inline(const char *caller, char *msg,
143  unsigned char *buf, int len)
144 {
145 #ifdef DEBUG
146  if (msg)
147  pr_debug("(%s) %s: ", caller, msg);
148  print_hex_dump(KERN_DEBUG, "", DUMP_PREFIX_NONE,
149  16, 1, buf, len, false);
150 #endif /* DEBUG */
151 }
152 
153 /*
154  * print data in a table format:
155  *
156  * addr: xx xx xx xx xx xx
157  * addr: xx xx xx xx xx xx
158  * ...
159  */
160 static inline void lowpan_raw_dump_table(const char *caller, char *msg,
161  unsigned char *buf, int len)
162 {
163 #ifdef DEBUG
164  if (msg)
165  pr_debug("(%s) %s:\n", caller, msg);
166  print_hex_dump(KERN_DEBUG, "\t", DUMP_PREFIX_OFFSET,
167  16, 1, buf, len, false);
168 #endif /* DEBUG */
169 }
170 
171 static u8
172 lowpan_compress_addr_64(u8 **hc06_ptr, u8 shift, const struct in6_addr *ipaddr,
173  const unsigned char *lladdr)
174 {
175  u8 val = 0;
176 
177  if (is_addr_mac_addr_based(ipaddr, lladdr))
178  val = 3; /* 0-bits */
179  else if (lowpan_is_iid_16_bit_compressable(ipaddr)) {
180  /* compress IID to 16 bits xxxx::XXXX */
181  memcpy(*hc06_ptr, &ipaddr->s6_addr16[7], 2);
182  *hc06_ptr += 2;
183  val = 2; /* 16-bits */
184  } else {
185  /* do not compress IID => xxxx::IID */
186  memcpy(*hc06_ptr, &ipaddr->s6_addr16[4], 8);
187  *hc06_ptr += 8;
188  val = 1; /* 64-bits */
189  }
190 
191  return rol8(val, shift);
192 }
193 
194 static void
195 lowpan_uip_ds6_set_addr_iid(struct in6_addr *ipaddr, unsigned char *lladdr)
196 {
197  memcpy(&ipaddr->s6_addr[8], lladdr, IEEE802154_ADDR_LEN);
198  /* second bit-flip (Universe/Local) is done according RFC2464 */
199  ipaddr->s6_addr[8] ^= 0x02;
200 }
201 
202 /*
203  * Uncompress addresses based on a prefix and a postfix with zeroes in
204  * between. If the postfix is zero in length it will use the link address
205  * to configure the IP address (autoconf style).
206  * pref_post_count takes a byte where the first nibble specify prefix count
207  * and the second postfix count (NOTE: 15/0xf => 16 bytes copy).
208  */
209 static int
210 lowpan_uncompress_addr(struct sk_buff *skb, struct in6_addr *ipaddr,
211  u8 const *prefix, u8 pref_post_count, unsigned char *lladdr)
212 {
213  u8 prefcount = pref_post_count >> 4;
214  u8 postcount = pref_post_count & 0x0f;
215 
216  /* full nibble 15 => 16 */
217  prefcount = (prefcount == 15 ? 16 : prefcount);
218  postcount = (postcount == 15 ? 16 : postcount);
219 
220  if (lladdr)
221  lowpan_raw_dump_inline(__func__, "linklocal address",
222  lladdr, IEEE802154_ADDR_LEN);
223  if (prefcount > 0)
224  memcpy(ipaddr, prefix, prefcount);
225 
226  if (prefcount + postcount < 16)
227  memset(&ipaddr->s6_addr[prefcount], 0,
228  16 - (prefcount + postcount));
229 
230  if (postcount > 0) {
231  memcpy(&ipaddr->s6_addr[16 - postcount], skb->data, postcount);
232  skb_pull(skb, postcount);
233  } else if (prefcount > 0) {
234  if (lladdr == NULL)
235  return -EINVAL;
236 
237  /* no IID based configuration if no prefix and no data */
238  lowpan_uip_ds6_set_addr_iid(ipaddr, lladdr);
239  }
240 
241  pr_debug("uncompressing %d + %d => ", prefcount, postcount);
242  lowpan_raw_dump_inline(NULL, NULL, ipaddr->s6_addr, 16);
243 
244  return 0;
245 }
246 
247 static void
248 lowpan_compress_udp_header(u8 **hc06_ptr, struct sk_buff *skb)
249 {
250  struct udphdr *uh = udp_hdr(skb);
251 
252  if (((uh->source & LOWPAN_NHC_UDP_4BIT_MASK) ==
254  ((uh->dest & LOWPAN_NHC_UDP_4BIT_MASK) ==
256  pr_debug("UDP header: both ports compression to 4 bits\n");
257  **hc06_ptr = LOWPAN_NHC_UDP_CS_P_11;
258  **(hc06_ptr + 1) = /* subtraction is faster */
259  (u8)((uh->dest - LOWPAN_NHC_UDP_4BIT_PORT) +
260  ((uh->source & LOWPAN_NHC_UDP_4BIT_PORT) << 4));
261  *hc06_ptr += 2;
262  } else if ((uh->dest & LOWPAN_NHC_UDP_8BIT_MASK) ==
264  pr_debug("UDP header: remove 8 bits of dest\n");
265  **hc06_ptr = LOWPAN_NHC_UDP_CS_P_01;
266  memcpy(*hc06_ptr + 1, &uh->source, 2);
267  **(hc06_ptr + 3) = (u8)(uh->dest - LOWPAN_NHC_UDP_8BIT_PORT);
268  *hc06_ptr += 4;
269  } else if ((uh->source & LOWPAN_NHC_UDP_8BIT_MASK) ==
271  pr_debug("UDP header: remove 8 bits of source\n");
272  **hc06_ptr = LOWPAN_NHC_UDP_CS_P_10;
273  memcpy(*hc06_ptr + 1, &uh->dest, 2);
274  **(hc06_ptr + 3) = (u8)(uh->source - LOWPAN_NHC_UDP_8BIT_PORT);
275  *hc06_ptr += 4;
276  } else {
277  pr_debug("UDP header: can't compress\n");
278  **hc06_ptr = LOWPAN_NHC_UDP_CS_P_00;
279  memcpy(*hc06_ptr + 1, &uh->source, 2);
280  memcpy(*hc06_ptr + 3, &uh->dest, 2);
281  *hc06_ptr += 5;
282  }
283 
284  /* checksum is always inline */
285  memcpy(*hc06_ptr, &uh->check, 2);
286  *hc06_ptr += 2;
287 }
288 
289 static inline int lowpan_fetch_skb_u8(struct sk_buff *skb, u8 *val)
290 {
291  if (unlikely(!pskb_may_pull(skb, 1)))
292  return -EINVAL;
293 
294  *val = skb->data[0];
295  skb_pull(skb, 1);
296 
297  return 0;
298 }
299 
300 static inline int lowpan_fetch_skb_u16(struct sk_buff *skb, u16 *val)
301 {
302  if (unlikely(!pskb_may_pull(skb, 2)))
303  return -EINVAL;
304 
305  *val = (skb->data[0] << 8) | skb->data[1];
306  skb_pull(skb, 2);
307 
308  return 0;
309 }
310 
311 static int
312 lowpan_uncompress_udp_header(struct sk_buff *skb)
313 {
314  struct udphdr *uh = udp_hdr(skb);
315  u8 tmp;
316 
317  if (!uh)
318  goto err;
319 
320  if (lowpan_fetch_skb_u8(skb, &tmp))
321  goto err;
322 
323  if ((tmp & LOWPAN_NHC_UDP_MASK) == LOWPAN_NHC_UDP_ID) {
324  pr_debug("UDP header uncompression\n");
325  switch (tmp & LOWPAN_NHC_UDP_CS_P_11) {
327  memcpy(&uh->source, &skb->data[0], 2);
328  memcpy(&uh->dest, &skb->data[2], 2);
329  skb_pull(skb, 4);
330  break;
332  memcpy(&uh->source, &skb->data[0], 2);
333  uh->dest =
334  skb->data[2] + LOWPAN_NHC_UDP_8BIT_PORT;
335  skb_pull(skb, 3);
336  break;
338  uh->source = skb->data[0] + LOWPAN_NHC_UDP_8BIT_PORT;
339  memcpy(&uh->dest, &skb->data[1], 2);
340  skb_pull(skb, 3);
341  break;
342  case LOWPAN_NHC_UDP_CS_P_11:
343  uh->source =
344  LOWPAN_NHC_UDP_4BIT_PORT + (skb->data[0] >> 4);
345  uh->dest =
346  LOWPAN_NHC_UDP_4BIT_PORT + (skb->data[0] & 0x0f);
347  skb_pull(skb, 1);
348  break;
349  default:
350  pr_debug("ERROR: unknown UDP format\n");
351  goto err;
352  break;
353  }
354 
355  pr_debug("uncompressed UDP ports: src = %d, dst = %d\n",
356  uh->source, uh->dest);
357 
358  /* copy checksum */
359  memcpy(&uh->check, &skb->data[0], 2);
360  skb_pull(skb, 2);
361  } else {
362  pr_debug("ERROR: unsupported NH format\n");
363  goto err;
364  }
365 
366  return 0;
367 err:
368  return -EINVAL;
369 }
370 
371 static int lowpan_header_create(struct sk_buff *skb,
372  struct net_device *dev,
373  unsigned short type, const void *_daddr,
374  const void *_saddr, unsigned int len)
375 {
376  u8 tmp, iphc0, iphc1, *hc06_ptr;
377  struct ipv6hdr *hdr;
378  const u8 *saddr = _saddr;
379  const u8 *daddr = _daddr;
380  u8 *head;
381  struct ieee802154_addr sa, da;
382 
383  if (type != ETH_P_IPV6)
384  return 0;
385  /* TODO:
386  * if this package isn't ipv6 one, where should it be routed?
387  */
388  head = kzalloc(100, GFP_KERNEL);
389  if (head == NULL)
390  return -ENOMEM;
391 
392  hdr = ipv6_hdr(skb);
393  hc06_ptr = head + 2;
394 
395  pr_debug("IPv6 header dump:\n\tversion = %d\n\tlength = %d\n"
396  "\tnexthdr = 0x%02x\n\thop_lim = %d\n", hdr->version,
397  ntohs(hdr->payload_len), hdr->nexthdr, hdr->hop_limit);
398 
399  lowpan_raw_dump_table(__func__, "raw skb network header dump",
400  skb_network_header(skb), sizeof(struct ipv6hdr));
401 
402  if (!saddr)
403  saddr = dev->dev_addr;
404 
405  lowpan_raw_dump_inline(__func__, "saddr", (unsigned char *)saddr, 8);
406 
407  /*
408  * As we copy some bit-length fields, in the IPHC encoding bytes,
409  * we sometimes use |=
410  * If the field is 0, and the current bit value in memory is 1,
411  * this does not work. We therefore reset the IPHC encoding here
412  */
413  iphc0 = LOWPAN_DISPATCH_IPHC;
414  iphc1 = 0;
415 
416  /* TODO: context lookup */
417 
418  lowpan_raw_dump_inline(__func__, "daddr", (unsigned char *)daddr, 8);
419 
420  /*
421  * Traffic class, flow label
422  * If flow label is 0, compress it. If traffic class is 0, compress it
423  * We have to process both in the same time as the offset of traffic
424  * class depends on the presence of version and flow label
425  */
426 
427  /* hc06 format of TC is ECN | DSCP , original one is DSCP | ECN */
428  tmp = (hdr->priority << 4) | (hdr->flow_lbl[0] >> 4);
429  tmp = ((tmp & 0x03) << 6) | (tmp >> 2);
430 
431  if (((hdr->flow_lbl[0] & 0x0F) == 0) &&
432  (hdr->flow_lbl[1] == 0) && (hdr->flow_lbl[2] == 0)) {
433  /* flow label can be compressed */
434  iphc0 |= LOWPAN_IPHC_FL_C;
435  if ((hdr->priority == 0) &&
436  ((hdr->flow_lbl[0] & 0xF0) == 0)) {
437  /* compress (elide) all */
438  iphc0 |= LOWPAN_IPHC_TC_C;
439  } else {
440  /* compress only the flow label */
441  *hc06_ptr = tmp;
442  hc06_ptr += 1;
443  }
444  } else {
445  /* Flow label cannot be compressed */
446  if ((hdr->priority == 0) &&
447  ((hdr->flow_lbl[0] & 0xF0) == 0)) {
448  /* compress only traffic class */
449  iphc0 |= LOWPAN_IPHC_TC_C;
450  *hc06_ptr = (tmp & 0xc0) | (hdr->flow_lbl[0] & 0x0F);
451  memcpy(hc06_ptr + 1, &hdr->flow_lbl[1], 2);
452  hc06_ptr += 3;
453  } else {
454  /* compress nothing */
455  memcpy(hc06_ptr, &hdr, 4);
456  /* replace the top byte with new ECN | DSCP format */
457  *hc06_ptr = tmp;
458  hc06_ptr += 4;
459  }
460  }
461 
462  /* NOTE: payload length is always compressed */
463 
464  /* Next Header is compress if UDP */
465  if (hdr->nexthdr == UIP_PROTO_UDP)
466  iphc0 |= LOWPAN_IPHC_NH_C;
467 
468  if ((iphc0 & LOWPAN_IPHC_NH_C) == 0) {
469  *hc06_ptr = hdr->nexthdr;
470  hc06_ptr += 1;
471  }
472 
473  /*
474  * Hop limit
475  * if 1: compress, encoding is 01
476  * if 64: compress, encoding is 10
477  * if 255: compress, encoding is 11
478  * else do not compress
479  */
480  switch (hdr->hop_limit) {
481  case 1:
482  iphc0 |= LOWPAN_IPHC_TTL_1;
483  break;
484  case 64:
485  iphc0 |= LOWPAN_IPHC_TTL_64;
486  break;
487  case 255:
488  iphc0 |= LOWPAN_IPHC_TTL_255;
489  break;
490  default:
491  *hc06_ptr = hdr->hop_limit;
492  hc06_ptr += 1;
493  break;
494  }
495 
496  /* source address compression */
497  if (is_addr_unspecified(&hdr->saddr)) {
498  pr_debug("source address is unspecified, setting SAC\n");
499  iphc1 |= LOWPAN_IPHC_SAC;
500  /* TODO: context lookup */
501  } else if (is_addr_link_local(&hdr->saddr)) {
502  pr_debug("source address is link-local\n");
503  iphc1 |= lowpan_compress_addr_64(&hc06_ptr,
504  LOWPAN_IPHC_SAM_BIT, &hdr->saddr, saddr);
505  } else {
506  pr_debug("send the full source address\n");
507  memcpy(hc06_ptr, &hdr->saddr.s6_addr16[0], 16);
508  hc06_ptr += 16;
509  }
510 
511  /* destination address compression */
512  if (is_addr_mcast(&hdr->daddr)) {
513  pr_debug("destination address is multicast: ");
514  iphc1 |= LOWPAN_IPHC_M;
516  pr_debug("compressed to 1 octet\n");
517  iphc1 |= LOWPAN_IPHC_DAM_11;
518  /* use last byte */
519  *hc06_ptr = hdr->daddr.s6_addr[15];
520  hc06_ptr += 1;
521  } else if (lowpan_is_mcast_addr_compressable32(&hdr->daddr)) {
522  pr_debug("compressed to 4 octets\n");
523  iphc1 |= LOWPAN_IPHC_DAM_10;
524  /* second byte + the last three */
525  *hc06_ptr = hdr->daddr.s6_addr[1];
526  memcpy(hc06_ptr + 1, &hdr->daddr.s6_addr[13], 3);
527  hc06_ptr += 4;
528  } else if (lowpan_is_mcast_addr_compressable48(&hdr->daddr)) {
529  pr_debug("compressed to 6 octets\n");
530  iphc1 |= LOWPAN_IPHC_DAM_01;
531  /* second byte + the last five */
532  *hc06_ptr = hdr->daddr.s6_addr[1];
533  memcpy(hc06_ptr + 1, &hdr->daddr.s6_addr[11], 5);
534  hc06_ptr += 6;
535  } else {
536  pr_debug("using full address\n");
537  iphc1 |= LOWPAN_IPHC_DAM_00;
538  memcpy(hc06_ptr, &hdr->daddr.s6_addr[0], 16);
539  hc06_ptr += 16;
540  }
541  } else {
542  /* TODO: context lookup */
543  if (is_addr_link_local(&hdr->daddr)) {
544  pr_debug("dest address is unicast and link-local\n");
545  iphc1 |= lowpan_compress_addr_64(&hc06_ptr,
546  LOWPAN_IPHC_DAM_BIT, &hdr->daddr, daddr);
547  } else {
548  pr_debug("dest address is unicast: using full one\n");
549  memcpy(hc06_ptr, &hdr->daddr.s6_addr16[0], 16);
550  hc06_ptr += 16;
551  }
552  }
553 
554  /* UDP header compression */
555  if (hdr->nexthdr == UIP_PROTO_UDP)
556  lowpan_compress_udp_header(&hc06_ptr, skb);
557 
558  head[0] = iphc0;
559  head[1] = iphc1;
560 
561  skb_pull(skb, sizeof(struct ipv6hdr));
562  memcpy(skb_push(skb, hc06_ptr - head), head, hc06_ptr - head);
563 
564  kfree(head);
565 
566  lowpan_raw_dump_table(__func__, "raw skb data dump", skb->data,
567  skb->len);
568 
569  /*
570  * NOTE1: I'm still unsure about the fact that compression and WPAN
571  * header are created here and not later in the xmit. So wait for
572  * an opinion of net maintainers.
573  */
574  /*
575  * NOTE2: to be absolutely correct, we must derive PANid information
576  * from MAC subif of the 'dev' and 'real_dev' network devices, but
577  * this isn't implemented in mainline yet, so currently we assign 0xff
578  */
579  {
580  /* prepare wpan address data */
581  sa.addr_type = IEEE802154_ADDR_LONG;
582  sa.pan_id = 0xff;
583 
584  da.addr_type = IEEE802154_ADDR_LONG;
585  da.pan_id = 0xff;
586 
587  memcpy(&(da.hwaddr), daddr, 8);
588  memcpy(&(sa.hwaddr), saddr, 8);
589 
590  mac_cb(skb)->flags = IEEE802154_FC_TYPE_DATA;
591 
592  return dev_hard_header(skb, lowpan_dev_info(dev)->real_dev,
593  type, (void *)&da, (void *)&sa, skb->len);
594  }
595 }
596 
597 static int lowpan_skb_deliver(struct sk_buff *skb, struct ipv6hdr *hdr)
598 {
599  struct sk_buff *new;
600  struct lowpan_dev_record *entry;
601  int stat = NET_RX_SUCCESS;
602 
603  new = skb_copy_expand(skb, sizeof(struct ipv6hdr), skb_tailroom(skb),
604  GFP_ATOMIC);
605  kfree_skb(skb);
606 
607  if (!new)
608  return -ENOMEM;
609 
610  skb_push(new, sizeof(struct ipv6hdr));
611  skb_reset_network_header(new);
612  skb_copy_to_linear_data(new, hdr, sizeof(struct ipv6hdr));
613 
614  new->protocol = htons(ETH_P_IPV6);
615  new->pkt_type = PACKET_HOST;
616 
617  rcu_read_lock();
618  list_for_each_entry_rcu(entry, &lowpan_devices, list)
619  if (lowpan_dev_info(entry->ldev)->real_dev == new->dev) {
620  skb = skb_copy(new, GFP_ATOMIC);
621  if (!skb) {
622  stat = -ENOMEM;
623  break;
624  }
625 
626  skb->dev = entry->ldev;
627  stat = netif_rx(skb);
628  }
629  rcu_read_unlock();
630 
631  kfree_skb(new);
632 
633  return stat;
634 }
635 
636 static void lowpan_fragment_timer_expired(unsigned long entry_addr)
637 {
638  struct lowpan_fragment *entry = (struct lowpan_fragment *)entry_addr;
639 
640  pr_debug("timer expired for frame with tag %d\n", entry->tag);
641 
642  list_del(&entry->list);
643  dev_kfree_skb(entry->skb);
644  kfree(entry);
645 }
646 
647 static struct lowpan_fragment *
648 lowpan_alloc_new_frame(struct sk_buff *skb, u8 len, u16 tag)
649 {
650  struct lowpan_fragment *frame;
651 
652  frame = kzalloc(sizeof(struct lowpan_fragment),
653  GFP_ATOMIC);
654  if (!frame)
655  goto frame_err;
656 
657  INIT_LIST_HEAD(&frame->list);
658 
659  frame->length = len;
660  frame->tag = tag;
661 
662  /* allocate buffer for frame assembling */
663  frame->skb = netdev_alloc_skb_ip_align(skb->dev, frame->length +
664  sizeof(struct ipv6hdr));
665 
666  if (!frame->skb)
667  goto skb_err;
668 
669  frame->skb->priority = skb->priority;
670  frame->skb->dev = skb->dev;
671 
672  /* reserve headroom for uncompressed ipv6 header */
673  skb_reserve(frame->skb, sizeof(struct ipv6hdr));
674  skb_put(frame->skb, frame->length);
675 
676  init_timer(&frame->timer);
677  /* time out is the same as for ipv6 - 60 sec */
678  frame->timer.expires = jiffies + LOWPAN_FRAG_TIMEOUT;
679  frame->timer.data = (unsigned long)frame;
680  frame->timer.function = lowpan_fragment_timer_expired;
681 
682  add_timer(&frame->timer);
683 
684  list_add_tail(&frame->list, &lowpan_fragments);
685 
686  return frame;
687 
688 skb_err:
689  kfree(frame);
690 frame_err:
691  return NULL;
692 }
693 
694 static int
695 lowpan_process_data(struct sk_buff *skb)
696 {
697  struct ipv6hdr hdr;
698  u8 tmp, iphc0, iphc1, num_context = 0;
699  u8 *_saddr, *_daddr;
700  int err;
701 
702  lowpan_raw_dump_table(__func__, "raw skb data dump", skb->data,
703  skb->len);
704  /* at least two bytes will be used for the encoding */
705  if (skb->len < 2)
706  goto drop;
707 
708  if (lowpan_fetch_skb_u8(skb, &iphc0))
709  goto drop;
710 
711  /* fragments assembling */
712  switch (iphc0 & LOWPAN_DISPATCH_MASK) {
715  {
716  struct lowpan_fragment *frame;
717  /* slen stores the rightmost 8 bits of the 11 bits length */
718  u8 slen, offset;
719  u16 len, tag;
720  bool found = false;
721 
722  if (lowpan_fetch_skb_u8(skb, &slen) || /* frame length */
723  lowpan_fetch_skb_u16(skb, &tag)) /* fragment tag */
724  goto drop;
725 
726  /* adds the 3 MSB to the 8 LSB to retrieve the 11 bits length */
727  len = ((iphc0 & 7) << 8) | slen;
728 
729  /*
730  * check if frame assembling with the same tag is
731  * already in progress
732  */
733  spin_lock_bh(&flist_lock);
734 
735  list_for_each_entry(frame, &lowpan_fragments, list)
736  if (frame->tag == tag) {
737  found = true;
738  break;
739  }
740 
741  /* alloc new frame structure */
742  if (!found) {
743  frame = lowpan_alloc_new_frame(skb, len, tag);
744  if (!frame)
745  goto unlock_and_drop;
746  }
747 
748  if ((iphc0 & LOWPAN_DISPATCH_MASK) == LOWPAN_DISPATCH_FRAG1)
749  goto unlock_and_drop;
750 
751  if (lowpan_fetch_skb_u8(skb, &offset)) /* fetch offset */
752  goto unlock_and_drop;
753 
754  /* if payload fits buffer, copy it */
755  if (likely((offset * 8 + skb->len) <= frame->length))
756  skb_copy_to_linear_data_offset(frame->skb, offset * 8,
757  skb->data, skb->len);
758  else
759  goto unlock_and_drop;
760 
761  frame->bytes_rcv += skb->len;
762 
763  /* frame assembling complete */
764  if ((frame->bytes_rcv == frame->length) &&
765  frame->timer.expires > jiffies) {
766  /* if timer haven't expired - first of all delete it */
767  del_timer_sync(&frame->timer);
768  list_del(&frame->list);
769  spin_unlock_bh(&flist_lock);
770 
771  dev_kfree_skb(skb);
772  skb = frame->skb;
773  kfree(frame);
774 
775  if (lowpan_fetch_skb_u8(skb, &iphc0))
776  goto drop;
777 
778  break;
779  }
780  spin_unlock_bh(&flist_lock);
781 
782  return kfree_skb(skb), 0;
783  }
784  default:
785  break;
786  }
787 
788  if (lowpan_fetch_skb_u8(skb, &iphc1))
789  goto drop;
790 
791  _saddr = mac_cb(skb)->sa.hwaddr;
792  _daddr = mac_cb(skb)->da.hwaddr;
793 
794  pr_debug("iphc0 = %02x, iphc1 = %02x\n", iphc0, iphc1);
795 
796  /* another if the CID flag is set */
797  if (iphc1 & LOWPAN_IPHC_CID) {
798  pr_debug("CID flag is set, increase header with one\n");
799  if (lowpan_fetch_skb_u8(skb, &num_context))
800  goto drop;
801  }
802 
803  hdr.version = 6;
804 
805  /* Traffic Class and Flow Label */
806  switch ((iphc0 & LOWPAN_IPHC_TF) >> 3) {
807  /*
808  * Traffic Class and FLow Label carried in-line
809  * ECN + DSCP + 4-bit Pad + Flow Label (4 bytes)
810  */
811  case 0: /* 00b */
812  if (lowpan_fetch_skb_u8(skb, &tmp))
813  goto drop;
814 
815  memcpy(&hdr.flow_lbl, &skb->data[0], 3);
816  skb_pull(skb, 3);
817  hdr.priority = ((tmp >> 2) & 0x0f);
818  hdr.flow_lbl[0] = ((tmp >> 2) & 0x30) | (tmp << 6) |
819  (hdr.flow_lbl[0] & 0x0f);
820  break;
821  /*
822  * Traffic class carried in-line
823  * ECN + DSCP (1 byte), Flow Label is elided
824  */
825  case 1: /* 10b */
826  if (lowpan_fetch_skb_u8(skb, &tmp))
827  goto drop;
828 
829  hdr.priority = ((tmp >> 2) & 0x0f);
830  hdr.flow_lbl[0] = ((tmp << 6) & 0xC0) | ((tmp >> 2) & 0x30);
831  hdr.flow_lbl[1] = 0;
832  hdr.flow_lbl[2] = 0;
833  break;
834  /*
835  * Flow Label carried in-line
836  * ECN + 2-bit Pad + Flow Label (3 bytes), DSCP is elided
837  */
838  case 2: /* 01b */
839  if (lowpan_fetch_skb_u8(skb, &tmp))
840  goto drop;
841 
842  hdr.flow_lbl[0] = (skb->data[0] & 0x0F) | ((tmp >> 2) & 0x30);
843  memcpy(&hdr.flow_lbl[1], &skb->data[0], 2);
844  skb_pull(skb, 2);
845  break;
846  /* Traffic Class and Flow Label are elided */
847  case 3: /* 11b */
848  hdr.priority = 0;
849  hdr.flow_lbl[0] = 0;
850  hdr.flow_lbl[1] = 0;
851  hdr.flow_lbl[2] = 0;
852  break;
853  default:
854  break;
855  }
856 
857  /* Next Header */
858  if ((iphc0 & LOWPAN_IPHC_NH_C) == 0) {
859  /* Next header is carried inline */
860  if (lowpan_fetch_skb_u8(skb, &(hdr.nexthdr)))
861  goto drop;
862 
863  pr_debug("NH flag is set, next header carried inline: %02x\n",
864  hdr.nexthdr);
865  }
866 
867  /* Hop Limit */
868  if ((iphc0 & 0x03) != LOWPAN_IPHC_TTL_I)
869  hdr.hop_limit = lowpan_ttl_values[iphc0 & 0x03];
870  else {
871  if (lowpan_fetch_skb_u8(skb, &(hdr.hop_limit)))
872  goto drop;
873  }
874 
875  /* Extract SAM to the tmp variable */
876  tmp = ((iphc1 & LOWPAN_IPHC_SAM) >> LOWPAN_IPHC_SAM_BIT) & 0x03;
877 
878  /* Source address uncompression */
879  pr_debug("source address stateless compression\n");
880  err = lowpan_uncompress_addr(skb, &hdr.saddr, lowpan_llprefix,
881  lowpan_unc_llconf[tmp], skb->data);
882  if (err)
883  goto drop;
884 
885  /* Extract DAM to the tmp variable */
886  tmp = ((iphc1 & LOWPAN_IPHC_DAM_11) >> LOWPAN_IPHC_DAM_BIT) & 0x03;
887 
888  /* check for Multicast Compression */
889  if (iphc1 & LOWPAN_IPHC_M) {
890  if (iphc1 & LOWPAN_IPHC_DAC) {
891  pr_debug("dest: context-based mcast compression\n");
892  /* TODO: implement this */
893  } else {
894  u8 prefix[] = {0xff, 0x02};
895 
896  pr_debug("dest: non context-based mcast compression\n");
897  if (0 < tmp && tmp < 3) {
898  if (lowpan_fetch_skb_u8(skb, &prefix[1]))
899  goto drop;
900  }
901 
902  err = lowpan_uncompress_addr(skb, &hdr.daddr, prefix,
903  lowpan_unc_mxconf[tmp], NULL);
904  if (err)
905  goto drop;
906  }
907  } else {
908  pr_debug("dest: stateless compression\n");
909  err = lowpan_uncompress_addr(skb, &hdr.daddr, lowpan_llprefix,
910  lowpan_unc_llconf[tmp], skb->data);
911  if (err)
912  goto drop;
913  }
914 
915  /* UDP data uncompression */
916  if (iphc0 & LOWPAN_IPHC_NH_C)
917  if (lowpan_uncompress_udp_header(skb))
918  goto drop;
919 
920  /* Not fragmented package */
921  hdr.payload_len = htons(skb->len);
922 
923  pr_debug("skb headroom size = %d, data length = %d\n",
924  skb_headroom(skb), skb->len);
925 
926  pr_debug("IPv6 header dump:\n\tversion = %d\n\tlength = %d\n\t"
927  "nexthdr = 0x%02x\n\thop_lim = %d\n", hdr.version,
928  ntohs(hdr.payload_len), hdr.nexthdr, hdr.hop_limit);
929 
930  lowpan_raw_dump_table(__func__, "raw header dump", (u8 *)&hdr,
931  sizeof(hdr));
932  return lowpan_skb_deliver(skb, &hdr);
933 
934 unlock_and_drop:
935  spin_unlock_bh(&flist_lock);
936 drop:
937  kfree_skb(skb);
938  return -EINVAL;
939 }
940 
941 static int lowpan_set_address(struct net_device *dev, void *p)
942 {
943  struct sockaddr *sa = p;
944 
945  if (netif_running(dev))
946  return -EBUSY;
947 
948  /* TODO: validate addr */
949  memcpy(dev->dev_addr, sa->sa_data, dev->addr_len);
950 
951  return 0;
952 }
953 
954 static int lowpan_get_mac_header_length(struct sk_buff *skb)
955 {
956  /*
957  * Currently long addressing mode is supported only, so the overall
958  * header size is 21:
959  * FC SeqNum DPAN DA SA Sec
960  * 2 + 1 + 2 + 8 + 8 + 0 = 21
961  */
962  return 21;
963 }
964 
965 static int
966 lowpan_fragment_xmit(struct sk_buff *skb, u8 *head,
967  int mlen, int plen, int offset)
968 {
969  struct sk_buff *frag;
970  int hlen, ret;
971 
972  /* if payload length is zero, therefore it's a first fragment */
973  hlen = (plen == 0 ? LOWPAN_FRAG1_HEAD_SIZE : LOWPAN_FRAGN_HEAD_SIZE);
974 
975  lowpan_raw_dump_inline(__func__, "6lowpan fragment header", head, hlen);
976 
977  frag = dev_alloc_skb(hlen + mlen + plen + IEEE802154_MFR_SIZE);
978  if (!frag)
979  return -ENOMEM;
980 
981  frag->priority = skb->priority;
982  frag->dev = skb->dev;
983 
984  /* copy header, MFR and payload */
985  memcpy(skb_put(frag, mlen), skb->data, mlen);
986  memcpy(skb_put(frag, hlen), head, hlen);
987 
988  if (plen)
989  skb_copy_from_linear_data_offset(skb, offset + mlen,
990  skb_put(frag, plen), plen);
991 
992  lowpan_raw_dump_table(__func__, " raw fragment dump", frag->data,
993  frag->len);
994 
995  ret = dev_queue_xmit(frag);
996 
997  return ret;
998 }
999 
1000 static int
1001 lowpan_skb_fragmentation(struct sk_buff *skb)
1002 {
1003  int err, header_length, payload_length, tag, offset = 0;
1004  u8 head[5];
1005 
1006  header_length = lowpan_get_mac_header_length(skb);
1007  payload_length = skb->len - header_length;
1008  tag = fragment_tag++;
1009 
1010  /* first fragment header */
1011  head[0] = LOWPAN_DISPATCH_FRAG1 | ((payload_length >> 8) & 0x7);
1012  head[1] = payload_length & 0xff;
1013  head[2] = tag >> 8;
1014  head[3] = tag & 0xff;
1015 
1016  err = lowpan_fragment_xmit(skb, head, header_length, 0, 0);
1017 
1018  /* next fragment header */
1019  head[0] &= ~LOWPAN_DISPATCH_FRAG1;
1020  head[0] |= LOWPAN_DISPATCH_FRAGN;
1021 
1022  while ((payload_length - offset > 0) && (err >= 0)) {
1023  int len = LOWPAN_FRAG_SIZE;
1024 
1025  head[4] = offset / 8;
1026 
1027  if (payload_length - offset < len)
1028  len = payload_length - offset;
1029 
1030  err = lowpan_fragment_xmit(skb, head, header_length,
1031  len, offset);
1032  offset += len;
1033  }
1034 
1035  return err;
1036 }
1037 
1038 static netdev_tx_t lowpan_xmit(struct sk_buff *skb, struct net_device *dev)
1039 {
1040  int err = -1;
1041 
1042  pr_debug("package xmit\n");
1043 
1044  skb->dev = lowpan_dev_info(dev)->real_dev;
1045  if (skb->dev == NULL) {
1046  pr_debug("ERROR: no real wpan device found\n");
1047  goto error;
1048  }
1049 
1050  if (skb->len <= IEEE802154_MTU) {
1051  err = dev_queue_xmit(skb);
1052  goto out;
1053  }
1054 
1055  pr_debug("frame is too big, fragmentation is needed\n");
1056  err = lowpan_skb_fragmentation(skb);
1057 error:
1058  dev_kfree_skb(skb);
1059 out:
1060  if (err < 0)
1061  pr_debug("ERROR: xmit failed\n");
1062 
1063  return (err < 0 ? NETDEV_TX_BUSY : NETDEV_TX_OK);
1064 }
1065 
1066 static struct wpan_phy *lowpan_get_phy(const struct net_device *dev)
1067 {
1068  struct net_device *real_dev = lowpan_dev_info(dev)->real_dev;
1069  return ieee802154_mlme_ops(real_dev)->get_phy(real_dev);
1070 }
1071 
1072 static u16 lowpan_get_pan_id(const struct net_device *dev)
1073 {
1074  struct net_device *real_dev = lowpan_dev_info(dev)->real_dev;
1075  return ieee802154_mlme_ops(real_dev)->get_pan_id(real_dev);
1076 }
1077 
1078 static u16 lowpan_get_short_addr(const struct net_device *dev)
1079 {
1080  struct net_device *real_dev = lowpan_dev_info(dev)->real_dev;
1081  return ieee802154_mlme_ops(real_dev)->get_short_addr(real_dev);
1082 }
1083 
1084 static struct header_ops lowpan_header_ops = {
1085  .create = lowpan_header_create,
1086 };
1087 
1088 static const struct net_device_ops lowpan_netdev_ops = {
1089  .ndo_start_xmit = lowpan_xmit,
1090  .ndo_set_mac_address = lowpan_set_address,
1091 };
1092 
1093 static struct ieee802154_mlme_ops lowpan_mlme = {
1094  .get_pan_id = lowpan_get_pan_id,
1095  .get_phy = lowpan_get_phy,
1096  .get_short_addr = lowpan_get_short_addr,
1097 };
1098 
1099 static void lowpan_setup(struct net_device *dev)
1100 {
1102  memset(dev->broadcast, 0xff, IEEE802154_ADDR_LEN);
1103  dev->type = ARPHRD_IEEE802154;
1104  /* Frame Control + Sequence Number + Address fields + Security Header */
1105  dev->hard_header_len = 2 + 1 + 20 + 14;
1106  dev->needed_tailroom = 2; /* FCS */
1107  dev->mtu = 1281;
1108  dev->tx_queue_len = 0;
1110  dev->watchdog_timeo = 0;
1111 
1112  dev->netdev_ops = &lowpan_netdev_ops;
1113  dev->header_ops = &lowpan_header_ops;
1114  dev->ml_priv = &lowpan_mlme;
1115  dev->destructor = free_netdev;
1116 }
1117 
1118 static int lowpan_validate(struct nlattr *tb[], struct nlattr *data[])
1119 {
1120  if (tb[IFLA_ADDRESS]) {
1121  if (nla_len(tb[IFLA_ADDRESS]) != IEEE802154_ADDR_LEN)
1122  return -EINVAL;
1123  }
1124  return 0;
1125 }
1126 
1127 static int lowpan_rcv(struct sk_buff *skb, struct net_device *dev,
1128  struct packet_type *pt, struct net_device *orig_dev)
1129 {
1130  struct sk_buff *local_skb;
1131 
1132  if (!netif_running(dev))
1133  goto drop;
1134 
1135  if (dev->type != ARPHRD_IEEE802154)
1136  goto drop;
1137 
1138  /* check that it's our buffer */
1139  switch (skb->data[0] & 0xe0) {
1140  case LOWPAN_DISPATCH_IPHC: /* ipv6 datagram */
1141  case LOWPAN_DISPATCH_FRAG1: /* first fragment header */
1142  case LOWPAN_DISPATCH_FRAGN: /* next fragments headers */
1143  local_skb = skb_clone(skb, GFP_ATOMIC);
1144  if (!local_skb)
1145  goto drop;
1146  lowpan_process_data(local_skb);
1147 
1148  kfree_skb(skb);
1149  break;
1150  default:
1151  break;
1152  }
1153 
1154  return NET_RX_SUCCESS;
1155 
1156 drop:
1157  kfree_skb(skb);
1158  return NET_RX_DROP;
1159 }
1160 
1161 static int lowpan_newlink(struct net *src_net, struct net_device *dev,
1162  struct nlattr *tb[], struct nlattr *data[])
1163 {
1164  struct net_device *real_dev;
1165  struct lowpan_dev_record *entry;
1166 
1167  pr_debug("adding new link\n");
1168 
1169  if (!tb[IFLA_LINK])
1170  return -EINVAL;
1171  /* find and hold real wpan device */
1172  real_dev = dev_get_by_index(src_net, nla_get_u32(tb[IFLA_LINK]));
1173  if (!real_dev)
1174  return -ENODEV;
1175 
1176  lowpan_dev_info(dev)->real_dev = real_dev;
1177  mutex_init(&lowpan_dev_info(dev)->dev_list_mtx);
1178 
1179  entry = kzalloc(sizeof(struct lowpan_dev_record), GFP_KERNEL);
1180  if (!entry) {
1181  dev_put(real_dev);
1182  lowpan_dev_info(dev)->real_dev = NULL;
1183  return -ENOMEM;
1184  }
1185 
1186  entry->ldev = dev;
1187 
1188  mutex_lock(&lowpan_dev_info(dev)->dev_list_mtx);
1189  INIT_LIST_HEAD(&entry->list);
1190  list_add_tail(&entry->list, &lowpan_devices);
1191  mutex_unlock(&lowpan_dev_info(dev)->dev_list_mtx);
1192 
1193  register_netdevice(dev);
1194 
1195  return 0;
1196 }
1197 
1198 static void lowpan_dellink(struct net_device *dev, struct list_head *head)
1199 {
1200  struct lowpan_dev_info *lowpan_dev = lowpan_dev_info(dev);
1201  struct net_device *real_dev = lowpan_dev->real_dev;
1202  struct lowpan_dev_record *entry, *tmp;
1203 
1204  ASSERT_RTNL();
1205 
1206  mutex_lock(&lowpan_dev_info(dev)->dev_list_mtx);
1207  list_for_each_entry_safe(entry, tmp, &lowpan_devices, list) {
1208  if (entry->ldev == dev) {
1209  list_del(&entry->list);
1210  kfree(entry);
1211  }
1212  }
1213  mutex_unlock(&lowpan_dev_info(dev)->dev_list_mtx);
1214 
1215  mutex_destroy(&lowpan_dev_info(dev)->dev_list_mtx);
1216 
1217  unregister_netdevice_queue(dev, head);
1218 
1219  dev_put(real_dev);
1220 }
1221 
1222 static struct rtnl_link_ops lowpan_link_ops __read_mostly = {
1223  .kind = "lowpan",
1224  .priv_size = sizeof(struct lowpan_dev_info),
1225  .setup = lowpan_setup,
1226  .newlink = lowpan_newlink,
1227  .dellink = lowpan_dellink,
1228  .validate = lowpan_validate,
1229 };
1230 
1231 static inline int __init lowpan_netlink_init(void)
1232 {
1233  return rtnl_link_register(&lowpan_link_ops);
1234 }
1235 
1236 static inline void __init lowpan_netlink_fini(void)
1237 {
1238  rtnl_link_unregister(&lowpan_link_ops);
1239 }
1240 
1241 static int lowpan_device_event(struct notifier_block *unused,
1242  unsigned long event,
1243  void *ptr)
1244 {
1245  struct net_device *dev = ptr;
1246  LIST_HEAD(del_list);
1247  struct lowpan_dev_record *entry, *tmp;
1248 
1249  if (dev->type != ARPHRD_IEEE802154)
1250  goto out;
1251 
1252  if (event == NETDEV_UNREGISTER) {
1253  list_for_each_entry_safe(entry, tmp, &lowpan_devices, list) {
1254  if (lowpan_dev_info(entry->ldev)->real_dev == dev)
1255  lowpan_dellink(entry->ldev, &del_list);
1256  }
1257 
1258  unregister_netdevice_many(&del_list);
1259  }
1260 
1261 out:
1262  return NOTIFY_DONE;
1263 }
1264 
1265 static struct notifier_block lowpan_dev_notifier = {
1266  .notifier_call = lowpan_device_event,
1267 };
1268 
1269 static struct packet_type lowpan_packet_type = {
1271  .func = lowpan_rcv,
1272 };
1273 
1274 static int __init lowpan_init_module(void)
1275 {
1276  int err = 0;
1277 
1278  err = lowpan_netlink_init();
1279  if (err < 0)
1280  goto out;
1281 
1282  dev_add_pack(&lowpan_packet_type);
1283 
1284  err = register_netdevice_notifier(&lowpan_dev_notifier);
1285  if (err < 0) {
1286  dev_remove_pack(&lowpan_packet_type);
1287  lowpan_netlink_fini();
1288  }
1289 out:
1290  return err;
1291 }
1292 
1293 static void __exit lowpan_cleanup_module(void)
1294 {
1295  struct lowpan_fragment *frame, *tframe;
1296 
1297  lowpan_netlink_fini();
1298 
1299  dev_remove_pack(&lowpan_packet_type);
1300 
1301  unregister_netdevice_notifier(&lowpan_dev_notifier);
1302 
1303  /* Now 6lowpan packet_type is removed, so no new fragments are
1304  * expected on RX, therefore that's the time to clean incomplete
1305  * fragments.
1306  */
1307  spin_lock_bh(&flist_lock);
1308  list_for_each_entry_safe(frame, tframe, &lowpan_fragments, list) {
1309  del_timer_sync(&frame->timer);
1310  list_del(&frame->list);
1311  dev_kfree_skb(frame->skb);
1312  kfree(frame);
1313  }
1314  spin_unlock_bh(&flist_lock);
1315 }
1316 
1317 module_init(lowpan_init_module);
1318 module_exit(lowpan_cleanup_module);
1319 MODULE_LICENSE("GPL");
1320 MODULE_ALIAS_RTNL_LINK("lowpan");