Skip to content

Commit a792e83

Browse files
author
Juha Heiskanen
committed
Added validation at MAC ack buffer handler
We need to verify that ACK buffer is valid for current active buffer. Otherwise it may mean that wrong TX process is finished by wrong ACK.
1 parent 2a465b2 commit a792e83

File tree

4 files changed

+23
-2
lines changed

4 files changed

+23
-2
lines changed

source/MAC/IEEE802_15_4/mac_mcps_sap.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1183,15 +1183,24 @@ static void mac_pd_data_confirm_failure_handle(protocol_interface_rf_mac_setup_s
11831183
mcps_data_confirm_cb(rf_mac_setup, &mcps_data_conf, NULL);
11841184
}
11851185

1186+
11861187
static void mac_pd_data_ack_handler(mac_pre_parsed_frame_t *buf)
11871188
{
11881189
protocol_interface_rf_mac_setup_s *rf_mac_setup = buf->mac_class_ptr;
11891190

11901191
if (!rf_mac_setup->active_pd_data_request) {
11911192
mcps_sap_pre_parsed_frame_buffer_free(buf);
1193+
tr_debug("RX ack without active buffer");
11921194
} else {
11931195
mac_pre_build_frame_t *buffer = rf_mac_setup->active_pd_data_request;
11941196

1197+
//Validate here ack is proper to active buffer
1198+
if (!mac_pd_sap_ack_validation(rf_mac_setup, &buf->fcf_dsn, mac_header_message_start_pointer(buf))) {
1199+
tr_debug("Not a valid ACK for active tx process");
1200+
mcps_sap_pre_parsed_frame_buffer_free(buf);
1201+
return;
1202+
}
1203+
11951204
if (mac_ack_sap_rx_handler(buf, rf_mac_setup)) {
11961205
//Do not forward ACK payload but Accept ACK
11971206
mcps_sap_pre_parsed_frame_buffer_free(buf);

source/MAC/IEEE802_15_4/mac_pd_sap.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -655,12 +655,16 @@ static int8_t mac_data_interface_tx_done_by_ack_cb(protocol_interface_rf_mac_set
655655
return 0;
656656
}
657657

658-
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)
658+
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)
659659
{
660-
if (!rf_ptr->active_pd_data_request || !rf_ptr->active_pd_data_request->fcf_dsn.ackRequested) {
660+
if (!rf_ptr->active_pd_data_request || (!rf_ptr->active_pd_data_request->fcf_dsn.ackRequested && !rf_ptr->active_pd_data_request->ExtendedFrameExchange)) {
661661
return false; //No active Data request anymore or no ACK request for current TX
662662
}
663663

664+
if (rf_ptr->active_pd_data_request->ExtendedFrameExchange && fcf_dsn->frametype == FC_DATA_FRAME) {
665+
return true;//EFDE final message
666+
}
667+
664668
if (fcf_dsn->frameVersion != rf_ptr->active_pd_data_request->fcf_dsn.frameVersion) {
665669
return false;
666670
}

source/MAC/IEEE802_15_4/mac_pd_sap.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
struct protocol_interface_rf_mac_setup;
2828
struct arm_phy_sap_msg_s;
29+
struct mac_fcf_sequence_s;
2930

3031
#define ENHANCED_ACK_NEIGHBOUR_POLL_MAX_TIME_US 3500
3132

@@ -61,4 +62,6 @@ void mac_pd_sap_state_machine(struct protocol_interface_rf_mac_setup *rf_mac_set
6162

6263
int8_t mac_data_edfe_force_stop(struct protocol_interface_rf_mac_setup *rf_ptr);
6364

65+
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);
66+
6467
#endif /* MAC_PD_SAP_H_ */

test/nanostack/unittest/stub/mac_pd_sap_stub.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,3 +87,8 @@ int8_t mac_data_edfe_force_stop(struct protocol_interface_rf_mac_setup *rf_ptr)
8787
{
8888
return 0;
8989
}
90+
91+
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)
92+
{
93+
return true;
94+
}

0 commit comments

Comments
 (0)