HL-PDJ-1/components/802_15_4/api/MAC/mac_mlme_associate.h

337 lines
13 KiB
C
Raw Normal View History

2025-08-19 09:49:41 +08:00
/**
* Copyright (c) 2016 - 2020 Nordic Semiconductor ASA and Luxoft Global Operations Gmbh.
*
* All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form, except as embedded into a Nordic
* Semiconductor ASA integrated circuit in a product or a software update for
* such product, must reproduce the above copyright notice, this list of
* conditions and the following disclaimer in the documentation and/or other
* materials provided with the distribution.
*
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* 4. This software, with or without modification, must only be used with a
* Nordic Semiconductor ASA integrated circuit.
*
* 5. Any software provided in binary form under this license must not be reverse
* engineered, decompiled, modified and/or disassembled.
*
*
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
#ifndef MAC_MLME_ASSOCIATE_H_INCLUDED
#define MAC_MLME_ASSOCIATE_H_INCLUDED
#include <stdint.h>
#include "mac_common.h"
#include "mac_task_scheduler.h"
/** @file
* The MAC Association module declares the MAC Association routines and necessary types/macros
* according to the MAC specification.
*
* @defgroup mac_assoc MAC MLME Association API
* @ingroup mac_15_4
* @{
* @brief Module to declare MAC MLME Association API.
* @details The MLME Association module declares Association MAC routines and necessary macros/types according
* to the MAC specification. More specifically, MLME Association request aka mlme_associate_req(),
* MLME Association confirm callback typedef aka mlme_associate_conf_cb_t, MLME Association indication
* as mlme_associate_ind(), and MLME Response aka mlme_associate_resp() primitives are declared.
*/
/**
* @brief Capability information field.
*
* In accordance with IEEE Std 802.15.4-2006, section 7.3.1.2.
*/
#define ALTERNATE_PAN_COORDINATOR_BIT (0)
#define DEVICE_TYPE_BIT (1)
#define POWER_SOURCE_BIT (2)
#define RECEIVER_ON_WHEN_IDLE_BIT (3)
#define SECURITY_CAPABILITY_BIT (6)
#define ALLOCATE_ADDRESS_BIT (7)
/**
* @brief Valid values of the Association Status field
*
* In accordance with IEEE Std 802.15.4-2006, section 7.3.2.3
*/
typedef enum
{
MAC_ASSOCIATION_SUCCESSFUL = 0,
MAC_PAN_AT_CAPACITY,
MAC_PAN_ACCESS_DENIED
} mac_association_status_t;
/**
* @brief Capability information field
*
* In accordance with IEEE Std 802.15.4-2006, section 7.3.1.2.
*/
typedef struct
{
uint8_t alternate_pan_coordinator : 1;
uint8_t device_type : 1;
uint8_t power_source : 1;
uint8_t rx_on_when_idle : 1;
uint8_t reserved : 2;
uint8_t security_capability : 1;
uint8_t allocate_address : 1;
} mac_capability_t;
/**@brief The Alternate PAN Coordinator subfield of the Capability Information field. */
typedef enum
{
MAC_CAP_CANNOT_BE_PAN_COORD = 0, /**< Device is not capable of becoming
the PAN coordinator.*/
MAC_CAP_CAN_BE_PAN_COORD /**< Device is capable of becoming
the PAN coordinator.*/
} mac_cap_alt_pan_coord_t;
/**@brief The Device Type subfield of the Capability Information field. */
typedef enum
{
MAC_CAP_RFD_DEVICE = 0, /**< Device is an RFD.*/
MAC_CAP_FFD_DEVICE /**< Device is an FFD.*/
} mac_cap_device_type_t;
/**@brief The Power Source subfield of the Capability Information field. */
typedef enum
{
MAC_CAP_BATTERY_POWERED = 0, /**< Device is not AC-powered.*/
MAC_CAP_MAINS_POWERED /**< Device is receiving power from the
alternating current mains.*/
} mac_cap_power_source_t;
/**@brief The Receiver On When Idle subfield of the Capability Information field. */
typedef enum
{
MAC_CAP_RX_OFF_WHEN_IDLE = 0, /**< Device conserves power during idle.*/
MAC_CAP_RX_ON_WHEN_IDLE /**< Device does not disable its receiver
to conserve power during idle periods.*/
} mac_cap_rx_when_idle_t;
/**@brief The Security Capability subfield of the Capability Information field. */
typedef enum
{
MAC_CAP_CANNOT_SECURE = 0, /**< Device does not support securing.*/
MAC_CAP_CAN_SECURE /**< Device is capable of sending and receiving
cryptographically protected MAC frames.*/
} mac_cap_secure_t;
/**@brief The Allocate Address subfield of the Capability Information field. */
typedef enum
{
MAC_CAP_SHORT_ADDR_NOT_REQ = 0, /**< The coordinator will not allocate a
16-bit short address as a result of
the association procedure.*/
MAC_CAP_SHORT_ADDR_REQ /**< The coordinator will allocate a
16-bit short address as a result of
the association procedure.*/
} mac_cap_allocate_addr_t;
#if (CONFIG_ASSOCIATE_REQ_ENABLED == 1)
/**
* @brief MLME-ASSOCIATE.confirm
*
* The MLME-ASSOCIATE.confirm primitive is generated by the initiating MLME and
* issued to its next higher layer in response to an MLME-ASSOCIATE.request primitive.
*
* In accordance with IEEE Std 802.15.4-2006, section 7.1.3.4.
*/
typedef struct
{
uint16_t assoc_short_address; /**< Association short 16-bit address. */
mac_status_t status; /**< Status of operation. */
#if (CONFIG_SECURE == 1)
uint8_t security_level; /**< Security level. */
uint8_t key_id_mode; /**< Key ID mode. */
uint64_t key_source; /**< Key source. */
uint8_t key_index; /**< Key index. */
#endif
} mlme_associate_conf_t;
/**
* @brief MLME-ASSOCIATE.request.
*
* @details Allows a device to request an association with a coordinator.
*
* In accordance with IEEE Std 802.15.4-2006, section 7.1.3.1.
*/
typedef struct
{
/** Do not edit this field. */
mac_abstract_req_t service;
/** Confirmation to this request. */
mlme_associate_conf_t confirm;
/**
* A total of 27 channels numbered 0 to 26.
* are available per channel page (section 6.1.2.1).
*/
uint8_t logical_channel;
/**
* A total of 32 channel pages are available
* with channel pages 3 to 31 being reserved
* for future use (section 6.1.2.2).
*/
#ifdef CONFIG_SUB_GHZ
uint8_t channel_page; /**< Channel page. */
#endif
mac_addr_mode_t coord_addr_mode; /**< Coordinator address mode. */
uint16_t coord_pan_id; /**< Coordinator PAN ID. */
mac_addr_t coord_address; /**< Coordinator address. */
mac_capability_t capability_information; /**< Capability information. */
#if (CONFIG_SECURE == 1)
uint8_t security_level; /**< Security level. */
uint8_t key_id_mode; /**< Key ID mode. */
uint64_t key_source; /**< Key source. */
uint8_t key_index; /**< Key index. */
#endif
} mlme_associate_req_t;
#if (CONFIG_ASSOCIATE_IND_ENABLED == 1)
/**
* @brief MLME-ASSOCIATE.indication.
*
* @details The MLME-ASSOCIATE.indication primitive is generated by the MLME of
* the coordinator and issued to its next higher layer to indicate the reception
* of an association request command.
*
* In accordance with IEEE Std 802.15.4-2006, section 7.1.3.2.
*/
typedef struct
{
uint64_t device_address; /**< 64-bit IEEE address. */
uint8_t capability_information; /**< Capability information. */
#if (CONFIG_SECURE == 1)
uint8_t security_level; /**< Security level. */
uint8_t key_id_mode; /**< Key ID mode. */
uint64_t key_source; /**< Key source. */
uint8_t key_index; /**< Key index. */
#endif
} mlme_associate_ind_t;
/**
* @brief MLME-ASSOCIATE.response.
*
* @details Generated by the next higher layer of a coordinator and issued
* to its MLME in order to respond to the MLME-ASSOCIATE.indication primitive.
*
* In accordance with IEEE Std 802.15.4-2006, section 7.1.3.3.
*/
typedef struct
{
uint64_t device_address; /**< 64-bit IEEE address. */
uint16_t assoc_short_address; /**< Association short 16-bit address. */
mac_association_status_t status; /**< Status of operation. */
#if (CONFIG_SECURE == 1)
uint8_t security_level; /**< Security level. */
uint8_t key_id_mode; /**< Key ID mode. */
uint64_t key_source; /**< Key source. */
uint8_t key_index; /**< Key index. */
#endif
} mlme_associate_resp_t;
#endif // (CONFIG_ASSOCIATE_IND_ENABLED == 1)
/**
* @brief Confirmation function.
*
* @details The MLME-ASSOCIATE.confirm primitive is generated by the
* initiating MLME and issued to its next higher layer in response to
* an MLME-ASSOCIATE.request primitive. If the request was successful,
* the status parameter will indicate a successful association, as
* contained in the Status field of the association response command.
* Otherwise, the status parameter indicates either an error code from
* the received association response command or the appropriate error
* code from Table 50.
* The status values are fully described in 7.1.3.1.3 and subclauses referenced by 7.1.3.1.3.
*
* @param Pointer to confirmation primitive.
*/
typedef void (* mlme_associate_conf_cb_t)(mlme_associate_conf_t *);
/**
* @brief MLME-ASSOCIATE request.
*
* @details Requests an association with a PAN through a coordinator
* After request completion, user callback will be issued with
* valid data stored in structure mlme_set_conf_t.
*
* @param req MLME_ASSOCIATE request structure.
* @param conf_cb Pointer to user callback.
*
* In accordance with IEEE Std 802.15.4-2006, section 7.1.3.5
*/
void mlme_associate_req(mlme_associate_req_t * req, mlme_associate_conf_cb_t conf_cb);
#if (CONFIG_ASSOCIATE_IND_ENABLED == 1)
/**
* @brief MLME-ASSOCIATE indication handler.
*
* @details Indicates an association with a PAN through a coordinator
* next higher layer of a coordinator receives the MLME-ASSOCIATE.indication
* primitive to determine whether to accept or reject the unassociated device
* using an algorithm outside the scope of standard.
*
* @param ind MLME ASSOCIATE indication structure.
*
* In accordance with IEEE Std 802.15.4-2006, section 7.1.3.5.
*/
extern void mlme_associate_ind(mlme_associate_ind_t * ind);
/**
* @brief MLME-ASSOCIATE response.
*
* @details Respond to an association with a PAN and issue to its MLME in order to
* respond to the MLME-ASSOCIATE.indication.
* Response structure passed as a parameter to this function must be retained
* in memory until the related MLME-COMM-STATUS.indication is received.
*
* @param resp MLME_ASSOCIATE response structure.
*
* In accordance with IEEE Std 802.15.4-2006, section 7.1.3.5.
*/
void mlme_associate_resp(mlme_associate_resp_t * resp);
#endif // (CONFIG_ASSOCIATE_IND_ENABLED == 1)
#endif // (CONFIG_ASSOCIATE_REQ_ENABLED == 1)
/** @} */
#endif // MAC_MLME_ASSOCIATE_H_INCLUDED