Skip to content

Commit

Permalink
MCPS-Data-REQ API update
Browse files Browse the repository at this point in the history
Added support to MAC user to suppress sequence number and pan-id.


Change-Id: I326d07b03e114865353ab995611af48dc8dd2f77
  • Loading branch information
Juha Heiskanen authored and juhhei01 committed Jan 22, 2018
1 parent 38aedc5 commit 6e94b08
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 19 deletions.
2 changes: 2 additions & 0 deletions nanostack/mac_mcps.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ typedef struct mcps_data_req_s {
bool TxAckReq: 1; /**< Specifies whether ACK is needed or not */
bool InDirectTx:1; /**< Specifies whether indirect or direct transmission is used */
bool PendingBit: 1; /**< Specifies whether more fragments are to be sent or not */
bool SeqNumSuppressed:1; /**< True suppress sequence number from frame. This will be only checked when 2015 extension is enabled */
bool PanIdSuppressed:1; /**< True suppress PAN-id is done when possible from frame. This will be only checked when 2015 extension is enabled */
mlme_security_t Key; /**< Security key */
} mcps_data_req_t;

Expand Down
47 changes: 28 additions & 19 deletions source/MAC/IEEE802_15_4/mac_mcps_sap.c
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,6 @@ void mcps_sap_data_req_handler_ext(protocol_interface_rf_mac_setup_s *rf_mac_set
status = MLME_FRAME_TOO_LONG;
goto verify_status;
}
//protocol_interface_rf_mac_setup_s *rf_mac_setup = (protocol_interface_rf_mac_setup_s*)api;
buffer = mcps_sap_prebuild_frame_buffer_get(0);
//tr_debug("Data Req");
if (!buffer) {
Expand Down Expand Up @@ -217,8 +216,8 @@ void mcps_sap_data_req_handler_ext(protocol_interface_rf_mac_setup_s *rf_mac_set
buffer->fcf_dsn.SrcAddrMode = data_req->SrcAddrMode;
buffer->fcf_dsn.framePending = data_req->PendingBit;

if (buffer->fcf_dsn.SrcAddrMode == MAC_ADDR_MODE_NONE) {
if (buffer->fcf_dsn.DstAddrMode == MAC_ADDR_MODE_NONE) {
if (buffer->fcf_dsn.SrcAddrMode == MAC_ADDR_MODE_NONE && !rf_mac_setup->mac_extension_enabled) {
if (buffer->fcf_dsn.DstAddrMode == MAC_ADDR_MODE_NONE ) {
status = MLME_INVALID_ADDRESS;
goto verify_status;
}
Expand All @@ -238,27 +237,37 @@ void mcps_sap_data_req_handler_ext(protocol_interface_rf_mac_setup_s *rf_mac_set
buffer->ie_elements.payloadIovLength = ie_list->payloadIovLength;
buffer->headerIeLength = ie_header_length;
buffer->payloadsIeLength = ie_payload_length;
if (ie_header_length || ie_payload_length) {
buffer->fcf_dsn.frameVersion = MAC_FRAME_VERSION_2015;
buffer->fcf_dsn.informationElementsPresets = true;
}

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

if (buffer->fcf_dsn.DstAddrMode && buffer->fcf_dsn.SrcAddrMode) {
if (buffer->fcf_dsn.DstAddrMode != MAC_ADDR_MODE_64_BIT || buffer->fcf_dsn.SrcAddrMode != MAC_ADDR_MODE_64_BIT) {
buffer->fcf_dsn.intraPan = true;
}
}
if (rf_mac_setup->mac_extension_enabled) {
//Handle mac extension's
buffer->fcf_dsn.frameVersion = MAC_FRAME_VERSION_2015;
if (ie_header_length || ie_payload_length) {
buffer->fcf_dsn.informationElementsPresets = true;
}

} else {
buffer->fcf_dsn.sequenceNumberSuppress = data_req->SeqNumSuppressed;
if (buffer->fcf_dsn.sequenceNumberSuppress) {
buffer->mac_header_length_with_security--;
}
/* PAN-ID compression bit enable when necessary */
if (buffer->fcf_dsn.SrcAddrMode == MAC_ADDR_MODE_NONE && buffer->fcf_dsn.DstAddrMode == MAC_ADDR_MODE_NONE) {
buffer->fcf_dsn.intraPan = !data_req->PanIdSuppressed;
} else if (buffer->fcf_dsn.DstAddrMode == MAC_ADDR_MODE_NONE) {
buffer->fcf_dsn.intraPan = data_req->PanIdSuppressed;
} 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)) {
buffer->fcf_dsn.intraPan = data_req->PanIdSuppressed;
} else /* two addresses, at least one address short */ {
// ignore or fault panidsuppressed
if (buffer->DstPANId == buffer->SrcPANId ) {
buffer->fcf_dsn.intraPan = true;
}
}
} else {
/* PAN-ID compression bit enable when necessary */
if ((buffer->fcf_dsn.DstAddrMode && buffer->fcf_dsn.SrcAddrMode) && (buffer->DstPANId == buffer->SrcPANId)) {
buffer->fcf_dsn.intraPan = true;
}
} else if (buffer->fcf_dsn.DstAddrMode == MAC_ADDR_MODE_NONE && buffer->fcf_dsn.frameVersion == MAC_FRAME_VERSION_2015) {
//Suppress sequence number
buffer->fcf_dsn.sequenceNumberSuppress = true;
buffer->mac_header_length_with_security--;
}

//Check PanID presents at header
Expand Down
25 changes: 25 additions & 0 deletions test/nanostack/unittest/mac/mac_mcps_sap/test_mac_mcps_sap.c
Original file line number Diff line number Diff line change
Expand Up @@ -2924,12 +2924,37 @@ bool test_mcps_sap_data_req_handler_ext()
mac_mcps_buffer_queue_free(rf_mac_setup);

data_req.DstAddrMode = MAC_ADDR_MODE_NONE;
data_req.SeqNumSuppressed = true;
nsdynmemlib_stub.returnCounter = 1;
mcps_sap_data_req_handler_ext(rf_mac_setup, &data_req, &ie_list , NULL);
if (!rf_mac_setup->active_pd_data_request || !rf_mac_setup->active_pd_data_request->fcf_dsn.sequenceNumberSuppress) {
return false;
}

mac_mcps_buffer_queue_free(rf_mac_setup);

data_req.DstAddrMode = MAC_ADDR_MODE_NONE;
data_req.SrcAddrMode = MAC_ADDR_MODE_NONE;
data_req.SeqNumSuppressed = false;
data_req.PanIdSuppressed = true;
nsdynmemlib_stub.returnCounter = 1;
mcps_sap_data_req_handler_ext(rf_mac_setup, &data_req, &ie_list , NULL);
if (!rf_mac_setup->active_pd_data_request || rf_mac_setup->active_pd_data_request->fcf_dsn.intraPan == data_req.PanIdSuppressed) {
return false;
}


mac_mcps_buffer_queue_free(rf_mac_setup);

data_req.DstAddrMode = MAC_ADDR_MODE_16_BIT;
data_req.SrcAddrMode = MAC_ADDR_MODE_NONE;
data_req.PanIdSuppressed = false;
nsdynmemlib_stub.returnCounter = 1;
mcps_sap_data_req_handler_ext(rf_mac_setup, &data_req, &ie_list , NULL);
if (!rf_mac_setup->active_pd_data_request || rf_mac_setup->active_pd_data_request->fcf_dsn.intraPan != data_req.PanIdSuppressed ) {
return false;
}


mac_mcps_buffer_queue_free(rf_mac_setup);

Expand Down

0 comments on commit 6e94b08

Please sign in to comment.