pinebuds/services/ble_stack/hl/inc/gapc.h

237 lines
6.8 KiB
C

#ifndef _GAPC_H_
#define _GAPC_H_
/**
****************************************************************************************
* @addtogroup GAPC Generic Access Profile Controller
* @ingroup GAP
* @brief Generic Access Profile Controller.
*
* The GAP Controller module is responsible for providing an API to the application in
* to perform GAP action related to a BLE connection (pairing, update parameters,
* disconnect ...). GAP controller is multi-instantiated, one task instance per BLE
* connection.
*
* @{
****************************************************************************************
*/
/*
* INCLUDE FILES
****************************************************************************************
*/
#include "rwip_config.h"
#if (BLE_GAPC)
#include "ke_task.h"
#include "gap.h"
#include "smpc.h"
/*
* DEFINES
****************************************************************************************
*/
/// Operation type
enum gapc_op_type
{
/// Operation used to manage Link (update params, get peer info)
GAPC_OP_LINK_INFO = 0x00,
/// Operation used to manage SMP
GAPC_OP_SMP = 0x01,
/// Operation used to manage connection update
GAPC_OP_LINK_UPD = 0x02,
/// Max number of operations
GAPC_OP_MAX
};
/// Link security status. This status represents the authentication/authorization/bonding levels of the connection
enum gapc_lk_sec_req
{
/// Link is bonded
GAPC_LK_BONDED,
/// Link is Encrypted
GAPC_LK_ENCRYPTED,
/// Link LTK Exchanged during pairing
GAPC_LK_LTK_PRESENT,
};
/*
* TYPE DEFINITIONS
****************************************************************************************
*/
/// GAP controller environment variable structure.
struct gapc_env_tag
{
/// Request operation Kernel message
void* operation[GAPC_OP_MAX];
/// Task id requested disconnection
ke_task_id_t disc_requester;
/* Connection parameters to keep */
/// Security Management Protocol environment variables
struct smpc_env smpc;
/// connection handle
uint16_t conhdl;
/// Configuration fields (@see enum gapc_fields)
uint8_t fields;
// BD Address used for the link that should be kept
struct gap_bdaddr src[SMPC_INFO_MAX];
/// Relevant information of peer LE features 8-byte array
uint8_t features;
};
/*
* MACROS
****************************************************************************************
*/
/*
* FUNCTION DECLARATIONS
****************************************************************************************
*/
/**
****************************************************************************************
* @brief Retrieve connection index from connection handle.
*
* @param[in] conhdl Connection handle
*
* @return Return found connection index, GAP_INVALID_CONIDX if not found.
****************************************************************************************
*/
uint8_t gapc_get_conidx(uint16_t conhdl);
/**
****************************************************************************************
* @brief Retrieve connection handle from connection index.
*
* @param[in] conidx Connection index
*
* @return Return found connection handle, GAP_INVALID_CONHDL if not found.
****************************************************************************************
*/
uint16_t gapc_get_conhdl(uint8_t conidx);
/**
****************************************************************************************
* @brief Retrieve connection role from connection index.
*
* @param[in] conidx Connection index
*
* @return Return found connection role
****************************************************************************************
*/
uint8_t gapc_get_role(uint8_t conidx);
/**
****************************************************************************************
* @brief Retrieve connection address information on current link.
*
* @param[in] conidx Connection index
* @param[in] src Connection information source
*
* @return Return found connection address
****************************************************************************************
*/
struct gap_bdaddr* gapc_get_bdaddr(uint8_t conidx, uint8_t src);
/**
****************************************************************************************
* @brief Check if current link support security requirements.
*
* @param[in] conidx Connection index
* @param[in] sec_req Link security requirement to test
*
* @return True if link requirement is supported, False else.
****************************************************************************************
*/
bool gapc_is_sec_set(uint8_t conidx, uint8_t sec_req);
/**
****************************************************************************************
* @brief Retrieve Link Security level
*
* @param[in] conidx Connection index
*
* @return Link Security level.
****************************************************************************************
*/
uint8_t gapc_lk_sec_lvl_get(uint8_t conidx);
/**
****************************************************************************************
* @brief Retrieve the encryption key size of the connection
*
* @param[in] conidx Connection index
*
* @return encryption key size (size is 7 - 16 byte range)
*
****************************************************************************************
*/
uint8_t gapc_enc_keysize_get(uint8_t conidx);
/**
****************************************************************************************
* @brief Get Service Change Client Configuration
*
* @param[in] conidx Connection index
*
* @return Service Change Client Configuration
****************************************************************************************
*/
bool gapc_svc_chg_ccc_get(uint8_t conidx);
/**
****************************************************************************************
* @brief Set Service Change Client Configuration
*
* @param[in] conidx Connection index
* @param[in] enable True if CCC is enabled, False else
*
****************************************************************************************
*/
void gapc_svc_chg_ccc_set(uint8_t conidx, bool enable);
/**
****************************************************************************************
* Retrieve if current connection index is used for a discovery purpose such as
* Name discovery
*
* @param conidx Index of the specific connection
*
* @return true if connection has a discovery purpose, False else
****************************************************************************************
*/
bool gapc_is_disc_connection(uint8_t conidx);
bool gapc_get_remote_dev_feature(uint8_t conidx, uint8_t* ptrFeature);
#ifdef __GATT_OVER_BR_EDR__
uint8_t gapc_create_btgatt(uint16_t conhdl);
void gapc_clean_btgatt(uint8_t conidx);
#endif
#endif // (BLE_GAPC)
/// @} GAPC
#endif /* _GAPC_H_ */