/*---------------------------------------------------------------------------*/ static int on_frame_created(void) { uint8_t sec_lvl; enum akes_nbr_status status; struct akes_nbr_entry *entry; uint8_t *dataptr; uint8_t datalen; sec_lvl = adaptivesec_get_sec_lvl(); if(sec_lvl && !packetbuf_holds_broadcast()) { status = akes_get_receiver_status(); entry = akes_nbr_get_receiver_entry(); if(!entry || !entry->refs[status]) { return 0; } dataptr = packetbuf_dataptr(); datalen = packetbuf_datalen(); adaptivesec_aead(entry->refs[status]->pairwise_key, sec_lvl & (1 << 2), dataptr + datalen, 1); packetbuf_set_datalen(datalen + ADAPTIVESEC_UNICAST_MIC_LEN); } return 1; }
/*---------------------------------------------------------------------------*/ static void send(mac_callback_t sent, void *ptr) { struct akes_nbr_entry *entry; packetbuf_set_attr(PACKETBUF_ATTR_FRAME_TYPE, FRAME802154_DATAFRAME); if(packetbuf_holds_broadcast()) { if(!akes_nbr_count(AKES_NBR_PERMANENT)) { mac_call_sent_callback(sent, ptr, MAC_TX_ERR, 0); return; } adaptivesec_add_security_header(NULL); } else { entry = akes_nbr_get_receiver_entry(); if(!entry || !entry->permanent) { mac_call_sent_callback(sent, ptr, MAC_TX_ERR, 0); return; } adaptivesec_add_security_header(&entry->permanent->anti_replay_info); #if ANTI_REPLAY_WITH_SUPPRESSION packetbuf_set_attr(PACKETBUF_ATTR_NEIGHBOR_INDEX, entry->local_index); #endif /* ANTI_REPLAY_WITH_SUPPRESSION */ } #if !ANTI_REPLAY_WITH_SUPPRESSION && !POTR_ENABLED framer_802154_set_seqno(); #endif /* ANTI_REPLAY_WITH_SUPPRESSION && !POTR_ENABLED */ ADAPTIVESEC_STRATEGY.send(sent, ptr); }