diff --git a/sys/include/net/gnrc/sixlowpan.h b/sys/include/net/gnrc/sixlowpan.h index f7cb8e2ce..6f76c2698 100644 --- a/sys/include/net/gnrc/sixlowpan.h +++ b/sys/include/net/gnrc/sixlowpan.h @@ -10,6 +10,86 @@ * @defgroup net_gnrc_sixlowpan 6LoWPAN * @ingroup net_gnrc * @brief GNRC's 6LoWPAN implementation + * + * This module is for usage with the @ref net_gnrc_netapi. + * + * # NETAPI command documentation + * + * ## `GNRC_NETAPI_MSG_TYPE_RCV` + * + * @ref GNRC_NETAPI_MSG_TYPE_RCV expects a @ref net_gnrc_pkt (referred to as "packet" in the + * following) in receive order (link-layer payload first, @ref net_gnrc_netif_hdr last) with the + * payload marked with @ref GNRC_NETTYPE_SIXLOWPAN. Every other packet will be silently discarded. + * + * If the first byte of the payload is @ref SIXLOWPAN_UNCOMP this byte will be removed by marking + * it with a new @ref gnrc_pktsnip_t and then removing this @ref gnrc_pktsnip_t, the remaining + * payload will be marked with @ref GNRC_NETTYPE_IPV6 and this module will issue a + * @ref GNRC_NETAPI_MSG_TYPE_RCV to all subscribers registered to @ref GNRC_NETTYPE_IPV6 with + * demultiplex context @ref GNRC_NETREG_DEMUX_CTX_ALL in the @ref net_gnrc_netreg with the packet. + * Otherwise, the packet will be silently discarded (except for the cases documented below). + * + * Depending on which other modules are included the behavior can be a little different: + * + * 1. If @ref net_gnrc_sixlowpan_frag is included and @ref sixlowpan_frag_is() is true for the + * packet, the fragmentation header will be removed and its remaining data will be added to + * the reassembly buffer (using @ref rbuf_add()) in accordance to the fragmentation header. + * The packet containing the fragment will be discarded. When the fragmented datagram is + * complete, its payload will be marked with @ref GNRC_NETTYPE_IPV6 and issued via a + * @ref GNRC_NETAPI_MSG_TYPE_RCV to all subscribers registered to @ref GNRC_NETTYPE_IPV6 with + * demultiplex context @ref GNRC_NETREG_DEMUX_CTX_ALL in the @ref net_gnrc_netreg. If + * reassembly times out or if fragments overlap the datagram will be silently discarded. + * 2. If @ref net_gnrc_sixlowpan_iphc is included the packet will not be send to the subscribers + * to @ref GNRC_NETTYPE_IPV6 with demultiplex context @ref GNRC_NETREG_DEMUX_CTX_ALL + * immediately, but it will be checked first if @ref sixlowpan_iphc_is() is true for its + * payload. If false it will be send to the @ref GNRC_NETTYPE_IPV6 subscribers as usual. If + * true the IPHC dispatch will be decompressed to a full IPv6 header first. The IPv6 header + * will be included as a new @ref gnrc_pktsnip_t to the packet directly behind the payload. + * The IPHC dispatch will be removed. The resulting packet will then be issued to the + * @ref GNRC_NETTYPE_IPV6 subscribers as usual. + * 3. If both @ref net_gnrc_sixlowpan_frag and @ref net_gnrc_sixlowpan_iphc are included the + * and @ref sixlowpan_frag_is() is true for the packet, the fragmented datagram will be + * reassembled as described in (1). If for the remainder (after removal of the fragment + * header) of the first fragment @ref sixlowpan_iphc_is() is true, it will be decompressed as + * described in (2), with the exception that the packet will only be send to all receivers of + * @ref GNRC_NETTYPE_IPV6 as soon as the datagram was completely reassembled and not after + * directly after decompression. If @ref sixlowpan_iphc_is() is false, reassembly is handled + * completely as described in (1). It is assumed that a fragment can fit a full compression + * header (including inlined fields and possibly NHC/GHC headers) as specified in + * RFC 6282, section 2. + * + * ## `GNRC_NETAPI_MSG_TYPE_SND` + * + * @ref GNRC_NETAPI_MSG_TYPE_SND expects a @ref net_gnrc_pkt (referred to as "packet" in the + * following) in send order (headers first, payload last) with the first header being a valid + * @ref GNRC_NETTYPE_NETIF header and the second a @ref GNRC_NETTYPE_IPV6 header. Every other + * packet will be silently discarded. + * + * The @ref GNRC_NETTYPE_SIXLOWPAN header must at least have the gnrc_netif_hdr_t::if_pid field + * set to a legal, 6LoWPAN compatible interface (a @ref gnrc_sixlowpan_netif_t entry referred to as + * `iface` in the following must exist) referred to as "the interface thread" in the following, + * otherwise the packet will be discarded. + * + * If @ref net_gnrc_sixlowpan_iphc is included and gnrc_sixlowpan_netif_t::iphc_enable of `iface` + * is true the @ref GNRC_NETTYPE_IPV6 header will be compressed according to + * RFC 6282. If it is false the + * @ref SIXLOWPAN_UNCOMP dispatch will be appended as a new @ref gnrc_pktsnip_t to the packet. + * The false case also applies if @ref net_gnrc_sixlowpan_iphc is not included. + * + * If the packet without @ref GNRC_NETTYPE_NETIF header is shorter than + * gnrc_sixlowpan_netif_t::max_frag_size of `iface` the packet will be send to the interface + * thread. Otherwise if @ref net_gnrc_sixlowpan_frag is included the packet will be fragmented + * according to RFC 4944 if the packet is without + * @ref GNRC_NETTYPE_NETIF header shorter than @ref SIXLOWPAN_FRAG_MAX_LEN. If none of these cases + * apply, the packet will be discarded silently. + * + * ## `GNRC_NETAPI_MSG_TYPE_SET` + * + * `GNRC_NETAPI_MSG_TYPE_SET` is not supported. + * + * ## `GNRC_NETAPI_MSG_TYPE_GET` + * + * `GNRC_NETAPI_MSG_TYPE_GET` is not supported. + * * @{ * * @file diff --git a/sys/net/gnrc/network_layer/sixlowpan/frag/rbuf.h b/sys/net/gnrc/network_layer/sixlowpan/frag/rbuf.h index b32de7e59..ddd50fcba 100644 --- a/sys/net/gnrc/network_layer/sixlowpan/frag/rbuf.h +++ b/sys/net/gnrc/network_layer/sixlowpan/frag/rbuf.h @@ -44,6 +44,8 @@ extern "C" { * @see * RFC 4944, section 5.3 * + * + * @internal */ typedef struct rbuf_int { struct rbuf_int *next; /**< next element in interval list */ @@ -66,6 +68,8 @@ typedef struct rbuf_int { * @see * RFC 4944, section 5.3 * + * + * @internal */ typedef struct { rbuf_int_t *ints; /**< intervals of the fragment */ @@ -89,6 +93,8 @@ typedef struct { * @param[in] frag The fragment to add. * @param[in] frag_size The fragment's size. * @param[in] offset The fragment's offset. + * + * @internal */ void rbuf_add(gnrc_netif_hdr_t *netif_hdr, gnrc_pktsnip_t *frag, size_t frag_size, size_t offset);