Skip to content

Commit 20b5e57

Browse files
author
Juha Heiskanen
committed
Enhanced ACK tx fix
Enhanced ack should be now thread safe. Ack have now own tx buffer. CCA trig is now thread safe. Change-Id: Iefb81aba820af832dc2a14f46c9df87658ce61ce
1 parent 3c1864b commit 20b5e57

File tree

6 files changed

+52
-5
lines changed

6 files changed

+52
-5
lines changed

source/MAC/IEEE802_15_4/mac_defines.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,12 @@ typedef enum arm_nwk_mlme_event_type {
9191
ARM_NWK_MAC_MLME_INDIRECT_DATA_POLL_AFTER_DATA = 5,
9292
} arm_nwk_mlme_event_type_e;
9393

94+
#define ENHANCED_ACK_MAX_LENGTH 255
95+
9496
typedef struct dev_driver_tx_buffer {
9597
uint8_t *buf;
98+
uint8_t *enhanced_ack_buf;
99+
uint16_t ack_len;
96100
uint16_t len;
97101
unsigned priority:2;
98102
} dev_driver_tx_buffer_s;

source/MAC/IEEE802_15_4/mac_mcps_sap.c

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1688,7 +1688,15 @@ int8_t mcps_generic_ack_build(protocol_interface_rf_mac_setup_s *rf_ptr, const m
16881688

16891689
//Add MHR length to total length
16901690
frame_length += buffer->mac_header_length_with_security + buffer->security_mic_len;
1691-
if ((frame_length) > dev_driver->phy_MTU - 2) {
1691+
uint16_t ack_mtu_size;
1692+
if (ENHANCED_ACK_MAX_LENGTH > dev_driver->phy_MTU) {
1693+
ack_mtu_size = dev_driver->phy_MTU;
1694+
} else {
1695+
ack_mtu_size = ENHANCED_ACK_MAX_LENGTH;
1696+
}
1697+
1698+
1699+
if ((frame_length) > ack_mtu_size - 2) {
16921700
buffer->status = MLME_FRAME_TOO_LONG;
16931701

16941702
if (buffer->fcf_dsn.securityEnabled) {
@@ -1700,12 +1708,12 @@ int8_t mcps_generic_ack_build(protocol_interface_rf_mac_setup_s *rf_ptr, const m
17001708
}
17011709

17021710
rf_ptr->mac_tx_status.length = frame_length;
1703-
uint8_t *ptr = tx_buf->buf;
1711+
uint8_t *ptr = tx_buf->enhanced_ack_buf;
17041712
if (dev_driver->phy_header_length) {
17051713
ptr += dev_driver->phy_header_length;
17061714
}
17071715

1708-
tx_buf->len = frame_length;
1716+
tx_buf->ack_len = frame_length;
17091717
uint8_t *mhr_start = ptr;
17101718
buffer->tx_time = rx_time + 196; //Send 196 us later
17111719

@@ -1795,6 +1803,7 @@ static int8_t mcps_generic_packet_rebuild(protocol_interface_rf_mac_setup_s *rf_
17951803

17961804
static int8_t mcps_pd_data_cca_trig(protocol_interface_rf_mac_setup_s *rf_ptr, mac_pre_build_frame_t *buffer)
17971805
{
1806+
platform_enter_critical();
17981807
mac_mlme_mac_radio_enable(rf_ptr);
17991808
rf_ptr->macTxProcessActive = true;
18001809
if (rf_ptr->rf_csma_extension_supported) {
@@ -1804,6 +1813,11 @@ static int8_t mcps_pd_data_cca_trig(protocol_interface_rf_mac_setup_s *rf_ptr, m
18041813
cca_enabled = false;
18051814
rf_ptr->mac_ack_tx_active = true;
18061815
} else {
1816+
if (rf_ptr->mac_ack_tx_active) {
1817+
mac_csma_backoff_start(rf_ptr);
1818+
platform_exit_critical();
1819+
return -1;
1820+
}
18071821
cca_enabled = true;
18081822
}
18091823
mac_pd_sap_set_phy_tx_time(rf_ptr, buffer->tx_time, cca_enabled);
@@ -1817,14 +1831,15 @@ static int8_t mcps_pd_data_cca_trig(protocol_interface_rf_mac_setup_s *rf_ptr, m
18171831
if (rf_ptr->active_pd_data_request) {
18181832
mac_csma_backoff_start(rf_ptr);
18191833
}
1834+
platform_exit_critical();
18201835
return -1;
18211836
}
18221837
mac_csma_backoff_start(rf_ptr);
18231838
}
18241839
} else {
18251840
timer_mac_start(rf_ptr, MAC_TIMER_CCA, (uint16_t)(buffer->tx_time / 50));
18261841
}
1827-
1842+
platform_exit_critical();
18281843
return 0;
18291844
}
18301845

source/MAC/IEEE802_15_4/mac_mlme.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -983,6 +983,7 @@ void mac_mlme_data_base_deallocate(struct protocol_interface_rf_mac_setup *rf_ma
983983
eventOS_callback_timer_unregister(rf_mac->mac_mcps_timer);
984984

985985
ns_dyn_mem_free(rf_mac->dev_driver_tx_buffer.buf);
986+
ns_dyn_mem_free(rf_mac->dev_driver_tx_buffer.enhanced_ack_buf);
986987
ns_dyn_mem_free(rf_mac->mac_beacon_payload);
987988

988989
mac_sec_mib_deinit(rf_mac);

source/MAC/IEEE802_15_4/mac_pd_sap.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,9 +159,19 @@ int8_t mac_plme_cca_req(protocol_interface_rf_mac_setup_s *rf_mac_setup) {
159159
return 0;
160160
}
161161

162-
if (dev_driver->tx(tx_buf->buf, tx_buf->len, 1, PHY_LAYER_PAYLOAD) == 0) {
162+
uint8_t *buffer;
163+
uint16_t length;
164+
if (rf_mac_setup->mac_ack_tx_active) {
165+
buffer = tx_buf->enhanced_ack_buf;
166+
length = tx_buf->ack_len;
167+
} else {
168+
buffer = tx_buf->buf;
169+
length = tx_buf->len;
170+
}
171+
if (dev_driver->tx(buffer, length, 1, PHY_LAYER_PAYLOAD) == 0) {
163172
return 0;
164173
}
174+
165175
rf_mac_setup->macRfRadioTxActive = false;
166176
return -1;
167177
}

source/MAC/IEEE802_15_4/sw_mac.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,22 @@ static int8_t ns_sw_mac_api_enable_mcps_ext(mac_api_t *api, mcps_data_indication
252252
cur->data_ind_ext_cb = data_ind_cb;
253253
cur->enhanced_ack_data_req_cb = ack_data_req_cb;
254254
if (data_cnf_cb && data_ind_cb && ack_data_req_cb) {
255+
arm_device_driver_list_s *dev_driver = mac_store.setup->dev_driver;
256+
ns_dyn_mem_free(mac_store.setup->dev_driver_tx_buffer.enhanced_ack_buf);
257+
258+
uint16_t total_length;
259+
if (ENHANCED_ACK_MAX_LENGTH > dev_driver->phy_driver->phy_MTU) {
260+
total_length = dev_driver->phy_driver->phy_MTU;
261+
} else {
262+
total_length = ENHANCED_ACK_MAX_LENGTH;
263+
}
264+
265+
total_length += (dev_driver->phy_driver->phy_header_length + dev_driver->phy_driver->phy_tail_length);
266+
mac_store.setup->dev_driver_tx_buffer.enhanced_ack_buf = ns_dyn_mem_alloc(total_length);
267+
if (!mac_store.setup->dev_driver_tx_buffer.enhanced_ack_buf) {
268+
return -2;
269+
}
270+
255271
mac_store.setup->mac_extension_enabled = true;
256272
} else {
257273
mac_store.setup->mac_extension_enabled = false;

test/nanostack/unittest/mac/mac_mcps_sap/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ TEST_SRC_FILES = \
2626
../../stub/mac_pairwise_key_stub.c \
2727
../../stub/protocol_stats_stub.c \
2828
../../stub/ccm_security_stub.c \
29+
../../stub/platform_stub.c \
2930
../../stub/fhss_config_stub.c \
3031

3132
include ../../MakefileWorker.mk

0 commit comments

Comments
 (0)