diff --git a/sys/include/net/gnrc/sixlowpan/frag.h b/sys/include/net/gnrc/sixlowpan/frag.h index aeb9275b8a..c6b1509d68 100644 --- a/sys/include/net/gnrc/sixlowpan/frag.h +++ b/sys/include/net/gnrc/sixlowpan/frag.h @@ -35,6 +35,7 @@ #ifdef MODULE_GNRC_SIXLOWPAN_FRAG_HINT #include "net/gnrc/sixlowpan/frag/hint.h" #endif /* MODULE_GNRC_SIXLOWPAN_FRAG_HINT */ +#include "net/gnrc/sixlowpan/frag/rb.h" #include "net/gnrc/sixlowpan/internal.h" #include "net/ieee802154.h" #include "net/sixlowpan.h" @@ -58,68 +59,6 @@ extern "C" { #define GNRC_SIXLOWPAN_MSG_FRAG_GC_RBUF (0x0226) /** @} */ -/** - * @brief Fragment intervals to identify limits of fragments and duplicates. - * - * @note Fragments MUST NOT overlap and overlapping fragments are to be - * discarded - * - * @see - * RFC 4944, section 5.3 - * - */ -typedef struct gnrc_sixlowpan_rbuf_int { - /** - * @brief next element in fragment interval list - */ - struct gnrc_sixlowpan_rbuf_int *next; - uint16_t start; /**< start byte of the fragment interval */ - uint16_t end; /**< end byte of the fragment interval */ -} gnrc_sixlowpan_rbuf_int_t; - -/** - * @brief Base class for both reassembly buffer and virtual reassembly buffer - * - * 1. the source address, - * 2. the destination address, - * 3. the datagram size, and - * 4. the datagram tag - * - * to identify all fragments that belong to the given datagram. - * - * @see [RFC 4944, section 5.3](https://tools.ietf.org/html/rfc4944#section-5.3) - * @see https://tools.ietf.org/html/draft-ietf-lwig-6lowpan-virtual-reassembly-01 - */ -typedef struct { - gnrc_sixlowpan_rbuf_int_t *ints; /**< intervals of already received fragments */ - uint8_t src[IEEE802154_LONG_ADDRESS_LEN]; /**< source address */ - uint8_t dst[IEEE802154_LONG_ADDRESS_LEN]; /**< destination address */ - uint8_t src_len; /**< length of gnrc_sixlowpan_rbuf_t::src */ - uint8_t dst_len; /**< length of gnrc_sixlowpan_rbuf_t::dst */ - uint16_t tag; /**< the datagram's tag */ - uint16_t datagram_size; /**< the datagram's size */ - /** - * @brief The number of bytes currently received of the complete datagram - */ - uint16_t current_size; - uint32_t arrival; /**< time in microseconds of arrival of - * last received fragment */ -} gnrc_sixlowpan_rbuf_base_t; - -/** - * @brief An entry in the 6LoWPAN reassembly buffer. - * - * A recipient of a fragment SHALL use - * - */ -typedef struct { - gnrc_sixlowpan_rbuf_base_t super; /**< base class */ - /** - * @brief The reassembled packet in the packet buffer - */ - gnrc_pktsnip_t *pkt; -} gnrc_sixlowpan_rbuf_t; - /** * @brief Definition of 6LoWPAN fragmentation type. */ @@ -204,18 +143,6 @@ void gnrc_sixlowpan_frag_recv(gnrc_pktsnip_t *pkt, void *ctx, unsigned page); */ uint16_t gnrc_sixlowpan_frag_next_tag(void); -/** - * @brief Remove base entry - * - * @param[in,out] entry Entry to remove - */ -void gnrc_sixlowpan_frag_rbuf_base_rm(gnrc_sixlowpan_rbuf_base_t *entry); - -/** - * @brief Garbage collect reassembly buffer. - */ -void gnrc_sixlowpan_frag_rbuf_gc(void); - /** * @brief Sends a message to pass a further fragment down the network stack * @@ -239,38 +166,6 @@ static inline bool gnrc_sixlowpan_frag_send_msg(gnrc_sixlowpan_msg_frag_t *fragm #endif } -#if defined(MODULE_GNRC_SIXLOWPAN_FRAG) || defined(DOXYGEN) -/** - * @brief Removes an entry from the reassembly buffer - * - * @pre `rbuf != NULL` - * - * @param[in] rbuf A reassembly buffer entry. Must not be NULL. - */ -void gnrc_sixlowpan_frag_rbuf_remove(gnrc_sixlowpan_rbuf_t *rbuf); - -/** - * @brief Checks if a reassembly buffer entry is complete and dispatches it - * to the next layer if that is the case - * - * @pre `rbuf != NULL` - * @pre `netif != NULL` - * - * @param[in] rbuf A reassembly buffer entry. Must not be NULL. - * @param[in] netif Original @ref gnrc_netif_hdr_t of the last received frame. - * Used to construct the @ref gnrc_netif_hdr_t of the completed - * datagram. Must not be NULL. - */ -void gnrc_sixlowpan_frag_rbuf_dispatch_when_complete(gnrc_sixlowpan_rbuf_t *rbuf, - gnrc_netif_hdr_t *netif); -#else -/* NOPs to be used with gnrc_sixlowpan_iphc if gnrc_sixlowpan_frag is not - * compiled in */ -#define gnrc_sixlowpan_frag_rbuf_remove(rbuf) (void)(rbuf) -#define gnrc_sixlowpan_frag_rbuf_dispatch_when_complete(rbuf, netif) \ - (void)(rbuf); (void)(netif) -#endif - #ifdef __cplusplus } #endif diff --git a/sys/include/net/gnrc/sixlowpan/frag/rb.h b/sys/include/net/gnrc/sixlowpan/frag/rb.h new file mode 100644 index 0000000000..ca0d98dca0 --- /dev/null +++ b/sys/include/net/gnrc/sixlowpan/frag/rb.h @@ -0,0 +1,140 @@ +/* + * Copyright (C) 2019 Freie Universität Berlin + * + * This file is subject to the terms and conditions of the GNU Lesser + * General Public License v2.1. See the file LICENSE in the top level + * directory for more details. + */ + +/** + * @defgroup net_gnrc_sixlowpan_frag_rb 6LoWPAN reassembly buffer + * @ingroup net_gnrc_sixlowpan_frag + * @brief 6LoWPAN reassembly buffer + * @{ + * + * @file + * @brief Reassembly buffer definitions + * + * @author Martine Lenders + */ +#ifndef NET_GNRC_SIXLOWPAN_FRAG_RB_H +#define NET_GNRC_SIXLOWPAN_FRAG_RB_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Fragment intervals to identify limits of fragments and duplicates. + * + * @note Fragments MUST NOT overlap and overlapping fragments are to be + * discarded + * + * @see + * RFC 4944, section 5.3 + * + */ +typedef struct gnrc_sixlowpan_rbuf_int { + /** + * @brief next element in fragment interval list + */ + struct gnrc_sixlowpan_rbuf_int *next; + uint16_t start; /**< start byte of the fragment interval */ + uint16_t end; /**< end byte of the fragment interval */ +} gnrc_sixlowpan_rbuf_int_t; + +/** + * @brief Base class for both reassembly buffer and virtual reassembly buffer + * + * 1. the source address, + * 2. the destination address, + * 3. the datagram size, and + * 4. the datagram tag + * + * to identify all fragments that belong to the given datagram. + * + * @see [RFC 4944, section 5.3](https://tools.ietf.org/html/rfc4944#section-5.3) + * @see https://tools.ietf.org/html/draft-ietf-lwig-6lowpan-virtual-reassembly-01 + */ +typedef struct { + gnrc_sixlowpan_rbuf_int_t *ints; /**< intervals of already received fragments */ + uint8_t src[IEEE802154_LONG_ADDRESS_LEN]; /**< source address */ + uint8_t dst[IEEE802154_LONG_ADDRESS_LEN]; /**< destination address */ + uint8_t src_len; /**< length of gnrc_sixlowpan_rbuf_t::src */ + uint8_t dst_len; /**< length of gnrc_sixlowpan_rbuf_t::dst */ + uint16_t tag; /**< the datagram's tag */ + uint16_t datagram_size; /**< the datagram's size */ + /** + * @brief The number of bytes currently received of the complete datagram + */ + uint16_t current_size; + uint32_t arrival; /**< time in microseconds of arrival of + * last received fragment */ +} gnrc_sixlowpan_rbuf_base_t; + +/** + * @brief An entry in the 6LoWPAN reassembly buffer. + * + * A recipient of a fragment SHALL use + * + */ +typedef struct { + gnrc_sixlowpan_rbuf_base_t super; /**< base class */ + /** + * @brief The reassembled packet in the packet buffer + */ + gnrc_pktsnip_t *pkt; +} gnrc_sixlowpan_rbuf_t; + +/** + * @brief Remove base entry + * + * @param[in,out] entry Entry to remove + */ +void gnrc_sixlowpan_frag_rbuf_base_rm(gnrc_sixlowpan_rbuf_base_t *entry); + +/** + * @brief Garbage collect reassembly buffer. + */ +void gnrc_sixlowpan_frag_rbuf_gc(void); + +#if defined(MODULE_GNRC_SIXLOWPAN_FRAG) || defined(DOXYGEN) +/** + * @brief Removes an entry from the reassembly buffer + * + * @pre `rbuf != NULL` + * + * @param[in] rbuf A reassembly buffer entry. Must not be NULL. + */ +void gnrc_sixlowpan_frag_rbuf_remove(gnrc_sixlowpan_rbuf_t *rbuf); + +/** + * @brief Checks if a reassembly buffer entry is complete and dispatches it + * to the next layer if that is the case + * + * @pre `rbuf != NULL` + * @pre `netif != NULL` + * + * @param[in] rbuf A reassembly buffer entry. Must not be NULL. + * @param[in] netif Original @ref gnrc_netif_hdr_t of the last received frame. + * Used to construct the @ref gnrc_netif_hdr_t of the completed + * datagram. Must not be NULL. + */ +void gnrc_sixlowpan_frag_rbuf_dispatch_when_complete(gnrc_sixlowpan_rbuf_t *rbuf, + gnrc_netif_hdr_t *netif); +#else +/* NOPs to be used with gnrc_sixlowpan_iphc if gnrc_sixlowpan_frag is not + * compiled in */ +#define gnrc_sixlowpan_frag_rbuf_remove(rbuf) (void)(rbuf) +#define gnrc_sixlowpan_frag_rbuf_dispatch_when_complete(rbuf, netif) \ + (void)(rbuf); (void)(netif) +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* NET_GNRC_SIXLOWPAN_FRAG_RB_H */ +/** @} */