diff --git a/source/MAC/IEEE802_15_4/mac_mcps_sap.c b/source/MAC/IEEE802_15_4/mac_mcps_sap.c index 38924cba934e..a47753c3a30f 100644 --- a/source/MAC/IEEE802_15_4/mac_mcps_sap.c +++ b/source/MAC/IEEE802_15_4/mac_mcps_sap.c @@ -1183,15 +1183,24 @@ static void mac_pd_data_confirm_failure_handle(protocol_interface_rf_mac_setup_s mcps_data_confirm_cb(rf_mac_setup, &mcps_data_conf, NULL); } + static void mac_pd_data_ack_handler(mac_pre_parsed_frame_t *buf) { protocol_interface_rf_mac_setup_s *rf_mac_setup = buf->mac_class_ptr; if (!rf_mac_setup->active_pd_data_request) { mcps_sap_pre_parsed_frame_buffer_free(buf); + tr_debug("RX ack without active buffer"); } else { mac_pre_build_frame_t *buffer = rf_mac_setup->active_pd_data_request; + //Validate here ack is proper to active buffer + if (!mac_pd_sap_ack_validation(rf_mac_setup, &buf->fcf_dsn, mac_header_message_start_pointer(buf))) { + tr_debug("Not a valid ACK for active tx process"); + mcps_sap_pre_parsed_frame_buffer_free(buf); + return; + } + if (mac_ack_sap_rx_handler(buf, rf_mac_setup)) { //Do not forward ACK payload but Accept ACK mcps_sap_pre_parsed_frame_buffer_free(buf); diff --git a/source/MAC/IEEE802_15_4/mac_pd_sap.c b/source/MAC/IEEE802_15_4/mac_pd_sap.c index 6b36a7f7d69d..dad7da84fd5b 100644 --- a/source/MAC/IEEE802_15_4/mac_pd_sap.c +++ b/source/MAC/IEEE802_15_4/mac_pd_sap.c @@ -655,12 +655,16 @@ static int8_t mac_data_interface_tx_done_by_ack_cb(protocol_interface_rf_mac_set return 0; } -static bool mac_pd_sap_ack_validation(protocol_interface_rf_mac_setup_s *rf_ptr, const mac_fcf_sequence_t *fcf_dsn, const uint8_t *data_ptr) +bool mac_pd_sap_ack_validation(protocol_interface_rf_mac_setup_s *rf_ptr, const mac_fcf_sequence_t *fcf_dsn, const uint8_t *data_ptr) { - if (!rf_ptr->active_pd_data_request || !rf_ptr->active_pd_data_request->fcf_dsn.ackRequested) { + if (!rf_ptr->active_pd_data_request || (!rf_ptr->active_pd_data_request->fcf_dsn.ackRequested && !rf_ptr->active_pd_data_request->ExtendedFrameExchange)) { return false; //No active Data request anymore or no ACK request for current TX } + if (rf_ptr->active_pd_data_request->ExtendedFrameExchange && fcf_dsn->frametype == FC_DATA_FRAME) { + return true;//EFDE final message + } + if (fcf_dsn->frameVersion != rf_ptr->active_pd_data_request->fcf_dsn.frameVersion) { return false; } diff --git a/source/MAC/IEEE802_15_4/mac_pd_sap.h b/source/MAC/IEEE802_15_4/mac_pd_sap.h index fdde95acac06..396e92bc7f41 100644 --- a/source/MAC/IEEE802_15_4/mac_pd_sap.h +++ b/source/MAC/IEEE802_15_4/mac_pd_sap.h @@ -26,6 +26,7 @@ struct protocol_interface_rf_mac_setup; struct arm_phy_sap_msg_s; +struct mac_fcf_sequence_s; #define ENHANCED_ACK_NEIGHBOUR_POLL_MAX_TIME_US 3500 @@ -61,4 +62,6 @@ void mac_pd_sap_state_machine(struct protocol_interface_rf_mac_setup *rf_mac_set int8_t mac_data_edfe_force_stop(struct protocol_interface_rf_mac_setup *rf_ptr); +bool mac_pd_sap_ack_validation(struct protocol_interface_rf_mac_setup *rf_ptr, const struct mac_fcf_sequence_s *fcf_dsn, const uint8_t *data_ptr); + #endif /* MAC_PD_SAP_H_ */ diff --git a/test/nanostack/unittest/stub/mac_pd_sap_stub.c b/test/nanostack/unittest/stub/mac_pd_sap_stub.c index 01d1be26a2d2..234aa57bc6ea 100644 --- a/test/nanostack/unittest/stub/mac_pd_sap_stub.c +++ b/test/nanostack/unittest/stub/mac_pd_sap_stub.c @@ -87,3 +87,8 @@ int8_t mac_data_edfe_force_stop(struct protocol_interface_rf_mac_setup *rf_ptr) { return 0; } + +bool mac_pd_sap_ack_validation(struct protocol_interface_rf_mac_setup *rf_ptr, const struct mac_fcf_sequence_s *fcf_dsn, const uint8_t *data_ptr) +{ + return true; +}