Skip to content

Commit d2f5347

Browse files
author
Juha Heiskanen
committed
MPX and MAC API update
Added possibility to set data priority for MAC abd MPX data request.
1 parent 7310cc0 commit d2f5347

File tree

14 files changed

+120
-46
lines changed

14 files changed

+120
-46
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
* Added support for Anonymous address generation in DHCPv6 server for Wi-SUN Border router
99
* Improved Wi-SUN Async messaging statics. Time spent in different states and neighbor management changes.
1010
* Created API to get the Wi-SUN Neighbor table with basic information from the neighbor.
11+
* Added support for set MAC and MPX Data Request priority.
1112

1213
### Changes
1314
* Added throttling of number of simultaneous EAPOL authentications based on Border Router TX queue size

nanostack/mac_api.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,10 +128,11 @@ typedef void mcps_data_request(const mac_api_t *api, const mcps_data_req_t *data
128128
* @param data MCPS-DATA.request specific values
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.
131+
* @param priority Data request priority level
131132
*
132133
* Asynch data request is mac standard extension. asynch_channel_list include channel mask which channel message is requested to send.
133134
*/
134-
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);
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);
135136

136137
/**
137138
* @brief mcps_purge_request MCPS_PURGE request call

nanostack/mac_mcps.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,5 +192,17 @@ typedef struct mcps_edfe_response_s {
192192
bool use_message_handle_to_discover: 1; /**< EDFE Data request message ID is valid at message_handle. */
193193
} mcps_edfe_response_t;
194194

195+
/**
196+
* @brief enum mac_data_priority_t Data request priority level
197+
*
198+
* Data request priority level may affect CCA process and MAC queue process
199+
*/
200+
typedef enum mac_data_priority_e {
201+
MAC_DATA_NORMAL_PRIORITY = 0, /**< Normal MCPS DATA REQ */
202+
MAC_DATA_MEDIUM_PRIORITY = 1, /**< Indirect Data which is polled */
203+
MAC_DATA_HIGH_PRIORITY = 2, /**< MAC command usually use this and beacon */
204+
MAC_DATA_EXPEDITE_FORWARD = 3 /**< Expedite forward level give highest priority */
205+
} mac_data_priority_t;
206+
195207

196208
#endif // MAC_MCPS_H

source/6LoWPAN/MAC/mpx_api.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
#ifndef MPX_API_H_
1919
#define MPX_API_H_
20-
20+
#include "mac_mcps.h"
2121
struct mcps_data_req_s;
2222
struct mcps_data_conf_s;
2323
struct mcps_data_ind_s;
@@ -30,9 +30,10 @@ typedef struct mpx_api_s mpx_api_t;
3030
* @param api API to handle the request
3131
* @param data MCPS-DATA.request specific values
3232
* @param user_id MPX user ID
33+
* @param priority priority level
3334
*
3435
*/
35-
typedef void mpx_data_request(const mpx_api_t *api, const struct mcps_data_req_s *data, uint16_t user_id);
36+
typedef void mpx_data_request(const mpx_api_t *api, const struct mcps_data_req_s *data, uint16_t user_id, mac_data_priority_t priority);
3637

3738
/**
3839
* @brief mpx_data_queue_clean clean MPX user data

source/6LoWPAN/adaptation_interface.c

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1060,12 +1060,34 @@ static void lowpan_data_request_to_mac(protocol_interface_info_entry_t *cur, buf
10601060
buf->link_specific.ieee802_15_4.rf_channel_switch = false;
10611061
}
10621062
}
1063+
//Define data priority
1064+
mac_data_priority_t data_priority;
1065+
1066+
switch (buf->priority) {
1067+
case QOS_HIGH:
1068+
data_priority = MAC_DATA_MEDIUM_PRIORITY;
1069+
break;
1070+
case QOS_NETWORK_CTRL:
1071+
data_priority = MAC_DATA_HIGH_PRIORITY;
1072+
break;
1073+
case QOS_EXPEDITE_FORWARD:
1074+
data_priority = MAC_DATA_EXPEDITE_FORWARD;
1075+
break;
1076+
case QOS_MAC_BEACON:
1077+
data_priority = MAC_DATA_HIGH_PRIORITY;
1078+
break;
1079+
default:
1080+
data_priority = MAC_DATA_NORMAL_PRIORITY;
1081+
break;
1082+
}
10631083

10641084
if (interface_ptr->mpx_api) {
10651085
dataReq.ExtendedFrameExchange = buf->options.edfe_mode;
1066-
interface_ptr->mpx_api->mpx_data_request(interface_ptr->mpx_api, &dataReq, interface_ptr->mpx_user_id);
1086+
interface_ptr->mpx_api->mpx_data_request(interface_ptr->mpx_api, &dataReq, interface_ptr->mpx_user_id, data_priority);
10671087
} else {
1068-
cur->mac_api->mcps_data_req(cur->mac_api, &dataReq);
1088+
mcps_data_req_ie_list_t ie_list;
1089+
memset(&ie_list, 0, sizeof(mcps_data_req_ie_list_t));
1090+
cur->mac_api->mcps_data_req_ext(cur->mac_api, &dataReq, &ie_list, NULL, data_priority);
10691091
}
10701092
}
10711093

source/6LoWPAN/ws/ws_eapol_pdu.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ int8_t ws_eapol_pdu_send_to_mpx(protocol_interface_info_entry_t *interface_ptr,
214214

215215
eapol_pdu_data->msdu_handle++;
216216

217-
eapol_pdu_data->mpx_api->mpx_data_request(eapol_pdu_data->mpx_api, &data_request, eapol_pdu_data->mpx_user_id);
217+
eapol_pdu_data->mpx_api->mpx_data_request(eapol_pdu_data->mpx_api, &data_request, eapol_pdu_data->mpx_user_id, MAC_DATA_NORMAL_PRIORITY);
218218
return 0;
219219
}
220220

source/6LoWPAN/ws/ws_llc_data_service.c

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ typedef struct {
9191
uint8_t mpx_user_handle; /**< This MPX user defined handle */
9292
ns_ie_iovec_t ie_vector_list[3]; /**< IE vectors: 1 for Header's, 1 for Payload and for MPX payload */
9393
mcps_data_req_ie_list_t ie_ext;
94+
mac_data_priority_t priority;
9495
ns_list_link_t link; /**< List link entry */
9596
uint8_t ie_buffer[]; /**< Trailing buffer data */
9697
} llc_message_t;
@@ -162,7 +163,7 @@ static llc_data_base_t *ws_llc_base_allocate(void);
162163
static void ws_llc_mac_confirm_cb(const mac_api_t *api, const mcps_data_conf_t *data, const mcps_data_conf_payload_t *conf_data);
163164
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);
164165
static uint16_t ws_mpx_header_size_get(llc_data_base_t *base, uint16_t user_id);
165-
static void ws_llc_mpx_data_request(const mpx_api_t *api, const struct mcps_data_req_s *data, uint16_t user_id);
166+
static void ws_llc_mpx_data_request(const mpx_api_t *api, const struct mcps_data_req_s *data, uint16_t user_id, mac_data_priority_t priority);
166167
static int8_t ws_llc_mpx_data_cb_register(const mpx_api_t *api, mpx_data_confirm *confirm_cb, mpx_data_indication *indication_cb, uint16_t user_id);
167168
static uint16_t ws_llc_mpx_header_size_get(const mpx_api_t *api, uint16_t user_id);
168169
static uint8_t ws_llc_mpx_data_purge_request(const mpx_api_t *api, struct mcps_purge_s *purge, uint16_t user_id);
@@ -290,6 +291,7 @@ static llc_message_t *llc_message_allocate(uint16_t ie_buffer_size, llc_data_bas
290291
}
291292
message->ack_requested = false;
292293
message->eapol_temporary = false;
294+
message->priority = MAC_DATA_NORMAL_PRIORITY;
293295
return message;
294296
}
295297

@@ -975,7 +977,7 @@ static void ws_llc_lowpan_mpx_header_set(llc_message_t *message, uint16_t user_i
975977
message->ie_vector_list[1].iovLen = ptr - (uint8_t *)message->ie_vector_list[1].ieBase;
976978
}
977979

978-
static void ws_llc_lowpan_mpx_data_request(llc_data_base_t *base, mpx_user_t *user_cb, const struct mcps_data_req_s *data)
980+
static void ws_llc_lowpan_mpx_data_request(llc_data_base_t *base, mpx_user_t *user_cb, const struct mcps_data_req_s *data, mac_data_priority_t priority)
979981
{
980982
wh_ie_sub_list_t ie_header_mask;
981983
memset(&ie_header_mask, 0, sizeof(wh_ie_sub_list_t));
@@ -1026,6 +1028,7 @@ static void ws_llc_lowpan_mpx_data_request(llc_data_base_t *base, mpx_user_t *us
10261028
//Add To active list
10271029
llc_message_id_allocate(message, base, true);
10281030
base->llc_message_list_size++;
1031+
message->priority = priority;
10291032
random_early_detetction_aq_calc(base->interface_ptr->llc_random_early_detection, base->llc_message_list_size);
10301033
ns_list_add_to_end(&base->llc_message_list, message);
10311034

@@ -1104,7 +1107,7 @@ static void ws_llc_lowpan_mpx_data_request(llc_data_base_t *base, mpx_user_t *us
11041107
message->ie_ext.payloadIovLength = 0; //Set Back 2 at response handler
11051108
}
11061109

1107-
base->interface_ptr->mac_api->mcps_data_req_ext(base->interface_ptr->mac_api, &data_req, &message->ie_ext, NULL);
1110+
base->interface_ptr->mac_api->mcps_data_req_ext(base->interface_ptr->mac_api, &data_req, &message->ie_ext, NULL, message->priority);
11081111
}
11091112

11101113
static bool ws_llc_eapol_temp_entry_set(llc_data_base_t *base, const uint8_t *mac64)
@@ -1159,11 +1162,11 @@ static void ws_llc_mpx_eapol_send(llc_data_base_t *base, llc_message_t *message)
11591162
message->eapol_temporary = ws_llc_eapol_temp_entry_set(base, message->dst_address);
11601163
ws_llc_eapol_data_req_init(&data_req, message);
11611164
base->temp_entries->active_eapol_session = true;
1162-
base->interface_ptr->mac_api->mcps_data_req_ext(base->interface_ptr->mac_api, &data_req, &message->ie_ext, NULL);
1165+
base->interface_ptr->mac_api->mcps_data_req_ext(base->interface_ptr->mac_api, &data_req, &message->ie_ext, NULL, message->priority);
11631166
}
11641167

11651168

1166-
static void ws_llc_mpx_eapol_request(llc_data_base_t *base, mpx_user_t *user_cb, const struct mcps_data_req_s *data)
1169+
static void ws_llc_mpx_eapol_request(llc_data_base_t *base, mpx_user_t *user_cb, const struct mcps_data_req_s *data, mac_data_priority_t priority)
11671170
{
11681171
wh_ie_sub_list_t ie_header_mask;
11691172
memset(&ie_header_mask, 0, sizeof(wh_ie_sub_list_t));
@@ -1198,6 +1201,7 @@ static void ws_llc_mpx_eapol_request(llc_data_base_t *base, mpx_user_t *user_cb,
11981201
user_cb->data_confirm(&base->mpx_data_base.mpx_api, &data_conf);
11991202
return;
12001203
}
1204+
message->priority = priority;
12011205
message->mpx_user_handle = data->msduHandle;
12021206
message->ack_requested = data->TxAckReq;
12031207

@@ -1257,7 +1261,7 @@ static void ws_llc_mpx_eapol_request(llc_data_base_t *base, mpx_user_t *user_cb,
12571261
}
12581262

12591263

1260-
static void ws_llc_mpx_data_request(const mpx_api_t *api, const struct mcps_data_req_s *data, uint16_t user_id)
1264+
static void ws_llc_mpx_data_request(const mpx_api_t *api, const struct mcps_data_req_s *data, uint16_t user_id, mac_data_priority_t priority)
12611265
{
12621266
llc_data_base_t *base = ws_llc_discover_by_mpx(api);
12631267
if (!base) {
@@ -1280,9 +1284,9 @@ static void ws_llc_mpx_data_request(const mpx_api_t *api, const struct mcps_data
12801284
}
12811285

12821286
if (user_id == MPX_KEY_MANAGEMENT_ENC_USER_ID) {
1283-
ws_llc_mpx_eapol_request(base, user_cb, data);
1287+
ws_llc_mpx_eapol_request(base, user_cb, data, priority);
12841288
} else if (user_id == MPX_LOWPAN_ENC_USER_ID) {
1285-
ws_llc_lowpan_mpx_data_request(base, user_cb, data);
1289+
ws_llc_lowpan_mpx_data_request(base, user_cb, data, priority);
12861290
}
12871291
}
12881292

@@ -1800,7 +1804,7 @@ int8_t ws_llc_asynch_request(struct protocol_interface_info_entry *interface, as
18001804
}
18011805
}
18021806

1803-
base->interface_ptr->mac_api->mcps_data_req_ext(base->interface_ptr->mac_api, &data_req, &message->ie_ext, &request->channel_list);
1807+
base->interface_ptr->mac_api->mcps_data_req_ext(base->interface_ptr->mac_api, &data_req, &message->ie_ext, &request->channel_list, message->priority);
18041808

18051809
return 0;
18061810
}

source/MAC/IEEE802_15_4/mac_mcps_sap.c

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ void mcps_sap_data_req_handler(protocol_interface_rf_mac_setup_s *rf_mac_setup,
154154
{
155155
mcps_data_req_ie_list_t ie_list;
156156
memset(&ie_list, 0, sizeof(mcps_data_req_ie_list_t));
157-
mcps_sap_data_req_handler_ext(rf_mac_setup, data_req, &ie_list, NULL);
157+
mcps_sap_data_req_handler_ext(rf_mac_setup, data_req, &ie_list, NULL, MAC_DATA_NORMAL_PRIORITY);
158158
}
159159

160160
static bool mac_ie_vector_length_validate(ns_ie_iovec_t *ie_vector, uint16_t iov_length, uint16_t *length_out)
@@ -193,7 +193,7 @@ static bool mac_ie_vector_length_validate(ns_ie_iovec_t *ie_vector, uint16_t iov
193193
}
194194

195195

196-
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)
196+
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)
197197
{
198198
uint8_t status = MLME_SUCCESS;
199199
mac_pre_build_frame_t *buffer = NULL;
@@ -265,6 +265,23 @@ void mcps_sap_data_req_handler_ext(protocol_interface_rf_mac_setup_s *rf_mac_set
265265
buffer->asynch_request = true;
266266
}
267267

268+
//Set Priority level
269+
switch (priority) {
270+
case MAC_DATA_EXPEDITE_FORWARD:
271+
buffer->priority = MAC_PD_DATA_EF_PRIORITY;
272+
break;
273+
case MAC_DATA_HIGH_PRIORITY:
274+
buffer->priority = MAC_PD_DATA_HIGH_PRIOTITY;
275+
break;
276+
case MAC_DATA_MEDIUM_PRIORITY:
277+
buffer->priority = MAC_PD_DATA_MEDIUM_PRIORITY;
278+
break;
279+
default:
280+
buffer->priority = MAC_PD_DATA_NORMAL_PRIORITY;
281+
break;
282+
}
283+
284+
268285
buffer->upper_layer_request = true;
269286
buffer->fcf_dsn.frametype = FC_DATA_FRAME;
270287
buffer->ExtendedFrameExchange = data_req->ExtendedFrameExchange;

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);
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);
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: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ static int8_t ns_sw_mac_api_enable_edfe_ext(mac_api_t *api, mcps_edfe_handler *e
5858

5959
static void mlme_req(const mac_api_t *api, mlme_primitive id, const void *data);
6060
static void mcps_req(const mac_api_t *api, const mcps_data_req_t *data);
61-
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);
61+
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);
6262
static uint8_t purge_req(const mac_api_t *api, const mcps_purge_t *data);
6363
static int8_t macext_mac64_address_set(const mac_api_t *api, const uint8_t *mac64);
6464
static int8_t macext_mac64_address_get(const mac_api_t *api, mac_extended_address_type type, uint8_t *mac64_buf);
@@ -575,22 +575,22 @@ void mlme_req(const mac_api_t *api, mlme_primitive id, const void *data)
575575
}
576576
}
577577

578-
void mcps_req(const mac_api_t *api, const mcps_data_req_t *data)
578+
static void mcps_req(const mac_api_t *api, const mcps_data_req_t *data)
579579
{
580580
//TODO: Populate linked list when present
581581
if (mac_store.mac_api == api) {
582582
/* Call direct new API but without IE extensions */
583583
mcps_data_req_ie_list_t ie_list;
584584
memset(&ie_list, 0, sizeof(mcps_data_req_ie_list_t));
585-
mcps_sap_data_req_handler_ext(mac_store.setup, data, &ie_list, NULL);
585+
mcps_sap_data_req_handler_ext(mac_store.setup, data, &ie_list, NULL, MAC_DATA_NORMAL_PRIORITY);
586586
}
587587
}
588588

589-
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)
589+
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)
590590
{
591591
//TODO: Populate linked list when present
592592
if (mac_store.mac_api == api) {
593-
mcps_sap_data_req_handler_ext(mac_store.setup, data, ie_ext, asynch_channel_list);
593+
mcps_sap_data_req_handler_ext(mac_store.setup, data, ie_ext, asynch_channel_list, priority);
594594
}
595595
}
596596

0 commit comments

Comments
 (0)