Commit cefc8c8a7c9e4867c45407f7f9a44fe80c5ea58a
Committed by
David S. Miller
1 parent
91c6922745
Exists in
master
and in
13 other branches
6lowpan: move 6lowpan header to include/net
This header is used by bluetooth and ieee802154 branch. This patch move this header to the include/net directory to avoid a use of a relative path in include. Signed-off-by: Alexander Aring <alex.aring@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Showing 6 changed files with 438 additions and 439 deletions Side-by-side Diff
include/net/6lowpan.h
1 | +/* | |
2 | + * Copyright 2011, Siemens AG | |
3 | + * written by Alexander Smirnov <alex.bluesman.smirnov@gmail.com> | |
4 | + */ | |
5 | + | |
6 | +/* | |
7 | + * Based on patches from Jon Smirl <jonsmirl@gmail.com> | |
8 | + * Copyright (c) 2011 Jon Smirl <jonsmirl@gmail.com> | |
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 | +#ifndef __6LOWPAN_H__ | |
54 | +#define __6LOWPAN_H__ | |
55 | + | |
56 | +#include <net/ipv6.h> | |
57 | + | |
58 | +#define UIP_802154_SHORTADDR_LEN 2 /* compressed ipv6 address length */ | |
59 | +#define UIP_IPH_LEN 40 /* ipv6 fixed header size */ | |
60 | +#define UIP_PROTO_UDP 17 /* ipv6 next header value for UDP */ | |
61 | +#define UIP_FRAGH_LEN 8 /* ipv6 fragment header size */ | |
62 | + | |
63 | +/* | |
64 | + * ipv6 address based on mac | |
65 | + * second bit-flip (Universe/Local) is done according RFC2464 | |
66 | + */ | |
67 | +#define is_addr_mac_addr_based(a, m) \ | |
68 | + ((((a)->s6_addr[8]) == (((m)[0]) ^ 0x02)) && \ | |
69 | + (((a)->s6_addr[9]) == (m)[1]) && \ | |
70 | + (((a)->s6_addr[10]) == (m)[2]) && \ | |
71 | + (((a)->s6_addr[11]) == (m)[3]) && \ | |
72 | + (((a)->s6_addr[12]) == (m)[4]) && \ | |
73 | + (((a)->s6_addr[13]) == (m)[5]) && \ | |
74 | + (((a)->s6_addr[14]) == (m)[6]) && \ | |
75 | + (((a)->s6_addr[15]) == (m)[7])) | |
76 | + | |
77 | +/* ipv6 address is unspecified */ | |
78 | +#define is_addr_unspecified(a) \ | |
79 | + ((((a)->s6_addr32[0]) == 0) && \ | |
80 | + (((a)->s6_addr32[1]) == 0) && \ | |
81 | + (((a)->s6_addr32[2]) == 0) && \ | |
82 | + (((a)->s6_addr32[3]) == 0)) | |
83 | + | |
84 | +/* compare ipv6 addresses prefixes */ | |
85 | +#define ipaddr_prefixcmp(addr1, addr2, length) \ | |
86 | + (memcmp(addr1, addr2, length >> 3) == 0) | |
87 | + | |
88 | +/* local link, i.e. FE80::/10 */ | |
89 | +#define is_addr_link_local(a) (((a)->s6_addr16[0]) == htons(0xFE80)) | |
90 | + | |
91 | +/* | |
92 | + * check whether we can compress the IID to 16 bits, | |
93 | + * it's possible for unicast adresses with first 49 bits are zero only. | |
94 | + */ | |
95 | +#define lowpan_is_iid_16_bit_compressable(a) \ | |
96 | + ((((a)->s6_addr16[4]) == 0) && \ | |
97 | + (((a)->s6_addr[10]) == 0) && \ | |
98 | + (((a)->s6_addr[11]) == 0xff) && \ | |
99 | + (((a)->s6_addr[12]) == 0xfe) && \ | |
100 | + (((a)->s6_addr[13]) == 0)) | |
101 | + | |
102 | +/* multicast address */ | |
103 | +#define is_addr_mcast(a) (((a)->s6_addr[0]) == 0xFF) | |
104 | + | |
105 | +/* check whether the 112-bit gid of the multicast address is mappable to: */ | |
106 | + | |
107 | +/* 9 bits, for FF02::1 (all nodes) and FF02::2 (all routers) addresses only. */ | |
108 | +#define lowpan_is_mcast_addr_compressable(a) \ | |
109 | + ((((a)->s6_addr16[1]) == 0) && \ | |
110 | + (((a)->s6_addr16[2]) == 0) && \ | |
111 | + (((a)->s6_addr16[3]) == 0) && \ | |
112 | + (((a)->s6_addr16[4]) == 0) && \ | |
113 | + (((a)->s6_addr16[5]) == 0) && \ | |
114 | + (((a)->s6_addr16[6]) == 0) && \ | |
115 | + (((a)->s6_addr[14]) == 0) && \ | |
116 | + ((((a)->s6_addr[15]) == 1) || (((a)->s6_addr[15]) == 2))) | |
117 | + | |
118 | +/* 48 bits, FFXX::00XX:XXXX:XXXX */ | |
119 | +#define lowpan_is_mcast_addr_compressable48(a) \ | |
120 | + ((((a)->s6_addr16[1]) == 0) && \ | |
121 | + (((a)->s6_addr16[2]) == 0) && \ | |
122 | + (((a)->s6_addr16[3]) == 0) && \ | |
123 | + (((a)->s6_addr16[4]) == 0) && \ | |
124 | + (((a)->s6_addr[10]) == 0)) | |
125 | + | |
126 | +/* 32 bits, FFXX::00XX:XXXX */ | |
127 | +#define lowpan_is_mcast_addr_compressable32(a) \ | |
128 | + ((((a)->s6_addr16[1]) == 0) && \ | |
129 | + (((a)->s6_addr16[2]) == 0) && \ | |
130 | + (((a)->s6_addr16[3]) == 0) && \ | |
131 | + (((a)->s6_addr16[4]) == 0) && \ | |
132 | + (((a)->s6_addr16[5]) == 0) && \ | |
133 | + (((a)->s6_addr[12]) == 0)) | |
134 | + | |
135 | +/* 8 bits, FF02::00XX */ | |
136 | +#define lowpan_is_mcast_addr_compressable8(a) \ | |
137 | + ((((a)->s6_addr[1]) == 2) && \ | |
138 | + (((a)->s6_addr16[1]) == 0) && \ | |
139 | + (((a)->s6_addr16[2]) == 0) && \ | |
140 | + (((a)->s6_addr16[3]) == 0) && \ | |
141 | + (((a)->s6_addr16[4]) == 0) && \ | |
142 | + (((a)->s6_addr16[5]) == 0) && \ | |
143 | + (((a)->s6_addr16[6]) == 0) && \ | |
144 | + (((a)->s6_addr[14]) == 0)) | |
145 | + | |
146 | +#define lowpan_is_addr_broadcast(a) \ | |
147 | + ((((a)[0]) == 0xFF) && \ | |
148 | + (((a)[1]) == 0xFF) && \ | |
149 | + (((a)[2]) == 0xFF) && \ | |
150 | + (((a)[3]) == 0xFF) && \ | |
151 | + (((a)[4]) == 0xFF) && \ | |
152 | + (((a)[5]) == 0xFF) && \ | |
153 | + (((a)[6]) == 0xFF) && \ | |
154 | + (((a)[7]) == 0xFF)) | |
155 | + | |
156 | +#define LOWPAN_DISPATCH_IPV6 0x41 /* 01000001 = 65 */ | |
157 | +#define LOWPAN_DISPATCH_HC1 0x42 /* 01000010 = 66 */ | |
158 | +#define LOWPAN_DISPATCH_IPHC 0x60 /* 011xxxxx = ... */ | |
159 | +#define LOWPAN_DISPATCH_FRAG1 0xc0 /* 11000xxx */ | |
160 | +#define LOWPAN_DISPATCH_FRAGN 0xe0 /* 11100xxx */ | |
161 | + | |
162 | +#define LOWPAN_DISPATCH_MASK 0xf8 /* 11111000 */ | |
163 | + | |
164 | +#define LOWPAN_FRAG_TIMEOUT (HZ * 60) /* time-out 60 sec */ | |
165 | + | |
166 | +#define LOWPAN_FRAG1_HEAD_SIZE 0x4 | |
167 | +#define LOWPAN_FRAGN_HEAD_SIZE 0x5 | |
168 | + | |
169 | +/* | |
170 | + * According IEEE802.15.4 standard: | |
171 | + * - MTU is 127 octets | |
172 | + * - maximum MHR size is 37 octets | |
173 | + * - MFR size is 2 octets | |
174 | + * | |
175 | + * so minimal payload size that we may guarantee is: | |
176 | + * MTU - MHR - MFR = 88 octets | |
177 | + */ | |
178 | +#define LOWPAN_FRAG_SIZE 88 | |
179 | + | |
180 | +/* | |
181 | + * Values of fields within the IPHC encoding first byte | |
182 | + * (C stands for compressed and I for inline) | |
183 | + */ | |
184 | +#define LOWPAN_IPHC_TF 0x18 | |
185 | + | |
186 | +#define LOWPAN_IPHC_FL_C 0x10 | |
187 | +#define LOWPAN_IPHC_TC_C 0x08 | |
188 | +#define LOWPAN_IPHC_NH_C 0x04 | |
189 | +#define LOWPAN_IPHC_TTL_1 0x01 | |
190 | +#define LOWPAN_IPHC_TTL_64 0x02 | |
191 | +#define LOWPAN_IPHC_TTL_255 0x03 | |
192 | +#define LOWPAN_IPHC_TTL_I 0x00 | |
193 | + | |
194 | + | |
195 | +/* Values of fields within the IPHC encoding second byte */ | |
196 | +#define LOWPAN_IPHC_CID 0x80 | |
197 | + | |
198 | +#define LOWPAN_IPHC_ADDR_00 0x00 | |
199 | +#define LOWPAN_IPHC_ADDR_01 0x01 | |
200 | +#define LOWPAN_IPHC_ADDR_02 0x02 | |
201 | +#define LOWPAN_IPHC_ADDR_03 0x03 | |
202 | + | |
203 | +#define LOWPAN_IPHC_SAC 0x40 | |
204 | +#define LOWPAN_IPHC_SAM 0x30 | |
205 | + | |
206 | +#define LOWPAN_IPHC_SAM_BIT 4 | |
207 | + | |
208 | +#define LOWPAN_IPHC_M 0x08 | |
209 | +#define LOWPAN_IPHC_DAC 0x04 | |
210 | +#define LOWPAN_IPHC_DAM_00 0x00 | |
211 | +#define LOWPAN_IPHC_DAM_01 0x01 | |
212 | +#define LOWPAN_IPHC_DAM_10 0x02 | |
213 | +#define LOWPAN_IPHC_DAM_11 0x03 | |
214 | + | |
215 | +#define LOWPAN_IPHC_DAM_BIT 0 | |
216 | +/* | |
217 | + * LOWPAN_UDP encoding (works together with IPHC) | |
218 | + */ | |
219 | +#define LOWPAN_NHC_UDP_MASK 0xF8 | |
220 | +#define LOWPAN_NHC_UDP_ID 0xF0 | |
221 | +#define LOWPAN_NHC_UDP_CHECKSUMC 0x04 | |
222 | +#define LOWPAN_NHC_UDP_CHECKSUMI 0x00 | |
223 | + | |
224 | +#define LOWPAN_NHC_UDP_4BIT_PORT 0xF0B0 | |
225 | +#define LOWPAN_NHC_UDP_4BIT_MASK 0xFFF0 | |
226 | +#define LOWPAN_NHC_UDP_8BIT_PORT 0xF000 | |
227 | +#define LOWPAN_NHC_UDP_8BIT_MASK 0xFF00 | |
228 | + | |
229 | +/* values for port compression, _with checksum_ ie bit 5 set to 0 */ | |
230 | +#define LOWPAN_NHC_UDP_CS_P_00 0xF0 /* all inline */ | |
231 | +#define LOWPAN_NHC_UDP_CS_P_01 0xF1 /* source 16bit inline, | |
232 | + dest = 0xF0 + 8 bit inline */ | |
233 | +#define LOWPAN_NHC_UDP_CS_P_10 0xF2 /* source = 0xF0 + 8bit inline, | |
234 | + dest = 16 bit inline */ | |
235 | +#define LOWPAN_NHC_UDP_CS_P_11 0xF3 /* source & dest = 0xF0B + 4bit inline */ | |
236 | +#define LOWPAN_NHC_UDP_CS_C 0x04 /* checksum elided */ | |
237 | + | |
238 | +#ifdef DEBUG | |
239 | +/* print data in line */ | |
240 | +static inline void raw_dump_inline(const char *caller, char *msg, | |
241 | + unsigned char *buf, int len) | |
242 | +{ | |
243 | + if (msg) | |
244 | + pr_debug("%s():%s: ", caller, msg); | |
245 | + | |
246 | + print_hex_dump_debug("", DUMP_PREFIX_NONE, 16, 1, buf, len, false); | |
247 | +} | |
248 | + | |
249 | +/* print data in a table format: | |
250 | + * | |
251 | + * addr: xx xx xx xx xx xx | |
252 | + * addr: xx xx xx xx xx xx | |
253 | + * ... | |
254 | + */ | |
255 | +static inline void raw_dump_table(const char *caller, char *msg, | |
256 | + unsigned char *buf, int len) | |
257 | +{ | |
258 | + if (msg) | |
259 | + pr_debug("%s():%s:\n", caller, msg); | |
260 | + | |
261 | + print_hex_dump_debug("\t", DUMP_PREFIX_OFFSET, 16, 1, buf, len, false); | |
262 | +} | |
263 | +#else | |
264 | +static inline void raw_dump_table(const char *caller, char *msg, | |
265 | + unsigned char *buf, int len) { } | |
266 | +static inline void raw_dump_inline(const char *caller, char *msg, | |
267 | + unsigned char *buf, int len) { } | |
268 | +#endif | |
269 | + | |
270 | +static inline int lowpan_fetch_skb_u8(struct sk_buff *skb, u8 *val) | |
271 | +{ | |
272 | + if (unlikely(!pskb_may_pull(skb, 1))) | |
273 | + return -EINVAL; | |
274 | + | |
275 | + *val = skb->data[0]; | |
276 | + skb_pull(skb, 1); | |
277 | + | |
278 | + return 0; | |
279 | +} | |
280 | + | |
281 | +static inline int lowpan_fetch_skb_u16(struct sk_buff *skb, u16 *val) | |
282 | +{ | |
283 | + if (unlikely(!pskb_may_pull(skb, 2))) | |
284 | + return -EINVAL; | |
285 | + | |
286 | + *val = (skb->data[0] << 8) | skb->data[1]; | |
287 | + skb_pull(skb, 2); | |
288 | + | |
289 | + return 0; | |
290 | +} | |
291 | + | |
292 | +static inline bool lowpan_fetch_skb(struct sk_buff *skb, | |
293 | + void *data, const unsigned int len) | |
294 | +{ | |
295 | + if (unlikely(!pskb_may_pull(skb, len))) | |
296 | + return true; | |
297 | + | |
298 | + skb_copy_from_linear_data(skb, data, len); | |
299 | + skb_pull(skb, len); | |
300 | + | |
301 | + return false; | |
302 | +} | |
303 | + | |
304 | +static inline void lowpan_push_hc_data(u8 **hc_ptr, const void *data, | |
305 | + const size_t len) | |
306 | +{ | |
307 | + memcpy(*hc_ptr, data, len); | |
308 | + *hc_ptr += len; | |
309 | +} | |
310 | + | |
311 | +static inline u8 lowpan_addr_mode_size(const u8 addr_mode) | |
312 | +{ | |
313 | + static const u8 addr_sizes[] = { | |
314 | + [LOWPAN_IPHC_ADDR_00] = 16, | |
315 | + [LOWPAN_IPHC_ADDR_01] = 8, | |
316 | + [LOWPAN_IPHC_ADDR_02] = 2, | |
317 | + [LOWPAN_IPHC_ADDR_03] = 0, | |
318 | + }; | |
319 | + return addr_sizes[addr_mode]; | |
320 | +} | |
321 | + | |
322 | +static inline u8 lowpan_next_hdr_size(const u8 h_enc, u16 *uncomp_header) | |
323 | +{ | |
324 | + u8 ret = 1; | |
325 | + | |
326 | + if ((h_enc & LOWPAN_NHC_UDP_MASK) == LOWPAN_NHC_UDP_ID) { | |
327 | + *uncomp_header += sizeof(struct udphdr); | |
328 | + | |
329 | + switch (h_enc & LOWPAN_NHC_UDP_CS_P_11) { | |
330 | + case LOWPAN_NHC_UDP_CS_P_00: | |
331 | + ret += 4; | |
332 | + break; | |
333 | + case LOWPAN_NHC_UDP_CS_P_01: | |
334 | + case LOWPAN_NHC_UDP_CS_P_10: | |
335 | + ret += 3; | |
336 | + break; | |
337 | + case LOWPAN_NHC_UDP_CS_P_11: | |
338 | + ret++; | |
339 | + break; | |
340 | + default: | |
341 | + break; | |
342 | + } | |
343 | + | |
344 | + if (!(h_enc & LOWPAN_NHC_UDP_CS_C)) | |
345 | + ret += 2; | |
346 | + } | |
347 | + | |
348 | + return ret; | |
349 | +} | |
350 | + | |
351 | +/** | |
352 | + * lowpan_uncompress_size - returns skb->len size with uncompressed header | |
353 | + * @skb: sk_buff with 6lowpan header inside | |
354 | + * @datagram_offset: optional to get the datagram_offset value | |
355 | + * | |
356 | + * Returns the skb->len with uncompressed header | |
357 | + */ | |
358 | +static inline u16 | |
359 | +lowpan_uncompress_size(const struct sk_buff *skb, u16 *dgram_offset) | |
360 | +{ | |
361 | + u16 ret = 2, uncomp_header = sizeof(struct ipv6hdr); | |
362 | + u8 iphc0, iphc1, h_enc; | |
363 | + | |
364 | + iphc0 = skb_network_header(skb)[0]; | |
365 | + iphc1 = skb_network_header(skb)[1]; | |
366 | + | |
367 | + switch ((iphc0 & LOWPAN_IPHC_TF) >> 3) { | |
368 | + case 0: | |
369 | + ret += 4; | |
370 | + break; | |
371 | + case 1: | |
372 | + ret += 3; | |
373 | + break; | |
374 | + case 2: | |
375 | + ret++; | |
376 | + break; | |
377 | + default: | |
378 | + break; | |
379 | + } | |
380 | + | |
381 | + if (!(iphc0 & LOWPAN_IPHC_NH_C)) | |
382 | + ret++; | |
383 | + | |
384 | + if (!(iphc0 & 0x03)) | |
385 | + ret++; | |
386 | + | |
387 | + ret += lowpan_addr_mode_size((iphc1 & LOWPAN_IPHC_SAM) >> | |
388 | + LOWPAN_IPHC_SAM_BIT); | |
389 | + | |
390 | + if (iphc1 & LOWPAN_IPHC_M) { | |
391 | + switch ((iphc1 & LOWPAN_IPHC_DAM_11) >> | |
392 | + LOWPAN_IPHC_DAM_BIT) { | |
393 | + case LOWPAN_IPHC_DAM_00: | |
394 | + ret += 16; | |
395 | + break; | |
396 | + case LOWPAN_IPHC_DAM_01: | |
397 | + ret += 6; | |
398 | + break; | |
399 | + case LOWPAN_IPHC_DAM_10: | |
400 | + ret += 4; | |
401 | + break; | |
402 | + case LOWPAN_IPHC_DAM_11: | |
403 | + ret++; | |
404 | + break; | |
405 | + default: | |
406 | + break; | |
407 | + } | |
408 | + } else { | |
409 | + ret += lowpan_addr_mode_size((iphc1 & LOWPAN_IPHC_DAM_11) >> | |
410 | + LOWPAN_IPHC_DAM_BIT); | |
411 | + } | |
412 | + | |
413 | + if (iphc0 & LOWPAN_IPHC_NH_C) { | |
414 | + h_enc = skb_network_header(skb)[ret]; | |
415 | + ret += lowpan_next_hdr_size(h_enc, &uncomp_header); | |
416 | + } | |
417 | + | |
418 | + if (dgram_offset) | |
419 | + *dgram_offset = uncomp_header; | |
420 | + | |
421 | + return skb->len + uncomp_header - ret; | |
422 | +} | |
423 | + | |
424 | +typedef int (*skb_delivery_cb)(struct sk_buff *skb, struct net_device *dev); | |
425 | + | |
426 | +int lowpan_process_data(struct sk_buff *skb, struct net_device *dev, | |
427 | + const u8 *saddr, const u8 saddr_type, const u8 saddr_len, | |
428 | + const u8 *daddr, const u8 daddr_type, const u8 daddr_len, | |
429 | + u8 iphc0, u8 iphc1, skb_delivery_cb skb_deliver); | |
430 | +int lowpan_header_compress(struct sk_buff *skb, struct net_device *dev, | |
431 | + unsigned short type, const void *_daddr, | |
432 | + const void *_saddr, unsigned int len); | |
433 | + | |
434 | +#endif /* __6LOWPAN_H__ */ |
net/bluetooth/6lowpan.c
net/ieee802154/6lowpan.h
1 | -/* | |
2 | - * Copyright 2011, Siemens AG | |
3 | - * written by Alexander Smirnov <alex.bluesman.smirnov@gmail.com> | |
4 | - */ | |
5 | - | |
6 | -/* | |
7 | - * Based on patches from Jon Smirl <jonsmirl@gmail.com> | |
8 | - * Copyright (c) 2011 Jon Smirl <jonsmirl@gmail.com> | |
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 | -#ifndef __6LOWPAN_H__ | |
54 | -#define __6LOWPAN_H__ | |
55 | - | |
56 | -#include <net/ipv6.h> | |
57 | - | |
58 | -#define UIP_802154_SHORTADDR_LEN 2 /* compressed ipv6 address length */ | |
59 | -#define UIP_IPH_LEN 40 /* ipv6 fixed header size */ | |
60 | -#define UIP_PROTO_UDP 17 /* ipv6 next header value for UDP */ | |
61 | -#define UIP_FRAGH_LEN 8 /* ipv6 fragment header size */ | |
62 | - | |
63 | -/* | |
64 | - * ipv6 address based on mac | |
65 | - * second bit-flip (Universe/Local) is done according RFC2464 | |
66 | - */ | |
67 | -#define is_addr_mac_addr_based(a, m) \ | |
68 | - ((((a)->s6_addr[8]) == (((m)[0]) ^ 0x02)) && \ | |
69 | - (((a)->s6_addr[9]) == (m)[1]) && \ | |
70 | - (((a)->s6_addr[10]) == (m)[2]) && \ | |
71 | - (((a)->s6_addr[11]) == (m)[3]) && \ | |
72 | - (((a)->s6_addr[12]) == (m)[4]) && \ | |
73 | - (((a)->s6_addr[13]) == (m)[5]) && \ | |
74 | - (((a)->s6_addr[14]) == (m)[6]) && \ | |
75 | - (((a)->s6_addr[15]) == (m)[7])) | |
76 | - | |
77 | -/* ipv6 address is unspecified */ | |
78 | -#define is_addr_unspecified(a) \ | |
79 | - ((((a)->s6_addr32[0]) == 0) && \ | |
80 | - (((a)->s6_addr32[1]) == 0) && \ | |
81 | - (((a)->s6_addr32[2]) == 0) && \ | |
82 | - (((a)->s6_addr32[3]) == 0)) | |
83 | - | |
84 | -/* compare ipv6 addresses prefixes */ | |
85 | -#define ipaddr_prefixcmp(addr1, addr2, length) \ | |
86 | - (memcmp(addr1, addr2, length >> 3) == 0) | |
87 | - | |
88 | -/* local link, i.e. FE80::/10 */ | |
89 | -#define is_addr_link_local(a) (((a)->s6_addr16[0]) == htons(0xFE80)) | |
90 | - | |
91 | -/* | |
92 | - * check whether we can compress the IID to 16 bits, | |
93 | - * it's possible for unicast adresses with first 49 bits are zero only. | |
94 | - */ | |
95 | -#define lowpan_is_iid_16_bit_compressable(a) \ | |
96 | - ((((a)->s6_addr16[4]) == 0) && \ | |
97 | - (((a)->s6_addr[10]) == 0) && \ | |
98 | - (((a)->s6_addr[11]) == 0xff) && \ | |
99 | - (((a)->s6_addr[12]) == 0xfe) && \ | |
100 | - (((a)->s6_addr[13]) == 0)) | |
101 | - | |
102 | -/* multicast address */ | |
103 | -#define is_addr_mcast(a) (((a)->s6_addr[0]) == 0xFF) | |
104 | - | |
105 | -/* check whether the 112-bit gid of the multicast address is mappable to: */ | |
106 | - | |
107 | -/* 9 bits, for FF02::1 (all nodes) and FF02::2 (all routers) addresses only. */ | |
108 | -#define lowpan_is_mcast_addr_compressable(a) \ | |
109 | - ((((a)->s6_addr16[1]) == 0) && \ | |
110 | - (((a)->s6_addr16[2]) == 0) && \ | |
111 | - (((a)->s6_addr16[3]) == 0) && \ | |
112 | - (((a)->s6_addr16[4]) == 0) && \ | |
113 | - (((a)->s6_addr16[5]) == 0) && \ | |
114 | - (((a)->s6_addr16[6]) == 0) && \ | |
115 | - (((a)->s6_addr[14]) == 0) && \ | |
116 | - ((((a)->s6_addr[15]) == 1) || (((a)->s6_addr[15]) == 2))) | |
117 | - | |
118 | -/* 48 bits, FFXX::00XX:XXXX:XXXX */ | |
119 | -#define lowpan_is_mcast_addr_compressable48(a) \ | |
120 | - ((((a)->s6_addr16[1]) == 0) && \ | |
121 | - (((a)->s6_addr16[2]) == 0) && \ | |
122 | - (((a)->s6_addr16[3]) == 0) && \ | |
123 | - (((a)->s6_addr16[4]) == 0) && \ | |
124 | - (((a)->s6_addr[10]) == 0)) | |
125 | - | |
126 | -/* 32 bits, FFXX::00XX:XXXX */ | |
127 | -#define lowpan_is_mcast_addr_compressable32(a) \ | |
128 | - ((((a)->s6_addr16[1]) == 0) && \ | |
129 | - (((a)->s6_addr16[2]) == 0) && \ | |
130 | - (((a)->s6_addr16[3]) == 0) && \ | |
131 | - (((a)->s6_addr16[4]) == 0) && \ | |
132 | - (((a)->s6_addr16[5]) == 0) && \ | |
133 | - (((a)->s6_addr[12]) == 0)) | |
134 | - | |
135 | -/* 8 bits, FF02::00XX */ | |
136 | -#define lowpan_is_mcast_addr_compressable8(a) \ | |
137 | - ((((a)->s6_addr[1]) == 2) && \ | |
138 | - (((a)->s6_addr16[1]) == 0) && \ | |
139 | - (((a)->s6_addr16[2]) == 0) && \ | |
140 | - (((a)->s6_addr16[3]) == 0) && \ | |
141 | - (((a)->s6_addr16[4]) == 0) && \ | |
142 | - (((a)->s6_addr16[5]) == 0) && \ | |
143 | - (((a)->s6_addr16[6]) == 0) && \ | |
144 | - (((a)->s6_addr[14]) == 0)) | |
145 | - | |
146 | -#define lowpan_is_addr_broadcast(a) \ | |
147 | - ((((a)[0]) == 0xFF) && \ | |
148 | - (((a)[1]) == 0xFF) && \ | |
149 | - (((a)[2]) == 0xFF) && \ | |
150 | - (((a)[3]) == 0xFF) && \ | |
151 | - (((a)[4]) == 0xFF) && \ | |
152 | - (((a)[5]) == 0xFF) && \ | |
153 | - (((a)[6]) == 0xFF) && \ | |
154 | - (((a)[7]) == 0xFF)) | |
155 | - | |
156 | -#define LOWPAN_DISPATCH_IPV6 0x41 /* 01000001 = 65 */ | |
157 | -#define LOWPAN_DISPATCH_HC1 0x42 /* 01000010 = 66 */ | |
158 | -#define LOWPAN_DISPATCH_IPHC 0x60 /* 011xxxxx = ... */ | |
159 | -#define LOWPAN_DISPATCH_FRAG1 0xc0 /* 11000xxx */ | |
160 | -#define LOWPAN_DISPATCH_FRAGN 0xe0 /* 11100xxx */ | |
161 | - | |
162 | -#define LOWPAN_DISPATCH_MASK 0xf8 /* 11111000 */ | |
163 | - | |
164 | -#define LOWPAN_FRAG_TIMEOUT (HZ * 60) /* time-out 60 sec */ | |
165 | - | |
166 | -#define LOWPAN_FRAG1_HEAD_SIZE 0x4 | |
167 | -#define LOWPAN_FRAGN_HEAD_SIZE 0x5 | |
168 | - | |
169 | -/* | |
170 | - * According IEEE802.15.4 standard: | |
171 | - * - MTU is 127 octets | |
172 | - * - maximum MHR size is 37 octets | |
173 | - * - MFR size is 2 octets | |
174 | - * | |
175 | - * so minimal payload size that we may guarantee is: | |
176 | - * MTU - MHR - MFR = 88 octets | |
177 | - */ | |
178 | -#define LOWPAN_FRAG_SIZE 88 | |
179 | - | |
180 | -/* | |
181 | - * Values of fields within the IPHC encoding first byte | |
182 | - * (C stands for compressed and I for inline) | |
183 | - */ | |
184 | -#define LOWPAN_IPHC_TF 0x18 | |
185 | - | |
186 | -#define LOWPAN_IPHC_FL_C 0x10 | |
187 | -#define LOWPAN_IPHC_TC_C 0x08 | |
188 | -#define LOWPAN_IPHC_NH_C 0x04 | |
189 | -#define LOWPAN_IPHC_TTL_1 0x01 | |
190 | -#define LOWPAN_IPHC_TTL_64 0x02 | |
191 | -#define LOWPAN_IPHC_TTL_255 0x03 | |
192 | -#define LOWPAN_IPHC_TTL_I 0x00 | |
193 | - | |
194 | - | |
195 | -/* Values of fields within the IPHC encoding second byte */ | |
196 | -#define LOWPAN_IPHC_CID 0x80 | |
197 | - | |
198 | -#define LOWPAN_IPHC_ADDR_00 0x00 | |
199 | -#define LOWPAN_IPHC_ADDR_01 0x01 | |
200 | -#define LOWPAN_IPHC_ADDR_02 0x02 | |
201 | -#define LOWPAN_IPHC_ADDR_03 0x03 | |
202 | - | |
203 | -#define LOWPAN_IPHC_SAC 0x40 | |
204 | -#define LOWPAN_IPHC_SAM 0x30 | |
205 | - | |
206 | -#define LOWPAN_IPHC_SAM_BIT 4 | |
207 | - | |
208 | -#define LOWPAN_IPHC_M 0x08 | |
209 | -#define LOWPAN_IPHC_DAC 0x04 | |
210 | -#define LOWPAN_IPHC_DAM_00 0x00 | |
211 | -#define LOWPAN_IPHC_DAM_01 0x01 | |
212 | -#define LOWPAN_IPHC_DAM_10 0x02 | |
213 | -#define LOWPAN_IPHC_DAM_11 0x03 | |
214 | - | |
215 | -#define LOWPAN_IPHC_DAM_BIT 0 | |
216 | -/* | |
217 | - * LOWPAN_UDP encoding (works together with IPHC) | |
218 | - */ | |
219 | -#define LOWPAN_NHC_UDP_MASK 0xF8 | |
220 | -#define LOWPAN_NHC_UDP_ID 0xF0 | |
221 | -#define LOWPAN_NHC_UDP_CHECKSUMC 0x04 | |
222 | -#define LOWPAN_NHC_UDP_CHECKSUMI 0x00 | |
223 | - | |
224 | -#define LOWPAN_NHC_UDP_4BIT_PORT 0xF0B0 | |
225 | -#define LOWPAN_NHC_UDP_4BIT_MASK 0xFFF0 | |
226 | -#define LOWPAN_NHC_UDP_8BIT_PORT 0xF000 | |
227 | -#define LOWPAN_NHC_UDP_8BIT_MASK 0xFF00 | |
228 | - | |
229 | -/* values for port compression, _with checksum_ ie bit 5 set to 0 */ | |
230 | -#define LOWPAN_NHC_UDP_CS_P_00 0xF0 /* all inline */ | |
231 | -#define LOWPAN_NHC_UDP_CS_P_01 0xF1 /* source 16bit inline, | |
232 | - dest = 0xF0 + 8 bit inline */ | |
233 | -#define LOWPAN_NHC_UDP_CS_P_10 0xF2 /* source = 0xF0 + 8bit inline, | |
234 | - dest = 16 bit inline */ | |
235 | -#define LOWPAN_NHC_UDP_CS_P_11 0xF3 /* source & dest = 0xF0B + 4bit inline */ | |
236 | -#define LOWPAN_NHC_UDP_CS_C 0x04 /* checksum elided */ | |
237 | - | |
238 | -#ifdef DEBUG | |
239 | -/* print data in line */ | |
240 | -static inline void raw_dump_inline(const char *caller, char *msg, | |
241 | - unsigned char *buf, int len) | |
242 | -{ | |
243 | - if (msg) | |
244 | - pr_debug("%s():%s: ", caller, msg); | |
245 | - | |
246 | - print_hex_dump_debug("", DUMP_PREFIX_NONE, 16, 1, buf, len, false); | |
247 | -} | |
248 | - | |
249 | -/* print data in a table format: | |
250 | - * | |
251 | - * addr: xx xx xx xx xx xx | |
252 | - * addr: xx xx xx xx xx xx | |
253 | - * ... | |
254 | - */ | |
255 | -static inline void raw_dump_table(const char *caller, char *msg, | |
256 | - unsigned char *buf, int len) | |
257 | -{ | |
258 | - if (msg) | |
259 | - pr_debug("%s():%s:\n", caller, msg); | |
260 | - | |
261 | - print_hex_dump_debug("\t", DUMP_PREFIX_OFFSET, 16, 1, buf, len, false); | |
262 | -} | |
263 | -#else | |
264 | -static inline void raw_dump_table(const char *caller, char *msg, | |
265 | - unsigned char *buf, int len) { } | |
266 | -static inline void raw_dump_inline(const char *caller, char *msg, | |
267 | - unsigned char *buf, int len) { } | |
268 | -#endif | |
269 | - | |
270 | -static inline int lowpan_fetch_skb_u8(struct sk_buff *skb, u8 *val) | |
271 | -{ | |
272 | - if (unlikely(!pskb_may_pull(skb, 1))) | |
273 | - return -EINVAL; | |
274 | - | |
275 | - *val = skb->data[0]; | |
276 | - skb_pull(skb, 1); | |
277 | - | |
278 | - return 0; | |
279 | -} | |
280 | - | |
281 | -static inline int lowpan_fetch_skb_u16(struct sk_buff *skb, u16 *val) | |
282 | -{ | |
283 | - if (unlikely(!pskb_may_pull(skb, 2))) | |
284 | - return -EINVAL; | |
285 | - | |
286 | - *val = (skb->data[0] << 8) | skb->data[1]; | |
287 | - skb_pull(skb, 2); | |
288 | - | |
289 | - return 0; | |
290 | -} | |
291 | - | |
292 | -static inline bool lowpan_fetch_skb(struct sk_buff *skb, | |
293 | - void *data, const unsigned int len) | |
294 | -{ | |
295 | - if (unlikely(!pskb_may_pull(skb, len))) | |
296 | - return true; | |
297 | - | |
298 | - skb_copy_from_linear_data(skb, data, len); | |
299 | - skb_pull(skb, len); | |
300 | - | |
301 | - return false; | |
302 | -} | |
303 | - | |
304 | -static inline void lowpan_push_hc_data(u8 **hc_ptr, const void *data, | |
305 | - const size_t len) | |
306 | -{ | |
307 | - memcpy(*hc_ptr, data, len); | |
308 | - *hc_ptr += len; | |
309 | -} | |
310 | - | |
311 | -static inline u8 lowpan_addr_mode_size(const u8 addr_mode) | |
312 | -{ | |
313 | - static const u8 addr_sizes[] = { | |
314 | - [LOWPAN_IPHC_ADDR_00] = 16, | |
315 | - [LOWPAN_IPHC_ADDR_01] = 8, | |
316 | - [LOWPAN_IPHC_ADDR_02] = 2, | |
317 | - [LOWPAN_IPHC_ADDR_03] = 0, | |
318 | - }; | |
319 | - return addr_sizes[addr_mode]; | |
320 | -} | |
321 | - | |
322 | -static inline u8 lowpan_next_hdr_size(const u8 h_enc, u16 *uncomp_header) | |
323 | -{ | |
324 | - u8 ret = 1; | |
325 | - | |
326 | - if ((h_enc & LOWPAN_NHC_UDP_MASK) == LOWPAN_NHC_UDP_ID) { | |
327 | - *uncomp_header += sizeof(struct udphdr); | |
328 | - | |
329 | - switch (h_enc & LOWPAN_NHC_UDP_CS_P_11) { | |
330 | - case LOWPAN_NHC_UDP_CS_P_00: | |
331 | - ret += 4; | |
332 | - break; | |
333 | - case LOWPAN_NHC_UDP_CS_P_01: | |
334 | - case LOWPAN_NHC_UDP_CS_P_10: | |
335 | - ret += 3; | |
336 | - break; | |
337 | - case LOWPAN_NHC_UDP_CS_P_11: | |
338 | - ret++; | |
339 | - break; | |
340 | - default: | |
341 | - break; | |
342 | - } | |
343 | - | |
344 | - if (!(h_enc & LOWPAN_NHC_UDP_CS_C)) | |
345 | - ret += 2; | |
346 | - } | |
347 | - | |
348 | - return ret; | |
349 | -} | |
350 | - | |
351 | -/** | |
352 | - * lowpan_uncompress_size - returns skb->len size with uncompressed header | |
353 | - * @skb: sk_buff with 6lowpan header inside | |
354 | - * @datagram_offset: optional to get the datagram_offset value | |
355 | - * | |
356 | - * Returns the skb->len with uncompressed header | |
357 | - */ | |
358 | -static inline u16 | |
359 | -lowpan_uncompress_size(const struct sk_buff *skb, u16 *dgram_offset) | |
360 | -{ | |
361 | - u16 ret = 2, uncomp_header = sizeof(struct ipv6hdr); | |
362 | - u8 iphc0, iphc1, h_enc; | |
363 | - | |
364 | - iphc0 = skb_network_header(skb)[0]; | |
365 | - iphc1 = skb_network_header(skb)[1]; | |
366 | - | |
367 | - switch ((iphc0 & LOWPAN_IPHC_TF) >> 3) { | |
368 | - case 0: | |
369 | - ret += 4; | |
370 | - break; | |
371 | - case 1: | |
372 | - ret += 3; | |
373 | - break; | |
374 | - case 2: | |
375 | - ret++; | |
376 | - break; | |
377 | - default: | |
378 | - break; | |
379 | - } | |
380 | - | |
381 | - if (!(iphc0 & LOWPAN_IPHC_NH_C)) | |
382 | - ret++; | |
383 | - | |
384 | - if (!(iphc0 & 0x03)) | |
385 | - ret++; | |
386 | - | |
387 | - ret += lowpan_addr_mode_size((iphc1 & LOWPAN_IPHC_SAM) >> | |
388 | - LOWPAN_IPHC_SAM_BIT); | |
389 | - | |
390 | - if (iphc1 & LOWPAN_IPHC_M) { | |
391 | - switch ((iphc1 & LOWPAN_IPHC_DAM_11) >> | |
392 | - LOWPAN_IPHC_DAM_BIT) { | |
393 | - case LOWPAN_IPHC_DAM_00: | |
394 | - ret += 16; | |
395 | - break; | |
396 | - case LOWPAN_IPHC_DAM_01: | |
397 | - ret += 6; | |
398 | - break; | |
399 | - case LOWPAN_IPHC_DAM_10: | |
400 | - ret += 4; | |
401 | - break; | |
402 | - case LOWPAN_IPHC_DAM_11: | |
403 | - ret++; | |
404 | - break; | |
405 | - default: | |
406 | - break; | |
407 | - } | |
408 | - } else { | |
409 | - ret += lowpan_addr_mode_size((iphc1 & LOWPAN_IPHC_DAM_11) >> | |
410 | - LOWPAN_IPHC_DAM_BIT); | |
411 | - } | |
412 | - | |
413 | - if (iphc0 & LOWPAN_IPHC_NH_C) { | |
414 | - h_enc = skb_network_header(skb)[ret]; | |
415 | - ret += lowpan_next_hdr_size(h_enc, &uncomp_header); | |
416 | - } | |
417 | - | |
418 | - if (dgram_offset) | |
419 | - *dgram_offset = uncomp_header; | |
420 | - | |
421 | - return skb->len + uncomp_header - ret; | |
422 | -} | |
423 | - | |
424 | -typedef int (*skb_delivery_cb)(struct sk_buff *skb, struct net_device *dev); | |
425 | - | |
426 | -int lowpan_process_data(struct sk_buff *skb, struct net_device *dev, | |
427 | - const u8 *saddr, const u8 saddr_type, const u8 saddr_len, | |
428 | - const u8 *daddr, const u8 daddr_type, const u8 daddr_len, | |
429 | - u8 iphc0, u8 iphc1, skb_delivery_cb skb_deliver); | |
430 | -int lowpan_header_compress(struct sk_buff *skb, struct net_device *dev, | |
431 | - unsigned short type, const void *_daddr, | |
432 | - const void *_saddr, unsigned int len); | |
433 | - | |
434 | -#endif /* __6LOWPAN_H__ */ |
net/ieee802154/6lowpan_iphc.c
... | ... | @@ -54,10 +54,9 @@ |
54 | 54 | #include <linux/if_arp.h> |
55 | 55 | #include <linux/module.h> |
56 | 56 | #include <linux/netdevice.h> |
57 | +#include <net/6lowpan.h> | |
57 | 58 | #include <net/ipv6.h> |
58 | 59 | #include <net/af_ieee802154.h> |
59 | - | |
60 | -#include "6lowpan.h" | |
61 | 60 | |
62 | 61 | /* |
63 | 62 | * Uncompress address function for source and |
net/ieee802154/6lowpan_rtnl.c
... | ... | @@ -52,10 +52,10 @@ |
52 | 52 | #include <net/af_ieee802154.h> |
53 | 53 | #include <net/ieee802154.h> |
54 | 54 | #include <net/ieee802154_netdev.h> |
55 | +#include <net/6lowpan.h> | |
55 | 56 | #include <net/ipv6.h> |
56 | 57 | |
57 | 58 | #include "reassembly.h" |
58 | -#include "6lowpan.h" | |
59 | 59 | |
60 | 60 | static LIST_HEAD(lowpan_devices); |
61 | 61 |
net/ieee802154/reassembly.c
... | ... | @@ -24,10 +24,10 @@ |
24 | 24 | #include <linux/export.h> |
25 | 25 | |
26 | 26 | #include <net/ieee802154_netdev.h> |
27 | +#include <net/6lowpan.h> | |
27 | 28 | #include <net/ipv6.h> |
28 | 29 | #include <net/inet_frag.h> |
29 | 30 | |
30 | -#include "6lowpan.h" | |
31 | 31 | #include "reassembly.h" |
32 | 32 | |
33 | 33 | static struct inet_frags lowpan_frags; |