Skip to content
This repository was archived by the owner on May 23, 2023. It is now read-only.

Commit 4352709

Browse files
Juha Heiskanenjuhhei01
authored andcommitted
MAC enhanced ACK RX and TX support
MAC extension for update: callback for request payload for Enhanced ACK. ACK Build without security and Receive support Enabled new MCPS data conform extension for indicate Enhanced ACK data. Change-Id: I97bea8bf3caa9cfffa3593c45ac29beeb2e461ef
1 parent 776e0e5 commit 4352709

20 files changed

+1026
-66
lines changed

nanostack/mac_api.h

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,16 @@ typedef void mcps_data_indication(const mac_api_t* api, const mcps_data_ind_t *d
172172
*/
173173
typedef void mcps_data_indication_ext(const mac_api_t* api, const mcps_data_ind_t *data, const mcps_data_ie_list_t *ie_ext);
174174

175+
/**
176+
* @brief mcps_ack_data_req_ext Callback for request IE elements and payload to enhanced ACK
177+
* @param api The API which handled the response
178+
* @param data Pointer where MAC user set Payload and IE element pointers and length
179+
* @param rssi Signal strength for received packet
180+
* @param lqi Link quality to neighbor
181+
*/
182+
typedef void mcps_ack_data_req_ext(const mac_api_t* api, mcps_ack_data_payload_t *data, int8_t rssi, uint8_t lqi);
183+
184+
175185
/**
176186
* @brief mcps_purge_confirm MCPS-PURGE confirm is called as a response to MCPS-PURGE request
177187
* @param api The API which handled the request
@@ -235,11 +245,13 @@ typedef int8_t mac_api_initialize(mac_api_t *api, mcps_data_confirm *data_conf_c
235245
* @param api mac_api_t pointer, which is created by application.
236246
* @param data_ind_cb Upper layer function to handle MCPS indications
237247
* @param data_cnf_cb Upper layer function to handle MCPS confirmation
248+
* @param ack_data_req_cb Upper layer function for set Enhanced ACK payload
238249
* @return -1 if error, -2 if OOM, 0 otherwise
239250
*/
240251
typedef int8_t mac_api_enable_mcps_ext(mac_api_t *api,
241252
mcps_data_indication_ext *data_ind_cb,
242-
mcps_data_confirm_ext *data_cnf_cb);
253+
mcps_data_confirm_ext *data_cnf_cb,
254+
mcps_ack_data_req_ext *ack_data_req_cb);
243255

244256
/**
245257
* \brief Struct mac_api_s defines functions for two-way communications between external MAC and Upper layer.
@@ -261,6 +273,7 @@ struct mac_api_s {
261273
mcps_data_confirm_ext *data_conf_ext_cb; /**< MAC MCPS data confirm with payload callback function */
262274
mcps_data_indication *data_ind_cb; /**< MAC MCPS data indication callback function */
263275
mcps_data_indication_ext *data_ind_ext_cb; /**< MAC MCPS data indication with IE extension's callback function */
276+
mcps_ack_data_req_ext *enhanced_ack_data_req_cb; /**< Enhanced ACK IE element and payload request from MAC user */
264277
mcps_purge_confirm *purge_conf_cb; /**< MAC MCPS purge confirm callback function */
265278
mlme_confirm *mlme_conf_cb; /**< MAC MLME confirm callback function */
266279
mlme_indication *mlme_ind_cb; /**< MAC MLME indication callback function */

nanostack/mac_mcps.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include <inttypes.h>
2626
#include "mac_common_defines.h"
2727

28+
2829
/**
2930
* @brief struct mcps_data_req_t Data request structure
3031
*
@@ -74,6 +75,7 @@ typedef struct mcps_data_conf_payload_s {
7475
uint16_t payloadLength; /**< Payload length in bytes */
7576
} mcps_data_conf_payload_t;
7677

78+
7779
/**
7880
* @brief struct mcps_data_ind_t Data indication structure
7981
*
@@ -133,6 +135,15 @@ typedef struct mcps_data_req_ie_list {
133135
} mcps_data_req_ie_list_t;
134136

135137

138+
/**
139+
* @brief struct mcps_ack_data_payload_t IE extension list and payload for enhanced ACK
140+
*
141+
*/
142+
typedef struct mcps_ack_data_payload {
143+
struct mcps_data_req_ie_list ie_elements; /**< IE hader and payload's elements */
144+
uint8_t *payloadPtr; /**< Ack payload pointer */
145+
uint16_t payloadLength; /**< Payload length in bytes */
146+
} mcps_ack_data_payload_t;
136147

137148
/**
138149
* @brief struct mcps_purge_t Purge request structure

nanostack/platform/arm_hal_phy.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ typedef struct phy_signal_info_s {
120120

121121
/** CSMA-CA parameters */
122122
typedef struct phy_csma_params {
123-
uint32_t symbol_backoff_time; /**< CSMA Backoff symbol time before start CCA & TX. */
123+
uint32_t symbol_backoff_time; /**< CSMA Backoff symbol time before start CCA & TX. 0 should disable current backoff*/
124124
bool cca_enabled; /**< True will affect CCA check false start TX direct after backoff */
125125
} phy_csma_params_t;
126126

source/6LoWPAN/ws/ws_llc_data_service.c

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ typedef struct {
100100
ws_asynch_ind *asynch_ind; /**< LLC Asynch data indication call back configured by user */
101101
ws_asynch_confirm *asynch_confirm; /**< LLC Asynch data confirmation call back configured by user */
102102
ws_neighbor_info_request *ws_neighbor_info_request_cb; /**< LLC Neighbour discover API*/
103+
uint8_t ws_enhanced_ack_elements[WH_IE_ELEMENT_HEADER_LENGTH + 4 + WH_IE_ELEMENT_HEADER_LENGTH + 1];
104+
ns_ie_iovec_t ws_header_vector;
103105
protocol_interface_info_entry_t *interface_ptr; /**< List link entry */
104106
ns_list_link_t link; /**< List link entry */
105107
} llc_data_base_t;
@@ -421,6 +423,27 @@ static void ws_llc_mac_confirm_cb(const mac_api_t* api, const mcps_data_conf_t *
421423

422424
}
423425

426+
static void ws_llc_ack_data_req_ext(const mac_api_t* api, mcps_ack_data_payload_t *data, int8_t rssi, uint8_t lqi)
427+
{
428+
llc_data_base_t *base = ws_llc_discover_by_mac(api);
429+
if (!base) {
430+
return;
431+
}
432+
/* Init all by zero */
433+
memset(data, 0, sizeof(mcps_ack_data_payload_t));
434+
//Add just 2 header elements to inside 1 block
435+
data->ie_elements.headerIeVectorList = &base->ws_header_vector;
436+
base->ws_header_vector.ieBase = base->ws_enhanced_ack_elements;
437+
base->ws_header_vector.iovLen = sizeof(base->ws_enhanced_ack_elements);
438+
data->ie_elements.headerIovLength = 1;
439+
440+
//Write Data to block
441+
uint8_t *ptr = base->ws_enhanced_ack_elements;
442+
ptr = ws_wh_utt_write(ptr, WS_FT_ACK);
443+
uint8_t rsl = ws_neighbor_class_rssi_from_dbm_calculate(rssi);
444+
ws_wh_rsl_write(ptr, rsl);
445+
}
446+
424447
/** WS LLC MAC data extension indication */
425448
static void ws_llc_mac_indication_cb(const mac_api_t* api, const mcps_data_ind_t *data, const mcps_data_ie_list_t *ie_ext)
426449
{
@@ -745,7 +768,7 @@ int8_t ws_llc_create(struct protocol_interface_info_entry *interface, ws_asynch_
745768
base->asynch_confirm = asynch_cnf_cb;
746769
base->ws_neighbor_info_request_cb = ws_neighbor_info_request_cb;
747770
//Register MAC Extensions
748-
base->interface_ptr->mac_api->mac_mcps_extension_enable(base->interface_ptr->mac_api, &ws_llc_mac_indication_cb, &ws_llc_mac_confirm_cb);
771+
base->interface_ptr->mac_api->mac_mcps_extension_enable(base->interface_ptr->mac_api, &ws_llc_mac_indication_cb, &ws_llc_mac_confirm_cb, &ws_llc_ack_data_req_ext);
749772
//Init MPX class
750773
ws_llc_mpx_init(&base->mpx_data_base);
751774
return 0;
@@ -762,7 +785,7 @@ int8_t ws_llc_delete(struct protocol_interface_info_entry *interface)
762785

763786
ns_list_remove(&llc_data_base_list, base);
764787
//Disable Mac extension
765-
base->interface_ptr->mac_api->mac_mcps_extension_enable(base->interface_ptr->mac_api, NULL, NULL);
788+
base->interface_ptr->mac_api->mac_mcps_extension_enable(base->interface_ptr->mac_api, NULL, NULL, NULL);
766789
ns_dyn_mem_free(base);
767790
return 0;
768791
}

source/MAC/IEEE802_15_4/mac_defines.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,8 @@ typedef struct protocol_interface_rf_mac_setup {
140140
bool shortAdressValid: 1; //Define Dynamic src address to mac16 when it is true
141141
bool beaconSrcAddressModeLong: 1; //This force beacon src to mac64 otherwise shortAdressValid will define type
142142
bool mac_extension_enabled:1;
143+
bool mac_ack_tx_active:1;
144+
bool mac_frame_pending:1;
143145
uint16_t mac_short_address;
144146
uint16_t pan_id;
145147
uint8_t mac64[8];

source/MAC/IEEE802_15_4/mac_header_helper_functions.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ bool mac_src_panid_present(const mac_fcf_sequence_t *header)
107107
return presents;
108108
}
109109

110-
static uint8_t mac_address_length(uint8_t address_mode)
110+
uint8_t mac_address_length(uint8_t address_mode)
111111
{
112112
uint8_t length = 0;
113113
switch (address_mode) {
@@ -252,6 +252,10 @@ const uint8_t * mac_header_parse_fcf_dsn(mac_fcf_sequence_t *header, const uint8
252252
if (header->frameVersion == MAC_FRAME_VERSION_2015 ) {
253253
header->sequenceNumberSuppress = ((fcf & MAC_FCF_SEQ_NUM_SUPPRESS_MASK ) >> MAC_FCF_SEQ_NUM_SUPPRESS_SHIFT);
254254
header->informationElementsPresets = ((fcf & MAC_FCF_IE_PRESENTS_MASK ) >> MAC_FCF_IE_PRESENTS_SHIFT);
255+
} else {
256+
//SET False to ALL 2015 Extension's by default
257+
header->sequenceNumberSuppress = false;
258+
header->informationElementsPresets = false;
255259
}
256260

257261
if (header->frameVersion < MAC_FRAME_VERSION_2015 || (header->frameVersion == MAC_FRAME_VERSION_2015 && !header->sequenceNumberSuppress)) {

source/MAC/IEEE802_15_4/mac_header_helper_functions.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ uint16_t mac_header_get_src_panid(const struct mac_fcf_sequence_s *header, const
5959
uint16_t mac_header_get_dst_panid(const struct mac_fcf_sequence_s *header, const uint8_t *ptr);
6060
void mac_header_get_src_address(const struct mac_fcf_sequence_s *header, const uint8_t *ptr, uint8_t *address_ptr);
6161
void mac_header_get_dst_address(const struct mac_fcf_sequence_s *header, const uint8_t *ptr, uint8_t *address_ptr);
62+
uint8_t mac_address_length(uint8_t address_mode);
6263
uint8_t mcps_mac_header_length_from_received_frame(const struct mac_pre_parsed_frame_s *buffer);
6364
uint32_t mcps_mac_security_frame_counter_read(const struct mac_pre_parsed_frame_s *buffer);
6465
uint8_t mcps_mac_command_frame_id_get(const struct mac_pre_parsed_frame_s *buffer);

source/MAC/IEEE802_15_4/mac_indirect_data.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ void mac_indirect_data_ttl_handle(protocol_interface_rf_mac_setup_s *cur, uint16
5555
if( dev_driver && dev_driver->extension ){
5656
dev_driver->extension(PHY_EXTENSION_CTRL_PENDING_BIT, &value);
5757
}
58+
cur->mac_frame_pending = false;
5859
return;
5960
}
6061
mac_pre_build_frame_t *buf, *buf_prev = 0, *buf_temp = 0;
@@ -222,6 +223,7 @@ void mac_indirect_queue_write(protocol_interface_rf_mac_setup_s *rf_mac_setup, m
222223
//Trig timer and set pending flag to radio
223224
eventOS_callback_timer_stop(rf_mac_setup->mac_mcps_timer);
224225
eventOS_callback_timer_start(rf_mac_setup->mac_mcps_timer, MAC_INDIRECT_TICK_IN_MS * 20);
226+
rf_mac_setup->mac_frame_pending = true;
225227
if (rf_mac_setup->dev_driver->phy_driver->extension)
226228
{
227229
uint8_t value = 1;

0 commit comments

Comments
 (0)