Skip to content

Commit

Permalink
MAC API update and internal update
Browse files Browse the repository at this point in the history
MAC API extension update:
* mcps_data_request_ext() add support for 2015 MAC IE support
* mcps_data_indication_ext() API for receive 2015 messages with IE
* mcps_data_confirm_ext() API for rceive Enhanced ack payload with
normal conf
* mac_api_enable_mcps_ext() enable 2015 support and data indication

SW MAC Update:

Added support for new MCPS data extensions. Old Data request call
internally new API with empty IE list, 2015 MAC frame type is only used
when message include IE elements.

Added MAC 2015 support for generic FCF parse and build. Also Code size
should be smaller and code more readable.

Updated unit test and stub's

Change-Id: I4e7a614aec3603c4546bcc3801300f1a21f00a74
  • Loading branch information
Juha Heiskanen authored and juhhei01 committed Jan 17, 2018
1 parent ad5a1e1 commit c329f61
Show file tree
Hide file tree
Showing 27 changed files with 1,644 additions and 575 deletions.
39 changes: 39 additions & 0 deletions nanostack/mac_api.h
Expand Up @@ -120,6 +120,14 @@ typedef void mlme_request(const mac_api_t* api, mlme_primitive id, const void *d
*/
typedef void mcps_data_request(const mac_api_t* api, const mcps_data_req_t *data);

/**
* @brief mcps_request MCPS_DATA with IE extions request call
* @param api API to handle the request
* @param data MCPS-DATA.request specific values
* @param ie_ext Information element list to MCPS-DATA.request
*/
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);

/**
* @brief mcps_purge_request MCPS_PURGE request call
* @param api API to handle the request
Expand All @@ -136,13 +144,29 @@ typedef void mcps_purge_request(const mac_api_t* api, const mcps_purge_t *data);
*/
typedef void mcps_data_confirm(const mac_api_t* api, const mcps_data_conf_t *data);

/**
* @brief mcps_data_confirm_ext MCPS-DATA confirm with Enhanced ACK payload is called as a response to MCPS-DATA request
* @param api The API which handled the response
* @param data MCPS-DATA.confirm specific values
* @param conf_data Possible Confirmation Data
*/
typedef void mcps_data_confirm_ext(const mac_api_t* api, const mcps_data_conf_t *data, const mcps_data_conf_payload_t *conf_data);

/**
* @brief mcps_data_indication MCPS-DATA indication is called when MAC layer has received data
* @param api The API which handled the response
* @param data MCPS-DATA.indication specific values
*/
typedef void mcps_data_indication(const mac_api_t* api, const mcps_data_ind_t *data);

/**
* @brief mcps_data_indication MCPS-DATA indication is called when MAC layer has received data
* @param api The API which handled the response
* @param data MCPS-DATA.indication specific values
* @param ie_ext Information element list
*/
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);

/**
* @brief mcps_purge_confirm MCPS-PURGE confirm is called as a response to MCPS-PURGE request
* @param api The API which handled the request
Expand Down Expand Up @@ -201,6 +225,17 @@ typedef int8_t mac_api_initialize(mac_api_t *api, mcps_data_confirm *data_conf_c
mcps_data_indication *data_ind_cb, mcps_purge_confirm *purge_conf_cb, mlme_confirm *mlme_conf_cb,
mlme_indication *mlme_ind_cb, int8_t parent_id);

/**
* @brief mac_api_enable_mcps_ext Initialises MAC 2015 extension for MCPS layer into use, callbacks must be non-NULL.
* @param api mac_api_t pointer, which is created by application.
* @param data_ind_cb Upper layer function to handle MCPS indications
* @param data_cnf_cb Upper layer function to handle MCPS confirmation
* @return -1 if error, -2 if OOM, 0 otherwise
*/
typedef int8_t mac_api_enable_mcps_ext(mac_api_t *api,
mcps_data_indication_ext *data_ind_cb,
mcps_data_confirm_ext *data_cnf_cb);

/**
* \brief Struct mac_api_s defines functions for two-way communications between external MAC and Upper layer.
* Application creates mac_api_t object by calling external MAC's creator function.
Expand All @@ -209,14 +244,18 @@ typedef int8_t mac_api_initialize(mac_api_t *api, mcps_data_confirm *data_conf_c
*/
struct mac_api_s {
mac_api_initialize *mac_initialize; /**< MAC initialize function to use */
mac_api_enable_mcps_ext *mac_mcps_extension_enable; /**< MAC MCPS IE extension enable function, optional feature */
//External MAC callbacks
mlme_request *mlme_req; /**< MAC MLME request function to use */
mcps_data_request *mcps_data_req; /**< MAC MCPS data request function to use */
mcps_data_request_ext *mcps_data_req_ext; /**< MAC MCPS data request with Information element extension function to use */
mcps_purge_request *mcps_purge_req; /**< MAC MCPS purge request function to use */

//Upper layer callbacksMLME_ASSOCIATE
mcps_data_confirm *data_conf_cb; /**< MAC MCPS data confirm callback function */
mcps_data_confirm_ext *data_conf_ext_cb; /**< MAC MCPS data confirm with payload callback function */
mcps_data_indication *data_ind_cb; /**< MAC MCPS data indication callback function */
mcps_data_indication_ext *data_ind_ext_cb; /**< MAC MCPS data indication with IE extension's callback function */
mcps_purge_confirm *purge_conf_cb; /**< MAC MCPS purge confirm callback function */
mlme_confirm *mlme_conf_cb; /**< MAC MLME confirm callback function */
mlme_indication *mlme_ind_cb; /**< MAC MLME indication callback function */
Expand Down
33 changes: 33 additions & 0 deletions nanostack/mac_common_defines.h
Expand Up @@ -30,6 +30,7 @@

#define MAC_FRAME_VERSION_2003 0 /**< FCF - IEEE 802.15.4-2003 compatible */
#define MAC_FRAME_VERSION_2006 1 /**< FCF - IEEE 802.15.4-2006 (big payload or new security) */
#define MAC_FRAME_VERSION_2015 2 /**< FCF - IEEE 802.15.4-2015 (IE element support) */

//See IEEE standard 802.15.4-2006 (table 96) for more details about identifiers
#define MAC_KEY_ID_MODE_IMPLICIT 0 /**< Key identifier mode implicit */
Expand Down Expand Up @@ -66,4 +67,36 @@ typedef struct mlme_security_s {
uint8_t Keysource[8]; /**< Key source */
} mlme_security_t;

#define MAC_HEADER_VENDOR_SPESIFIC_IE_ID 0x00
#define MAC_HEADER_ASSIGNED_EXTERNAL_ORG_IE_ID 0x2a
#define MAC_HEADER_TERMINATION1_IE_ID 0x7e
#define MAC_HEADER_TERMINATION2_IE_ID 0x7f


/**
* @brief struct mac_header_IE_t Mac Header information element structure for parsing or write operation
* This structure encapsulates security related variables,
*/
typedef struct mac_header_IE_s {
const uint8_t *content_ptr; /**< Content data */
unsigned length:7; /**< Element length 0- 127 */
uint8_t id; /**< Element ID */
} mac_header_IE_t;

#define MAC_PAYLOAD_IE_ESDU_GROUP_ID 0x00
#define MAC_PAYLOAD_MLME_IE_GROUP_ID 0x01
#define MAC_PAYLOAD_VENDOR_IE_GROUP_ID 0x02
#define MAC_PAYLOAD_MPX_IE_GROUP_ID 0x03
#define MAC_PAYLOAD_TERMINATION_IE_GROUP_ID 0x0f

/**
* @brief struct mac_header_IE_t Mac Payload information element structure for parsing or write operation
* This structure encapsulates security related variables,
*/
typedef struct mac_payload_IE_s {
const uint8_t *content_ptr; /**< Content data */
unsigned length:11; /**< Element length 0- 2047 */
unsigned id:4; /**< Group ID */
} mac_payload_IE_t;

#endif /* MAC_COMMON_DEFINES_H_ */
49 changes: 49 additions & 0 deletions nanostack/mac_mcps.h
Expand Up @@ -58,6 +58,16 @@ typedef struct mcps_data_conf_s {
uint8_t tx_retries; /**< Number of retries done during sending, 0 means no retries */
} mcps_data_conf_t;


typedef struct mcps_data_conf_payload_s {
uint8_t *headerIeList; /**< Header information IE's list without terminator*/
uint8_t *payloadIeList; /**< Payload information IE's list without terminator*/
uint8_t *payloadPtr; /**< Ack payload pointer */
uint16_t headerIeListLength; /**< Header information IE's list length in bytes */
uint16_t payloadIeListLength; /**< Payload information IE's list length in bytes */
uint16_t payloadLength; /**< Payload length in bytes */
} mcps_data_conf_payload_t;

/**
* @brief struct mcps_data_ind_t Data indication structure
*
Expand All @@ -79,6 +89,45 @@ typedef struct mcps_data_ind_s {
uint8_t *msdu_ptr; /**< Data unit */
} mcps_data_ind_t;

/**
* @brief struct mcps_data_ie_list_t MCPS data Information element list stucture
*
* Structure for IEEE 802.15.4-2015 MCPS data extension to Indication and confirmation
*/
typedef struct mcps_data_ie_list {
uint8_t *headerIeList; /**< Header information IE's list without terminator*/
uint8_t *payloadIeList; /**< Payload information IE's list without terminator*/
uint16_t headerIeListLength; /**< Header information IE's list length in bytes */
uint16_t payloadIeListLength; /**< Payload information IE's list length in bytes */
} mcps_data_ie_list_t;

/** \brief Scatter-gather descriptor for MCPS request IE Element list
*
* Slightly optimised for small platforms - we assume we won't need any
* element bigger than 64K.
*/
typedef struct ns_ie_iovec {
void *ieBase; /**< IE element pointer */
uint_fast16_t iovLen; /**< IE element length */
} ns_ie_iovec_t;


/**
* @brief struct mcps_data_req_ie_list MCPS data Information element list stuctrure
*
* Structure for IEEE 802.15.4-2015 MCPS data extension to Request
*
* IE element could be divided to multiple vector which MAC just write to message direct.
*/
typedef struct mcps_data_req_ie_list {
ns_ie_iovec_t *headerIeVectorList; /**< Header IE element list */
ns_ie_iovec_t *payloadIeVectorList; /**< Payload IE element list */
uint16_t headerIovLength; /**< Header IE element list size, set 0 when no elements */
uint16_t payloadIovLength; /**< Payload IE element list size, set 0 when no elements */
} mcps_data_req_ie_list_t;



/**
* @brief struct mcps_purge_t Purge request structure
*
Expand Down
36 changes: 20 additions & 16 deletions source/MAC/IEEE802_15_4/mac_defines.h
Expand Up @@ -250,22 +250,26 @@ typedef struct protocol_interface_rf_mac_setup {
} protocol_interface_rf_mac_setup_s;


#define MAC_FCF_FRAME_TYPE_MASK 0x0007
#define MAC_FCF_FRAME_TYPE_SHIFT 0
#define MAC_FCF_SECURITY_BIT_MASK 0x0008
#define MAC_FCF_SECURITY_BIT_SHIFT 3
#define MAC_FCF_PENDING_BIT_MASK 0x0010
#define MAC_FCF_PENDING_BIT_SHIFT 4
#define MAC_FCF_ACK_REQ_BIT_MASK 0x0020
#define MAC_FCF_ACK_REQ_BIT_SHIFT 5
#define MAC_FCF_INTRA_PANID_MASK 0x0040
#define MAC_FCF_INTRA_PANID_SHIFT 6
#define MAC_FCF_DST_ADDR_MASK 0x0c00
#define MAC_FCF_DST_ADDR_SHIFT 10
#define MAC_FCF_VERSION_MASK 0x3000
#define MAC_FCF_VERSION_SHIFT 12
#define MAC_FCF_SRC_ADDR_MASK 0xc000
#define MAC_FCF_SRC_ADDR_SHIFT 14
#define MAC_FCF_FRAME_TYPE_MASK 0x0007
#define MAC_FCF_FRAME_TYPE_SHIFT 0
#define MAC_FCF_SECURITY_BIT_MASK 0x0008
#define MAC_FCF_SECURITY_BIT_SHIFT 3
#define MAC_FCF_PENDING_BIT_MASK 0x0010
#define MAC_FCF_PENDING_BIT_SHIFT 4
#define MAC_FCF_ACK_REQ_BIT_MASK 0x0020
#define MAC_FCF_ACK_REQ_BIT_SHIFT 5
#define MAC_FCF_INTRA_PANID_MASK 0x0040
#define MAC_FCF_INTRA_PANID_SHIFT 6
#define MAC_FCF_SEQ_NUM_SUPPRESS_MASK 0x0100
#define MAC_FCF_SEQ_NUM_SUPPRESS_SHIFT 8
#define MAC_FCF_IE_PRESENTS_MASK 0x0200
#define MAC_FCF_IE_PRESENTS_SHIFT 9
#define MAC_FCF_DST_ADDR_MASK 0x0c00
#define MAC_FCF_DST_ADDR_SHIFT 10
#define MAC_FCF_VERSION_MASK 0x3000
#define MAC_FCF_VERSION_SHIFT 12
#define MAC_FCF_SRC_ADDR_MASK 0xc000
#define MAC_FCF_SRC_ADDR_SHIFT 14

/* MAC supported frame types */
#define FC_BEACON_FRAME 0x00
Expand Down
1 change: 1 addition & 0 deletions source/MAC/IEEE802_15_4/mac_filter.c
Expand Up @@ -26,6 +26,7 @@
#include "mac_filter.h"
#include "mac_common_defines.h"

#include "mac_mcps.h"
#include "MAC/IEEE802_15_4/mac_mcps_sap.h"
#include "MAC/IEEE802_15_4/mac_header_helper_functions.h"

Expand Down

0 comments on commit c329f61

Please sign in to comment.