| /* |
| * 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 void feature_unmask_peer_features(struct ll_conn *conn, uint64_t ll_feat_mask) |
| { |
| conn->llcp.fex.features_peer &= ~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) != 0; |
| #else |
| return 0; |
| #endif |
| } |
| |
| static inline bool feature_sca(struct ll_conn *conn) |
| { |
| #if defined(CONFIG_BT_CTLR_SCA_UPDATE) |
| return (conn->llcp.fex.features_used & LL_FEAT_BIT_SCA_UPDATE) != 0; |
| #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; |
| } |
| |
| static inline bool feature_peer_iso_central(struct ll_conn *conn) |
| { |
| return (conn->llcp.fex.features_peer & BIT64(BT_LE_FEAT_BIT_CIS_CENTRAL)) != 0; |
| } |
| |
| static inline bool feature_iso_central(struct ll_conn *conn) |
| { |
| return LL_FEAT_BIT_CIS_CENTRAL != 0; |
| } |
| |
| static inline bool feature_peer_iso_peripheral(struct ll_conn *conn) |
| { |
| return (conn->llcp.fex.features_peer & BIT64(BT_LE_FEAT_BIT_CIS_PERIPHERAL)) != 0; |
| } |
| |
| static inline bool feature_iso_peripheral(struct ll_conn *conn) |
| { |
| return LL_FEAT_BIT_CIS_PERIPHERAL != 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 |
| * rpk_valid |
| * iso_central |
| * iso_periph |
| * iso_broadcast |
| * iso_receiver |
| * iso_channels |
| * le_pwr_req |
| * le_pwr_ind |
| * le_path_loss |
| */ |