diff --git a/sys/include/net/gnrc/sixlowpan/frag/vrb.h b/sys/include/net/gnrc/sixlowpan/frag/vrb.h index 2ed4e2fd4f..b9838b842e 100644 --- a/sys/include/net/gnrc/sixlowpan/frag/vrb.h +++ b/sys/include/net/gnrc/sixlowpan/frag/vrb.h @@ -36,27 +36,20 @@ extern "C" { /** * @brief Representation of the virtual reassembly buffer entry + * + * gnrc_sixlowpan_frag_rb_base_t::dst of gnrc_sixlowpan_frag_vrb_t::super + * becomes the next hop destination address. */ typedef struct { gnrc_sixlowpan_frag_rb_base_t super; /**< base type */ - /** - * @brief Link-layer destination address to which the fragments are - * supposed to be forwarded to - */ - uint8_t out_dst[IEEE802154_LONG_ADDRESS_LEN]; - /** - * @brief Outgoing interface to gnrc_sixlowpan_frag_vrb_t::out_dst + * @brief Outgoing interface to gnrc_sixlowpan_frag_rb_base_t::dst */ gnrc_netif_t *out_netif; /** - * @brief Outgoing tag to gnrc_sixlowpan_frag_vrb_t::out_dst + * @brief Outgoing tag to gnrc_sixlowpan_frag_rb_base_t::dst */ uint16_t out_tag; - /** - * @brief Length of gnrc_sixlowpan_frag_vrb_t::out_dst - */ - uint8_t out_dst_len; } gnrc_sixlowpan_frag_vrb_t; /** diff --git a/sys/net/gnrc/network_layer/sixlowpan/frag/vrb/gnrc_sixlowpan_frag_vrb.c b/sys/net/gnrc/network_layer/sixlowpan/frag/vrb/gnrc_sixlowpan_frag_vrb.c index 25aa4c0cc2..95e3809d80 100644 --- a/sys/net/gnrc/network_layer/sixlowpan/frag/vrb/gnrc_sixlowpan_frag_vrb.c +++ b/sys/net/gnrc/network_layer/sixlowpan/frag/vrb/gnrc_sixlowpan_frag_vrb.c @@ -34,6 +34,16 @@ uint16_t gnrc_sixlowpan_frag_next_tag(void) } #endif /* !defined(MODULE_GNRC_SIXLOWPAN_FRAG) && defined(TEST_SUITES) */ +static inline bool _equal_index(const gnrc_sixlowpan_frag_vrb_t *vrbe, + const uint8_t *src, size_t src_len, + unsigned tag) +{ + return ((vrbe->super.tag == tag) && + (vrbe->super.src_len == src_len) && + (memcmp(vrbe->super.src, src, src_len) == 0)); +} + + gnrc_sixlowpan_frag_vrb_t *gnrc_sixlowpan_frag_vrb_add( const gnrc_sixlowpan_frag_rb_base_t *base, gnrc_netif_t *out_netif, const uint8_t *out_dst, size_t out_dst_len) @@ -48,14 +58,14 @@ gnrc_sixlowpan_frag_vrb_t *gnrc_sixlowpan_frag_vrb_add( gnrc_sixlowpan_frag_vrb_t *ptr = &_vrb[i]; if (gnrc_sixlowpan_frag_vrb_entry_empty(ptr) || - (memcmp(&ptr->super, base, sizeof(ptr->super)) == 0)) { + _equal_index(ptr, base->src, base->src_len, base->tag)) { vrbe = ptr; if (gnrc_sixlowpan_frag_vrb_entry_empty(vrbe)) { vrbe->super = *base; vrbe->out_netif = out_netif; - memcpy(vrbe->out_dst, out_dst, out_dst_len); + memcpy(vrbe->super.dst, out_dst, out_dst_len); vrbe->out_tag = gnrc_sixlowpan_frag_next_tag(); - vrbe->out_dst_len = out_dst_len; + vrbe->super.dst_len = out_dst_len; DEBUG("6lo vrb: creating entry (%s, ", gnrc_netif_addr_to_str(vrbe->super.src, vrbe->super.src_len, @@ -66,8 +76,8 @@ gnrc_sixlowpan_frag_vrb_t *gnrc_sixlowpan_frag_vrb_add( l2addr_str), (unsigned)vrbe->super.datagram_size, vrbe->super.tag); DEBUG("(%s, %u)\n", - gnrc_netif_addr_to_str(vrbe->out_dst, - vrbe->out_dst_len, + gnrc_netif_addr_to_str(vrbe->super.dst, + vrbe->super.dst_len, l2addr_str), vrbe->out_tag); } break; @@ -89,12 +99,10 @@ gnrc_sixlowpan_frag_vrb_t *gnrc_sixlowpan_frag_vrb_get( for (unsigned i = 0; i < GNRC_SIXLOWPAN_FRAG_VRB_SIZE; i++) { gnrc_sixlowpan_frag_vrb_t *vrbe = &_vrb[i]; - if ((vrbe->super.tag == src_tag) && - (vrbe->super.src_len == src_len) && - (memcmp(vrbe->super.src, src, src_len) == 0)) { + if (_equal_index(vrbe, src, src_len, src_tag)) { DEBUG("6lo vrb: got VRB to (%s, %u)\n", - gnrc_netif_addr_to_str(vrbe->out_dst, - vrbe->out_dst_len, + gnrc_netif_addr_to_str(vrbe->super.dst, + vrbe->super.dst_len, l2addr_str), vrbe->out_tag); return vrbe; } diff --git a/tests/unittests/tests-gnrc_sixlowpan_frag_vrb/tests-gnrc_sixlowpan_frag_vrb.c b/tests/unittests/tests-gnrc_sixlowpan_frag_vrb/tests-gnrc_sixlowpan_frag_vrb.c index a92363052e..8b827522d6 100644 --- a/tests/unittests/tests-gnrc_sixlowpan_frag_vrb/tests-gnrc_sixlowpan_frag_vrb.c +++ b/tests/unittests/tests-gnrc_sixlowpan_frag_vrb/tests-gnrc_sixlowpan_frag_vrb.c @@ -80,16 +80,13 @@ static void test_vrb_add__success(void) TEST_ASSERT_EQUAL_INT(_base.src_len, res->super.src_len); TEST_ASSERT_MESSAGE(memcmp(_base.src, res->super.src, TEST_SRC_LEN) == 0, "TEST_SRC != res->super.src"); - TEST_ASSERT_EQUAL_INT(_base.dst_len, res->super.src_len); - TEST_ASSERT_MESSAGE(memcmp(_base.dst, res->super.dst, TEST_DST_LEN) == 0, - "TEST_DST != res->super.dst"); TEST_ASSERT_EQUAL_INT(_base.tag, res->super.tag); TEST_ASSERT_EQUAL_INT(_base.datagram_size, res->super.datagram_size); TEST_ASSERT_EQUAL_INT(_base.current_size, res->super.current_size); TEST_ASSERT_EQUAL_INT(_base.arrival, res->super.arrival); TEST_ASSERT((&_dummy_netif) == res->out_netif); - TEST_ASSERT_EQUAL_INT(sizeof(_out_dst), res->out_dst_len); - TEST_ASSERT_MESSAGE(memcmp(_out_dst, res->out_dst, sizeof(_out_dst)) == 0, + TEST_ASSERT_EQUAL_INT(sizeof(_out_dst), res->super.dst_len); + TEST_ASSERT_MESSAGE(memcmp(_out_dst, res->super.dst, sizeof(_out_dst)) == 0, "TEST_DST != res->super.dst"); TEST_ASSERT_EQUAL_INT(TEST_TAG_INITIAL, res->out_tag); TEST_ASSERT(TEST_TAG_INITIAL != tag);