Skip to content

Commit 7905df6

Browse files
author
Jarkko Paso
authored
Restart or remove transmission when MAC data request timeouts (ARMmbed#2636)
* Data request timeout to 10s. Adapt layer will remove or resend * Updated unit tests * Removed debug traces * Do not timeout broadcast frames
1 parent c97695c commit 7905df6

File tree

3 files changed

+15
-69
lines changed

3 files changed

+15
-69
lines changed

source/6LoWPAN/adaptation_interface.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1631,6 +1631,11 @@ int8_t lowpan_adaptation_interface_tx_confirm(protocol_interface_info_entry_t *c
16311631
}
16321632
} else if ((confirm->status == MLME_BUSY_CHAN) && !ws_info(cur)) {
16331633
lowpan_data_request_to_mac(cur, buf, tx_ptr, interface_ptr);
1634+
} else if ((buf->link_specific.ieee802_15_4.requestAck) && (confirm->status == MLME_TRANSACTION_EXPIRED)) {
1635+
lowpan_adaptation_tx_queue_write_to_front(cur, interface_ptr, buf);
1636+
ns_list_remove(&interface_ptr->activeUnicastList, tx_ptr);
1637+
ns_dyn_mem_free(tx_ptr);
1638+
interface_ptr->activeTxList_size--;
16341639
} else {
16351640

16361641

source/MAC/IEEE802_15_4/mac_mcps_sap.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,7 @@
5757
// Used to set TX time (us) with FHSS. Must be <= 65ms.
5858
#define MAC_TX_PROCESSING_DELAY_INITIAL 2000
5959
// Give up on data request after given timeout (seconds)
60-
#define DATA_REQUEST_TIMEOUT_NORMAL_PRIORITY_S 30
61-
#define DATA_REQUEST_TIMEOUT_EF_PRIORITY_S 120
60+
#define DATA_REQUEST_TIMEOUT_NORMAL_PRIORITY_S 10
6261

6362
typedef struct {
6463
uint8_t address[8];
@@ -1109,9 +1108,8 @@ static bool mcps_sap_check_buffer_timeout(protocol_interface_rf_mac_setup_s *rf_
11091108
{
11101109
// Convert from 1us slots to seconds
11111110
uint32_t buffer_age_s = (mac_mcps_sap_get_phy_timestamp(rf_mac_setup) - buffer->request_start_time_us) / 1000000;
1112-
if ((buffer->priority == MAC_PD_DATA_NORMAL_PRIORITY) && (buffer_age_s > DATA_REQUEST_TIMEOUT_NORMAL_PRIORITY_S)) {
1113-
return true;
1114-
} else if ((buffer->priority == MAC_PD_DATA_EF_PRIORITY) && (buffer_age_s > DATA_REQUEST_TIMEOUT_EF_PRIORITY_S)) {
1111+
// Do not timeout broadcast frames. Broadcast interval could be very long.
1112+
if (buffer->fcf_dsn.ackRequested && (buffer_age_s > DATA_REQUEST_TIMEOUT_NORMAL_PRIORITY_S)) {
11151113
return true;
11161114
}
11171115
return false;

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

Lines changed: 7 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
#include <string.h>
6363

6464
static uint8_t tes_mac_mcps_mac64[8];
65+
uint32_t test_timestamp = 1000000;
6566

6667
static mac_pre_build_frame_t *tes_mac_mcps_temporary_buffer_get(uint16_t length)
6768
{
@@ -74,6 +75,8 @@ static mac_pre_build_frame_t *tes_mac_mcps_temporary_buffer_get(uint16_t length)
7475
buf->mac_allocated_payload_ptr = true;
7576
buf->mac_payload_length = length;
7677
}
78+
buf->request_start_time_us = test_timestamp - 100000;
79+
buf->fcf_dsn.ackRequested = true;
7780

7881
return buf;
7982
}
@@ -238,7 +241,6 @@ static arm_device_driver_list_s *rf_client_driver_allocate()
238241
return driver;
239242
}
240243

241-
uint32_t test_timestamp = 1000000;
242244
static int8_t test_rf_extension(phy_extension_type_e extension, uint8_t *buf)
243245
{
244246
switch (extension) {
@@ -3054,10 +3056,10 @@ bool test_mac_mcps_trig_buffer_from_queue()
30543056
buf2 = tes_mac_mcps_temporary_buffer_get(0);
30553057
mac_pre_build_frame_t *buf3 = tes_mac_mcps_temporary_buffer_get(0);
30563058
mac_pre_build_frame_t *buf4 = tes_mac_mcps_temporary_buffer_get(0);
3057-
buf->request_start_time_us = test_timestamp - 32000000;
3058-
buf2->request_start_time_us = test_timestamp - 31000000;
3059-
buf3->request_start_time_us = test_timestamp - 25000000;
3060-
buf4->request_start_time_us = test_timestamp - 23000000;
3059+
buf->request_start_time_us = test_timestamp - 12000000;
3060+
buf2->request_start_time_us = test_timestamp - 11000000;
3061+
buf3->request_start_time_us = test_timestamp - 5000000;
3062+
buf4->request_start_time_us = test_timestamp - 3000000;
30613063
rf_mac_setup->pd_data_request_queue_to_go = buf;
30623064
rf_mac_setup->pd_data_request_queue_to_go->next = buf2;
30633065
rf_mac_setup->pd_data_request_queue_to_go->next->next = buf3;
@@ -3074,65 +3076,6 @@ bool test_mac_mcps_trig_buffer_from_queue()
30743076
}
30753077
mac_mcps_buffer_queue_free(rf_mac_setup);
30763078

3077-
// Test removing old buffers with low priority from queue
3078-
rf_mac_setup->fhss_api = ns_fhss_create(0, 0, 0);
3079-
// Add 4 buffers in queue, buf and buf2 are too old but only first one should be removed
3080-
buf = tes_mac_mcps_temporary_buffer_get(0);
3081-
buf2 = tes_mac_mcps_temporary_buffer_get(0);
3082-
buf3 = tes_mac_mcps_temporary_buffer_get(0);
3083-
buf4 = tes_mac_mcps_temporary_buffer_get(0);
3084-
buf->request_start_time_us = test_timestamp - 32000000;
3085-
buf2->request_start_time_us = test_timestamp - 31000000;
3086-
buf3->request_start_time_us = test_timestamp - 25000000;
3087-
buf4->request_start_time_us = test_timestamp - 23000000;
3088-
// Change buf2 priority to medium
3089-
buf2->priority = MAC_PD_DATA_MEDIUM_PRIORITY;
3090-
rf_mac_setup->pd_data_request_queue_to_go = buf;
3091-
rf_mac_setup->pd_data_request_queue_to_go->next = buf2;
3092-
rf_mac_setup->pd_data_request_queue_to_go->next->next = buf3;
3093-
rf_mac_setup->pd_data_request_queue_to_go->next->next->next = buf4;
3094-
rf_mac_setup->unicast_queue_size = 4;
3095-
fhss_config_stub.bool_value = false;
3096-
fhss_tx_condition = true;
3097-
// Trig should remove first buffer and take second as active data request
3098-
mac_mcps_trig_buffer_from_queue(rf_mac_setup);
3099-
if (rf_mac_setup->active_pd_data_request != buf2) {
3100-
test_mac_rf_mac_class_free(rf_mac_setup);
3101-
printf("Fail: Remove old buffers with priority, wrong buffer activated\r\n");
3102-
return false;
3103-
}
3104-
mac_mcps_buffer_queue_free(rf_mac_setup);
3105-
3106-
// Test removing old buffers with EF priority from queue
3107-
rf_mac_setup->fhss_api = ns_fhss_create(0, 0, 0);
3108-
// Add 4 buffers in queue, buf(normal priority) and buf2(EF priority) are too old and should be removed
3109-
buf = tes_mac_mcps_temporary_buffer_get(0);
3110-
buf2 = tes_mac_mcps_temporary_buffer_get(0);
3111-
buf3 = tes_mac_mcps_temporary_buffer_get(0);
3112-
buf4 = tes_mac_mcps_temporary_buffer_get(0);
3113-
buf->request_start_time_us = test_timestamp - 32000000;
3114-
buf2->request_start_time_us = test_timestamp - 121000000;
3115-
buf3->request_start_time_us = test_timestamp - 100000000;
3116-
buf4->request_start_time_us = test_timestamp - 23000000;
3117-
// Change buf2 and buf3 priority to expedited forwarding
3118-
buf2->priority = MAC_PD_DATA_EF_PRIORITY;
3119-
buf3->priority = MAC_PD_DATA_EF_PRIORITY;
3120-
rf_mac_setup->pd_data_request_queue_to_go = buf;
3121-
rf_mac_setup->pd_data_request_queue_to_go->next = buf2;
3122-
rf_mac_setup->pd_data_request_queue_to_go->next->next = buf3;
3123-
rf_mac_setup->pd_data_request_queue_to_go->next->next->next = buf4;
3124-
rf_mac_setup->unicast_queue_size = 4;
3125-
fhss_config_stub.bool_value = false;
3126-
fhss_tx_condition = true;
3127-
// Trig should remove first two buffers and take third as active data request
3128-
mac_mcps_trig_buffer_from_queue(rf_mac_setup);
3129-
if (rf_mac_setup->active_pd_data_request != buf3) {
3130-
test_mac_rf_mac_class_free(rf_mac_setup);
3131-
printf("Fail: Remove old buffers with EF priority, wrong buffer activated\r\n");
3132-
return false;
3133-
}
3134-
mac_mcps_buffer_queue_free(rf_mac_setup);
3135-
31363079
// Free test setup struct
31373080
test_mac_rf_mac_class_free(rf_mac_setup);
31383081
return true;

0 commit comments

Comments
 (0)