Skip to content

Commit a3f3412

Browse files
author
Jarkko Paso
authored
MAC data req: API to support mode switch (ARMmbed#2674)
* MAC data req: API to support mode switch * Updated MAC unit tests
1 parent cad5122 commit a3f3412

File tree

9 files changed

+34
-29
lines changed

9 files changed

+34
-29
lines changed

nanostack/mac_api.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,10 +129,11 @@ typedef void mcps_data_request(const mac_api_t *api, const mcps_data_req_t *data
129129
* @param ie_ext Information element list to MCPS-DATA.request
130130
* @param asynch_channel_list Optional channel list to asynch data request. Give NULL when normal data request.
131131
* @param priority Data request priority level
132+
* @param phy_mode_id Use mode switch if given phy_mode_id > 0
132133
*
133134
* Asynch data request is mac standard extension. asynch_channel_list include channel mask which channel message is requested to send.
134135
*/
135-
typedef void mcps_data_request_ext(const mac_api_t *api, const mcps_data_req_t *data, const mcps_data_req_ie_list_t *ie_ext, const struct channel_list_s *asynch_channel_list, mac_data_priority_t priority);
136+
typedef void mcps_data_request_ext(const mac_api_t *api, const mcps_data_req_t *data, const mcps_data_req_ie_list_t *ie_ext, const struct channel_list_s *asynch_channel_list, mac_data_priority_t priority, uint8_t phy_mode_id);
136137

137138
/**
138139
* @brief mcps_purge_request MCPS_PURGE request call
@@ -286,10 +287,11 @@ typedef int8_t mac_api_enable_mcps_edfe_ext(mac_api_t *api,
286287
* @brief mac_api_mode_switch_resolver_ext Initialises mode switch resolver callback. Upper layer must configure function when mode switch is used.
287288
* @param api mac_api_t pointer, which is created by application.
288289
* @param mode_resolver_cb Upper layer function to resolve received PHY mode ID
290+
* @param base_phy_mode Base PHY mode, device returns to this mode after mode switch transmission or reception
289291
* @return -1 if error, 0 otherwise
290292
*/
291293
typedef int8_t mac_api_mode_switch_resolver_ext(mac_api_t *api,
292-
mode_switch_resolver *mode_resolver_cb);
294+
mode_switch_resolver *mode_resolver_cb, uint8_t base_phy_mode);
293295

294296
/**
295297
* \brief Struct mac_api_s defines functions for two-way communications between external MAC and Upper layer.

source/6LoWPAN/adaptation_interface.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1137,7 +1137,7 @@ static void lowpan_data_request_to_mac(protocol_interface_info_entry_t *cur, buf
11371137
} else {
11381138
mcps_data_req_ie_list_t ie_list;
11391139
memset(&ie_list, 0, sizeof(mcps_data_req_ie_list_t));
1140-
cur->mac_api->mcps_data_req_ext(cur->mac_api, &dataReq, &ie_list, NULL, data_priority);
1140+
cur->mac_api->mcps_data_req_ext(cur->mac_api, &dataReq, &ie_list, NULL, data_priority, 0);
11411141
}
11421142
}
11431143

source/6LoWPAN/ws/ws_llc_data_service.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1152,7 +1152,7 @@ static void ws_llc_lowpan_mpx_data_request(llc_data_base_t *base, mpx_user_t *us
11521152
message->ie_ext.payloadIovLength = 0; //Set Back 2 at response handler
11531153
}
11541154

1155-
base->interface_ptr->mac_api->mcps_data_req_ext(base->interface_ptr->mac_api, &data_req, &message->ie_ext, NULL, message->priority);
1155+
base->interface_ptr->mac_api->mcps_data_req_ext(base->interface_ptr->mac_api, &data_req, &message->ie_ext, NULL, message->priority, 0);
11561156
}
11571157

11581158
static void ws_llc_eapol_data_req_init(mcps_data_req_t *data_req, llc_message_t *message)
@@ -1199,7 +1199,7 @@ static void ws_llc_mpx_eapol_send(llc_data_base_t *base, llc_message_t *message)
11991199
ns_list_add_to_end(&base->llc_message_list, message);
12001200
ws_llc_eapol_data_req_init(&data_req, message);
12011201
base->temp_entries->active_eapol_session = true;
1202-
base->interface_ptr->mac_api->mcps_data_req_ext(base->interface_ptr->mac_api, &data_req, &message->ie_ext, NULL, message->priority);
1202+
base->interface_ptr->mac_api->mcps_data_req_ext(base->interface_ptr->mac_api, &data_req, &message->ie_ext, NULL, message->priority, 0);
12031203
}
12041204

12051205

@@ -1916,7 +1916,7 @@ int8_t ws_llc_asynch_request(struct protocol_interface_info_entry *interface, as
19161916

19171917
}
19181918

1919-
base->interface_ptr->mac_api->mcps_data_req_ext(base->interface_ptr->mac_api, &data_req, &message->ie_ext, &request->channel_list, message->priority);
1919+
base->interface_ptr->mac_api->mcps_data_req_ext(base->interface_ptr->mac_api, &data_req, &message->ie_ext, &request->channel_list, message->priority, 0);
19201920

19211921
return 0;
19221922
}

source/MAC/IEEE802_15_4/mac_defines.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,7 @@ typedef struct protocol_interface_rf_mac_setup {
228228

229229
uint8_t mac_channel;
230230
uint8_t mac_tx_start_channel;
231+
uint8_t base_phy_mode;
231232
//uint8_t cca_failure;
232233

233234
/* MAC TX Queue */

source/MAC/IEEE802_15_4/mac_mcps_sap.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ void mcps_sap_data_req_handler(protocol_interface_rf_mac_setup_s *rf_mac_setup,
156156
{
157157
mcps_data_req_ie_list_t ie_list;
158158
memset(&ie_list, 0, sizeof(mcps_data_req_ie_list_t));
159-
mcps_sap_data_req_handler_ext(rf_mac_setup, data_req, &ie_list, NULL, MAC_DATA_NORMAL_PRIORITY);
159+
mcps_sap_data_req_handler_ext(rf_mac_setup, data_req, &ie_list, NULL, MAC_DATA_NORMAL_PRIORITY, 0);
160160
}
161161

162162
static bool mac_ie_vector_length_validate(ns_ie_iovec_t *ie_vector, uint16_t iov_length, uint16_t *length_out)
@@ -195,8 +195,9 @@ static bool mac_ie_vector_length_validate(ns_ie_iovec_t *ie_vector, uint16_t iov
195195
}
196196

197197

198-
void mcps_sap_data_req_handler_ext(protocol_interface_rf_mac_setup_s *rf_mac_setup, const mcps_data_req_t *data_req, const mcps_data_req_ie_list_t *ie_list, const channel_list_s *asynch_channel_list, mac_data_priority_t priority)
198+
void mcps_sap_data_req_handler_ext(protocol_interface_rf_mac_setup_s *rf_mac_setup, const mcps_data_req_t *data_req, const mcps_data_req_ie_list_t *ie_list, const channel_list_s *asynch_channel_list, mac_data_priority_t priority, uint8_t phy_mode_id)
199199
{
200+
(void) phy_mode_id;
200201
uint8_t status = MLME_SUCCESS;
201202
mac_pre_build_frame_t *buffer = NULL;
202203

source/MAC/IEEE802_15_4/mac_mcps_sap.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ int8_t mac_virtual_sap_data_cb(void *identifier, struct arm_phy_sap_msg_s *messa
123123

124124
void mcps_sap_data_req_handler(struct protocol_interface_rf_mac_setup *rf_mac_setup, const struct mcps_data_req_s *data_req);
125125

126-
void mcps_sap_data_req_handler_ext(struct protocol_interface_rf_mac_setup *rf_mac_setup, const struct mcps_data_req_s *data_req, const struct mcps_data_req_ie_list *ie_list, const channel_list_s *asynch_channel_list, mac_data_priority_t priority);
126+
void mcps_sap_data_req_handler_ext(struct protocol_interface_rf_mac_setup *rf_mac_setup, const struct mcps_data_req_s *data_req, const struct mcps_data_req_ie_list *ie_list, const channel_list_s *asynch_channel_list, mac_data_priority_t priority, uint8_t phy_mode_id);
127127

128128
void mac_mcps_trig_buffer_from_queue(struct protocol_interface_rf_mac_setup *rf_mac_setup);
129129

source/MAC/IEEE802_15_4/sw_mac.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,11 @@ static int8_t ns_sw_mac_initialize(mac_api_t *api, mcps_data_confirm *mcps_data_
5555
mlme_confirm *mlme_conf_callback, mlme_indication *mlme_ind_callback, int8_t parent_id);
5656
static int8_t ns_sw_mac_api_enable_mcps_ext(mac_api_t *api, mcps_data_indication_ext *data_ind_cb, mcps_data_confirm_ext *data_cnf_cb, mcps_ack_data_req_ext *ack_data_req_cb);
5757
static int8_t ns_sw_mac_api_enable_edfe_ext(mac_api_t *api, mcps_edfe_handler *edfe_ind_cb);
58-
static int8_t ns_sw_mac_api_mode_switch_resolver_set(mac_api_t *api, mode_switch_resolver *mode_resolver_cb);
58+
static int8_t ns_sw_mac_api_mode_switch_resolver_set(mac_api_t *api, mode_switch_resolver *mode_resolver_cb, uint8_t base_phy_mode);
5959

6060
static void mlme_req(const mac_api_t *api, mlme_primitive id, const void *data);
6161
static void mcps_req(const mac_api_t *api, const mcps_data_req_t *data);
62-
static void mcps_req_ext(const mac_api_t *api, const mcps_data_req_t *data, const mcps_data_req_ie_list_t *ie_ext, const channel_list_s *asynch_channel_list, mac_data_priority_t priority);
62+
static void mcps_req_ext(const mac_api_t *api, const mcps_data_req_t *data, const mcps_data_req_ie_list_t *ie_ext, const channel_list_s *asynch_channel_list, mac_data_priority_t priority, uint8_t phy_mode_id);
6363
static uint8_t purge_req(const mac_api_t *api, const mcps_purge_t *data);
6464
static int8_t macext_mac64_address_set(const mac_api_t *api, const uint8_t *mac64);
6565
static int8_t macext_mac64_address_get(const mac_api_t *api, mac_extended_address_type type, uint8_t *mac64_buf);
@@ -346,14 +346,15 @@ static int8_t ns_sw_mac_api_enable_edfe_ext(mac_api_t *api, mcps_edfe_handler *e
346346
return 0;
347347
}
348348

349-
static int8_t ns_sw_mac_api_mode_switch_resolver_set(mac_api_t *api, mode_switch_resolver *mode_resolver_cb)
349+
static int8_t ns_sw_mac_api_mode_switch_resolver_set(mac_api_t *api, mode_switch_resolver *mode_resolver_cb, uint8_t base_phy_mode)
350350
{
351351
if (api != mac_store.mac_api) {
352352
return -1;
353353
}
354354
if (!mac_store.setup->mac_extension_enabled) {
355355
return -1;
356356
}
357+
mac_store.setup->base_phy_mode = base_phy_mode;
357358
mac_store.mac_api->mode_resolver_cb = mode_resolver_cb;
358359
return 0;
359360
}
@@ -596,15 +597,15 @@ static void mcps_req(const mac_api_t *api, const mcps_data_req_t *data)
596597
/* Call direct new API but without IE extensions */
597598
mcps_data_req_ie_list_t ie_list;
598599
memset(&ie_list, 0, sizeof(mcps_data_req_ie_list_t));
599-
mcps_sap_data_req_handler_ext(mac_store.setup, data, &ie_list, NULL, MAC_DATA_NORMAL_PRIORITY);
600+
mcps_sap_data_req_handler_ext(mac_store.setup, data, &ie_list, NULL, MAC_DATA_NORMAL_PRIORITY, 0);
600601
}
601602
}
602603

603-
static void mcps_req_ext(const mac_api_t *api, const mcps_data_req_t *data, const mcps_data_req_ie_list_t *ie_ext, const channel_list_s *asynch_channel_list, mac_data_priority_t priority)
604+
static void mcps_req_ext(const mac_api_t *api, const mcps_data_req_t *data, const mcps_data_req_ie_list_t *ie_ext, const channel_list_s *asynch_channel_list, mac_data_priority_t priority, uint8_t phy_mode_id)
604605
{
605606
//TODO: Populate linked list when present
606607
if (mac_store.mac_api == api) {
607-
mcps_sap_data_req_handler_ext(mac_store.setup, data, ie_ext, asynch_channel_list, priority);
608+
mcps_sap_data_req_handler_ext(mac_store.setup, data, ie_ext, asynch_channel_list, priority, phy_mode_id);
608609
}
609610
}
610611

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

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -831,7 +831,7 @@ bool test_mac_mcps_data_confirmation()
831831
channel_list.channel_mask[0] = 0x07FFF800;
832832
rf_mac_setup->mac_channel = 20;
833833
mac_mlme_stub.uint16_value = 11;
834-
mcps_sap_data_req_handler_ext(rf_mac_setup, &data_req, &ie_list, &channel_list, MAC_DATA_NORMAL_PRIORITY);
834+
mcps_sap_data_req_handler_ext(rf_mac_setup, &data_req, &ie_list, &channel_list, MAC_DATA_NORMAL_PRIORITY, 0);
835835
if (!rf_mac_setup->active_pd_data_request) {
836836
return false;
837837
}
@@ -3165,7 +3165,7 @@ bool test_mcps_sap_data_req_handler_ext()
31653165
ie_list.headerIovLength = 1;
31663166
//NULL Pointer
31673167

3168-
mcps_sap_data_req_handler_ext(rf_mac_setup, &data_req, &ie_list, NULL, MAC_DATA_NORMAL_PRIORITY);
3168+
mcps_sap_data_req_handler_ext(rf_mac_setup, &data_req, &ie_list, NULL, MAC_DATA_NORMAL_PRIORITY, 0);
31693169
if (rf_mac_setup->active_pd_data_request || !data_confirm_valid) {
31703170
return false;
31713171
}
@@ -3178,7 +3178,7 @@ bool test_mcps_sap_data_req_handler_ext()
31783178
vector->ieBase = NULL;
31793179
vector->iovLen = 15;
31803180
ie_list.headerIeVectorList = vector;
3181-
mcps_sap_data_req_handler_ext(rf_mac_setup, &data_req, &ie_list, NULL, MAC_DATA_NORMAL_PRIORITY);
3181+
mcps_sap_data_req_handler_ext(rf_mac_setup, &data_req, &ie_list, NULL, MAC_DATA_NORMAL_PRIORITY, 0);
31823182
if (rf_mac_setup->active_pd_data_request || !data_confirm_valid) {
31833183
return false;
31843184
}
@@ -3192,7 +3192,7 @@ bool test_mcps_sap_data_req_handler_ext()
31923192
expect_data_confirmation_status = MLME_INVALID_PARAMETER;
31933193
data_confirm_valid = false;
31943194

3195-
mcps_sap_data_req_handler_ext(rf_mac_setup, &data_req, &ie_list, NULL, MAC_DATA_NORMAL_PRIORITY);
3195+
mcps_sap_data_req_handler_ext(rf_mac_setup, &data_req, &ie_list, NULL, MAC_DATA_NORMAL_PRIORITY, 0);
31963196
if (rf_mac_setup->active_pd_data_request || !data_confirm_valid) {
31973197
return false;
31983198
}
@@ -3203,7 +3203,7 @@ bool test_mcps_sap_data_req_handler_ext()
32033203
expect_data_confirmation_status = MLME_INVALID_PARAMETER;
32043204
data_confirm_valid = false;
32053205

3206-
mcps_sap_data_req_handler_ext(rf_mac_setup, &data_req, &ie_list, NULL, MAC_DATA_NORMAL_PRIORITY);
3206+
mcps_sap_data_req_handler_ext(rf_mac_setup, &data_req, &ie_list, NULL, MAC_DATA_NORMAL_PRIORITY, 0);
32073207
if (rf_mac_setup->active_pd_data_request || !data_confirm_valid) {
32083208
return false;
32093209
}
@@ -3214,7 +3214,7 @@ bool test_mcps_sap_data_req_handler_ext()
32143214
expect_data_confirmation_status = MLME_INVALID_PARAMETER;
32153215
data_confirm_valid = false;
32163216

3217-
mcps_sap_data_req_handler_ext(rf_mac_setup, &data_req, &ie_list, NULL, MAC_DATA_NORMAL_PRIORITY);
3217+
mcps_sap_data_req_handler_ext(rf_mac_setup, &data_req, &ie_list, NULL, MAC_DATA_NORMAL_PRIORITY, 0);
32183218

32193219

32203220

@@ -3234,7 +3234,7 @@ bool test_mcps_sap_data_req_handler_ext()
32343234
nsdynmemlib_stub.returnCounter = 10;
32353235
nsdynmemlib_stub.returnCounter = 0;
32363236
//TEST new confirmation call
3237-
mcps_sap_data_req_handler_ext(rf_mac_setup, &data_req, &ie_list, NULL, MAC_DATA_NORMAL_PRIORITY);
3237+
mcps_sap_data_req_handler_ext(rf_mac_setup, &data_req, &ie_list, NULL, MAC_DATA_NORMAL_PRIORITY, 0);
32383238
if (rf_mac_setup->active_pd_data_request || !data_confirm_valid) {
32393239
return false;
32403240
}
@@ -3243,7 +3243,7 @@ bool test_mcps_sap_data_req_handler_ext()
32433243
data_req.DstAddrMode = MAC_ADDR_MODE_16_BIT;
32443244
data_req.SrcAddrMode = MAC_ADDR_MODE_16_BIT;
32453245
nsdynmemlib_stub.returnCounter = 1;
3246-
mcps_sap_data_req_handler_ext(rf_mac_setup, &data_req, &ie_list, NULL, MAC_DATA_NORMAL_PRIORITY);
3246+
mcps_sap_data_req_handler_ext(rf_mac_setup, &data_req, &ie_list, NULL, MAC_DATA_NORMAL_PRIORITY, 0);
32473247
if (!rf_mac_setup->active_pd_data_request) {
32483248
return false;
32493249
}
@@ -3253,7 +3253,7 @@ bool test_mcps_sap_data_req_handler_ext()
32533253
data_req.DstAddrMode = MAC_ADDR_MODE_NONE;
32543254
data_req.SeqNumSuppressed = true;
32553255
nsdynmemlib_stub.returnCounter = 1;
3256-
mcps_sap_data_req_handler_ext(rf_mac_setup, &data_req, &ie_list, NULL, MAC_DATA_NORMAL_PRIORITY);
3256+
mcps_sap_data_req_handler_ext(rf_mac_setup, &data_req, &ie_list, NULL, MAC_DATA_NORMAL_PRIORITY, 0);
32573257
if (!rf_mac_setup->active_pd_data_request || !rf_mac_setup->active_pd_data_request->fcf_dsn.sequenceNumberSuppress) {
32583258
return false;
32593259
}
@@ -3265,7 +3265,7 @@ bool test_mcps_sap_data_req_handler_ext()
32653265
data_req.SeqNumSuppressed = false;
32663266
data_req.PanIdSuppressed = true;
32673267
nsdynmemlib_stub.returnCounter = 1;
3268-
mcps_sap_data_req_handler_ext(rf_mac_setup, &data_req, &ie_list, NULL, MAC_DATA_NORMAL_PRIORITY);
3268+
mcps_sap_data_req_handler_ext(rf_mac_setup, &data_req, &ie_list, NULL, MAC_DATA_NORMAL_PRIORITY, 0);
32693269
if (!rf_mac_setup->active_pd_data_request || rf_mac_setup->active_pd_data_request->fcf_dsn.intraPan == data_req.PanIdSuppressed) {
32703270
return false;
32713271
}
@@ -3277,7 +3277,7 @@ bool test_mcps_sap_data_req_handler_ext()
32773277
data_req.SrcAddrMode = MAC_ADDR_MODE_NONE;
32783278
data_req.PanIdSuppressed = false;
32793279
nsdynmemlib_stub.returnCounter = 1;
3280-
mcps_sap_data_req_handler_ext(rf_mac_setup, &data_req, &ie_list, NULL, MAC_DATA_NORMAL_PRIORITY);
3280+
mcps_sap_data_req_handler_ext(rf_mac_setup, &data_req, &ie_list, NULL, MAC_DATA_NORMAL_PRIORITY, 0);
32813281
if (!rf_mac_setup->active_pd_data_request || rf_mac_setup->active_pd_data_request->fcf_dsn.intraPan != data_req.PanIdSuppressed) {
32823282
return false;
32833283
}
@@ -3302,12 +3302,12 @@ bool test_mcps_sap_data_req_handler_ext()
33023302
expect_data_confirmation_status = MLME_INVALID_PARAMETER;
33033303
data_confirm_valid = false;
33043304

3305-
mcps_sap_data_req_handler_ext(rf_mac_setup, &data_req, &ie_list, &channel_list, MAC_DATA_NORMAL_PRIORITY);
3305+
mcps_sap_data_req_handler_ext(rf_mac_setup, &data_req, &ie_list, &channel_list, MAC_DATA_NORMAL_PRIORITY, 0);
33063306
if (rf_mac_setup->active_pd_data_request || !data_confirm_valid) {
33073307
return false;
33083308
}
33093309
data_req.TxAckReq = false;
3310-
mcps_sap_data_req_handler_ext(rf_mac_setup, &data_req, &ie_list, &channel_list, MAC_DATA_NORMAL_PRIORITY);
3310+
mcps_sap_data_req_handler_ext(rf_mac_setup, &data_req, &ie_list, &channel_list, MAC_DATA_NORMAL_PRIORITY, 0);
33113311
if (!rf_mac_setup->active_pd_data_request) {
33123312
return false;
33133313
}

test/nanostack/unittest/stub/mac_mcps_sap_stub.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ mac_mcps_sap_stub_def mac_mcps_sap_stub;
5555
void mcps_sap_data_req_handler(protocol_interface_rf_mac_setup_s *rf_mac_setup, const mcps_data_req_t *data_req)
5656
{
5757
}
58-
void mcps_sap_data_req_handler_ext(protocol_interface_rf_mac_setup_s *rf_mac_setup, const mcps_data_req_t *data_req, const mcps_data_req_ie_list_t *ie_list, const channel_list_s *asynch_channel_list, mac_data_priority_t priority)
58+
void mcps_sap_data_req_handler_ext(protocol_interface_rf_mac_setup_s *rf_mac_setup, const mcps_data_req_t *data_req, const mcps_data_req_ie_list_t *ie_list, const channel_list_s *asynch_channel_list, mac_data_priority_t priority, uint8_t phy_mode_id)
5959
{
6060

6161
}

0 commit comments

Comments
 (0)