diff --git a/sys/include/net/gnrc/sixlowpan.h b/sys/include/net/gnrc/sixlowpan.h index 665e79b426..b2e1a190a2 100644 --- a/sys/include/net/gnrc/sixlowpan.h +++ b/sys/include/net/gnrc/sixlowpan.h @@ -67,12 +67,13 @@ * * 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. + * the reassembly buffer (using @ref gnrc_sixlowpan_frag_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 diff --git a/sys/include/net/gnrc/sixlowpan/frag/rb.h b/sys/include/net/gnrc/sixlowpan/frag/rb.h index 84678fef25..b383d22dfa 100644 --- a/sys/include/net/gnrc/sixlowpan/frag/rb.h +++ b/sys/include/net/gnrc/sixlowpan/frag/rb.h @@ -113,11 +113,10 @@ typedef struct { * @param[in] frag The fragment to add. * @param[in] offset The fragment's offset. * @param[in] page Current 6Lo dispatch parsing page. - * - * @internal */ -void rbuf_add(gnrc_netif_hdr_t *netif_hdr, gnrc_pktsnip_t *frag, - size_t offset, unsigned page); +void gnrc_sixlowpan_frag_rbuf_add(gnrc_netif_hdr_t *netif_hdr, + gnrc_pktsnip_t *frag, size_t offset, + unsigned page); /** * @brief Checks if a reassembly buffer entry is unset @@ -126,10 +125,8 @@ void rbuf_add(gnrc_netif_hdr_t *netif_hdr, gnrc_pktsnip_t *frag, * * @return true, if @p rbuf is empty (i.e. rbuf->super.pkt is NULL). * @return false, if @p rbuf is in use. - * - * @internal */ -static inline bool rbuf_entry_empty(const gnrc_sixlowpan_rbuf_t *rbuf) { +static inline bool gnrc_sixlowpan_frag_rbuf_entry_empty(const gnrc_sixlowpan_rbuf_t *rbuf) { return (rbuf->pkt == NULL); } @@ -139,7 +136,7 @@ static inline bool rbuf_entry_empty(const gnrc_sixlowpan_rbuf_t *rbuf) { * * @note Only available when @ref TEST_SUITES is defined */ -void rbuf_reset(void); +void gnrc_sixlowpan_frag_rbuf_reset(void); /** * @brief Returns a pointer to the array representing the reassembly buffer. @@ -150,7 +147,7 @@ void rbuf_reset(void); * access is immediately spotted at compile time of tests. The `const` * qualifier may however be discarded if required by the tests. */ -const gnrc_sixlowpan_rbuf_t *rbuf_array(void); +const gnrc_sixlowpan_rbuf_t *gnrc_sixlowpan_frag_rbuf_array(void); #endif /** diff --git a/sys/net/gnrc/network_layer/sixlowpan/frag/gnrc_sixlowpan_frag.c b/sys/net/gnrc/network_layer/sixlowpan/frag/gnrc_sixlowpan_frag.c index 44fb4eb59e..a750e9660e 100644 --- a/sys/net/gnrc/network_layer/sixlowpan/frag/gnrc_sixlowpan_frag.c +++ b/sys/net/gnrc/network_layer/sixlowpan/frag/gnrc_sixlowpan_frag.c @@ -359,7 +359,7 @@ void gnrc_sixlowpan_frag_recv(gnrc_pktsnip_t *pkt, void *ctx, unsigned page) return; } - rbuf_add(hdr, pkt, offset, page); + gnrc_sixlowpan_frag_rbuf_add(hdr, pkt, offset, page); } uint16_t gnrc_sixlowpan_frag_next_tag(void) diff --git a/sys/net/gnrc/network_layer/sixlowpan/frag/rb/gnrc_sixlowpan_frag_rb.c b/sys/net/gnrc/network_layer/sixlowpan/frag/rb/gnrc_sixlowpan_frag_rb.c index 2a96ddec9c..7204dfb721 100644 --- a/sys/net/gnrc/network_layer/sixlowpan/frag/rb/gnrc_sixlowpan_frag_rb.c +++ b/sys/net/gnrc/network_layer/sixlowpan/frag/rb/gnrc_sixlowpan_frag_rb.c @@ -119,8 +119,9 @@ static int _check_fragments(gnrc_sixlowpan_rbuf_base_t *entry, return RBUF_ADD_SUCCESS; } -void rbuf_add(gnrc_netif_hdr_t *netif_hdr, gnrc_pktsnip_t *pkt, - size_t offset, unsigned page) +void gnrc_sixlowpan_frag_rbuf_add(gnrc_netif_hdr_t *netif_hdr, + gnrc_pktsnip_t *pkt, size_t offset, + unsigned page) { if (_rbuf_add(netif_hdr, pkt, offset, page) == RBUF_ADD_REPEAT) { _rbuf_add(netif_hdr, pkt, offset, page); @@ -272,7 +273,7 @@ void gnrc_sixlowpan_frag_rbuf_gc(void) for (i = 0; i < RBUF_SIZE; i++) { /* since pkt occupies pktbuf, aggressivly collect garbage */ - if (!rbuf_entry_empty(&rbuf[i]) && + if (!gnrc_sixlowpan_frag_rbuf_entry_empty(&rbuf[i]) && ((now_usec - rbuf[i].super.arrival) > RBUF_TIMEOUT)) { DEBUG("6lo rfrag: entry (%s, ", gnrc_netif_addr_to_str(rbuf[i].super.src, @@ -328,7 +329,7 @@ static gnrc_sixlowpan_rbuf_t *_rbuf_get(const void *src, size_t src_len, } /* if there is a free spot: remember it */ - if ((res == NULL) && rbuf_entry_empty(&rbuf[i])) { + if ((res == NULL) && gnrc_sixlowpan_frag_rbuf_entry_empty(&rbuf[i])) { res = &(rbuf[i]); } @@ -345,7 +346,7 @@ static gnrc_sixlowpan_rbuf_t *_rbuf_get(const void *src, size_t src_len, assert(oldest != NULL); /* if oldest is not empty, res must not be NULL (because otherwise * oldest could have been picked as res) */ - assert(!rbuf_entry_empty(oldest)); + assert(!gnrc_sixlowpan_frag_rbuf_entry_empty(oldest)); if (GNRC_SIXLOWPAN_FRAG_RBUF_AGGRESSIVE_OVERRIDE || ((now_usec - oldest->super.arrival) > GNRC_SIXLOWPAN_FRAG_RBUF_TIMEOUT_US)) { @@ -410,7 +411,7 @@ static gnrc_sixlowpan_rbuf_t *_rbuf_get(const void *src, size_t src_len, } #ifdef TEST_SUITES -void rbuf_reset(void) +void gnrc_sixlowpan_frag_rbuf_reset(void) { xtimer_remove(&_gc_timer); memset(rbuf_int, 0, sizeof(rbuf_int)); @@ -423,7 +424,7 @@ void rbuf_reset(void) memset(rbuf, 0, sizeof(rbuf)); } -const gnrc_sixlowpan_rbuf_t *rbuf_array(void) +const gnrc_sixlowpan_rbuf_t *gnrc_sixlowpan_frag_rbuf_array(void) { return &rbuf[0]; } diff --git a/tests/gnrc_sixlowpan_frag/main.c b/tests/gnrc_sixlowpan_frag/main.c index 3fb4f9eb0a..49bad0135e 100644 --- a/tests/gnrc_sixlowpan_frag/main.c +++ b/tests/gnrc_sixlowpan_frag/main.c @@ -184,7 +184,7 @@ static inline void _set_fragment_offset(void *frag, uint16_t offset) static void _set_up(void) { - rbuf_reset(); + gnrc_sixlowpan_frag_rbuf_reset(); gnrc_pktbuf_init(); gnrc_netif_hdr_init(&_test_netif_hdr.hdr, GNRC_NETIF_HDR_L2ADDR_MAX_LEN, @@ -207,10 +207,10 @@ static void _set_up(void) static const gnrc_sixlowpan_rbuf_t *_first_non_empty_rbuf(void) { - const gnrc_sixlowpan_rbuf_t *rbuf = rbuf_array(); + const gnrc_sixlowpan_rbuf_t *rbuf = gnrc_sixlowpan_frag_rbuf_array(); for (unsigned i = 0; i < RBUF_SIZE; i++) { - if (!rbuf_entry_empty(&rbuf[i])) { + if (!gnrc_sixlowpan_frag_rbuf_entry_empty(&rbuf[i])) { return rbuf; } } @@ -257,7 +257,8 @@ static void test_rbuf_add__success_first_fragment(void) const gnrc_sixlowpan_rbuf_t *entry; TEST_ASSERT_NOT_NULL(pkt); - rbuf_add(&_test_netif_hdr.hdr, pkt, TEST_FRAGMENT1_OFFSET, TEST_PAGE); + gnrc_sixlowpan_frag_rbuf_add(&_test_netif_hdr.hdr, pkt, + TEST_FRAGMENT1_OFFSET, TEST_PAGE); entry = _first_non_empty_rbuf(); /* current_size must be the offset of fragment 2, not the size of * fragment 1 (fragment dispatch was removed, IPHC was applied etc.). */ @@ -273,7 +274,8 @@ static void test_rbuf_add__success_subsequent_fragment(void) const gnrc_sixlowpan_rbuf_t *entry; TEST_ASSERT_NOT_NULL(pkt); - rbuf_add(&_test_netif_hdr.hdr, pkt, TEST_FRAGMENT2_OFFSET, TEST_PAGE); + gnrc_sixlowpan_frag_rbuf_add(&_test_netif_hdr.hdr, pkt, + TEST_FRAGMENT2_OFFSET, TEST_PAGE); entry = _first_non_empty_rbuf(); /* current_size must be the offset of fragment 3, not the size of * fragment 2 (fragment dispatch was removed, IPHC was applied etc.). */ @@ -291,9 +293,11 @@ static void test_rbuf_add__success_duplicate_fragments(void) const gnrc_sixlowpan_rbuf_t *entry; TEST_ASSERT_NOT_NULL(pkt1); - rbuf_add(&_test_netif_hdr.hdr, pkt1, TEST_FRAGMENT3_OFFSET, TEST_PAGE); + gnrc_sixlowpan_frag_rbuf_add(&_test_netif_hdr.hdr, pkt1, + TEST_FRAGMENT3_OFFSET, TEST_PAGE); TEST_ASSERT_NOT_NULL(pkt2); - rbuf_add(&_test_netif_hdr.hdr, pkt2, TEST_FRAGMENT3_OFFSET, TEST_PAGE); + gnrc_sixlowpan_frag_rbuf_add(&_test_netif_hdr.hdr, pkt2, + TEST_FRAGMENT3_OFFSET, TEST_PAGE); entry = _first_non_empty_rbuf(); /* current_size must be the offset of fragment 4, not the size of * fragment 3 (fragment dispatch was removed, IPHC was applied etc.). */ @@ -322,13 +326,17 @@ static void test_rbuf_add__success_complete(void) gnrc_netreg_register(TEST_DATAGRAM_NETTYPE, ®); /* Mixing up things. Order decided by fair dice-rolls ;-) */ TEST_ASSERT_NOT_NULL(pkt2); - rbuf_add(&_test_netif_hdr.hdr, pkt2, TEST_FRAGMENT2_OFFSET, TEST_PAGE); + gnrc_sixlowpan_frag_rbuf_add(&_test_netif_hdr.hdr, pkt2, + TEST_FRAGMENT2_OFFSET, TEST_PAGE); TEST_ASSERT_NOT_NULL(pkt4); - rbuf_add(&_test_netif_hdr.hdr, pkt4, TEST_FRAGMENT4_OFFSET, TEST_PAGE); + gnrc_sixlowpan_frag_rbuf_add(&_test_netif_hdr.hdr, pkt4, + TEST_FRAGMENT4_OFFSET, TEST_PAGE); TEST_ASSERT_NOT_NULL(pkt1); - rbuf_add(&_test_netif_hdr.hdr, pkt1, TEST_FRAGMENT1_OFFSET, TEST_PAGE); + gnrc_sixlowpan_frag_rbuf_add(&_test_netif_hdr.hdr, pkt1, + TEST_FRAGMENT1_OFFSET, TEST_PAGE); TEST_ASSERT_NOT_NULL(pkt3); - rbuf_add(&_test_netif_hdr.hdr, pkt3, TEST_FRAGMENT3_OFFSET, TEST_PAGE); + gnrc_sixlowpan_frag_rbuf_add(&_test_netif_hdr.hdr, pkt3, + TEST_FRAGMENT3_OFFSET, TEST_PAGE); TEST_ASSERT_MESSAGE( xtimer_msg_receive_timeout(&msg, TEST_RECEIVE_TIMEOUT) >= 0, "Receiving reassembled datagram timed out" @@ -355,21 +363,21 @@ static void test_rbuf_add__full_rbuf(void) pkt = gnrc_pktbuf_add(NULL, _fragment1, sizeof(_fragment1), GNRC_NETTYPE_SIXLOWPAN); TEST_ASSERT_NOT_NULL(pkt); - rbuf_add(&_test_netif_hdr.hdr, pkt, TEST_FRAGMENT1_OFFSET, - TEST_PAGE); + gnrc_sixlowpan_frag_rbuf_add(&_test_netif_hdr.hdr, pkt, + TEST_FRAGMENT1_OFFSET, TEST_PAGE); _set_fragment_tag(_fragment1, TEST_TAG + i + 1); - /* pkt is released in rbuf_add() */ + /* pkt is released in gnrc_sixlowpan_frag_rbuf_add() */ } pkt = gnrc_pktbuf_add(NULL, _fragment1, sizeof(_fragment1), GNRC_NETTYPE_SIXLOWPAN); TEST_ASSERT_NOT_NULL(pkt); - rbuf_add(&_test_netif_hdr.hdr, pkt, TEST_FRAGMENT1_OFFSET, - TEST_PAGE); - rbuf = rbuf_array(); + gnrc_sixlowpan_frag_rbuf_add(&_test_netif_hdr.hdr, pkt, + TEST_FRAGMENT1_OFFSET, TEST_PAGE); + rbuf = gnrc_sixlowpan_frag_rbuf_array(); for (unsigned i = 0; i < RBUF_SIZE; i++) { const gnrc_sixlowpan_rbuf_t *entry = &rbuf[i]; - TEST_ASSERT_MESSAGE(!rbuf_entry_empty(entry), + TEST_ASSERT_MESSAGE(!gnrc_sixlowpan_frag_rbuf_entry_empty(entry), "Reassembly buffer entry unexpectedly empty"); TEST_ASSERT((sizeof(_fragment1) - sizeof(sixlowpan_frag_t)) < entry->pkt->size); @@ -397,8 +405,8 @@ static void test_rbuf_add__too_big_fragment(void) GNRC_NETTYPE_SIXLOWPAN); TEST_ASSERT_NOT_NULL(pkt); - rbuf_add(&_test_netif_hdr.hdr, pkt, TEST_FRAGMENT1_OFFSET, - TEST_PAGE); + gnrc_sixlowpan_frag_rbuf_add(&_test_netif_hdr.hdr, pkt, + TEST_FRAGMENT1_OFFSET, TEST_PAGE); /* packet buffer is empty*/ TEST_ASSERT_NULL(_first_non_empty_rbuf()); _check_pktbuf(NULL); @@ -417,14 +425,15 @@ static void test_rbuf_add__overlap_lhs(void) pkt2 = gnrc_pktbuf_add(NULL, _fragment2, sizeof(_fragment2), GNRC_NETTYPE_SIXLOWPAN); TEST_ASSERT_NOT_NULL(pkt1); - rbuf_add(&_test_netif_hdr.hdr, pkt1, TEST_FRAGMENT1_OFFSET, - TEST_PAGE); + gnrc_sixlowpan_frag_rbuf_add(&_test_netif_hdr.hdr, pkt1, + TEST_FRAGMENT1_OFFSET, TEST_PAGE); TEST_ASSERT_NOT_NULL(pkt2); - rbuf_add(&_test_netif_hdr.hdr, pkt2, pkt2_offset, TEST_PAGE); - rbuf = rbuf_array(); + gnrc_sixlowpan_frag_rbuf_add(&_test_netif_hdr.hdr, pkt2, pkt2_offset, + TEST_PAGE); + rbuf = gnrc_sixlowpan_frag_rbuf_array(); for (unsigned i = 0; i < RBUF_SIZE; i++) { const gnrc_sixlowpan_rbuf_t *entry = &rbuf[i]; - if (!rbuf_entry_empty(entry)) { + if (!gnrc_sixlowpan_frag_rbuf_entry_empty(entry)) { static const size_t pkt3_offset = TEST_FRAGMENT3_OFFSET - 8U - 1; rbuf_entries++; @@ -459,16 +468,18 @@ static void test_rbuf_add__overlap_rhs(void) pkt2 = gnrc_pktbuf_add(NULL, _fragment2, sizeof(_fragment2), GNRC_NETTYPE_SIXLOWPAN); TEST_ASSERT_NOT_NULL(pkt1); - rbuf_add(&_test_netif_hdr.hdr, pkt1, TEST_FRAGMENT1_OFFSET, - TEST_PAGE); + gnrc_sixlowpan_frag_rbuf_add(&_test_netif_hdr.hdr, pkt1, + TEST_FRAGMENT1_OFFSET, TEST_PAGE); TEST_ASSERT_NOT_NULL(pkt3); - rbuf_add(&_test_netif_hdr.hdr, pkt3, TEST_FRAGMENT3_OFFSET, TEST_PAGE); + gnrc_sixlowpan_frag_rbuf_add(&_test_netif_hdr.hdr, pkt3, + TEST_FRAGMENT3_OFFSET, TEST_PAGE); TEST_ASSERT_NOT_NULL(pkt2); - rbuf_add(&_test_netif_hdr.hdr, pkt2, pkt2_offset, TEST_PAGE); - rbuf = rbuf_array(); + gnrc_sixlowpan_frag_rbuf_add(&_test_netif_hdr.hdr, pkt2, pkt2_offset, + TEST_PAGE); + rbuf = gnrc_sixlowpan_frag_rbuf_array(); for (unsigned i = 0; i < RBUF_SIZE; i++) { const gnrc_sixlowpan_rbuf_t *entry = &rbuf[i]; - if (!rbuf_entry_empty(entry)) { + if (!gnrc_sixlowpan_frag_rbuf_entry_empty(entry)) { static const size_t pkt3_offset = TEST_FRAGMENT3_OFFSET + 8U - 1U; rbuf_entries++; @@ -511,7 +522,8 @@ static void test_rbuf_gc__manually(void) gnrc_sixlowpan_rbuf_t *entry; TEST_ASSERT_NOT_NULL(pkt); - rbuf_add(&_test_netif_hdr.hdr, pkt, TEST_FRAGMENT1_OFFSET, TEST_PAGE); + gnrc_sixlowpan_frag_rbuf_add(&_test_netif_hdr.hdr, pkt, + TEST_FRAGMENT1_OFFSET, TEST_PAGE); /* discarding const qualifier intentionally to override `arrival` */ entry = (gnrc_sixlowpan_rbuf_t *)_first_non_empty_rbuf(); TEST_ASSERT_NOT_NULL(entry); @@ -531,7 +543,8 @@ static void test_rbuf_gc__timed(void) gnrc_sixlowpan_rbuf_t *entry; TEST_ASSERT_NOT_NULL(pkt); - rbuf_add(&_test_netif_hdr.hdr, pkt, TEST_FRAGMENT1_OFFSET, TEST_PAGE); + gnrc_sixlowpan_frag_rbuf_add(&_test_netif_hdr.hdr, pkt, + TEST_FRAGMENT1_OFFSET, TEST_PAGE); /* discarding const qualifier intentionally to override `arrival` */ entry = (gnrc_sixlowpan_rbuf_t *)_first_non_empty_rbuf(); TEST_ASSERT_NOT_NULL(entry);