Skip to content

Commit 1f7c040

Browse files
author
Juha Heiskanen
authored
Merge pull request ARMmbed#1849 from ARMmbed/mac_asynch_fix
MAC Asynch Data request update
2 parents cebdaf4 + 279c708 commit 1f7c040

File tree

6 files changed

+76
-76
lines changed

6 files changed

+76
-76
lines changed

source/MAC/IEEE802_15_4/mac_mcps_sap.c

Lines changed: 7 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -88,47 +88,18 @@ static uint32_t mac_mcps_sap_get_phy_timestamp(protocol_interface_rf_mac_setup_s
8888
return timestamp;
8989
}
9090

91-
static void mac_data_request_init(protocol_interface_rf_mac_setup_s *rf_mac_setup, mac_pre_build_frame_t *buffer)
92-
{
93-
rf_mac_setup->active_pd_data_request = buffer;
94-
if (buffer->asynch_request) {
95-
buffer->asynch_channel = rf_mac_setup->mac_channel; //Store Original channel
96-
uint16_t channel = mlme_scan_analyze_next_channel(&buffer->asynch_channel_list);
97-
if (channel <= 0xff) {
98-
uint8_t switch_channel = channel;
99-
if (rf_mac_setup->mac_channel != switch_channel) {
100-
mac_mlme_mac_radio_disabled(rf_mac_setup);
101-
rf_mac_setup->mac_channel = channel;
102-
mac_mlme_mac_radio_enable(rf_mac_setup);
103-
}
104-
}
105-
}
106-
}
107-
10891
static bool mac_data_request_confirmation_finnish(protocol_interface_rf_mac_setup_s *rf_mac_setup, mac_pre_build_frame_t *buffer)
10992
{
11093
if (!buffer->asynch_request) {
11194
return true;
11295
}
11396

114-
uint16_t channel = mlme_scan_analyze_next_channel(&buffer->asynch_channel_list);
115-
uint8_t switch_channel;
116-
bool return_value;
117-
118-
if (channel > 0x00ff) {
119-
return_value = true;
120-
switch_channel = buffer->asynch_channel;
121-
} else {
122-
switch_channel = channel;
123-
return_value = false;
124-
}
125-
//Set original Channel back if channel is switched
126-
if (rf_mac_setup->mac_channel != switch_channel) {
127-
mac_mlme_mac_radio_disabled(rf_mac_setup);
128-
rf_mac_setup->mac_channel = switch_channel;
129-
mac_mlme_mac_radio_enable(rf_mac_setup);
97+
if (mlme_scan_analyze_next_channel(&buffer->asynch_channel_list, false) > 0x00ff) {
98+
mac_mlme_rf_channel_change(rf_mac_setup, buffer->asynch_channel);
99+
return true;
130100
}
131-
return return_value;
101+
102+
return false;
132103

133104
}
134105

@@ -1081,7 +1052,7 @@ void mac_mcps_trig_buffer_from_queue(protocol_interface_rf_mac_setup_s *rf_mac_s
10811052
buffer = mcps_sap_pd_req_queue_read(rf_mac_setup, is_bc_queue, false);
10821053

10831054
if (buffer) {
1084-
mac_data_request_init(rf_mac_setup, buffer);
1055+
rf_mac_setup->active_pd_data_request = buffer;
10851056
if (mcps_pd_data_request(rf_mac_setup, buffer) != 0) {
10861057
rf_mac_setup->active_pd_data_request = NULL;
10871058
mac_mcps_asynch_finish(rf_mac_setup, buffer);
@@ -1923,7 +1894,7 @@ void mcps_sap_pd_req_queue_write(protocol_interface_rf_mac_setup_s *rf_mac_setup
19231894
}
19241895
}
19251896
//Start TX process immediately
1926-
mac_data_request_init(rf_mac_setup, buffer);
1897+
rf_mac_setup->active_pd_data_request = buffer;
19271898
if (mcps_pd_data_request(rf_mac_setup, buffer) != 0) {
19281899
rf_mac_setup->mac_tx_result = MAC_TX_PRECOND_FAIL;
19291900
rf_mac_setup->macTxRequestAck = false;

source/MAC/IEEE802_15_4/mac_mlme.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ static void mac_mlme_energy_scan_start(protocol_interface_rf_mac_setup_s *rf_mac
8585
rf_mac_setup->macRfRadioTxActive = false;
8686
}
8787

88-
uint16_t mlme_scan_analyze_next_channel(channel_list_s *mac_channel_list)
88+
uint16_t mlme_scan_analyze_next_channel(channel_list_s *mac_channel_list, bool clear_channel)
8989
{
9090
uint8_t i, j = 0, k = 1;
9191
uint32_t mask = 1;
@@ -101,7 +101,9 @@ uint16_t mlme_scan_analyze_next_channel(channel_list_s *mac_channel_list)
101101
{
102102
if (*channel_mask & mask)
103103
{
104-
*channel_mask &= ~mask;
104+
if (clear_channel) {
105+
*channel_mask &= ~mask;
106+
}
105107
return (i+j*32);
106108
}
107109
mask <<= 1;
@@ -280,7 +282,7 @@ static void mac_mlme_scan_start(protocol_interface_rf_mac_setup_s *rf_mac_setup)
280282
{
281283
uint8_t channel;
282284

283-
channel = (uint8_t) mlme_scan_analyze_next_channel(&rf_mac_setup->mac_channel_list);
285+
channel = (uint8_t) mlme_scan_analyze_next_channel(&rf_mac_setup->mac_channel_list, true);
284286
mac_mlme_scan_init(channel, rf_mac_setup);
285287
}
286288

@@ -795,7 +797,7 @@ static void mlme_scan_operation(protocol_interface_rf_mac_setup_s *rf_mac_setup)
795797
resp->ResultListSize++;
796798
}
797799

798-
channel = mlme_scan_analyze_next_channel(&rf_mac_setup->mac_channel_list);
800+
channel = mlme_scan_analyze_next_channel(&rf_mac_setup->mac_channel_list, true);
799801
if (channel > 0xff || rf_mac_setup->mac_mlme_scan_resp->ResultListSize == MLME_MAC_RES_SIZE_MAX) {
800802
resp->status = MLME_SUCCESS;
801803
tr_debug("Scan Complete..Halt MAC");

source/MAC/IEEE802_15_4/mac_mlme.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,6 @@ int8_t mac_mlme_beacon_tx(struct protocol_interface_rf_mac_setup *rf_ptr);
125125
uint8_t mac_mlme_beacon_req_tx(struct protocol_interface_rf_mac_setup *rf_ptr);
126126
int8_t mac_mlme_virtual_confirmation_handle(int8_t driver_id, const uint8_t *data_ptr, uint16_t length);
127127

128-
uint16_t mlme_scan_analyze_next_channel(struct channel_list_s *mac_channel_list);
128+
uint16_t mlme_scan_analyze_next_channel(struct channel_list_s *mac_channel_list, bool clear_channel);
129129

130130
#endif /* MAC_MLME_H_ */

source/MAC/IEEE802_15_4/mac_pd_sap.c

Lines changed: 57 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -290,15 +290,22 @@ void mac_pd_sap_state_machine(protocol_interface_rf_mac_setup_s *rf_mac_setup)
290290

291291
static void mac_sap_cca_fail_cb(protocol_interface_rf_mac_setup_s *rf_ptr)
292292
{
293-
rf_ptr->macRfRadioTxActive = false;
294-
if (rf_ptr->mac_cca_retry > rf_ptr->macMaxCSMABackoffs || (rf_ptr->active_pd_data_request && rf_ptr->active_pd_data_request->asynch_request)) {
295-
//Send MAC_CCA_FAIL
296-
mac_tx_done_state_set(rf_ptr, MAC_CCA_FAIL);
293+
if (rf_ptr->mac_ack_tx_active) {
294+
if (rf_ptr->active_pd_data_request) {
295+
mac_csma_backoff_start(rf_ptr);
296+
}
297297
} else {
298-
timer_mac_stop(rf_ptr);
299-
mac_csma_BE_update(rf_ptr);
300-
if (mcps_pd_data_rebuild(rf_ptr, rf_ptr->active_pd_data_request) ) {
298+
299+
rf_ptr->macRfRadioTxActive = false;
300+
if (rf_ptr->mac_cca_retry > rf_ptr->macMaxCSMABackoffs || (rf_ptr->active_pd_data_request && rf_ptr->active_pd_data_request->asynch_request)) {
301+
//Send MAC_CCA_FAIL
301302
mac_tx_done_state_set(rf_ptr, MAC_CCA_FAIL);
303+
} else {
304+
timer_mac_stop(rf_ptr);
305+
mac_csma_BE_update(rf_ptr);
306+
if (mcps_pd_data_rebuild(rf_ptr, rf_ptr->active_pd_data_request) ) {
307+
mac_tx_done_state_set(rf_ptr, MAC_CCA_FAIL);
308+
}
302309
}
303310
}
304311
}
@@ -344,6 +351,20 @@ static bool mac_data_counter_too_small(uint32_t current_counter, uint32_t packet
344351
}
345352

346353

354+
static bool mac_data_asynch_channel_switch(protocol_interface_rf_mac_setup_s *rf_ptr, mac_pre_build_frame_t *active_buf)
355+
{
356+
if (!active_buf || !active_buf->asynch_request) {
357+
return false;
358+
}
359+
active_buf->asynch_channel = rf_ptr->mac_channel; //Store Original channel
360+
uint16_t channel = mlme_scan_analyze_next_channel(&active_buf->asynch_channel_list, true);
361+
if (channel <= 0xff) {
362+
mac_mlme_rf_channel_change(rf_ptr, channel);
363+
364+
}
365+
return true;
366+
}
367+
347368
static int8_t mac_data_interface_tx_done_cb(protocol_interface_rf_mac_setup_s *rf_ptr, phy_link_tx_status_e status, uint8_t cca_retry, uint8_t tx_retry)
348369
{
349370

@@ -352,10 +373,16 @@ static int8_t mac_data_interface_tx_done_cb(protocol_interface_rf_mac_setup_s *r
352373
}
353374

354375
if (status == PHY_LINK_CCA_PREPARE) {
376+
377+
if (rf_ptr->mac_ack_tx_active) {
378+
return 0;
379+
}
380+
381+
if (mac_data_asynch_channel_switch(rf_ptr, rf_ptr->active_pd_data_request) ) {
382+
return 0;
383+
}
384+
355385
if (rf_ptr->fhss_api) {
356-
if (rf_ptr->mac_ack_tx_active) {
357-
return 0;
358-
}
359386
mac_pre_build_frame_t *active_buf = rf_ptr->active_pd_data_request;
360387
if (!active_buf) {
361388
return -1;
@@ -367,28 +394,28 @@ static int8_t mac_data_interface_tx_done_cb(protocol_interface_rf_mac_setup_s *r
367394
uint8_t *synch_info = tx_buf->buf + rf_ptr->dev_driver->phy_driver->phy_header_length + tx_buf->len - FHSS_SYNCH_INFO_LENGTH;
368395
rf_ptr->fhss_api->write_synch_info(rf_ptr->fhss_api, synch_info, 0, FHSS_SYNCH_FRAME, 0);
369396
}
370-
if (active_buf->asynch_request == false) {
371-
// Change to destination channel and write synchronization info to Beacon frames here
372-
int tx_handle_retval = rf_ptr->fhss_api->tx_handle(rf_ptr->fhss_api, !mac_is_ack_request_set(active_buf),
373-
active_buf->DstAddr, mac_convert_frame_type_to_fhss(active_buf->fcf_dsn.frametype),
374-
active_buf->mac_payload_length, rf_ptr->dev_driver->phy_driver->phy_header_length,
375-
rf_ptr->dev_driver->phy_driver->phy_tail_length, active_buf->tx_time);
376-
// When FHSS TX handle returns -1, transmission of the packet is currently not allowed -> restart CCA timer
377-
if (tx_handle_retval == -1) {
378-
mac_sap_cca_fail_cb(rf_ptr);
379-
return -2;
380-
}
381-
// When FHSS TX handle returns -3, we are trying to transmit broadcast packet on unicast channel -> push back
382-
// to queue by using CCA fail event
383-
if (tx_handle_retval == -3) {
384-
mac_tx_done_state_set(rf_ptr, MAC_CCA_FAIL);
385-
return -3;
386-
} else if (tx_handle_retval == -2) {
387-
mac_tx_done_state_set(rf_ptr, MAC_UNKNOWN_DESTINATION);
388-
return -2;
389-
}
397+
398+
// Change to destination channel and write synchronization info to Beacon frames here
399+
int tx_handle_retval = rf_ptr->fhss_api->tx_handle(rf_ptr->fhss_api, !mac_is_ack_request_set(active_buf),
400+
active_buf->DstAddr, mac_convert_frame_type_to_fhss(active_buf->fcf_dsn.frametype),
401+
active_buf->mac_payload_length, rf_ptr->dev_driver->phy_driver->phy_header_length,
402+
rf_ptr->dev_driver->phy_driver->phy_tail_length, active_buf->tx_time);
403+
// When FHSS TX handle returns -1, transmission of the packet is currently not allowed -> restart CCA timer
404+
if (tx_handle_retval == -1) {
405+
mac_sap_cca_fail_cb(rf_ptr);
406+
return -2;
407+
}
408+
// When FHSS TX handle returns -3, we are trying to transmit broadcast packet on unicast channel -> push back
409+
// to queue by using CCA fail event
410+
if (tx_handle_retval == -3) {
411+
mac_tx_done_state_set(rf_ptr, MAC_CCA_FAIL);
412+
return -3;
413+
} else if (tx_handle_retval == -2) {
414+
mac_tx_done_state_set(rf_ptr, MAC_UNKNOWN_DESTINATION);
415+
return -2;
390416
}
391417
}
418+
392419
return 0;
393420
}
394421

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -796,23 +796,23 @@ bool test_mac_mcps_data_confirmation()
796796
rf_mac_setup->mac_channel = 20;
797797
mac_mlme_stub.uint16_value = 11;
798798
mcps_sap_data_req_handler_ext(rf_mac_setup, &data_req, &ie_list , &channel_list);
799-
if (!rf_mac_setup->active_pd_data_request || rf_mac_setup->mac_channel != 11) {
799+
if (!rf_mac_setup->active_pd_data_request) {
800800
return false;
801801
}
802802
//Test Confirmation to switch channel
803803
rf_mac_setup->mac_tx_result = MAC_TX_DONE;
804804
mac_mlme_stub.uint16_value = 15;
805805
mcps_sap_pd_confirm(rf_mac_setup);
806806

807-
if (!rf_mac_setup->active_pd_data_request || rf_mac_setup->mac_channel != 15) {
807+
if (!rf_mac_setup->active_pd_data_request ) {
808808
return false;
809809
}
810810

811811
rf_mac_setup->mac_tx_result = MAC_TX_DONE;
812812
mac_mlme_stub.uint16_value = 0xffff;
813813
mcps_sap_pd_confirm(rf_mac_setup);
814814

815-
if (rf_mac_setup->active_pd_data_request || rf_mac_setup->mac_channel != 20) {
815+
if (rf_mac_setup->active_pd_data_request ) {
816816
return false;
817817
}
818818
rf_mac_setup->mac_extension_enabled = false;
@@ -3183,7 +3183,7 @@ bool test_mcps_sap_data_req_handler_ext()
31833183
}
31843184
data_req.TxAckReq = false;
31853185
mcps_sap_data_req_handler_ext(rf_mac_setup, &data_req, &ie_list , &channel_list);
3186-
if (!rf_mac_setup->active_pd_data_request || rf_mac_setup->mac_channel != 11) {
3186+
if (!rf_mac_setup->active_pd_data_request) {
31873187
return false;
31883188
}
31893189

test/nanostack/unittest/stub/mac_mlme_stub.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ int8_t mac_mlme_virtual_confirmation_handle(int8_t driver_id, const uint8_t *dat
174174
return 0;
175175
}
176176

177-
uint16_t mlme_scan_analyze_next_channel(channel_list_s *mac_channel_list)
177+
uint16_t mlme_scan_analyze_next_channel(channel_list_s *mac_channel_list, bool clear_channel)
178178
{
179179
return mac_mlme_stub.uint16_value;
180180
}

0 commit comments

Comments
 (0)