Skip to content

Commit dac1d99

Browse files
author
Juha Heiskanen
authored
Merge pull request ARMmbed#1857 from ARMmbed/mac_enhanced_ack
Enhanced ACK tx fix
2 parents b819fa8 + 20b5e57 commit dac1d99

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 = mac_mcps_sap_get_phy_timestamp(rf_ptr) + 300; //Send 300 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)