1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2025-12-24 22:13:52 +01:00

gnrc_sixlowpan_frag_vrb: add reverse look-up

To label switch ACKs for fragments back to the originator, a reverse
look-up in the VRB is required.
This commit is contained in:
Martine S. Lenders 2019-10-28 18:57:44 +01:00 committed by Martine Lenders
parent 581cc641ef
commit 27f4939211
No known key found for this signature in database
GPG Key ID: CCD317364F63286F
2 changed files with 40 additions and 0 deletions

View File

@ -117,6 +117,23 @@ void gnrc_sixlowpan_frag_vrb_gc(void);
gnrc_sixlowpan_frag_vrb_t *gnrc_sixlowpan_frag_vrb_get(
const uint8_t *src, size_t src_len, unsigned src_tag);
/**
* @brief Reverse VRB lookup
*
* @param[in] netif Network interface the reverse label-switched packet
* came over
* @param[in] src Link-layer source address of reverse label-switched
* packet.
* @param[in] src_len Length of @p src.
* @param[in] tag Tag of the reverse label-switched packet.
*
* @return The VRB entry with `vrb->super.dst == src` and `vrb->out_tag == tag`.
* @return NULL, if there is no entry in the VRB that has these values.
*/
gnrc_sixlowpan_frag_vrb_t *gnrc_sixlowpan_frag_vrb_reverse(
const gnrc_netif_t *netif, const uint8_t *src, size_t src_len,
unsigned tag);
/**
* @brief Removes an entry from the VRB
*

View File

@ -184,6 +184,29 @@ gnrc_sixlowpan_frag_vrb_t *gnrc_sixlowpan_frag_vrb_get(
return NULL;
}
gnrc_sixlowpan_frag_vrb_t *gnrc_sixlowpan_frag_vrb_reverse(
const gnrc_netif_t *netif, const uint8_t *src, size_t src_len,
unsigned tag)
{
DEBUG("6lo vrb: trying to get entry for reverse label switching (%s, %u)\n",
gnrc_netif_addr_to_str(src, src_len, addr_str), tag);
for (unsigned i = 0; i < CONFIG_GNRC_SIXLOWPAN_FRAG_VRB_SIZE; i++) {
gnrc_sixlowpan_frag_vrb_t *vrbe = &_vrb[i];
if ((vrbe->out_tag == tag) && (vrbe->out_netif == netif) &&
(memcmp(vrbe->super.dst, src, src_len) == 0)) {
DEBUG("6lo vrb: got VRB entry from (%s, %u)\n",
gnrc_netif_addr_to_str(vrbe->super.src,
vrbe->super.src_len,
addr_str), vrbe->super.tag);
return vrbe;
}
}
DEBUG("6lo vrb: no entry found\n");
return NULL;
}
void gnrc_sixlowpan_frag_vrb_gc(void)
{
uint32_t now_usec = xtimer_now_usec();