Commit cefc8c8a7c9e4867c45407f7f9a44fe80c5ea58a

Authored by Alexander Aring
Committed by David S. Miller
1 parent 91c6922745

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
... ... @@ -27,7 +27,7 @@
27 27  
28 28 #include "6lowpan.h"
29 29  
30   -#include "../ieee802154/6lowpan.h" /* for the compression support */
  30 +#include <net/6lowpan.h> /* for the compression support */
31 31  
32 32 #define IFACE_NAME_TEMPLATE "bt%d"
33 33 #define EUI64_ADDR_LEN 8
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;