diff --git a/net/sixlowpan/Kconfig b/net/sixlowpan/Kconfig index ff47838489..4505a7ee88 100644 --- a/net/sixlowpan/Kconfig +++ b/net/sixlowpan/Kconfig @@ -121,6 +121,10 @@ config NET_6LOWPAN_MAXADDRCONTEXT_PREFIX_2_1 endif # NET_6LOWPAN_MAXADDRCONTEXT_PREINIT_0 endif # NET_6LOWPAN_COMPRESSION_HC06 +config NET_6LOWPAN_RIMEADDR_SIZE + int "Rime address size" + default 2 + config NET_SIXLOWPAN_MAXAGE int "Packet reassembly timeout" default 20 diff --git a/net/sixlowpan/Make.defs b/net/sixlowpan/Make.defs index ceda75dc6d..703f89cf52 100644 --- a/net/sixlowpan/Make.defs +++ b/net/sixlowpan/Make.defs @@ -43,6 +43,10 @@ NET_CSRCS += sixlowpan_initialize.c sixlowpan_globals.c NET_CSRCS += sixlowpan_input.c sixlowpan_output.c NET_CSRCS += sixlowpan_compressor.c sixlowpan_sniffer.c +ifeq ($(CONFIG_NET_6LOWPAN_COMPRESSION_HC1),y) +NET_CSRCS += sixlowpan_hc1.c +endif + ifeq ($(CONFIG_NET_6LOWPAN_COMPRESSION_HC06),y) NET_CSRCS += sixlowpan_hc06.c endif diff --git a/net/sixlowpan/sixlowpan.h b/net/sixlowpan/sixlowpan.h index 6fe0efe99f..ab36cf86d4 100644 --- a/net/sixlowpan/sixlowpan.h +++ b/net/sixlowpan/sixlowpan.h @@ -45,6 +45,15 @@ #ifdef CONFIG_NET_6LOWPAN +/**************************************************************************** + * Public Types + ****************************************************************************/ + +struct rimeaddr_s +{ + uint8_t u8[CONFIG_NET_6LOWPAN_RIMEADDR_SIZE]; +}; + /**************************************************************************** * Public Data ****************************************************************************/ @@ -67,6 +76,8 @@ extern FAR struct sixlowpan_rime_sniffer_s *g_sixlowpan_sniffer; * Public Function Prototypes ****************************************************************************/ +struct net_driver_s; /* Forward reference */ + /**************************************************************************** * Name: sixlowpan_initialize * @@ -88,6 +99,26 @@ extern FAR struct sixlowpan_rime_sniffer_s *g_sixlowpan_sniffer; void sixlowpan_initialize(void); +/**************************************************************************** + * Name: sixlowpan_output + * + * Description: + * Process an outgoing UDP or TCP packet. Called from UDP/TCP logic to + * determine if the the packet should be formatted for 6loWPAN output. + * + * Input Parameters: + * dev - The IEEE802.15.4 MAC network driver interface. + * + * Returned Value: + * Ok is returned on success; Othewise a negated errno value is returned. + * This function is expected to fail if the driver is not an IEEE802.15.4 + * MAC network driver. In that case, the UDP/TCP will fall back to normal + * IPv4/IPv6 formatting. + * + ****************************************************************************/ + +int sixlowpan_output(FAR struct net_driver_s *dev); + /**************************************************************************** * Name: sixlowpan_hc06_initialize * @@ -111,5 +142,117 @@ void sixlowpan_initialize(void); void sixlowpan_hc06_initialize(void); #endif +/**************************************************************************** + * Name: sixlowpan_hc06_initialize + * + * Description: + * Compress IP/UDP header + * + * This function is called by the 6lowpan code to create a compressed + * 6lowpan packet in the packetbuf buffer from a full IPv6 packet in the + * uip_buf buffer. + * + * HC-06 (draft-ietf-6lowpan-hc, version 6) + * http://tools.ietf.org/html/draft-ietf-6lowpan-hc-06 + * + * NOTE: sixlowpan_compresshdr_hc06() does not support ISA100_UDP header + * compression + * + * Input Parameters: + * dev - A reference to the IEE802.15.4 network device state + * destaddr - L2 destination address, needed to compress IP dest + * + * Returned Value: + * None + * + ****************************************************************************/ + +#ifdef CONFIG_NET_6LOWPAN_COMPRESSION_HC06 +void sixlowpan_compresshdr_hc06(FAR struct net_driver_s *dev, + FAR struct rimeaddr_s *destaddr); +#endif + +/**************************************************************************** + * Name: sixlowpan_hc06_initialize + * + * Description: + * Uncompress HC06 (i.e., IPHC and LOWPAN_UDP) headers and put them in + * sixlowpan_buf + * + * This function is called by the input function when the dispatch is HC06. + * We process the packet in the rime buffer, uncompress the header fields, + * and copy the result in the sixlowpan buffer. At the end of the + * decompression, g_rime_hdrlen and g_uncompressed_hdrlen are set to the + * appropriate values + * + * Input Parmeters: + * dev - A reference to the IEE802.15.4 network device state + * iplen - Equal to 0 if the packet is not a fragment (IP length is then + * inferred from the L2 length), non 0 if the packet is a 1st + * fragment. + * + * Returned Value: + * None + * + ****************************************************************************/ + +#ifdef CONFIG_NET_6LOWPAN_COMPRESSION_HC06 +void sixlowpan_uncompresshdr_hc06(FAR struct net_driver_s *dev, + uint16_t iplen); +#endif + +/**************************************************************************** + * Name: sixlowpan_compresshdr_hc1 + * + * Description: + * Compress IP/UDP header using HC1 and HC_UDP + * + * This function is called by the 6lowpan code to create a compressed + * 6lowpan packet in the packetbuf buffer from a full IPv6 packet in the + * uip_buf buffer. + * + * Input Parmeters: + * dev - A reference to the IEE802.15.4 network device state + * destaddr - L2 destination address, needed to compress the IP + * destination field + * + * Returned Value: + * None + * + ****************************************************************************/ + +#ifdef CONFIG_NET_6LOWPAN_COMPRESSION_HC1 +void sixlowpan_compresshdr_hc1(FAR struct net_driver_s *dev, + FAR struct rimeaddr_s *destaddr); +#endif + +/**************************************************************************** + * Name: sixlowpan_uncompresshdr_hc1 + * + * Description: + * Uncompress HC1 (and HC_UDP) headers and put them in sixlowpan_buf + * + * This function is called by the input function when the dispatch is + * HC1. It processes the packet in the rime buffer, uncompresses the + * header fields, and copies the result in the sixlowpan buffer. At the + * end of the decompression, g_rime_hdrlen and uncompressed_hdr_len + * are set to the appropriate values + * + * Input Parameters: + * dev - A reference to the IEE802.15.4 network device state + * iplen - Equal to 0 if the packet is not a fragment (IP length is then + * inferred from the L2 length), non 0 if the packet is a 1st + * fragment. + * + * Returned Value: + * None + * + ****************************************************************************/ + +#ifdef CONFIG_NET_6LOWPAN_COMPRESSION_HC1 +void sixlowpan_uncompresshdr_hc1(FAR struct net_driver_s *dev, + uint16_t ip_len); +#endif + #endif /* CONFIG_NET_6LOWPAN */ #endif /* _NET_SIXLOWPAN_SIXLOWPAN_H */ diff --git a/net/sixlowpan/sixlowpan_globals.c b/net/sixlowpan/sixlowpan_globals.c index e289d88c0c..6a5729d619 100644 --- a/net/sixlowpan/sixlowpan_globals.c +++ b/net/sixlowpan/sixlowpan_globals.c @@ -1,5 +1,5 @@ /**************************************************************************** - * net/sixlowpan/sixlowpan_sniffer.c + * net/sixlowpan/sixlowpan_globals.c * * Copyright (C) 2017 Gregory Nutt. All rights reserved. * Author: Gregory Nutt diff --git a/net/sixlowpan/sixlowpan_hc06.c b/net/sixlowpan/sixlowpan_hc06.c index 8ce6518bc4..733edc900b 100644 --- a/net/sixlowpan/sixlowpan_hc06.c +++ b/net/sixlowpan/sixlowpan_hc06.c @@ -57,6 +57,7 @@ #include +#include #include #include "sixlowpan/sixlowpan.h" @@ -166,4 +167,84 @@ void sixlowpan_hc06_initialize(void) #endif /* CONFIG_NET_6LOWPAN_MAXADDRCONTEXT > 0 */ } +/**************************************************************************** + * Name: sixlowpan_hc06_initialize + * + * Description: + * Compress IP/UDP header + * + * This function is called by the 6lowpan code to create a compressed + * 6lowpan packet in the packetbuf buffer from a full IPv6 packet in the + * uip_buf buffer. + * + * HC-06 (draft-ietf-6lowpan-hc, version 6) + * http://tools.ietf.org/html/draft-ietf-6lowpan-hc-06 + * + * NOTE: sixlowpan_compresshdr_hc06() does not support ISA100_UDP header + * compression + * + * For LOWPAN_UDP compression, we either compress both ports or none. + * General format with LOWPAN_UDP compression is + * 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * |0|1|1|TF |N|HLI|C|S|SAM|M|D|DAM| SCI | DCI | comp. IPv6 hdr| + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | compressed IPv6 fields ..... | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | LOWPAN_UDP | non compressed UDP fields ... | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | L4 data ... | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * + * NOTE: The g_addr_context number 00 is reserved for the link local prefix. + * For unicast addresses, if we cannot compress the prefix, we neither + * compress the IID. + * + * Input Parameters: + * dev - A reference to the IEE802.15.4 network device state + * destaddr - L2 destination address, needed to compress IP dest + * + * Returned Value: + * None + * + ****************************************************************************/ + +void sixlowpan_compresshdr_hc06(FAR struct net_driver_s *dev, + FAR struct rimeaddr_s *destaddr) +{ + /* REVISIT: To be provided */ +} + +/**************************************************************************** + * Name: sixlowpan_hc06_initialize + * + * Description: + * Uncompress HC06 (i.e., IPHC and LOWPAN_UDP) headers and put them in + * sixlowpan_buf + * + * This function is called by the input function when the dispatch is HC06. + * We process the packet in the rime buffer, uncompress the header fields, + * and copy the result in the sixlowpan buffer. At the end of the + * decompression, g_rime_hdrlen and g_uncompressed_hdrlen are set to the + * appropriate values + * + * Input Parmeters: + * dev - A reference to the IEE802.15.4 network device state + * iplen - Equal to 0 if the packet is not a fragment (IP length is then + * inferred from the L2 length), non 0 if the packet is a 1st + * fragment. + * + * Returned Value: + * None + * + ****************************************************************************/ + +void sixlowpan_uncompresshdr_hc06(FAR struct net_driver_s *dev, + uint16_t iplen) +{ + /* REVISIT: To be provided */ +} + + #endif /* CONFIG_NET_6LOWPAN_COMPRESSION_HC06 */ diff --git a/net/sixlowpan/sixlowpan_hc1.c b/net/sixlowpan/sixlowpan_hc1.c new file mode 100644 index 0000000000..3f9b93f17d --- /dev/null +++ b/net/sixlowpan/sixlowpan_hc1.c @@ -0,0 +1,149 @@ +/**************************************************************************** + * net/sixlowpan/sixlowpan_hc1.c + * + * Copyright (C) 2017, Gregory Nutt, all rights reserved + * Author: Gregory Nutt + * + * Derives from Contiki: + * + * Copyright (c) 2008, Swedish Institute of Computer Science. + * All rights reserved. + * Authors: Adam Dunkels + * Nicolas Tsiftes + * Niclas Finne + * Mathilde Durvy + * Julien Abeille + * Joakim Eriksson + * Joel Hoglund + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include "sixlowpan/sixlowpan.h" + +#ifdef CONFIG_NET_6LOWPAN_COMPRESSION_HC1 + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: sixlowpan_compresshdr_hc1 + * + * Description: + * Compress IP/UDP header using HC1 and HC_UDP + * + * This function is called by the 6lowpan code to create a compressed + * 6lowpan packet in the packetbuf buffer from a full IPv6 packet in the + * uip_buf buffer. + * + * If we can compress everything, we use HC1 dispatch, if not we use + * IPv6 dispatch. We can compress everything if: + * + * - IP version is + * - Flow label and traffic class are 0 + * - Both src and dest ip addresses are link local + * - Both src and dest interface ID are recoverable from lower layer + * header + * - Next header is either ICMP, UDP or TCP + * + * Moreover, if next header is UDP, we try to compress it using HC_UDP. + * This is feasible is both ports are between F0B0 and F0B0 + 15\n\n + * + * Resulting header structure: + * - For ICMP, TCP, non compressed UDP\n + * HC1 encoding = 11111010 (UDP) 11111110 (TCP) 11111100 (ICMP)\n + * 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | LoWPAN HC1 Dsp | HC1 encoding | IPv6 Hop limit| L4 hdr + data| + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | ... + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * + * - For compressed UDP + * HC1 encoding = 11111011, HC_UDP encoding = 11100000\n + * 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | LoWPAN HC1 Dsp| HC1 encoding | HC_UDP encod.| IPv6 Hop limit| + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | src p.| dst p.| UDP checksum | L4 data... + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * + * Input Parmeters: + * dev - A reference to the IEE802.15.4 network device state + * destaddr - L2 destination address, needed to compress the IP + * destination field + * + * Returned Value: + * None + * + ****************************************************************************/ + +void sixlowpan_compresshdr_hc1(FAR struct net_driver_s *dev, + FAR struct rimeaddr_s *destaddr) +{ +/* REVISIT: To be provided */ +} + +/**************************************************************************** + * Name: sixlowpan_uncompresshdr_hc1 + * + * Description: + * Uncompress HC1 (and HC_UDP) headers and put them in sixlowpan_buf + * + * This function is called by the input function when the dispatch is + * HC1. It processes the packet in the rime buffer, uncompresses the + * header fields, and copies the result in the sixlowpan buffer. At the + * end of the decompression, g_rime_hdrlen and uncompressed_hdr_len + * are set to the appropriate values + * + * Input Parameters: + * dev - A reference to the IEE802.15.4 network device state + * iplen - Equal to 0 if the packet is not a fragment (IP length is then + * inferred from the L2 length), non 0 if the packet is a 1st + * fragment. + * + * Returned Value: + * None + * + ****************************************************************************/ + +void sixlowpan_uncompresshdr_hc1(FAR struct net_driver_s *dev, + uint16_t iplen) +{ +/* REVISIT: To be provided */ +} + +#endif /* CONFIG_NET_6LOWPAN_COMPRESSION_HC1 */ diff --git a/net/sixlowpan/sixlowpan_input.c b/net/sixlowpan/sixlowpan_input.c index df02dbece9..f28c0eafda 100644 --- a/net/sixlowpan/sixlowpan_input.c +++ b/net/sixlowpan/sixlowpan_input.c @@ -1,5 +1,5 @@ /**************************************************************************** - * net/sixlowpan/sixlowpan_initialize.c + * net/sixlowpan/sixlowpan_input.c * * Copyright (C) 2017 Gregory Nutt. All rights reserved. * Author: Gregory Nutt