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:
parent
581cc641ef
commit
27f4939211
@ -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
|
||||
*
|
||||
|
||||
@ -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();
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user