blob: c27063807f5299666234599b6f9dbb99cf8ad4e5 [file] [log] [blame]
/*
* Copyright (c) 2018-2019 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: Apache-2.0
*/
static inline void feature_unmask_features(struct ll_conn *conn, uint64_t ll_feat_mask)
{
conn->llcp.fex.features_used &= ~ll_feat_mask;
}
static inline bool feature_le_encryption(struct ll_conn *conn)
{
#if defined(CONFIG_BT_CTLR_LE_ENC)
return (conn->llcp.fex.features_used & LL_FEAT_BIT_ENC) != 0;
#else
return 0;
#endif
}
static inline bool feature_conn_param_req(struct ll_conn *conn)
{
#if defined(CONFIG_BT_CTLR_CONN_PARAM_REQ)
return (conn->llcp.fex.features_used & LL_FEAT_BIT_CONN_PARAM_REQ) != 0;
#else
return 0;
#endif
}
static inline bool feature_ext_rej_ind(struct ll_conn *conn)
{
#if defined(CONFIG_BT_CTLR_EXT_REJ_IND)
return (conn->llcp.fex.features_used & LL_FEAT_BIT_EXT_REJ_IND) != 0;
#else
return 0;
#endif
}
static inline bool feature_periph_feat_req(struct ll_conn *conn)
{
#if defined(CONFIG_BT_CTLR_PER_INIT_FEAT_XCHG)
return (conn->llcp.fex.features_used & LL_FEAT_BIT_PER_INIT_FEAT_XCHG) != 0;
#else
return 0;
#endif
}
static inline bool feature_le_ping(struct ll_conn *conn)
{
#if defined(CONFIG_BT_CTLR_LE_PING)
return (conn->llcp.fex.features_used & LL_FEAT_BIT_PING) != 0;
#else
return 0;
#endif
}
static inline bool feature_dle(struct ll_conn *conn)
{
#if defined(CONFIG_BT_CTLR_DATA_LENGTH)
return (conn->llcp.fex.features_used & LL_FEAT_BIT_DLE) != 0;
#else
return 0;
#endif
}
static inline bool feature_privacy(struct ll_conn *conn)
{
#if defined(CONFIG_BT_CTLR_PRIVACY)
return (conn->llcp.fex.features_used & LL_FEAT_BIT_PRIVACY) != 0;
#else
return 0;
#endif
}
static inline bool feature_ext_scan(struct ll_conn *conn)
{
#if defined(CONFIG_BT_CTLR_EXT_SCAN_FP)
return (conn->llcp.fex.features_used & LL_FEAT_BIT_EXT_SCAN) != 0;
#else
return 0;
#endif
}
static inline bool feature_chan_sel_2(struct ll_conn *conn)
{
#if defined(CONFIG_BT_CTLR_CHAN_SEL_2)
return (conn->llcp.fex.features_used & LL_FEAT_BIT_CHAN_SEL_2) != 0;
#else
return 0;
#endif
}
static inline bool feature_min_used_chan(struct ll_conn *conn)
{
#if defined(CONFIG_BT_CTLR_MIN_USED_CHAN)
return (conn->llcp.fex.features_used & LL_FEAT_BIT_MIN_USED_CHAN) != 0;
#else
return 0;
#endif
}
static inline bool feature_phy_2m(struct ll_conn *conn)
{
#if defined(CONFIG_BT_CTLR_PHY_2M)
return (conn->llcp.fex.features_used & LL_FEAT_BIT_PHY_2M) != 0;
#else
return 0;
#endif
}
static inline bool feature_phy_coded(struct ll_conn *conn)
{
#if defined(CONFIG_BT_CTLR_PHY_CODED)
return (conn->llcp.fex.features_used & LL_FEAT_BIT_PHY_CODED) != 0;
#else
return 0;
#endif
}
static inline bool feature_cte_req(struct ll_conn *conn)
{
#if defined(CONFIG_BT_CTLR_DF) && defined(CONFIG_BT_CTLR_DF_CONN_CTE_REQ)
return conn->llcp.fex.features_used & LL_FEAT_BIT_CONNECTION_CTE_REQ;
#else
return 0;
#endif
}
/*
* for asymmetric features we can check either if we support it
* or if the peer supports it
*/
static inline bool feature_smi_rx(void)
{
return LL_FEAT_BIT_SMI_RX != 0;
}
static inline bool feature_peer_smi_rx(struct ll_conn *conn)
{
return (conn->llcp.fex.features_peer & BIT64(BT_LE_FEAT_BIT_SMI_RX)) != 0;
}
static inline bool feature_smi_tx(void)
{
return LL_FEAT_BIT_SMI_TX != 0;
}
static inline bool feature_peer_smi_tx(struct ll_conn *conn)
{
return (conn->llcp.fex.features_peer & BIT64(BT_LE_FEAT_BIT_SMI_TX)) != 0;
}
/*
* The following features are not yet defined in KConfig and do
* not have a bitfield defined in ll_feat.h
* ext_adv
* per_adv
* pwr_class1
* min_chann
* ant_sw_CTE_tx
* ant_sw_CTE_rx
* tone_ext
* per_adv_sync_tx
* per_adv_sync_rx
* sleep_upd
* rpk_valid
* iso_central
* iso_periph
* iso_broadcast
* iso_receiver
* iso_channels
* le_pwr_req
* le_pwr_ind
* le_path_loss
*/