1 /* 2 * Copyright (c) 2020 Demant 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 */ 6 7 /* Temporary data structure to avoid change ll_conn/lll_conn to much 8 * and having to update all the dependencies 9 */ 10 11 enum { ULL_CP_CONNECTED, ULL_CP_DISCONNECTED }; 12 13 /** 14 * @brief Initialize the LL Control Procedure system. 15 */ 16 void ull_cp_init(void); 17 18 /** 19 * @brief Initialize the LL Control Procedure connection data. 20 */ 21 void ull_llcp_init(struct ll_conn *conn); 22 23 /** 24 * @brief XXX 25 */ 26 void ull_cp_state_set(struct ll_conn *conn, uint8_t state); 27 28 void ull_cp_release_nodes(struct ll_conn *conn); 29 30 /* 31 * @brief Update 'global' tx buffer allowance 32 */ 33 void ull_cp_update_tx_buffer_queue(struct ll_conn *conn); 34 35 /** 36 * 37 */ 38 void ull_cp_release_tx(struct ll_conn *conn, struct node_tx *tx); 39 40 /** 41 * @brief Procedure Response Timeout Check 42 * @param elapsed_event The number of elapsed events. 43 * @param[out] error_code The error code for this timeout. 44 * @return 0 on success, -ETIMEDOUT if timer expired. 45 */ 46 int ull_cp_prt_elapse(struct ll_conn *conn, uint16_t elapsed_event, uint8_t *error_code); 47 48 void ull_cp_prt_reload_set(struct ll_conn *conn, uint32_t conn_intv); 49 50 /** 51 * @brief Run pending LL Control Procedures. 52 */ 53 void ull_cp_run(struct ll_conn *conn); 54 55 /** 56 * @brief Handle TX ack PDU. 57 */ 58 void ull_cp_tx_ack(struct ll_conn *conn, struct node_tx *tx); 59 60 /** 61 * @brief Handle TX procedures notifications towards Host. 62 */ 63 void ull_cp_tx_ntf(struct ll_conn *conn); 64 65 /** 66 * @brief Handle received LL Control PDU. 67 */ 68 void ull_cp_rx(struct ll_conn *conn, memq_link_t *link, struct node_rx_pdu *rx); 69 70 #if defined(CONFIG_BT_CTLR_LE_PING) 71 /** 72 * @brief Initiate a LE Ping Procedure. 73 */ 74 uint8_t ull_cp_le_ping(struct ll_conn *conn); 75 #endif /* CONFIG_BT_CTLR_LE_PING */ 76 77 /** 78 * @brief Initiate a Version Exchange Procedure. 79 */ 80 uint8_t ull_cp_version_exchange(struct ll_conn *conn); 81 82 /** 83 * @brief Initiate a Feature Exchange Procedure. 84 */ 85 uint8_t ull_cp_feature_exchange(struct ll_conn *conn, uint8_t host_initiated); 86 87 #if defined(CONFIG_BT_CTLR_MIN_USED_CHAN) 88 /** 89 * @brief Initiate a Minimum used channels Procedure. 90 */ 91 uint8_t ull_cp_min_used_chans(struct ll_conn *conn, uint8_t phys, uint8_t min_used_chans); 92 #endif /* CONFIG_BT_CTLR_MIN_USED_CHAN */ 93 94 /** 95 * @brief Initiate a Encryption Start Procedure. 96 */ 97 uint8_t ull_cp_encryption_start(struct ll_conn *conn, const uint8_t rand[8], const uint8_t ediv[2], 98 const uint8_t ltk[16]); 99 100 /** 101 * @brief Initiate a Encryption Pause Procedure. 102 */ 103 uint8_t ull_cp_encryption_pause(struct ll_conn *conn, const uint8_t rand[8], const uint8_t ediv[2], 104 const uint8_t ltk[16]); 105 106 /** 107 * @brief Check if an encryption pause procedure is active. 108 */ 109 uint8_t ull_cp_encryption_paused(struct ll_conn *conn); 110 111 /** 112 */ 113 uint8_t ull_cp_ltk_req_reply(struct ll_conn *conn, const uint8_t ltk[16]); 114 115 /** 116 */ 117 uint8_t ull_cp_ltk_req_neq_reply(struct ll_conn *conn); 118 119 /** 120 * @brief Initiate a PHY Update Procedure. 121 */ 122 uint8_t ull_cp_phy_update(struct ll_conn *conn, uint8_t tx, uint8_t flags, uint8_t rx, 123 uint8_t host_initiated); 124 125 /** 126 * @brief Initiate a Connection Parameter Request Procedure or Connection Update Procedure 127 */ 128 uint8_t ull_cp_conn_update(struct ll_conn *conn, uint16_t interval_min, uint16_t interval_max, 129 uint16_t latency, uint16_t timeout, uint16_t *offsets); 130 131 /** 132 * @brief Accept the remote device’s request to change connection parameters. 133 */ 134 void ull_cp_conn_param_req_reply(struct ll_conn *conn); 135 136 /** 137 * @brief Reject the remote device’s request to change connection parameters. 138 */ 139 void ull_cp_conn_param_req_neg_reply(struct ll_conn *conn, uint8_t error_code); 140 141 /** 142 * @brief Check if a remote data length update is in the works. 143 */ 144 uint8_t ull_cp_remote_dle_pending(struct ll_conn *conn); 145 146 /** 147 * @brief Check if a remote connection param reg is in the 148 * works. 149 */ 150 uint8_t ull_cp_remote_cpr_pending(struct ll_conn *conn); 151 152 /** 153 * @brief Check if a remote connection param reg is expecting an 154 * anchor point move response. 155 */ 156 bool ull_cp_remote_cpr_apm_awaiting_reply(struct ll_conn *conn); 157 158 /** 159 * @brief Repsond to anchor point move of remote connection 160 * param reg. 161 */ 162 void ull_cp_remote_cpr_apm_reply(struct ll_conn *conn, uint16_t *offsets); 163 164 /** 165 * @brief Reject anchor point move of remote connection param 166 * reg. 167 */ 168 void ull_cp_remote_cpr_apm_neg_reply(struct ll_conn *conn, uint8_t error_code); 169 170 /** 171 * @brief Initiate a Termination Procedure. 172 */ 173 uint8_t ull_cp_terminate(struct ll_conn *conn, uint8_t error_code); 174 175 /** 176 * @brief Initiate a CIS Termination Procedure. 177 */ 178 uint8_t ull_cp_cis_terminate(struct ll_conn *conn, struct ll_conn_iso_stream *cis, 179 uint8_t error_code); 180 181 /** 182 * @brief Initiate a CIS Create Procedure. 183 */ 184 uint8_t ull_cp_cis_create(struct ll_conn *conn, struct ll_conn_iso_stream *cis); 185 186 /** 187 * @brief Resume CIS create after CIS offset calculation. 188 */ 189 void ull_cp_cc_offset_calc_reply(struct ll_conn *conn, uint32_t cis_offset_min, 190 uint32_t cis_offset_max); 191 192 /** 193 * @brief Is ongoing create cis procedure expecting a reply? 194 */ 195 bool ull_cp_cc_awaiting_reply(struct ll_conn *conn); 196 197 /** 198 * @brief Is ongoing create cis procedure expecting an established event? 199 */ 200 bool ull_cp_cc_awaiting_established(struct ll_conn *conn); 201 202 /** 203 * @brief Get handle of ongoing create cis procedure. 204 * @return 0xFFFF if none 205 */ 206 uint16_t ull_cp_cc_ongoing_handle(struct ll_conn *conn); 207 208 /** 209 * @brief Accept the remote device’s request to create cis. 210 */ 211 void ull_cp_cc_accept(struct ll_conn *conn, uint32_t cis_offset_min); 212 213 /** 214 * @brief Reject the remote device’s request to create cis. 215 */ 216 void ull_cp_cc_reject(struct ll_conn *conn, uint8_t error_code); 217 218 /** 219 * @brief CIS was established. 220 */ 221 void ull_cp_cc_established(struct ll_conn *conn, uint8_t error_code); 222 223 /** 224 * @brief CIS creation ongoing. 225 */ 226 bool ull_lp_cc_is_active(struct ll_conn *conn); 227 228 /** 229 * @brief CIS creation ongoing or enqueued. 230 */ 231 bool ull_lp_cc_is_enqueued(struct ll_conn *conn); 232 233 /** 234 * @brief Initiate a Channel Map Update Procedure. 235 */ 236 uint8_t ull_cp_chan_map_update(struct ll_conn *conn, const uint8_t chm[5]); 237 238 /** 239 * @brief Check if Channel Map Update Procedure is pending 240 */ 241 const uint8_t *ull_cp_chan_map_update_pending(struct ll_conn *conn); 242 243 #if defined(CONFIG_BT_CTLR_DATA_LENGTH) 244 /** 245 * @brief Initiate a Data Length Update Procedure. 246 */ 247 uint8_t ull_cp_data_length_update(struct ll_conn *conn, uint16_t max_tx_octets, 248 uint16_t max_tx_time); 249 #endif /* CONFIG_BT_CTLR_DATA_LENGTH */ 250 /** 251 * @brief Initiate a CTE Request Procedure. 252 */ 253 uint8_t ull_cp_cte_req(struct ll_conn *conn, uint8_t min_cte_len, uint8_t cte_type); 254 255 /** 256 * @brief Set a CTE Request Procedure disabled. 257 */ 258 void ull_cp_cte_req_set_disable(struct ll_conn *conn); 259 260 /** 261 * @brief Enable or disable response to CTE Request Procedure. 262 */ 263 void ull_cp_cte_rsp_enable(struct ll_conn *conn, bool enable, uint8_t max_cte_len, 264 uint8_t cte_types); 265 266 #if defined(CONFIG_BT_CTLR_SCA_UPDATE) 267 /** 268 * @brief Initiate a Sleep Clock Accuracy Update Procedure. 269 */ 270 uint8_t ull_cp_req_peer_sca(struct ll_conn *conn); 271 #endif /* CONFIG_BT_CTLR_SCA_UPDATE */ 272