diff --git a/sys/include/net/gnrc/sixlowpan/frag/vrb.h b/sys/include/net/gnrc/sixlowpan/frag/vrb.h index 3bb859195a..462a82e971 100644 --- a/sys/include/net/gnrc/sixlowpan/frag/vrb.h +++ b/sys/include/net/gnrc/sixlowpan/frag/vrb.h @@ -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 * 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 00159c3228..1e6c7797fb 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 @@ -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();