bool ieee802154_validate_frame(uint8_t *buf, uint8_t length, struct ieee802154_mpdu *mpdu) { uint8_t *p_buf; if (length > IEEE802154_MTU || length < IEEE802154_MIN_LENGTH) { NET_DBG("Wrong packet length: %d", length); return false; } mpdu->mhr.fs = validate_fc_seq(buf, &p_buf); if (!mpdu->mhr.fs) { return false; } /* ToDo: Support later version's frame types */ if (mpdu->mhr.fs->fc.frame_type > IEEE802154_FRAME_TYPE_MAC_COMMAND) { return false; } mpdu->mhr.dst_addr = validate_addr(p_buf, &p_buf, mpdu->mhr.fs->fc.dst_addr_mode, false); mpdu->mhr.src_addr = validate_addr(p_buf, &p_buf, mpdu->mhr.fs->fc.src_addr_mode, (mpdu->mhr.fs->fc.pan_id_comp)); return validate_payload_and_mfr(mpdu, buf, p_buf, length); }
bool ieee802154_validate_frame(u8_t *buf, u8_t length, struct ieee802154_mpdu *mpdu) { u8_t *p_buf = NULL; if (length > IEEE802154_MTU || length < IEEE802154_MIN_LENGTH) { NET_DBG("Wrong packet length: %d", length); return false; } mpdu->mhr.fs = validate_fc_seq(buf, &p_buf); if (!mpdu->mhr.fs) { return false; } /* ToDo: Support later version's frame types */ if (mpdu->mhr.fs->fc.frame_type > IEEE802154_FRAME_TYPE_MAC_COMMAND) { return false; } mpdu->mhr.dst_addr = validate_addr(p_buf, &p_buf, mpdu->mhr.fs->fc.dst_addr_mode, false); mpdu->mhr.src_addr = validate_addr(p_buf, &p_buf, mpdu->mhr.fs->fc.src_addr_mode, (mpdu->mhr.fs->fc.pan_id_comp)); #ifdef CONFIG_NET_L2_IEEE802154_SECURITY if (mpdu->mhr.fs->fc.security_enabled) { mpdu->mhr.aux_sec = ieee802154_validate_aux_security_hdr(p_buf, &p_buf); if (!mpdu->mhr.aux_sec) { return false; } } #endif return validate_payload_and_mfr(mpdu, buf, p_buf, length); }