Skip to content

Commit 6e94b08

Browse files
Juha Heiskanenjuhhei01
authored andcommitted
MCPS-Data-REQ API update
Added support to MAC user to suppress sequence number and pan-id. Change-Id: I326d07b03e114865353ab995611af48dc8dd2f77
1 parent 38aedc5 commit 6e94b08

File tree

3 files changed

+55
-19
lines changed

3 files changed

+55
-19
lines changed

nanostack/mac_mcps.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ typedef struct mcps_data_req_s {
4141
bool TxAckReq: 1; /**< Specifies whether ACK is needed or not */
4242
bool InDirectTx:1; /**< Specifies whether indirect or direct transmission is used */
4343
bool PendingBit: 1; /**< Specifies whether more fragments are to be sent or not */
44+
bool SeqNumSuppressed:1; /**< True suppress sequence number from frame. This will be only checked when 2015 extension is enabled */
45+
bool PanIdSuppressed:1; /**< True suppress PAN-id is done when possible from frame. This will be only checked when 2015 extension is enabled */
4446
mlme_security_t Key; /**< Security key */
4547
} mcps_data_req_t;
4648

source/MAC/IEEE802_15_4/mac_mcps_sap.c

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,6 @@ void mcps_sap_data_req_handler_ext(protocol_interface_rf_mac_setup_s *rf_mac_set
174174
status = MLME_FRAME_TOO_LONG;
175175
goto verify_status;
176176
}
177-
//protocol_interface_rf_mac_setup_s *rf_mac_setup = (protocol_interface_rf_mac_setup_s*)api;
178177
buffer = mcps_sap_prebuild_frame_buffer_get(0);
179178
//tr_debug("Data Req");
180179
if (!buffer) {
@@ -217,8 +216,8 @@ void mcps_sap_data_req_handler_ext(protocol_interface_rf_mac_setup_s *rf_mac_set
217216
buffer->fcf_dsn.SrcAddrMode = data_req->SrcAddrMode;
218217
buffer->fcf_dsn.framePending = data_req->PendingBit;
219218

220-
if (buffer->fcf_dsn.SrcAddrMode == MAC_ADDR_MODE_NONE) {
221-
if (buffer->fcf_dsn.DstAddrMode == MAC_ADDR_MODE_NONE) {
219+
if (buffer->fcf_dsn.SrcAddrMode == MAC_ADDR_MODE_NONE && !rf_mac_setup->mac_extension_enabled) {
220+
if (buffer->fcf_dsn.DstAddrMode == MAC_ADDR_MODE_NONE ) {
222221
status = MLME_INVALID_ADDRESS;
223222
goto verify_status;
224223
}
@@ -238,27 +237,37 @@ void mcps_sap_data_req_handler_ext(protocol_interface_rf_mac_setup_s *rf_mac_set
238237
buffer->ie_elements.payloadIovLength = ie_list->payloadIovLength;
239238
buffer->headerIeLength = ie_header_length;
240239
buffer->payloadsIeLength = ie_payload_length;
241-
if (ie_header_length || ie_payload_length) {
242-
buffer->fcf_dsn.frameVersion = MAC_FRAME_VERSION_2015;
243-
buffer->fcf_dsn.informationElementsPresets = true;
244-
}
245240

246-
if (buffer->fcf_dsn.DstAddrMode && buffer->DstPANId == buffer->SrcPANId) {
247-
if (buffer->fcf_dsn.frameVersion == MAC_FRAME_VERSION_2015) {
248241

249-
if (buffer->fcf_dsn.DstAddrMode && buffer->fcf_dsn.SrcAddrMode) {
250-
if (buffer->fcf_dsn.DstAddrMode != MAC_ADDR_MODE_64_BIT || buffer->fcf_dsn.SrcAddrMode != MAC_ADDR_MODE_64_BIT) {
251-
buffer->fcf_dsn.intraPan = true;
252-
}
253-
}
242+
if (rf_mac_setup->mac_extension_enabled) {
243+
//Handle mac extension's
244+
buffer->fcf_dsn.frameVersion = MAC_FRAME_VERSION_2015;
245+
if (ie_header_length || ie_payload_length) {
246+
buffer->fcf_dsn.informationElementsPresets = true;
247+
}
254248

255-
} else {
249+
buffer->fcf_dsn.sequenceNumberSuppress = data_req->SeqNumSuppressed;
250+
if (buffer->fcf_dsn.sequenceNumberSuppress) {
251+
buffer->mac_header_length_with_security--;
252+
}
253+
/* PAN-ID compression bit enable when necessary */
254+
if (buffer->fcf_dsn.SrcAddrMode == MAC_ADDR_MODE_NONE && buffer->fcf_dsn.DstAddrMode == MAC_ADDR_MODE_NONE) {
255+
buffer->fcf_dsn.intraPan = !data_req->PanIdSuppressed;
256+
} else if (buffer->fcf_dsn.DstAddrMode == MAC_ADDR_MODE_NONE) {
257+
buffer->fcf_dsn.intraPan = data_req->PanIdSuppressed;
258+
} else if (buffer->fcf_dsn.SrcAddrMode == MAC_ADDR_MODE_NONE || (buffer->fcf_dsn.SrcAddrMode == MAC_ADDR_MODE_64_BIT && buffer->fcf_dsn.DstAddrMode == MAC_ADDR_MODE_64_BIT)) {
259+
buffer->fcf_dsn.intraPan = data_req->PanIdSuppressed;
260+
} else /* two addresses, at least one address short */ {
261+
// ignore or fault panidsuppressed
262+
if (buffer->DstPANId == buffer->SrcPANId ) {
263+
buffer->fcf_dsn.intraPan = true;
264+
}
265+
}
266+
} else {
267+
/* PAN-ID compression bit enable when necessary */
268+
if ((buffer->fcf_dsn.DstAddrMode && buffer->fcf_dsn.SrcAddrMode) && (buffer->DstPANId == buffer->SrcPANId)) {
256269
buffer->fcf_dsn.intraPan = true;
257270
}
258-
} else if (buffer->fcf_dsn.DstAddrMode == MAC_ADDR_MODE_NONE && buffer->fcf_dsn.frameVersion == MAC_FRAME_VERSION_2015) {
259-
//Suppress sequence number
260-
buffer->fcf_dsn.sequenceNumberSuppress = true;
261-
buffer->mac_header_length_with_security--;
262271
}
263272

264273
//Check PanID presents at header

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

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2924,12 +2924,37 @@ bool test_mcps_sap_data_req_handler_ext()
29242924
mac_mcps_buffer_queue_free(rf_mac_setup);
29252925

29262926
data_req.DstAddrMode = MAC_ADDR_MODE_NONE;
2927+
data_req.SeqNumSuppressed = true;
29272928
nsdynmemlib_stub.returnCounter = 1;
29282929
mcps_sap_data_req_handler_ext(rf_mac_setup, &data_req, &ie_list , NULL);
29292930
if (!rf_mac_setup->active_pd_data_request || !rf_mac_setup->active_pd_data_request->fcf_dsn.sequenceNumberSuppress) {
29302931
return false;
29312932
}
29322933

2934+
mac_mcps_buffer_queue_free(rf_mac_setup);
2935+
2936+
data_req.DstAddrMode = MAC_ADDR_MODE_NONE;
2937+
data_req.SrcAddrMode = MAC_ADDR_MODE_NONE;
2938+
data_req.SeqNumSuppressed = false;
2939+
data_req.PanIdSuppressed = true;
2940+
nsdynmemlib_stub.returnCounter = 1;
2941+
mcps_sap_data_req_handler_ext(rf_mac_setup, &data_req, &ie_list , NULL);
2942+
if (!rf_mac_setup->active_pd_data_request || rf_mac_setup->active_pd_data_request->fcf_dsn.intraPan == data_req.PanIdSuppressed) {
2943+
return false;
2944+
}
2945+
2946+
2947+
mac_mcps_buffer_queue_free(rf_mac_setup);
2948+
2949+
data_req.DstAddrMode = MAC_ADDR_MODE_16_BIT;
2950+
data_req.SrcAddrMode = MAC_ADDR_MODE_NONE;
2951+
data_req.PanIdSuppressed = false;
2952+
nsdynmemlib_stub.returnCounter = 1;
2953+
mcps_sap_data_req_handler_ext(rf_mac_setup, &data_req, &ie_list , NULL);
2954+
if (!rf_mac_setup->active_pd_data_request || rf_mac_setup->active_pd_data_request->fcf_dsn.intraPan != data_req.PanIdSuppressed ) {
2955+
return false;
2956+
}
2957+
29332958

29342959
mac_mcps_buffer_queue_free(rf_mac_setup);
29352960

0 commit comments

Comments
 (0)