Skip to content

Commit 2f5a2ce

Browse files
author
Arto Kinnunen
authored
Remove recursion from MAC layer (ARMmbed#1826)
Failing MCPS write request is calling callback function directly and a caller would then trigger a new MCPS write request. This recursion can cause stack overflow in some conditions. Change failing data request to use event queue when returning status back to caller.
1 parent 06e3243 commit 2f5a2ce

File tree

3 files changed

+15
-20
lines changed

3 files changed

+15
-20
lines changed

source/MAC/IEEE802_15_4/mac_defines.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ typedef enum mac_event_t {
3939
MAC_TX_FAIL,
4040
MAC_TX_TIMEOUT,
4141
MAC_UNKNOWN_DESTINATION,
42+
MAC_TX_PRECOND_FAIL
4243
} mac_event_t;
4344

4445
typedef enum mac_tx_status_type_t {

source/MAC/IEEE802_15_4/mac_mcps_sap.c

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,6 @@ static void mac_data_poll_radio_disable_check(protocol_interface_rf_mac_setup_s
145145

146146
static void mcps_data_confirm_cb(protocol_interface_rf_mac_setup_s *rf_mac_setup, mcps_data_conf_t *confirm, mac_pre_parsed_frame_t *ack_buf)
147147
{
148-
149148
mac_data_poll_radio_disable_check(rf_mac_setup);
150149

151150
if( get_sw_mac_api(rf_mac_setup) ) {
@@ -1123,8 +1122,8 @@ static int8_t mac_ack_sap_rx_handler(mac_pre_parsed_frame_t *buf, protocol_inter
11231122
return 0;
11241123
}
11251124

1126-
static void mac_pd_data_confirm_handle(protocol_interface_rf_mac_setup_s *rf_mac_setup) {
1127-
1125+
static void mac_pd_data_confirm_handle(protocol_interface_rf_mac_setup_s *rf_mac_setup)
1126+
{
11281127
if (rf_mac_setup->active_pd_data_request) {
11291128
mac_pre_build_frame_t *buffer = rf_mac_setup->active_pd_data_request;
11301129
if (mac_data_request_confirmation_finnish(rf_mac_setup, buffer) ) {
@@ -1146,8 +1145,8 @@ static void mac_pd_data_confirm_handle(protocol_interface_rf_mac_setup_s *rf_mac
11461145
}
11471146

11481147

1149-
static void mac_pd_data_ack_handler(mac_pre_parsed_frame_t *buf) {
1150-
1148+
static void mac_pd_data_ack_handler(mac_pre_parsed_frame_t *buf)
1149+
{
11511150
protocol_interface_rf_mac_setup_s *rf_mac_setup = buf->mac_class_ptr;
11521151

11531152
if (!rf_mac_setup->active_pd_data_request) {
@@ -1357,7 +1356,9 @@ static void mac_common_data_confirmation_handle (protocol_interface_rf_mac_setup
13571356
buf->status = MLME_TRANSACTION_EXPIRED;
13581357
} else if (m_event == MAC_UNKNOWN_DESTINATION) {
13591358
buf->status = MLME_UNAVAILABLE_KEY;
1360-
}
1359+
}/** else if (m_event == MAC_TX_PRECOND_FAIL) {
1360+
* Nothing to do, status already set to buf->status.
1361+
}**/
13611362
}
13621363
}
13631364

@@ -1904,17 +1905,9 @@ void mcps_sap_pd_req_queue_write(protocol_interface_rf_mac_setup_s *rf_mac_setup
19041905
//Start TX process immediately
19051906
mac_data_request_init(rf_mac_setup, buffer);
19061907
if (mcps_pd_data_request(rf_mac_setup, buffer) != 0) {
1907-
rf_mac_setup->active_pd_data_request = NULL;
1908-
mcps_data_conf_t confirm;
1909-
memset(&confirm, 0, sizeof(mcps_data_conf_t));
1910-
confirm.msduHandle = buffer->msduHandle;
1911-
confirm.status = buffer->status;
1912-
bool requested_from_up = buffer->upper_layer_request;
1913-
mcps_sap_prebuild_frame_buffer_free(buffer);
1914-
if (requested_from_up) {
1915-
mcps_data_confirm_cb(rf_mac_setup, &confirm, NULL);
1916-
}
1917-
//Call
1908+
rf_mac_setup->mac_tx_result = MAC_TX_PRECOND_FAIL;
1909+
rf_mac_setup->macTxRequestAck = false;
1910+
mcps_sap_pd_confirm(rf_mac_setup);
19181911
}
19191912

19201913
return;

test/nanostack/unittest/mac/mac_mcps_sap/test_mac_mcps_sap.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2463,11 +2463,11 @@ bool test_mcps_sap_data_req_handler()
24632463
nsdynmemlib_stub.returnCounter = 1;
24642464
data_req.msduHandle = msdu_handle++;
24652465
mcps_sap_data_req_handler(rf_mac_setup, &data_req);
2466-
if (rf_mac_setup->active_pd_data_request || !data_confirm_valid) {
2466+
/* async callback is not called, active_pd_data_request available in rf_mac_setup */
2467+
if (!rf_mac_setup->active_pd_data_request || data_confirm_valid) {
24672468
return false;
24682469
}
24692470

2470-
24712471
//Test with unknow neighbor
24722472
mac_security_mib_stub.key_ptr = &key_description;
24732473

@@ -2477,7 +2477,8 @@ bool test_mcps_sap_data_req_handler()
24772477
data_req.TxAckReq = true;
24782478
mcps_sap_data_req_handler(rf_mac_setup, &data_req);
24792479
data_req.msduHandle = msdu_handle++;
2480-
if (rf_mac_setup->active_pd_data_request || !data_confirm_valid) {
2480+
/* async callback is not called, active_pd_data_request available in rf_mac_setup */
2481+
if (!rf_mac_setup->active_pd_data_request || data_confirm_valid) {
24812482
return false;
24822483
}
24832484

0 commit comments

Comments
 (0)