Skip to content

Commit ed5209e

Browse files
author
Jarkko Paso
authored
Iotthd 4584 (ARMmbed#2599)
* MAC: priority and extra CCA backoffs for expedited forwarding * Unit tests for blacklisting updated
1 parent 60726dc commit ed5209e

File tree

5 files changed

+86
-6
lines changed

5 files changed

+86
-6
lines changed

source/MAC/IEEE802_15_4/mac_data_buffer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ typedef struct mac_pre_build_frame {
9595
uint8_t stored_cca_cnt;
9696
uint8_t cca_request_restart_cnt;
9797
uint8_t tx_request_restart_cnt;
98+
uint8_t priority;
9899
uint32_t blacklist_start_time_us;
99100
uint16_t blacklist_period_ms;
100101
uint16_t initial_tx_channel;
@@ -107,7 +108,6 @@ typedef struct mac_pre_build_frame {
107108
bool ExtendedFrameExchange: 1;
108109
bool WaitResponse: 1;
109110
unsigned security_mic_len: 5; //Max possible lengths 0, 4, 8, 16 bytes
110-
unsigned priority: 2;
111111
unsigned stored_priority: 2;
112112
struct mac_pre_build_frame *next; //Pointer for queue purpose
113113
} mac_pre_build_frame_t;

source/MAC/IEEE802_15_4/mac_defines.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ typedef struct dev_driver_tx_buffer {
124124
#define MAC_CCA_MAX 8
125125
#define MAC_DEF_MIN_BE 3
126126
#define MAC_DEF_MAX_BE 5
127+
#define MAC_PRIORITY_EF_BACKOFF_MULTIPLIER 2
127128

128129
typedef struct mac_active_scan {
129130
uint8_t pan_id[2];

source/MAC/IEEE802_15_4/mac_mcps_sap.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,10 @@ void mcps_sap_data_req_handler_ext(protocol_interface_rf_mac_setup_s *rf_mac_set
355355
buffer->mac_payload = data_req->msdu;
356356
buffer->mac_payload_length = data_req->msduLength;
357357
buffer->cca_request_restart_cnt = rf_mac_setup->cca_failure_restart_max;
358+
// Multiply number of backoffs for higher priority packets
359+
if (buffer->priority == MAC_PD_DATA_EF_PRIORITY) {
360+
buffer->cca_request_restart_cnt *= MAC_PRIORITY_EF_BACKOFF_MULTIPLIER;
361+
}
358362
buffer->tx_request_restart_cnt = rf_mac_setup->tx_failure_restart_max;
359363
//check that header + payload length is not bigger than MAC MTU
360364

@@ -1548,7 +1552,11 @@ static bool mcps_update_packet_request_restart(protocol_interface_rf_mac_setup_s
15481552
}
15491553
if (rf_ptr->mac_tx_result == MAC_CCA_FAIL && buffer->cca_request_restart_cnt) {
15501554
buffer->cca_request_restart_cnt--;
1551-
mcps_set_packet_blacklist(rf_ptr, buffer, rf_ptr->cca_failure_restart_max - buffer->cca_request_restart_cnt);
1555+
if (buffer->priority == MAC_PD_DATA_EF_PRIORITY) {
1556+
mcps_set_packet_blacklist(rf_ptr, buffer, (rf_ptr->cca_failure_restart_max * MAC_PRIORITY_EF_BACKOFF_MULTIPLIER) - buffer->cca_request_restart_cnt);
1557+
} else {
1558+
mcps_set_packet_blacklist(rf_ptr, buffer, rf_ptr->cca_failure_restart_max - buffer->cca_request_restart_cnt);
1559+
}
15521560
return true;
15531561
} else if (rf_ptr->mac_tx_result == MAC_TX_FAIL && buffer->tx_request_restart_cnt) {
15541562
buffer->tx_request_restart_cnt--;

source/MAC/IEEE802_15_4/mac_mcps_sap.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ typedef enum {
4949
#define MAC_PD_DATA_NORMAL_PRIORITY 0 //Normal MCPS DATA REQ
5050
#define MAC_PD_DATA_MEDIUM_PRIORITY 1 //Indirect Data which is polled
5151
#define MAC_PD_DATA_HIGH_PRIOTITY 2 //Beacon request Beacon response
52-
#define MAC_PD_DATA_TX_IMMEDIATELY 3 //Only for packets whose transmission was interrupted by wrong channel type. E.g. unicast on broadcast channel.
52+
#define MAC_PD_DATA_EF_PRIORITY 3 //Expedited forwarding
53+
#define MAC_PD_DATA_TX_IMMEDIATELY 4 //Only for packets whose transmission was interrupted by wrong channel type. E.g. unicast on broadcast channel.
5354

5455
#define MCPS_SAP_DATA_IND_EVENT 1
5556
#define MCPS_SAP_DATA_CNF_EVENT 2

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

Lines changed: 73 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -875,9 +875,79 @@ bool test_mac_mcps_data_confirmation()
875875
test_mac_rf_mac_class_free(rf_mac_setup);
876876
return false;
877877
}
878-
879-
880-
878+
// Test full 4 restarts and give up
879+
nsdynmemlib_stub.returnCounter = 3;
880+
data_req.TxAckReq = true;
881+
fhss_tx_condition = true;
882+
rf_mac_setup->tx_failure_restart_max = 4;
883+
rf_mac_setup->dev_driver->phy_driver->extension = test_rf_extension;
884+
rf_mac_setup->blacklist_min_ms = 20;
885+
rf_mac_setup->blacklist_max_ms = 200;
886+
mcps_sap_data_req_handler(rf_mac_setup, &data_req);
887+
for (int i = 0; i < 4; i++) {
888+
rf_mac_setup->mac_tx_result = MAC_TX_FAIL;
889+
mcps_sap_pd_confirm(rf_mac_setup);
890+
if (!rf_mac_setup->active_pd_data_request) {
891+
test_mac_rf_mac_class_free(rf_mac_setup);
892+
return false;
893+
}
894+
}
895+
rf_mac_setup->mac_tx_result = MAC_TX_FAIL;
896+
mcps_sap_pd_confirm(rf_mac_setup);
897+
if (rf_mac_setup->active_pd_data_request) {
898+
test_mac_rf_mac_class_free(rf_mac_setup);
899+
return false;
900+
}
901+
// Test full CCA backoffs and give up
902+
nsdynmemlib_stub.returnCounter = 3;
903+
data_req.TxAckReq = true;
904+
fhss_tx_condition = true;
905+
rf_mac_setup->tx_failure_restart_max = 4;
906+
rf_mac_setup->cca_failure_restart_max = 9;
907+
rf_mac_setup->dev_driver->phy_driver->extension = test_rf_extension;
908+
rf_mac_setup->blacklist_min_ms = 20;
909+
rf_mac_setup->blacklist_max_ms = 200;
910+
mcps_sap_data_req_handler(rf_mac_setup, &data_req);
911+
for (int i = 0; i < 9; i++) {
912+
rf_mac_setup->mac_tx_result = MAC_CCA_FAIL;
913+
mcps_sap_pd_confirm(rf_mac_setup);
914+
if (!rf_mac_setup->active_pd_data_request) {
915+
test_mac_rf_mac_class_free(rf_mac_setup);
916+
return false;
917+
}
918+
}
919+
rf_mac_setup->mac_tx_result = MAC_CCA_FAIL;
920+
mcps_sap_pd_confirm(rf_mac_setup);
921+
if (rf_mac_setup->active_pd_data_request) {
922+
test_mac_rf_mac_class_free(rf_mac_setup);
923+
return false;
924+
}
925+
// Test full CCA backoffs for EF priority and give up
926+
nsdynmemlib_stub.returnCounter = 3;
927+
data_req.TxAckReq = true;
928+
fhss_tx_condition = true;
929+
rf_mac_setup->tx_failure_restart_max = 4;
930+
rf_mac_setup->cca_failure_restart_max = 9;
931+
rf_mac_setup->dev_driver->phy_driver->extension = test_rf_extension;
932+
rf_mac_setup->blacklist_min_ms = 20;
933+
rf_mac_setup->blacklist_max_ms = 200;
934+
mcps_sap_data_req_handler(rf_mac_setup, &data_req);
935+
rf_mac_setup->active_pd_data_request->priority = MAC_PD_DATA_EF_PRIORITY;
936+
rf_mac_setup->active_pd_data_request->cca_request_restart_cnt *= MAC_PRIORITY_EF_BACKOFF_MULTIPLIER;
937+
for (int i = 0; i < 9 * MAC_PRIORITY_EF_BACKOFF_MULTIPLIER; i++) {
938+
rf_mac_setup->mac_tx_result = MAC_CCA_FAIL;
939+
mcps_sap_pd_confirm(rf_mac_setup);
940+
if (!rf_mac_setup->active_pd_data_request) {
941+
test_mac_rf_mac_class_free(rf_mac_setup);
942+
return false;
943+
}
944+
}
945+
rf_mac_setup->mac_tx_result = MAC_CCA_FAIL;
946+
mcps_sap_pd_confirm(rf_mac_setup);
947+
if (rf_mac_setup->active_pd_data_request) {
948+
test_mac_rf_mac_class_free(rf_mac_setup);
949+
return false;
950+
}
881951

882952
test_mac_rf_mac_class_free(rf_mac_setup);
883953
return true;

0 commit comments

Comments
 (0)