bool gnrc_sixlowpan_nd_opt_6ctx_handle(uint8_t icmpv6_type, sixlowpan_nd_opt_6ctx_t *ctx_opt) { if (((ctx_opt->ctx_len < 64) && (ctx_opt->len != 2)) || ((ctx_opt->ctx_len >= 64) && (ctx_opt->len != 3))) { DEBUG("6lo nd: invalid 6LoWPAN context option received\n"); return false; } if (icmpv6_type != ICMPV6_RTR_ADV) { /* discard silently */ return true; } /* don't care for result */ gnrc_sixlowpan_ctx_update(sixlowpan_nd_opt_6ctx_get_cid(ctx_opt), (ipv6_addr_t *)(ctx_opt + 1), ctx_opt->ctx_len, byteorder_ntohs(ctx_opt->ltime), sixlowpan_nd_opt_6ctx_is_comp(ctx_opt)); return true; }
/* UINT16_MAX min < UINT32_MAX ms so no risk of overflow */ MS_PER_SEC * SEC_PER_MIN * ltime); } return abr; } #endif /* GNRC_IPV6_NIB_CONF_MULTIHOP_P6C */ #if GNRC_IPV6_NIB_CONF_MULTIHOP_P6C uint32_t _handle_6co(const icmpv6_hdr_t *icmpv6, const sixlowpan_nd_opt_6ctx_t *sixco, _nib_abr_entry_t *abr) #else /* GNRC_IPV6_NIB_CONF_MULTIHOP_P6C */ uint32_t _handle_6co(const icmpv6_hdr_t *icmpv6, const sixlowpan_nd_opt_6ctx_t *sixco) #endif /* GNRC_IPV6_NIB_CONF_MULTIHOP_P6C */ { uint16_t ltime; #ifdef MODULE_GNRC_SIXLOWPAN_CTX uint8_t cid; #endif /* MODULE_GNRC_SIXLOWPAN_CTX */ if ((sixco->len != SIXLOWPAN_ND_OPT_6CTX_LEN_MIN) || ((sixco->len != SIXLOWPAN_ND_OPT_6CTX_LEN_MAX) && (sixco->ctx_len > 64U)) || (icmpv6->type != ICMPV6_RTR_ADV)) { DEBUG("nib: received 6CO of invalid length (%u), must be %u " "or wasn't delivered by RA." "\n", sixco->len, (sixco->ctx_len > 64U) ? SIXLOWPAN_ND_OPT_6CTX_LEN_MAX : SIXLOWPAN_ND_OPT_6CTX_LEN_MIN); return UINT32_MAX; } ltime = byteorder_ntohs(sixco->ltime); #ifdef MODULE_GNRC_SIXLOWPAN_CTX cid = sixlowpan_nd_opt_6ctx_get_cid(sixco); gnrc_sixlowpan_ctx_update(cid, (ipv6_addr_t *)(sixco + 1), sixco->ctx_len, ltime, sixlowpan_nd_opt_6ctx_is_comp(sixco)); #if GNRC_IPV6_NIB_CONF_MULTIHOP_P6C assert(abr != NULL); /* should have been set in _handle_abro() */ if (ltime == 0) { bf_unset(abr->ctxs, cid); } else { bf_set(abr->ctxs, cid); } #endif /* GNRC_IPV6_NIB_CONF_MULTIHOP_P6C */ #else /* MODULE_GNRC_SIXLOWPAN_CTX */ (void)abr; #endif /* MODULE_GNRC_SIXLOWPAN_CTX */ return ltime * SEC_PER_MIN * MS_PER_SEC; }