| /* |
| * Copyright (c) 2020 Demant |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| /* Temporary data structure to avoid change ll_conn/lll_conn to much |
| * and having to update all the dependencies |
| */ |
| |
| enum { ULL_CP_CONNECTED, ULL_CP_DISCONNECTED }; |
| |
| /** |
| * @brief Initialize the LL Control Procedure system. |
| */ |
| void ull_cp_init(void); |
| |
| /** |
| * @brief Initialize the LL Control Procedure connection data. |
| */ |
| void ull_llcp_init(struct ll_conn *conn); |
| |
| /** |
| * @brief XXX |
| */ |
| void ull_cp_state_set(struct ll_conn *conn, uint8_t state); |
| |
| void ull_cp_release_nodes(struct ll_conn *conn); |
| |
| /* |
| * @brief Update 'global' tx buffer allowance |
| */ |
| void ull_cp_update_tx_buffer_queue(struct ll_conn *conn); |
| |
| /** |
| * |
| */ |
| void ull_cp_release_tx(struct ll_conn *conn, struct node_tx *tx); |
| |
| /** |
| * @brief Procedure Response Timeout Check |
| * @param elapsed_event The number of elapsed events. |
| * @param[out] error_code The error code for this timeout. |
| * @return 0 on success, -ETIMEDOUT if timer expired. |
| */ |
| int ull_cp_prt_elapse(struct ll_conn *conn, uint16_t elapsed_event, uint8_t *error_code); |
| |
| void ull_cp_prt_reload_set(struct ll_conn *conn, uint32_t conn_intv); |
| |
| /** |
| * @brief Run pending LL Control Procedures. |
| */ |
| void ull_cp_run(struct ll_conn *conn); |
| |
| /** |
| * @brief Handle TX ack PDU. |
| */ |
| void ull_cp_tx_ack(struct ll_conn *conn, struct node_tx *tx); |
| |
| /** |
| * @brief Handle TX procedures notifications towards Host. |
| */ |
| void ull_cp_tx_ntf(struct ll_conn *conn); |
| |
| /** |
| * @brief Handle received LL Control PDU. |
| */ |
| void ull_cp_rx(struct ll_conn *conn, memq_link_t *link, struct node_rx_pdu *rx); |
| |
| #if defined(CONFIG_BT_CTLR_LE_PING) |
| /** |
| * @brief Initiate a LE Ping Procedure. |
| */ |
| uint8_t ull_cp_le_ping(struct ll_conn *conn); |
| #endif /* CONFIG_BT_CTLR_LE_PING */ |
| |
| /** |
| * @brief Initiate a Version Exchange Procedure. |
| */ |
| uint8_t ull_cp_version_exchange(struct ll_conn *conn); |
| |
| /** |
| * @brief Initiate a Feature Exchange Procedure. |
| */ |
| uint8_t ull_cp_feature_exchange(struct ll_conn *conn, uint8_t host_initiated); |
| |
| #if defined(CONFIG_BT_CTLR_MIN_USED_CHAN) |
| /** |
| * @brief Initiate a Minimum used channels Procedure. |
| */ |
| uint8_t ull_cp_min_used_chans(struct ll_conn *conn, uint8_t phys, uint8_t min_used_chans); |
| #endif /* CONFIG_BT_CTLR_MIN_USED_CHAN */ |
| |
| /** |
| * @brief Initiate a Encryption Start Procedure. |
| */ |
| uint8_t ull_cp_encryption_start(struct ll_conn *conn, const uint8_t rand[8], const uint8_t ediv[2], |
| const uint8_t ltk[16]); |
| |
| /** |
| * @brief Initiate a Encryption Pause Procedure. |
| */ |
| uint8_t ull_cp_encryption_pause(struct ll_conn *conn, const uint8_t rand[8], const uint8_t ediv[2], |
| const uint8_t ltk[16]); |
| |
| /** |
| * @brief Check if an encryption pause procedure is active. |
| */ |
| uint8_t ull_cp_encryption_paused(struct ll_conn *conn); |
| |
| /** |
| */ |
| uint8_t ull_cp_ltk_req_reply(struct ll_conn *conn, const uint8_t ltk[16]); |
| |
| /** |
| */ |
| uint8_t ull_cp_ltk_req_neq_reply(struct ll_conn *conn); |
| |
| /** |
| * @brief Initiate a PHY Update Procedure. |
| */ |
| uint8_t ull_cp_phy_update(struct ll_conn *conn, uint8_t tx, uint8_t flags, uint8_t rx, |
| uint8_t host_initiated); |
| |
| /** |
| * @brief Initiate a Connection Parameter Request Procedure or Connection Update Procedure |
| */ |
| uint8_t ull_cp_conn_update(struct ll_conn *conn, uint16_t interval_min, uint16_t interval_max, |
| uint16_t latency, uint16_t timeout, uint16_t *offsets); |
| |
| /** |
| * @brief Accept the remote device’s request to change connection parameters. |
| */ |
| void ull_cp_conn_param_req_reply(struct ll_conn *conn); |
| |
| /** |
| * @brief Reject the remote device’s request to change connection parameters. |
| */ |
| void ull_cp_conn_param_req_neg_reply(struct ll_conn *conn, uint8_t error_code); |
| |
| /** |
| * @brief Check if a remote data length update is in the works. |
| */ |
| uint8_t ull_cp_remote_dle_pending(struct ll_conn *conn); |
| |
| /** |
| * @brief Check if a remote connection param reg is in the |
| * works. |
| */ |
| uint8_t ull_cp_remote_cpr_pending(struct ll_conn *conn); |
| |
| /** |
| * @brief Check if a remote connection param reg is expecting an |
| * anchor point move response. |
| */ |
| bool ull_cp_remote_cpr_apm_awaiting_reply(struct ll_conn *conn); |
| |
| /** |
| * @brief Repsond to anchor point move of remote connection |
| * param reg. |
| */ |
| void ull_cp_remote_cpr_apm_reply(struct ll_conn *conn, uint16_t *offsets); |
| |
| /** |
| * @brief Reject anchor point move of remote connection param |
| * reg. |
| */ |
| void ull_cp_remote_cpr_apm_neg_reply(struct ll_conn *conn, uint8_t error_code); |
| |
| /** |
| * @brief Initiate a Termination Procedure. |
| */ |
| uint8_t ull_cp_terminate(struct ll_conn *conn, uint8_t error_code); |
| |
| /** |
| * @brief Initiate a CIS Termination Procedure. |
| */ |
| uint8_t ull_cp_cis_terminate(struct ll_conn *conn, struct ll_conn_iso_stream *cis, |
| uint8_t error_code); |
| |
| /** |
| * @brief Initiate a CIS Create Procedure. |
| */ |
| uint8_t ull_cp_cis_create(struct ll_conn *conn, struct ll_conn_iso_stream *cis); |
| |
| /** |
| * @brief Resume CIS create after CIS offset calculation. |
| */ |
| void ull_cp_cc_offset_calc_reply(struct ll_conn *conn, uint32_t cis_offset_min, |
| uint32_t cis_offset_max); |
| |
| /** |
| * @brief Is ongoing create cis procedure expecting a reply? |
| */ |
| bool ull_cp_cc_awaiting_reply(struct ll_conn *conn); |
| |
| /** |
| * @brief Is ongoing create cis procedure expecting an established event? |
| */ |
| bool ull_cp_cc_awaiting_established(struct ll_conn *conn); |
| |
| /** |
| * @brief Get handle of ongoing create cis procedure. |
| * @return 0xFFFF if none |
| */ |
| uint16_t ull_cp_cc_ongoing_handle(struct ll_conn *conn); |
| |
| /** |
| * @brief Accept the remote device’s request to create cis. |
| */ |
| void ull_cp_cc_accept(struct ll_conn *conn, uint32_t cis_offset_min); |
| |
| /** |
| * @brief Reject the remote device’s request to create cis. |
| */ |
| void ull_cp_cc_reject(struct ll_conn *conn, uint8_t error_code); |
| |
| /** |
| * @brief CIS was established. |
| */ |
| void ull_cp_cc_established(struct ll_conn *conn, uint8_t error_code); |
| |
| /** |
| * @brief CIS creation ongoing. |
| */ |
| bool ull_lp_cc_is_active(struct ll_conn *conn); |
| |
| /** |
| * @brief CIS creation ongoing or enqueued. |
| */ |
| bool ull_lp_cc_is_enqueued(struct ll_conn *conn); |
| |
| /** |
| * @brief Initiate a Channel Map Update Procedure. |
| */ |
| uint8_t ull_cp_chan_map_update(struct ll_conn *conn, const uint8_t chm[5]); |
| |
| /** |
| * @brief Check if Channel Map Update Procedure is pending |
| */ |
| const uint8_t *ull_cp_chan_map_update_pending(struct ll_conn *conn); |
| |
| #if defined(CONFIG_BT_CTLR_DATA_LENGTH) |
| /** |
| * @brief Initiate a Data Length Update Procedure. |
| */ |
| uint8_t ull_cp_data_length_update(struct ll_conn *conn, uint16_t max_tx_octets, |
| uint16_t max_tx_time); |
| #endif /* CONFIG_BT_CTLR_DATA_LENGTH */ |
| /** |
| * @brief Initiate a CTE Request Procedure. |
| */ |
| uint8_t ull_cp_cte_req(struct ll_conn *conn, uint8_t min_cte_len, uint8_t cte_type); |
| |
| /** |
| * @brief Set a CTE Request Procedure disabled. |
| */ |
| void ull_cp_cte_req_set_disable(struct ll_conn *conn); |
| |
| /** |
| * @brief Enable or disable response to CTE Request Procedure. |
| */ |
| void ull_cp_cte_rsp_enable(struct ll_conn *conn, bool enable, uint8_t max_cte_len, |
| uint8_t cte_types); |
| |
| #if defined(CONFIG_BT_CTLR_SCA_UPDATE) |
| /** |
| * @brief Initiate a Sleep Clock Accuracy Update Procedure. |
| */ |
| uint8_t ull_cp_req_peer_sca(struct ll_conn *conn); |
| #endif /* CONFIG_BT_CTLR_SCA_UPDATE */ |