Line data Source code
1 1 : /** @file
2 : * @brief Bluetooth connection handling
3 : */
4 :
5 : /*
6 : * Copyright (c) 2015-2016 Intel Corporation
7 : *
8 : * SPDX-License-Identifier: Apache-2.0
9 : */
10 : #ifndef ZEPHYR_INCLUDE_BLUETOOTH_CONN_H_
11 : #define ZEPHYR_INCLUDE_BLUETOOTH_CONN_H_
12 :
13 : /**
14 : * @brief Connection management
15 : * @defgroup bt_conn Connection management
16 : * @ingroup bluetooth
17 : * @{
18 : */
19 :
20 : #include <stdbool.h>
21 : #include <stdint.h>
22 :
23 : #include <zephyr/bluetooth/bluetooth.h>
24 : #include <zephyr/bluetooth/hci_types.h>
25 : #include <zephyr/bluetooth/addr.h>
26 : #include <zephyr/bluetooth/gap.h>
27 : #include <zephyr/bluetooth/direction.h>
28 : #include <zephyr/sys/iterable_sections.h>
29 :
30 : #ifdef __cplusplus
31 : extern "C" {
32 : #endif
33 :
34 : /** Opaque type representing a connection to a remote device */
35 : struct bt_conn;
36 :
37 : /** Connection parameters for LE connections */
38 1 : struct bt_le_conn_param {
39 0 : uint16_t interval_min;
40 0 : uint16_t interval_max;
41 0 : uint16_t latency;
42 0 : uint16_t timeout;
43 : };
44 :
45 : /** @brief Initialize connection parameters
46 : *
47 : * @param int_min Minimum Connection Interval (N * 1.25 ms)
48 : * @param int_max Maximum Connection Interval (N * 1.25 ms)
49 : * @param lat Connection Latency
50 : * @param to Supervision Timeout (N * 10 ms)
51 : */
52 1 : #define BT_LE_CONN_PARAM_INIT(int_min, int_max, lat, to) \
53 : { \
54 : .interval_min = (int_min), \
55 : .interval_max = (int_max), \
56 : .latency = (lat), \
57 : .timeout = (to), \
58 : }
59 :
60 : /** Helper to declare connection parameters inline
61 : *
62 : * @param int_min Minimum Connection Interval (N * 1.25 ms)
63 : * @param int_max Maximum Connection Interval (N * 1.25 ms)
64 : * @param lat Connection Latency
65 : * @param to Supervision Timeout (N * 10 ms)
66 : */
67 1 : #define BT_LE_CONN_PARAM(int_min, int_max, lat, to) \
68 : ((struct bt_le_conn_param[]) { \
69 : BT_LE_CONN_PARAM_INIT(int_min, int_max, lat, to) \
70 : })
71 :
72 : /** Default LE connection parameters:
73 : * Connection Interval: 30-50 ms
74 : * Latency: 0
75 : * Timeout: 4 s
76 : */
77 1 : #define BT_LE_CONN_PARAM_DEFAULT \
78 : BT_LE_CONN_PARAM(BT_GAP_INIT_CONN_INT_MIN, BT_GAP_INIT_CONN_INT_MAX, 0, \
79 : BT_GAP_MS_TO_CONN_TIMEOUT(4000))
80 :
81 : /** Connection PHY information for LE connections */
82 1 : struct bt_conn_le_phy_info {
83 0 : uint8_t tx_phy; /** Connection transmit PHY */
84 1 : uint8_t rx_phy; /** Connection receive PHY */
85 : };
86 :
87 : /** Connection PHY options */
88 1 : enum {
89 : /** Convenience value when no options are specified. */
90 : BT_CONN_LE_PHY_OPT_NONE = 0,
91 :
92 : /** LE Coded using S=2 coding preferred when transmitting. */
93 : BT_CONN_LE_PHY_OPT_CODED_S2 = BIT(0),
94 :
95 : /** LE Coded using S=8 coding preferred when transmitting. */
96 : BT_CONN_LE_PHY_OPT_CODED_S8 = BIT(1),
97 : };
98 :
99 : /** Preferred PHY parameters for LE connections */
100 1 : struct bt_conn_le_phy_param {
101 1 : uint16_t options; /**< Connection PHY options. */
102 1 : uint8_t pref_tx_phy; /**< Bitmask of preferred transmit PHYs */
103 1 : uint8_t pref_rx_phy; /**< Bitmask of preferred receive PHYs */
104 : };
105 :
106 : /** Initialize PHY parameters
107 : *
108 : * @param _pref_tx_phy Bitmask of preferred transmit PHYs.
109 : * @param _pref_rx_phy Bitmask of preferred receive PHYs.
110 : */
111 1 : #define BT_CONN_LE_PHY_PARAM_INIT(_pref_tx_phy, _pref_rx_phy) \
112 : { \
113 : .options = BT_CONN_LE_PHY_OPT_NONE, \
114 : .pref_tx_phy = (_pref_tx_phy), \
115 : .pref_rx_phy = (_pref_rx_phy), \
116 : }
117 :
118 : /** Helper to declare PHY parameters inline
119 : *
120 : * @param _pref_tx_phy Bitmask of preferred transmit PHYs.
121 : * @param _pref_rx_phy Bitmask of preferred receive PHYs.
122 : */
123 1 : #define BT_CONN_LE_PHY_PARAM(_pref_tx_phy, _pref_rx_phy) \
124 : ((struct bt_conn_le_phy_param []) { \
125 : BT_CONN_LE_PHY_PARAM_INIT(_pref_tx_phy, _pref_rx_phy) \
126 : })
127 :
128 : /** Only LE 1M PHY */
129 1 : #define BT_CONN_LE_PHY_PARAM_1M BT_CONN_LE_PHY_PARAM(BT_GAP_LE_PHY_1M, \
130 : BT_GAP_LE_PHY_1M)
131 :
132 : /** Only LE 2M PHY */
133 1 : #define BT_CONN_LE_PHY_PARAM_2M BT_CONN_LE_PHY_PARAM(BT_GAP_LE_PHY_2M, \
134 : BT_GAP_LE_PHY_2M)
135 :
136 : /** Only LE Coded PHY. */
137 1 : #define BT_CONN_LE_PHY_PARAM_CODED BT_CONN_LE_PHY_PARAM(BT_GAP_LE_PHY_CODED, \
138 : BT_GAP_LE_PHY_CODED)
139 :
140 : /** All LE PHYs. */
141 1 : #define BT_CONN_LE_PHY_PARAM_ALL BT_CONN_LE_PHY_PARAM(BT_GAP_LE_PHY_1M | \
142 : BT_GAP_LE_PHY_2M | \
143 : BT_GAP_LE_PHY_CODED, \
144 : BT_GAP_LE_PHY_1M | \
145 : BT_GAP_LE_PHY_2M | \
146 : BT_GAP_LE_PHY_CODED)
147 :
148 : /** Connection data length information for LE connections */
149 1 : struct bt_conn_le_data_len_info {
150 : /** Maximum Link Layer transmission payload size in bytes. */
151 1 : uint16_t tx_max_len;
152 : /** Maximum Link Layer transmission payload time in us. */
153 1 : uint16_t tx_max_time;
154 : /** Maximum Link Layer reception payload size in bytes. */
155 1 : uint16_t rx_max_len;
156 : /** Maximum Link Layer reception payload time in us. */
157 1 : uint16_t rx_max_time;
158 : };
159 :
160 : /** Connection data length parameters for LE connections */
161 1 : struct bt_conn_le_data_len_param {
162 : /** Maximum Link Layer transmission payload size in bytes. */
163 1 : uint16_t tx_max_len;
164 : /** Maximum Link Layer transmission payload time in us. */
165 1 : uint16_t tx_max_time;
166 : };
167 :
168 : /** Initialize transmit data length parameters
169 : *
170 : * @param _tx_max_len Maximum Link Layer transmission payload size in bytes.
171 : * @param _tx_max_time Maximum Link Layer transmission payload time in us.
172 : */
173 1 : #define BT_CONN_LE_DATA_LEN_PARAM_INIT(_tx_max_len, _tx_max_time) \
174 : { \
175 : .tx_max_len = (_tx_max_len), \
176 : .tx_max_time = (_tx_max_time), \
177 : }
178 :
179 : /** Helper to declare transmit data length parameters inline
180 : *
181 : * @param _tx_max_len Maximum Link Layer transmission payload size in bytes.
182 : * @param _tx_max_time Maximum Link Layer transmission payload time in us.
183 : */
184 1 : #define BT_CONN_LE_DATA_LEN_PARAM(_tx_max_len, _tx_max_time) \
185 : ((struct bt_conn_le_data_len_param[]) { \
186 : BT_CONN_LE_DATA_LEN_PARAM_INIT(_tx_max_len, _tx_max_time) \
187 : })
188 :
189 : /** Default LE data length parameters. */
190 1 : #define BT_LE_DATA_LEN_PARAM_DEFAULT \
191 : BT_CONN_LE_DATA_LEN_PARAM(BT_GAP_DATA_LEN_DEFAULT, \
192 : BT_GAP_DATA_TIME_DEFAULT)
193 :
194 : /** Maximum LE data length parameters. */
195 1 : #define BT_LE_DATA_LEN_PARAM_MAX \
196 : BT_CONN_LE_DATA_LEN_PARAM(BT_GAP_DATA_LEN_MAX, \
197 : BT_GAP_DATA_TIME_MAX)
198 :
199 : /** Connection subrating parameters for LE connections */
200 1 : struct bt_conn_le_subrate_param {
201 : /** Minimum subrate factor. */
202 1 : uint16_t subrate_min;
203 : /** Maximum subrate factor. */
204 1 : uint16_t subrate_max;
205 : /** Maximum Peripheral latency in units of subrated connection intervals. */
206 1 : uint16_t max_latency;
207 : /** Minimum number of underlying connection events to remain active
208 : * after a packet containing a Link Layer PDU with a non-zero Length
209 : * field is sent or received.
210 : */
211 1 : uint16_t continuation_number;
212 : /** Connection Supervision timeout (N * 10 ms).
213 : * If using @ref bt_conn_le_subrate_set_defaults, this is the
214 : * maximum supervision timeout allowed in requests by a peripheral.
215 : */
216 1 : uint16_t supervision_timeout;
217 : };
218 :
219 : /** Subrating information for LE connections */
220 1 : struct bt_conn_le_subrating_info {
221 : /** Connection subrate factor. */
222 1 : uint16_t factor;
223 : /** Number of underlying connection events to remain active after
224 : * a packet containing a Link Layer PDU with a non-zero Length
225 : * field is sent or received.
226 : */
227 1 : uint16_t continuation_number;
228 : };
229 :
230 : /** Updated subrating connection parameters for LE connections */
231 1 : struct bt_conn_le_subrate_changed {
232 : /** HCI Status from LE Subrate Changed event.
233 : * The remaining parameters will be unchanged if status is not
234 : * BT_HCI_ERR_SUCCESS.
235 : */
236 1 : uint8_t status;
237 : /** Connection subrate factor. */
238 1 : uint16_t factor;
239 : /** Number of underlying connection events to remain active after
240 : * a packet containing a Link Layer PDU with a non-zero Length
241 : * field is sent or received.
242 : */
243 1 : uint16_t continuation_number;
244 : /** Peripheral latency in units of subrated connection intervals. */
245 1 : uint16_t peripheral_latency;
246 : /** Connection Supervision timeout (N * 10 ms). */
247 1 : uint16_t supervision_timeout;
248 : };
249 :
250 : /** Connection Type */
251 1 : enum __packed bt_conn_type {
252 : /** LE Connection Type */
253 : BT_CONN_TYPE_LE = BIT(0),
254 : /** BR/EDR Connection Type */
255 : BT_CONN_TYPE_BR = BIT(1),
256 : /** SCO Connection Type */
257 : BT_CONN_TYPE_SCO = BIT(2),
258 : /** ISO Connection Type */
259 : BT_CONN_TYPE_ISO = BIT(3),
260 : /** All Connection Type */
261 : BT_CONN_TYPE_ALL = BT_CONN_TYPE_LE | BT_CONN_TYPE_BR |
262 : BT_CONN_TYPE_SCO | BT_CONN_TYPE_ISO,
263 : };
264 :
265 : /** Supported AA-Only RTT precision. */
266 1 : enum bt_conn_le_cs_capability_rtt_aa_only {
267 : /** AA-Only RTT variant is not supported. */
268 : BT_CONN_LE_CS_RTT_AA_ONLY_NOT_SUPP = 0,
269 : /** 10ns time-of-flight accuracy. */
270 : BT_CONN_LE_CS_RTT_AA_ONLY_10NS,
271 : /** 150ns time-of-flight accuracy. */
272 : BT_CONN_LE_CS_RTT_AA_ONLY_150NS,
273 : };
274 :
275 : /** Supported Sounding Sequence RTT precision. */
276 1 : enum bt_conn_le_cs_capability_rtt_sounding {
277 : /** Sounding Sequence RTT variant is not supported. */
278 : BT_CONN_LE_CS_RTT_SOUNDING_NOT_SUPP = 0,
279 : /** 10ns time-of-flight accuracy. */
280 : BT_CONN_LE_CS_RTT_SOUNDING_10NS,
281 : /** 150ns time-of-flight accuracy. */
282 : BT_CONN_LE_CS_RTT_SOUNDING_150NS,
283 : };
284 :
285 : /** Supported Random Payload RTT precision. */
286 1 : enum bt_conn_le_cs_capability_rtt_random_payload {
287 : /** Random Payload RTT variant is not supported. */
288 : BT_CONN_LE_CS_RTT_RANDOM_PAYLOAD_NOT_SUPP = 0,
289 : /** 10ns time-of-flight accuracy. */
290 : BT_CONN_LE_CS_RTT_RANDOM_PAYLOAD_10NS,
291 : /** 150ns time-of-flight accuracy. */
292 : BT_CONN_LE_CS_RTT_RANDOM_PAYLOAD_150NS,
293 : };
294 :
295 : /** Remote channel sounding capabilities for LE connections supporting CS */
296 1 : struct bt_conn_le_cs_capabilities {
297 : /** Number of CS configurations */
298 1 : uint8_t num_config_supported;
299 : /** Maximum number of consecutive CS procedures.
300 : *
301 : * When set to zero, indicates support for both fixed and indefinite
302 : * numbers of CS procedures before termination.
303 : */
304 1 : uint16_t max_consecutive_procedures_supported;
305 : /** Number of antennas. */
306 1 : uint8_t num_antennas_supported;
307 : /** Maximum number of antenna paths. */
308 1 : uint8_t max_antenna_paths_supported;
309 : /** Initiator role. */
310 1 : bool initiator_supported;
311 : /** Reflector role. */
312 1 : bool reflector_supported;
313 : /** Mode-3 */
314 1 : bool mode_3_supported;
315 : /** RTT AA-Only */
316 1 : enum bt_conn_le_cs_capability_rtt_aa_only rtt_aa_only_precision;
317 : /** RTT Sounding */
318 1 : enum bt_conn_le_cs_capability_rtt_sounding rtt_sounding_precision;
319 : /** RTT Random Payload */
320 1 : enum bt_conn_le_cs_capability_rtt_random_payload rtt_random_payload_precision;
321 : /** Number of CS steps needed to achieve the
322 : * accuracy requirements for RTT AA Only.
323 : *
324 : * Set to 0 if RTT AA Only isn't supported.
325 : */
326 1 : uint8_t rtt_aa_only_n;
327 : /** Number of CS steps needed to achieve the
328 : * accuracy requirements for RTT Sounding.
329 : *
330 : * Set to 0 if RTT Sounding isn't supported
331 : */
332 1 : uint8_t rtt_sounding_n;
333 : /** Number of CS steps needed to achieve the
334 : * accuracy requirements for RTT Random Payload.
335 : *
336 : * Set to 0 if RTT Random Payload isn't supported.
337 : */
338 1 : uint8_t rtt_random_payload_n;
339 : /** Phase-based normalized attack detector metric
340 : * when a CS_SYNC with sounding sequence is received.
341 : */
342 1 : bool phase_based_nadm_sounding_supported;
343 : /** Phase-based normalized attack detector metric
344 : * when a CS_SYNC with random sequence is received.
345 : */
346 1 : bool phase_based_nadm_random_supported;
347 : /** CS_SYNC LE 2M PHY. */
348 1 : bool cs_sync_2m_phy_supported;
349 : /** CS_SYNC LE 2M 2BT PHY. */
350 1 : bool cs_sync_2m_2bt_phy_supported;
351 : /** Subfeature: CS with no Frequency Actuation Error. */
352 1 : bool cs_without_fae_supported;
353 : /** Subfeature: Channel Selection Algorithm #3c */
354 1 : bool chsel_alg_3c_supported;
355 : /** Subfeature: Phase-based Ranging from RTT sounding sequence. */
356 1 : bool pbr_from_rtt_sounding_seq_supported;
357 : /** Optional T_IP1 time durations during CS steps.
358 : *
359 : * - Bit 0: 10 us
360 : * - Bit 1: 20 us
361 : * - Bit 2: 30 us
362 : * - Bit 3: 40 us
363 : * - Bit 4: 50 us
364 : * - Bit 5: 60 us
365 : * - Bit 6: 80 us
366 : */
367 1 : uint16_t t_ip1_times_supported;
368 : /** Optional T_IP2 time durations during CS steps.
369 : *
370 : * - Bit 0: 10 us
371 : * - Bit 1: 20 us
372 : * - Bit 2: 30 us
373 : * - Bit 3: 40 us
374 : * - Bit 4: 50 us
375 : * - Bit 5: 60 us
376 : * - Bit 6: 80 us
377 : */
378 1 : uint16_t t_ip2_times_supported;
379 : /** Optional T_FCS time durations during CS steps.
380 : *
381 : * - Bit 0: 15 us
382 : * - Bit 1: 20 us
383 : * - Bit 2: 30 us
384 : * - Bit 3: 40 us
385 : * - Bit 4: 50 us
386 : * - Bit 5: 60 us
387 : * - Bit 6: 80 us
388 : * - Bit 7: 100 us
389 : * - Bit 8: 120 us
390 : */
391 1 : uint16_t t_fcs_times_supported;
392 : /** Optional T_PM time durations during CS steps.
393 : *
394 : * - Bit 0: 10 us
395 : * - Bit 1: 20 us
396 : */
397 1 : uint16_t t_pm_times_supported;
398 : /** Time in microseconds for the antenna switch period of the CS tones. */
399 1 : uint8_t t_sw_time;
400 : /** Supported SNR levels used in RTT packets.
401 : *
402 : * - Bit 0: 18dB
403 : * - Bit 1: 21dB
404 : * - Bit 2: 24dB
405 : * - Bit 3: 27dB
406 : * - Bit 4: 30dB
407 : */
408 1 : uint8_t tx_snr_capability;
409 : };
410 :
411 : /** Remote FAE Table for LE connections supporting CS */
412 1 : struct bt_conn_le_cs_fae_table {
413 0 : int8_t *remote_fae_table;
414 : };
415 :
416 : /** Channel sounding main mode */
417 1 : enum bt_conn_le_cs_main_mode {
418 : /** Mode-1 (RTT) */
419 : BT_CONN_LE_CS_MAIN_MODE_1 = BT_HCI_OP_LE_CS_MAIN_MODE_1,
420 : /** Mode-2 (PBR) */
421 : BT_CONN_LE_CS_MAIN_MODE_2 = BT_HCI_OP_LE_CS_MAIN_MODE_2,
422 : /** Mode-3 (RTT and PBR) */
423 : BT_CONN_LE_CS_MAIN_MODE_3 = BT_HCI_OP_LE_CS_MAIN_MODE_3,
424 : };
425 :
426 : /** Channel sounding sub mode */
427 1 : enum bt_conn_le_cs_sub_mode {
428 : /** Unused */
429 : BT_CONN_LE_CS_SUB_MODE_UNUSED = BT_HCI_OP_LE_CS_SUB_MODE_UNUSED,
430 : /** Mode-1 (RTT) */
431 : BT_CONN_LE_CS_SUB_MODE_1 = BT_HCI_OP_LE_CS_SUB_MODE_1,
432 : /** Mode-2 (PBR) */
433 : BT_CONN_LE_CS_SUB_MODE_2 = BT_HCI_OP_LE_CS_SUB_MODE_2,
434 : /** Mode-3 (RTT and PBR) */
435 : BT_CONN_LE_CS_SUB_MODE_3 = BT_HCI_OP_LE_CS_SUB_MODE_3,
436 : };
437 :
438 : /** Channel sounding role */
439 1 : enum bt_conn_le_cs_role {
440 : /** CS initiator role */
441 : BT_CONN_LE_CS_ROLE_INITIATOR,
442 : /** CS reflector role */
443 : BT_CONN_LE_CS_ROLE_REFLECTOR,
444 : };
445 :
446 : /** Channel sounding RTT type */
447 1 : enum bt_conn_le_cs_rtt_type {
448 : /** RTT AA only */
449 : BT_CONN_LE_CS_RTT_TYPE_AA_ONLY = BT_HCI_OP_LE_CS_RTT_TYPE_AA_ONLY,
450 : /** RTT with 32-bit sounding sequence */
451 : BT_CONN_LE_CS_RTT_TYPE_32_BIT_SOUNDING = BT_HCI_OP_LE_CS_RTT_TYPE_32BIT_SOUND,
452 : /** RTT with 96-bit sounding sequence */
453 : BT_CONN_LE_CS_RTT_TYPE_96_BIT_SOUNDING = BT_HCI_OP_LE_CS_RTT_TYPE_96BIT_SOUND,
454 : /** RTT with 32-bit random sequence */
455 : BT_CONN_LE_CS_RTT_TYPE_32_BIT_RANDOM = BT_HCI_OP_LE_CS_RTT_TYPE_32BIT_RAND,
456 : /** RTT with 64-bit random sequence */
457 : BT_CONN_LE_CS_RTT_TYPE_64_BIT_RANDOM = BT_HCI_OP_LE_CS_RTT_TYPE_64BIT_RAND,
458 : /** RTT with 96-bit random sequence */
459 : BT_CONN_LE_CS_RTT_TYPE_96_BIT_RANDOM = BT_HCI_OP_LE_CS_RTT_TYPE_96BIT_RAND,
460 : /** RTT with 128-bit random sequence */
461 : BT_CONN_LE_CS_RTT_TYPE_128_BIT_RANDOM = BT_HCI_OP_LE_CS_RTT_TYPE_128BIT_RAND,
462 : };
463 :
464 : /** Channel sounding PHY used for CS sync */
465 1 : enum bt_conn_le_cs_sync_phy {
466 : /** LE 1M PHY */
467 : BT_CONN_LE_CS_SYNC_1M_PHY = BT_HCI_OP_LE_CS_CS_SYNC_1M,
468 : /** LE 2M PHY */
469 : BT_CONN_LE_CS_SYNC_2M_PHY = BT_HCI_OP_LE_CS_CS_SYNC_2M,
470 : /** LE 2M 2BT PHY */
471 : BT_CONN_LE_CS_SYNC_2M_2BT_PHY = BT_HCI_OP_LE_CS_CS_SYNC_2M_2BT,
472 : };
473 :
474 : /** Channel sounding channel selection type */
475 1 : enum bt_conn_le_cs_chsel_type {
476 : /** Use Channel Selection Algorithm #3b for non-mode-0 CS steps */
477 : BT_CONN_LE_CS_CHSEL_TYPE_3B = BT_HCI_OP_LE_CS_TEST_CHSEL_TYPE_3B,
478 : /** Use Channel Selection Algorithm #3c for non-mode-0 CS steps */
479 : BT_CONN_LE_CS_CHSEL_TYPE_3C = BT_HCI_OP_LE_CS_TEST_CHSEL_TYPE_3C,
480 : };
481 :
482 : /** Channel sounding channel sequence shape */
483 1 : enum bt_conn_le_cs_ch3c_shape {
484 : /** Use Hat shape for user-specified channel sequence */
485 : BT_CONN_LE_CS_CH3C_SHAPE_HAT = BT_HCI_OP_LE_CS_TEST_CH3C_SHAPE_HAT,
486 : /** Use X shape for user-specified channel sequence */
487 : BT_CONN_LE_CS_CH3C_SHAPE_X = BT_HCI_OP_LE_CS_TEST_CH3C_SHAPE_X,
488 : };
489 :
490 : /** Channel sounding configuration */
491 1 : struct bt_conn_le_cs_config {
492 : /** CS configuration ID */
493 1 : uint8_t id;
494 : /** Main CS mode type */
495 1 : enum bt_conn_le_cs_main_mode main_mode_type;
496 : /** Sub CS mode type */
497 1 : enum bt_conn_le_cs_sub_mode sub_mode_type;
498 : /** Minimum number of CS main mode steps to be executed before a submode step is executed */
499 1 : uint8_t min_main_mode_steps;
500 : /** Maximum number of CS main mode steps to be executed before a submode step is executed */
501 1 : uint8_t max_main_mode_steps;
502 : /** Number of main mode steps taken from the end of the last CS subevent to be repeated
503 : * at the beginning of the current CS subevent directly after the last mode-0 step of that
504 : * event
505 : */
506 1 : uint8_t main_mode_repetition;
507 : /** Number of CS mode-0 steps to be included at the beginning of each CS subevent */
508 1 : uint8_t mode_0_steps;
509 : /** CS role */
510 1 : enum bt_conn_le_cs_role role;
511 : /** RTT type */
512 1 : enum bt_conn_le_cs_rtt_type rtt_type;
513 : /** CS Sync PHY */
514 1 : enum bt_conn_le_cs_sync_phy cs_sync_phy;
515 : /** The number of times the Channel_Map field will be cycled through for non-mode-0 steps
516 : * within a CS procedure
517 : */
518 1 : uint8_t channel_map_repetition;
519 : /** Channel selection type */
520 1 : enum bt_conn_le_cs_chsel_type channel_selection_type;
521 : /** User-specified channel sequence shape */
522 1 : enum bt_conn_le_cs_ch3c_shape ch3c_shape;
523 : /** Number of channels skipped in each rising and falling sequence */
524 1 : uint8_t ch3c_jump;
525 : /** Interlude time in microseconds between the RTT packets */
526 1 : uint8_t t_ip1_time_us;
527 : /** Interlude time in microseconds between the CS tones */
528 1 : uint8_t t_ip2_time_us;
529 : /** Time in microseconds for frequency changes */
530 1 : uint8_t t_fcs_time_us;
531 : /** Time in microseconds for the phase measurement period of the CS tones */
532 1 : uint8_t t_pm_time_us;
533 : /** Channel map used for CS procedure
534 : * Channels n = 0, 1, 23, 24, 25, 77, and 78 are not allowed and shall be set to zero.
535 : * Channel 79 is reserved for future use and shall be set to zero.
536 : * At least 15 channels shall be enabled.
537 : */
538 1 : uint8_t channel_map[10];
539 : };
540 :
541 : /** Procedure done status */
542 0 : enum bt_conn_le_cs_procedure_done_status {
543 : BT_CONN_LE_CS_PROCEDURE_COMPLETE = BT_HCI_LE_CS_PROCEDURE_DONE_STATUS_COMPLETE,
544 : BT_CONN_LE_CS_PROCEDURE_INCOMPLETE = BT_HCI_LE_CS_PROCEDURE_DONE_STATUS_PARTIAL,
545 : BT_CONN_LE_CS_PROCEDURE_ABORTED = BT_HCI_LE_CS_PROCEDURE_DONE_STATUS_ABORTED,
546 : };
547 :
548 : /** Subevent done status */
549 0 : enum bt_conn_le_cs_subevent_done_status {
550 : BT_CONN_LE_CS_SUBEVENT_COMPLETE = BT_HCI_LE_CS_SUBEVENT_DONE_STATUS_COMPLETE,
551 : BT_CONN_LE_CS_SUBEVENT_ABORTED = BT_HCI_LE_CS_SUBEVENT_DONE_STATUS_ABORTED,
552 : };
553 :
554 : /** Procedure abort reason */
555 0 : enum bt_conn_le_cs_procedure_abort_reason {
556 : BT_CONN_LE_CS_PROCEDURE_NOT_ABORTED = BT_HCI_LE_CS_PROCEDURE_ABORT_REASON_NO_ABORT,
557 : BT_CONN_LE_CS_PROCEDURE_ABORT_REQUESTED =
558 : BT_HCI_LE_CS_PROCEDURE_ABORT_REASON_LOCAL_HOST_OR_REMOTE_REQUEST,
559 : BT_CONN_LE_CS_PROCEDURE_ABORT_TOO_FEW_CHANNELS =
560 : BT_HCI_LE_CS_PROCEDURE_ABORT_REASON_TOO_FEW_CHANNELS,
561 : BT_CONN_LE_CS_PROCEDURE_ABORT_CHMAP_INSTANT_PASSED =
562 : BT_HCI_LE_CS_PROCEDURE_ABORT_REASON_CHMAP_INSTANT_PASSED,
563 : BT_CONN_LE_CS_PROCEDURE_ABORT_UNSPECIFIED = BT_HCI_LE_CS_PROCEDURE_ABORT_REASON_UNSPECIFIED,
564 : };
565 :
566 : /** Subevent abort reason */
567 0 : enum bt_conn_le_cs_subevent_abort_reason {
568 : BT_CONN_LE_CS_SUBEVENT_NOT_ABORTED = BT_HCI_LE_CS_SUBEVENT_ABORT_REASON_NO_ABORT,
569 : BT_CONN_LE_CS_SUBEVENT_ABORT_REQUESTED =
570 : BT_HCI_LE_CS_SUBEVENT_ABORT_REASON_LOCAL_HOST_OR_REMOTE_REQUEST,
571 : BT_CONN_LE_CS_SUBEVENT_ABORT_NO_CS_SYNC =
572 : BT_HCI_LE_CS_SUBEVENT_ABORT_REASON_NO_CS_SYNC_RECEIVED,
573 : BT_CONN_LE_CS_SUBEVENT_ABORT_SCHED_CONFLICT =
574 : BT_HCI_LE_CS_SUBEVENT_ABORT_REASON_SCHED_CONFLICT,
575 : BT_CONN_LE_CS_SUBEVENT_ABORT_UNSPECIFIED = BT_HCI_LE_CS_SUBEVENT_ABORT_REASON_UNSPECIFIED,
576 : };
577 :
578 : /** Subevent data for LE connections supporting CS */
579 1 : struct bt_conn_le_cs_subevent_result {
580 : struct {
581 : /** CS configuration identifier.
582 : *
583 : * Range: 0 to 3
584 : *
585 : * If these results were generated by a CS Test,
586 : * this value will be set to 0 and has no meaning.
587 : */
588 1 : uint8_t config_id;
589 : /** Starting ACL connection event counter.
590 : *
591 : * If these results were generated by a CS Test,
592 : * this value will be set to 0 and has no meaning.
593 : */
594 1 : uint16_t start_acl_conn_event;
595 : /** CS procedure count associated with these results.
596 : *
597 : * This is the CS procedure count since the completion of
598 : * the Channel Sounding Security Start procedure.
599 : */
600 1 : uint16_t procedure_counter;
601 : /** Frequency compensation value in units of 0.01 ppm.
602 : *
603 : * This is a 15-bit signed integer in the range [-100, 100] ppm.
604 : *
605 : * A value of @ref BT_HCI_LE_CS_SUBEVENT_RESULT_FREQ_COMPENSATION_NOT_AVAILABLE
606 : * indicates that the role is not the initiator, or that the
607 : * frequency compensation value is unavailable.
608 : */
609 1 : uint16_t frequency_compensation;
610 : /** Reference power level in dBm.
611 : *
612 : * Range: -127 to 20
613 : *
614 : * A value of @ref BT_HCI_LE_CS_REF_POWER_LEVEL_UNAVAILABLE indicates
615 : * that the reference power level was not available during a subevent.
616 : */
617 1 : int8_t reference_power_level;
618 : /** Procedure status. */
619 1 : enum bt_conn_le_cs_procedure_done_status procedure_done_status;
620 : /** Subevent status
621 : *
622 : * For aborted subevents, this will be set to @ref BT_CONN_LE_CS_SUBEVENT_ABORTED
623 : * and abort_step will contain the step number on which the subevent was aborted.
624 : * Consider the following example:
625 : *
626 : * subevent_done_status = @ref BT_CONN_LE_CS_SUBEVENT_ABORTED
627 : * num_steps_reported = 160
628 : * abort_step = 100
629 : *
630 : * this would mean that steps from 0 to 99 are complete and steps from 100 to 159
631 : * are aborted.
632 : */
633 1 : enum bt_conn_le_cs_subevent_done_status subevent_done_status;
634 : /** Abort reason.
635 : *
636 : * If the procedure status is
637 : * @ref BT_CONN_LE_CS_PROCEDURE_ABORTED, this field will
638 : * specify the reason for the abortion.
639 : */
640 1 : enum bt_conn_le_cs_procedure_abort_reason procedure_abort_reason;
641 : /** Abort reason.
642 : *
643 : * If the subevent status is
644 : * @ref BT_CONN_LE_CS_SUBEVENT_ABORTED, this field will
645 : * specify the reason for the abortion.
646 : */
647 1 : enum bt_conn_le_cs_subevent_abort_reason subevent_abort_reason;
648 : /** Number of antenna paths used during the phase measurement stage.
649 : */
650 1 : uint8_t num_antenna_paths;
651 : /** Number of CS steps in the subevent.
652 : */
653 1 : uint8_t num_steps_reported;
654 : /** Step number, on which the subevent was aborted
655 : * if subevent_done_status is @ref BT_CONN_LE_CS_SUBEVENT_COMPLETE
656 : * then abort_step will be unused and set to 255
657 : */
658 1 : uint8_t abort_step;
659 0 : } header;
660 : /** Pointer to buffer containing step data.
661 : * NULL if num_steps_reported is 0.
662 : */
663 1 : struct net_buf_simple *step_data_buf;
664 : };
665 :
666 : /** @brief Increment a connection's reference count.
667 : *
668 : * Increment the reference count of a connection object.
669 : *
670 : * @note Will return NULL if the reference count is zero.
671 : *
672 : * @param conn Connection object.
673 : *
674 : * @return Connection object with incremented reference count, or NULL if the
675 : * reference count is zero.
676 : */
677 1 : struct bt_conn *bt_conn_ref(struct bt_conn *conn);
678 :
679 : /** @brief Decrement a connection's reference count.
680 : *
681 : * Decrement the reference count of a connection object.
682 : *
683 : * @param conn Connection object.
684 : */
685 1 : void bt_conn_unref(struct bt_conn *conn);
686 :
687 : /** @brief Iterate through all bt_conn objects.
688 : *
689 : * Iterates through all bt_conn objects that are alive in the Host allocator.
690 : *
691 : * To find established connections, combine this with @ref bt_conn_get_info.
692 : * Check that @ref bt_conn_info.state is @ref BT_CONN_STATE_CONNECTED.
693 : *
694 : * Thread safety: This API is thread safe, but it does not guarantee a
695 : * sequentially-consistent view for objects allocated during the current
696 : * invocation of this API. E.g. If preempted while allocations A then B then C
697 : * happen then results may include A and C but miss B.
698 : *
699 : * @param type Connection Type
700 : * @param func Function to call for each connection.
701 : * @param data Data to pass to the callback function.
702 : */
703 1 : void bt_conn_foreach(enum bt_conn_type type,
704 : void (*func)(struct bt_conn *conn, void *data),
705 : void *data);
706 :
707 : /** @brief Look up an existing connection by address.
708 : *
709 : * Look up an existing connection based on the remote address.
710 : *
711 : * The caller gets a new reference to the connection object which must be
712 : * released with bt_conn_unref() once done using the object.
713 : *
714 : * @param id Local identity (in most cases BT_ID_DEFAULT).
715 : * @param peer Remote address.
716 : *
717 : * @return Connection object or NULL if not found.
718 : */
719 1 : struct bt_conn *bt_conn_lookup_addr_le(uint8_t id, const bt_addr_le_t *peer);
720 :
721 : /** @brief Get destination (peer) address of a connection.
722 : *
723 : * @param conn Connection object.
724 : *
725 : * @return Destination address.
726 : */
727 1 : const bt_addr_le_t *bt_conn_get_dst(const struct bt_conn *conn);
728 :
729 : /** @brief Get array index of a connection
730 : *
731 : * This function is used to map bt_conn to index of an array of
732 : * connections. The array has CONFIG_BT_MAX_CONN elements.
733 : *
734 : * @param conn Connection object.
735 : *
736 : * @return Index of the connection object.
737 : * The range of the returned value is 0..CONFIG_BT_MAX_CONN-1
738 : */
739 1 : uint8_t bt_conn_index(const struct bt_conn *conn);
740 :
741 : /** LE Connection Info Structure */
742 1 : struct bt_conn_le_info {
743 : /** Source (Local) Identity Address */
744 1 : const bt_addr_le_t *src;
745 : /** Destination (Remote) Identity Address or remote Resolvable Private
746 : * Address (RPA) before identity has been resolved.
747 : */
748 1 : const bt_addr_le_t *dst;
749 : /** Local device address used during connection setup. */
750 1 : const bt_addr_le_t *local;
751 : /** Remote device address used during connection setup. */
752 1 : const bt_addr_le_t *remote;
753 1 : uint16_t interval; /**< Connection interval */
754 1 : uint16_t latency; /**< Connection peripheral latency */
755 1 : uint16_t timeout; /**< Connection supervision timeout */
756 :
757 : #if defined(CONFIG_BT_USER_PHY_UPDATE)
758 0 : const struct bt_conn_le_phy_info *phy;
759 : #endif /* defined(CONFIG_BT_USER_PHY_UPDATE) */
760 :
761 : #if defined(CONFIG_BT_USER_DATA_LEN_UPDATE)
762 : /* Connection maximum single fragment parameters */
763 0 : const struct bt_conn_le_data_len_info *data_len;
764 : #endif /* defined(CONFIG_BT_USER_DATA_LEN_UPDATE) */
765 :
766 : #if defined(CONFIG_BT_SUBRATING)
767 : /* Connection subrating parameters */
768 : const struct bt_conn_le_subrating_info *subrate;
769 : #endif /* defined(CONFIG_BT_SUBRATING) */
770 : };
771 :
772 : /** @brief Convert connection interval to milliseconds
773 : *
774 : * Multiply by 1.25 to get milliseconds.
775 : *
776 : * Note that this may be inaccurate, as something like 7.5 ms cannot be
777 : * accurately presented with integers.
778 : */
779 1 : #define BT_CONN_INTERVAL_TO_MS(interval) ((interval) * 5U / 4U)
780 :
781 : /** @brief Convert connection interval to microseconds
782 : *
783 : * Multiply by 1250 to get microseconds.
784 : */
785 1 : #define BT_CONN_INTERVAL_TO_US(interval) ((interval) * 1250U)
786 :
787 : /** BR/EDR Connection Info Structure */
788 1 : struct bt_conn_br_info {
789 1 : const bt_addr_t *dst; /**< Destination (Remote) BR/EDR address */
790 : };
791 :
792 0 : enum {
793 : BT_CONN_ROLE_CENTRAL = 0,
794 : BT_CONN_ROLE_PERIPHERAL = 1,
795 : };
796 :
797 0 : enum bt_conn_state {
798 : /** Channel disconnected */
799 : BT_CONN_STATE_DISCONNECTED,
800 : /** Channel in connecting state */
801 : BT_CONN_STATE_CONNECTING,
802 : /** Channel connected and ready for upper layer traffic on it */
803 : BT_CONN_STATE_CONNECTED,
804 : /** Channel in disconnecting state */
805 : BT_CONN_STATE_DISCONNECTING,
806 : };
807 :
808 : /** Security level. */
809 1 : typedef enum __packed {
810 : /** Level 0: Only for BR/EDR special cases, like SDP */
811 : BT_SECURITY_L0,
812 : /** Level 1: No encryption and no authentication. */
813 : BT_SECURITY_L1,
814 : /** Level 2: Encryption and no authentication (no MITM). */
815 : BT_SECURITY_L2,
816 : /** Level 3: Encryption and authentication (MITM). */
817 : BT_SECURITY_L3,
818 : /** Level 4: Authenticated Secure Connections and 128-bit key. */
819 : BT_SECURITY_L4,
820 : /** Bit to force new pairing procedure, bit-wise OR with requested
821 : * security level.
822 : */
823 : BT_SECURITY_FORCE_PAIR = BIT(7),
824 : } bt_security_t;
825 :
826 : /** Security Info Flags. */
827 1 : enum bt_security_flag {
828 : /** Paired with Secure Connections. */
829 : BT_SECURITY_FLAG_SC = BIT(0),
830 : /** Paired with Out of Band method. */
831 : BT_SECURITY_FLAG_OOB = BIT(1),
832 : };
833 :
834 : /** Security Info Structure. */
835 1 : struct bt_security_info {
836 : /** Security Level. */
837 1 : bt_security_t level;
838 : /** Encryption Key Size. */
839 1 : uint8_t enc_key_size;
840 : /** Flags. */
841 1 : enum bt_security_flag flags;
842 : };
843 :
844 : /** Connection Info Structure */
845 1 : struct bt_conn_info {
846 : /** Connection Type. */
847 1 : enum bt_conn_type type;
848 : /** Connection Role. */
849 1 : uint8_t role;
850 : /** Which local identity the connection was created with */
851 1 : uint8_t id;
852 : /** Connection Type specific Info.*/
853 : union {
854 : /** LE Connection specific Info. */
855 1 : struct bt_conn_le_info le;
856 : /** BR/EDR Connection specific Info. */
857 1 : struct bt_conn_br_info br;
858 1 : };
859 : /** Connection state. */
860 1 : enum bt_conn_state state;
861 : /** Security specific info. */
862 1 : struct bt_security_info security;
863 : };
864 :
865 : /** LE Connection Remote Info Structure */
866 1 : struct bt_conn_le_remote_info {
867 :
868 : /** Remote LE feature set (bitmask). */
869 1 : const uint8_t *features;
870 : };
871 :
872 : /** BR/EDR Connection Remote Info structure */
873 1 : struct bt_conn_br_remote_info {
874 :
875 : /** Remote feature set (pages of bitmasks). */
876 1 : const uint8_t *features;
877 :
878 : /** Number of pages in the remote feature set. */
879 1 : uint8_t num_pages;
880 : };
881 :
882 : /** @brief Connection Remote Info Structure
883 : *
884 : * @note The version, manufacturer and subversion fields will only contain
885 : * valid data if @kconfig{CONFIG_BT_REMOTE_VERSION} is enabled.
886 : */
887 1 : struct bt_conn_remote_info {
888 : /** Connection Type */
889 1 : uint8_t type;
890 :
891 : /** Remote Link Layer version */
892 1 : uint8_t version;
893 :
894 : /** Remote manufacturer identifier */
895 1 : uint16_t manufacturer;
896 :
897 : /** Per-manufacturer unique revision */
898 1 : uint16_t subversion;
899 :
900 : union {
901 : /** LE connection remote info */
902 1 : struct bt_conn_le_remote_info le;
903 :
904 : /** BR/EDR connection remote info */
905 1 : struct bt_conn_br_remote_info br;
906 0 : };
907 : };
908 :
909 0 : enum bt_conn_le_tx_power_phy {
910 : /** Convenience macro for when no PHY is set. */
911 : BT_CONN_LE_TX_POWER_PHY_NONE,
912 : /** LE 1M PHY */
913 : BT_CONN_LE_TX_POWER_PHY_1M,
914 : /** LE 2M PHY */
915 : BT_CONN_LE_TX_POWER_PHY_2M,
916 : /** LE Coded PHY using S=8 coding. */
917 : BT_CONN_LE_TX_POWER_PHY_CODED_S8,
918 : /** LE Coded PHY using S=2 coding. */
919 : BT_CONN_LE_TX_POWER_PHY_CODED_S2,
920 : };
921 :
922 : /** LE Transmit Power Level Structure */
923 1 : struct bt_conn_le_tx_power {
924 :
925 : /** Input: 1M, 2M, Coded S2 or Coded S8 */
926 1 : uint8_t phy;
927 :
928 : /** Output: current transmit power level */
929 1 : int8_t current_level;
930 :
931 : /** Output: maximum transmit power level */
932 1 : int8_t max_level;
933 : };
934 :
935 :
936 : /** LE Transmit Power Reporting Structure */
937 1 : struct bt_conn_le_tx_power_report {
938 :
939 : /** Reason for Transmit power reporting,
940 : * as documented in Core Spec. Version 5.4 Vol. 4, Part E, 7.7.65.33.
941 : */
942 1 : uint8_t reason;
943 :
944 : /** Phy of Transmit power reporting. */
945 1 : enum bt_conn_le_tx_power_phy phy;
946 :
947 : /** Transmit power level
948 : * - 0xXX - Transmit power level
949 : * + Range: -127 to 20
950 : * + Units: dBm
951 : *
952 : * - 0x7E - Remote device is not managing power levels on this PHY.
953 : * - 0x7F - Transmit power level is not available
954 : */
955 1 : int8_t tx_power_level;
956 :
957 : /** Bit 0: Transmit power level is at minimum level.
958 : * Bit 1: Transmit power level is at maximum level.
959 : */
960 1 : uint8_t tx_power_level_flag;
961 :
962 : /** Change in transmit power level
963 : * - 0xXX - Change in transmit power level (positive indicates increased
964 : * power, negative indicates decreased power, zero indicates unchanged)
965 : * Units: dB
966 : * - 0x7F - Change is not available or is out of range.
967 : */
968 1 : int8_t delta;
969 : };
970 :
971 : /** @brief Path Loss zone that has been entered.
972 : *
973 : * The path loss zone that has been entered in the most recent LE Path Loss Monitoring
974 : * Threshold Change event as documented in Core Spec. Version 5.4 Vol.4, Part E, 7.7.65.32.
975 : *
976 : * @note BT_CONN_LE_PATH_LOSS_ZONE_UNAVAILABLE has been added to notify when path loss becomes
977 : * unavailable.
978 : */
979 1 : enum bt_conn_le_path_loss_zone {
980 : /** Low path loss zone entered. */
981 : BT_CONN_LE_PATH_LOSS_ZONE_ENTERED_LOW,
982 : /** Middle path loss zone entered. */
983 : BT_CONN_LE_PATH_LOSS_ZONE_ENTERED_MIDDLE,
984 : /** High path loss zone entered. */
985 : BT_CONN_LE_PATH_LOSS_ZONE_ENTERED_HIGH,
986 : /** Path loss has become unavailable. */
987 : BT_CONN_LE_PATH_LOSS_ZONE_UNAVAILABLE,
988 : };
989 :
990 : BUILD_ASSERT(BT_CONN_LE_PATH_LOSS_ZONE_ENTERED_LOW == BT_HCI_LE_ZONE_ENTERED_LOW);
991 : BUILD_ASSERT(BT_CONN_LE_PATH_LOSS_ZONE_ENTERED_MIDDLE == BT_HCI_LE_ZONE_ENTERED_MIDDLE);
992 : BUILD_ASSERT(BT_CONN_LE_PATH_LOSS_ZONE_ENTERED_HIGH == BT_HCI_LE_ZONE_ENTERED_HIGH);
993 :
994 : /** @brief LE Path Loss Monitoring Threshold Change Report Structure. */
995 1 : struct bt_conn_le_path_loss_threshold_report {
996 :
997 : /** Path Loss zone as documented in Core Spec. Version 5.4 Vol.4, Part E, 7.7.65.32. */
998 1 : enum bt_conn_le_path_loss_zone zone;
999 :
1000 : /** Current path loss (dB). */
1001 1 : uint8_t path_loss;
1002 : };
1003 :
1004 : /** @brief LE Path Loss Monitoring Parameters Structure as defined in Core Spec. Version 5.4
1005 : * Vol.4, Part E, 7.8.119 LE Set Path Loss Reporting Parameters command.
1006 : */
1007 1 : struct bt_conn_le_path_loss_reporting_param {
1008 : /** High threshold for the path loss (dB). */
1009 1 : uint8_t high_threshold;
1010 : /** Hysteresis value for the high threshold (dB). */
1011 1 : uint8_t high_hysteresis;
1012 : /** Low threshold for the path loss (dB). */
1013 1 : uint8_t low_threshold;
1014 : /** Hysteresis value for the low threshold (dB). */
1015 1 : uint8_t low_hysteresis;
1016 : /** Minimum time in number of connection events to be observed once the
1017 : * path loss crosses the threshold before an event is generated.
1018 : */
1019 1 : uint16_t min_time_spent;
1020 : };
1021 :
1022 : /** @brief Passkey Keypress Notification type
1023 : *
1024 : * The numeric values are the same as in the Core specification for Pairing
1025 : * Keypress Notification PDU.
1026 : */
1027 0 : enum bt_conn_auth_keypress {
1028 : BT_CONN_AUTH_KEYPRESS_ENTRY_STARTED = 0x00,
1029 : BT_CONN_AUTH_KEYPRESS_DIGIT_ENTERED = 0x01,
1030 : BT_CONN_AUTH_KEYPRESS_DIGIT_ERASED = 0x02,
1031 : BT_CONN_AUTH_KEYPRESS_CLEARED = 0x03,
1032 : BT_CONN_AUTH_KEYPRESS_ENTRY_COMPLETED = 0x04,
1033 : };
1034 :
1035 : /** @brief Get connection info
1036 : *
1037 : * @param conn Connection object.
1038 : * @param info Connection info object.
1039 : *
1040 : * @return Zero on success or (negative) error code on failure.
1041 : */
1042 1 : int bt_conn_get_info(const struct bt_conn *conn, struct bt_conn_info *info);
1043 :
1044 : /** @brief Get connection info for the remote device.
1045 : *
1046 : * @param conn Connection object.
1047 : * @param remote_info Connection remote info object.
1048 : *
1049 : * @note In order to retrieve the remote version (version, manufacturer
1050 : * and subversion) @kconfig{CONFIG_BT_REMOTE_VERSION} must be enabled
1051 : *
1052 : * @note The remote information is exchanged directly after the connection has
1053 : * been established. The application can be notified about when the remote
1054 : * information is available through the remote_info_available callback.
1055 : *
1056 : * @return Zero on success or (negative) error code on failure.
1057 : * @return -EBUSY The remote information is not yet available.
1058 : */
1059 1 : int bt_conn_get_remote_info(struct bt_conn *conn,
1060 : struct bt_conn_remote_info *remote_info);
1061 :
1062 : /** @brief Get connection transmit power level.
1063 : *
1064 : * @param conn Connection object.
1065 : * @param tx_power_level Transmit power level descriptor.
1066 : *
1067 : * @return Zero on success or (negative) error code on failure.
1068 : * @return -ENOBUFS HCI command buffer is not available.
1069 : */
1070 1 : int bt_conn_le_get_tx_power_level(struct bt_conn *conn,
1071 : struct bt_conn_le_tx_power *tx_power_level);
1072 :
1073 : /** @brief Get local enhanced connection transmit power level.
1074 : *
1075 : * @param conn Connection object.
1076 : * @param tx_power Transmit power level descriptor.
1077 : *
1078 : * @return Zero on success or (negative) error code on failure.
1079 : * @retval -ENOBUFS HCI command buffer is not available.
1080 : */
1081 1 : int bt_conn_le_enhanced_get_tx_power_level(struct bt_conn *conn,
1082 : struct bt_conn_le_tx_power *tx_power);
1083 :
1084 : /** @brief Get remote (peer) transmit power level.
1085 : *
1086 : * @param conn Connection object.
1087 : * @param phy PHY information.
1088 : *
1089 : * @return Zero on success or (negative) error code on failure.
1090 : * @retval -ENOBUFS HCI command buffer is not available.
1091 : */
1092 1 : int bt_conn_le_get_remote_tx_power_level(struct bt_conn *conn,
1093 : enum bt_conn_le_tx_power_phy phy);
1094 :
1095 : /** @brief Enable transmit power reporting.
1096 : *
1097 : * @param conn Connection object.
1098 : * @param local_enable Enable/disable reporting for local.
1099 : * @param remote_enable Enable/disable reporting for remote.
1100 : *
1101 : * @return Zero on success or (negative) error code on failure.
1102 : * @retval -ENOBUFS HCI command buffer is not available.
1103 : */
1104 1 : int bt_conn_le_set_tx_power_report_enable(struct bt_conn *conn,
1105 : bool local_enable,
1106 : bool remote_enable);
1107 :
1108 : /** @brief Set Path Loss Monitoring Parameters.
1109 : *
1110 : * Change the configuration for path loss threshold change events for a given conn handle.
1111 : *
1112 : * @note To use this API @kconfig{CONFIG_BT_PATH_LOSS_MONITORING} must be set.
1113 : *
1114 : * @param conn Connection object.
1115 : * @param param Path Loss Monitoring parameters
1116 : *
1117 : * @return Zero on success or (negative) error code on failure.
1118 : */
1119 1 : int bt_conn_le_set_path_loss_mon_param(struct bt_conn *conn,
1120 : const struct bt_conn_le_path_loss_reporting_param *param);
1121 :
1122 : /** @brief Enable or Disable Path Loss Monitoring.
1123 : *
1124 : * Enable or disable Path Loss Monitoring, which will decide whether Path Loss Threshold events
1125 : * are sent from the controller to the host.
1126 : *
1127 : * @note To use this API @kconfig{CONFIG_BT_PATH_LOSS_MONITORING} must be set.
1128 : *
1129 : * @param conn Connection Object.
1130 : * @param enable Enable/disable path loss reporting.
1131 : *
1132 : * @return Zero on success or (negative) error code on failure.
1133 : */
1134 1 : int bt_conn_le_set_path_loss_mon_enable(struct bt_conn *conn, bool enable);
1135 :
1136 : /** @brief Set Default Connection Subrating Parameters.
1137 : *
1138 : * Change the default subrating parameters for all future
1139 : * ACL connections where the local device is the central.
1140 : * This command does not affect any existing connection.
1141 : * Parameters set for specific connection will always have precedence.
1142 : *
1143 : * @note To use this API @kconfig{CONFIG_BT_SUBRATING} and
1144 : * @kconfig{CONFIG_BT_CENTRAL} must be set.
1145 : *
1146 : * @param params Subrating parameters.
1147 : *
1148 : * @return Zero on success or (negative) error code on failure.
1149 : */
1150 1 : int bt_conn_le_subrate_set_defaults(const struct bt_conn_le_subrate_param *params);
1151 :
1152 : /** @brief Request New Subrating Parameters.
1153 : *
1154 : * Request a change to the subrating parameters of a connection.
1155 : *
1156 : * @note To use this API @kconfig{CONFIG_BT_SUBRATING} must be set.
1157 : *
1158 : * @param conn Connection object.
1159 : * @param params Subrating parameters.
1160 : *
1161 : * @return Zero on success or (negative) error code on failure.
1162 : */
1163 1 : int bt_conn_le_subrate_request(struct bt_conn *conn,
1164 : const struct bt_conn_le_subrate_param *params);
1165 :
1166 : /** @brief Update the connection parameters.
1167 : *
1168 : * If the local device is in the peripheral role then updating the connection
1169 : * parameters will be delayed. This delay can be configured by through the
1170 : * @kconfig{CONFIG_BT_CONN_PARAM_UPDATE_TIMEOUT} option.
1171 : *
1172 : * @param conn Connection object.
1173 : * @param param Updated connection parameters.
1174 : *
1175 : * @return Zero on success or (negative) error code on failure.
1176 : */
1177 1 : int bt_conn_le_param_update(struct bt_conn *conn,
1178 : const struct bt_le_conn_param *param);
1179 :
1180 : /** @brief Update the connection transmit data length parameters.
1181 : *
1182 : * @param conn Connection object.
1183 : * @param param Updated data length parameters.
1184 : *
1185 : * @return Zero on success or (negative) error code on failure.
1186 : */
1187 1 : int bt_conn_le_data_len_update(struct bt_conn *conn,
1188 : const struct bt_conn_le_data_len_param *param);
1189 :
1190 : /** @brief Update the connection PHY parameters.
1191 : *
1192 : * Update the preferred transmit and receive PHYs of the connection.
1193 : * Use @ref BT_GAP_LE_PHY_NONE to indicate no preference.
1194 : *
1195 : * @param conn Connection object.
1196 : * @param param Updated connection parameters.
1197 : *
1198 : * @return Zero on success or (negative) error code on failure.
1199 : */
1200 1 : int bt_conn_le_phy_update(struct bt_conn *conn,
1201 : const struct bt_conn_le_phy_param *param);
1202 :
1203 : /** @brief Disconnect from a remote device or cancel pending connection.
1204 : *
1205 : * Disconnect an active connection with the specified reason code or cancel
1206 : * pending outgoing connection.
1207 : *
1208 : * The disconnect reason for a normal disconnect should be:
1209 : * @ref BT_HCI_ERR_REMOTE_USER_TERM_CONN.
1210 : *
1211 : * The following disconnect reasons are accepted:
1212 : * - @ref BT_HCI_ERR_AUTH_FAIL
1213 : * - @ref BT_HCI_ERR_REMOTE_USER_TERM_CONN
1214 : * - @ref BT_HCI_ERR_REMOTE_LOW_RESOURCES
1215 : * - @ref BT_HCI_ERR_REMOTE_POWER_OFF
1216 : * - @ref BT_HCI_ERR_UNSUPP_REMOTE_FEATURE
1217 : * - @ref BT_HCI_ERR_PAIRING_NOT_SUPPORTED
1218 : * - @ref BT_HCI_ERR_UNACCEPT_CONN_PARAM
1219 : *
1220 : * @param conn Connection to disconnect.
1221 : * @param reason Reason code for the disconnection.
1222 : *
1223 : * @return Zero on success or (negative) error code on failure.
1224 : */
1225 1 : int bt_conn_disconnect(struct bt_conn *conn, uint8_t reason);
1226 :
1227 0 : enum {
1228 : /** Convenience value when no options are specified. */
1229 : BT_CONN_LE_OPT_NONE = 0,
1230 :
1231 : /** @brief Enable LE Coded PHY.
1232 : *
1233 : * Enable scanning on the LE Coded PHY.
1234 : */
1235 : BT_CONN_LE_OPT_CODED = BIT(0),
1236 :
1237 : /** @brief Disable LE 1M PHY.
1238 : *
1239 : * Disable scanning on the LE 1M PHY.
1240 : *
1241 : * @note Requires @ref BT_CONN_LE_OPT_CODED.
1242 : */
1243 : BT_CONN_LE_OPT_NO_1M = BIT(1),
1244 : };
1245 :
1246 0 : struct bt_conn_le_create_param {
1247 :
1248 : /** Bit-field of create connection options. */
1249 1 : uint32_t options;
1250 :
1251 : /** Scan interval (N * 0.625 ms)
1252 : *
1253 : * @note When @kconfig{CONFIG_BT_SCAN_AND_INITIATE_IN_PARALLEL} is enabled
1254 : * and the application wants to scan and connect in parallel,
1255 : * the Bluetooth Controller may require the scan interval used
1256 : * for scanning and connection establishment to be equal to
1257 : * obtain the best performance.
1258 : */
1259 1 : uint16_t interval;
1260 :
1261 : /** Scan window (N * 0.625 ms)
1262 : *
1263 : * @note When @kconfig{CONFIG_BT_SCAN_AND_INITIATE_IN_PARALLEL} is enabled
1264 : * and the application wants to scan and connect in parallel,
1265 : * the Bluetooth Controller may require the scan window used
1266 : * for scanning and connection establishment to be equal to
1267 : * obtain the best performance.
1268 : */
1269 1 : uint16_t window;
1270 :
1271 : /** @brief Scan interval LE Coded PHY (N * 0.625 MS)
1272 : *
1273 : * Set zero to use same as LE 1M PHY scan interval
1274 : */
1275 1 : uint16_t interval_coded;
1276 :
1277 : /** @brief Scan window LE Coded PHY (N * 0.625 MS)
1278 : *
1279 : * Set zero to use same as LE 1M PHY scan window.
1280 : */
1281 1 : uint16_t window_coded;
1282 :
1283 : /** @brief Connection initiation timeout (N * 10 MS)
1284 : *
1285 : * Set zero to use the default @kconfig{CONFIG_BT_CREATE_CONN_TIMEOUT}
1286 : * timeout.
1287 : *
1288 : * @note Unused in @ref bt_conn_le_create_auto
1289 : */
1290 1 : uint16_t timeout;
1291 : };
1292 :
1293 : /** @brief Initialize create connection parameters
1294 : *
1295 : * @param _options Create connection options.
1296 : * @param _interval Create connection scan interval (N * 0.625 ms).
1297 : * @param _window Create connection scan window (N * 0.625 ms).
1298 : */
1299 1 : #define BT_CONN_LE_CREATE_PARAM_INIT(_options, _interval, _window) \
1300 : { \
1301 : .options = (_options), \
1302 : .interval = (_interval), \
1303 : .window = (_window), \
1304 : .interval_coded = 0, \
1305 : .window_coded = 0, \
1306 : .timeout = 0, \
1307 : }
1308 :
1309 : /** Helper to declare create connection parameters inline
1310 : *
1311 : * @param _options Create connection options.
1312 : * @param _interval Create connection scan interval (N * 0.625 ms).
1313 : * @param _window Create connection scan window (N * 0.625 ms).
1314 : */
1315 1 : #define BT_CONN_LE_CREATE_PARAM(_options, _interval, _window) \
1316 : ((struct bt_conn_le_create_param[]) { \
1317 : BT_CONN_LE_CREATE_PARAM_INIT(_options, _interval, _window) \
1318 : })
1319 :
1320 : /** Default LE create connection parameters.
1321 : * Scan continuously by setting scan interval equal to scan window.
1322 : */
1323 1 : #define BT_CONN_LE_CREATE_CONN \
1324 : BT_CONN_LE_CREATE_PARAM(BT_CONN_LE_OPT_NONE, \
1325 : BT_GAP_SCAN_FAST_INTERVAL, \
1326 : BT_GAP_SCAN_FAST_INTERVAL)
1327 :
1328 : /** Default LE create connection using filter accept list parameters.
1329 : * Scan window: 30 ms.
1330 : * Scan interval: 60 ms.
1331 : */
1332 1 : #define BT_CONN_LE_CREATE_CONN_AUTO \
1333 : BT_CONN_LE_CREATE_PARAM(BT_CONN_LE_OPT_NONE, \
1334 : BT_GAP_SCAN_FAST_INTERVAL, \
1335 : BT_GAP_SCAN_FAST_WINDOW)
1336 :
1337 : /** @brief Initiate an LE connection to a remote device.
1338 : *
1339 : * Allows initiate new LE link to remote peer using its address.
1340 : *
1341 : * The caller gets a new reference to the connection object which must be
1342 : * released with bt_conn_unref() once done using the object. If
1343 : * @kconfig{CONFIG_BT_CONN_CHECK_NULL_BEFORE_CREATE} is enabled, this function
1344 : * will return -EINVAL if dereferenced @p conn is not NULL.
1345 : *
1346 : * This uses the General Connection Establishment procedure.
1347 : *
1348 : * The application must disable explicit scanning before initiating
1349 : * a new LE connection if @kconfig{CONFIG_BT_SCAN_AND_INITIATE_IN_PARALLEL}
1350 : * is not enabled.
1351 : *
1352 : * @param[in] peer Remote address.
1353 : * @param[in] create_param Create connection parameters.
1354 : * @param[in] conn_param Initial connection parameters.
1355 : * @param[out] conn Valid connection object on success.
1356 : *
1357 : * @return Zero on success or (negative) error code on failure.
1358 : */
1359 1 : int bt_conn_le_create(const bt_addr_le_t *peer,
1360 : const struct bt_conn_le_create_param *create_param,
1361 : const struct bt_le_conn_param *conn_param,
1362 : struct bt_conn **conn);
1363 :
1364 0 : struct bt_conn_le_create_synced_param {
1365 :
1366 : /** @brief Remote address
1367 : *
1368 : * The peer must be synchronized to the PAwR train.
1369 : *
1370 : */
1371 1 : const bt_addr_le_t *peer;
1372 :
1373 : /** The subevent where the connection will be initiated. */
1374 1 : uint8_t subevent;
1375 : };
1376 :
1377 : /** @brief Create a connection to a synced device
1378 : *
1379 : * Initiate a connection to a synced device from a Periodic Advertising
1380 : * with Responses (PAwR) train.
1381 : *
1382 : * The caller gets a new reference to the connection object which must be
1383 : * released with bt_conn_unref() once done using the object. If
1384 : * @kconfig{CONFIG_BT_CONN_CHECK_NULL_BEFORE_CREATE} is enabled, this function
1385 : * will return -EINVAL if dereferenced @p conn is not NULL.
1386 : *
1387 : * This uses the Periodic Advertising Connection Procedure.
1388 : *
1389 : * @param[in] adv The adverting set the PAwR advertiser belongs to.
1390 : * @param[in] synced_param Create connection parameters.
1391 : * @param[in] conn_param Initial connection parameters.
1392 : * @param[out] conn Valid connection object on success.
1393 : *
1394 : * @return Zero on success or (negative) error code on failure.
1395 : */
1396 1 : int bt_conn_le_create_synced(const struct bt_le_ext_adv *adv,
1397 : const struct bt_conn_le_create_synced_param *synced_param,
1398 : const struct bt_le_conn_param *conn_param, struct bt_conn **conn);
1399 :
1400 : /** @brief Automatically connect to remote devices in the filter accept list.
1401 : *
1402 : * This uses the Auto Connection Establishment procedure.
1403 : * The procedure will continue until a single connection is established or the
1404 : * procedure is stopped through @ref bt_conn_create_auto_stop.
1405 : * To establish connections to all devices in the filter accept list the
1406 : * procedure should be started again in the connected callback after a
1407 : * new connection has been established.
1408 : *
1409 : * @param create_param Create connection parameters
1410 : * @param conn_param Initial connection parameters.
1411 : *
1412 : * @return Zero on success or (negative) error code on failure.
1413 : * @return -ENOMEM No free connection object available.
1414 : */
1415 1 : int bt_conn_le_create_auto(const struct bt_conn_le_create_param *create_param,
1416 : const struct bt_le_conn_param *conn_param);
1417 :
1418 : /** @brief Stop automatic connect creation.
1419 : *
1420 : * @return Zero on success or (negative) error code on failure.
1421 : */
1422 1 : int bt_conn_create_auto_stop(void);
1423 :
1424 : /** @brief Automatically connect to remote device if it's in range.
1425 : *
1426 : * This function enables/disables automatic connection initiation.
1427 : * Every time the device loses the connection with peer, this connection
1428 : * will be re-established if connectable advertisement from peer is received.
1429 : *
1430 : * @note Auto connect is disabled during explicit scanning.
1431 : *
1432 : * @param addr Remote Bluetooth address.
1433 : * @param param If non-NULL, auto connect is enabled with the given
1434 : * parameters. If NULL, auto connect is disabled.
1435 : *
1436 : * @return Zero on success or error code otherwise.
1437 : */
1438 1 : __deprecated int bt_le_set_auto_conn(const bt_addr_le_t *addr,
1439 : const struct bt_le_conn_param *param);
1440 :
1441 : /** @brief Set security level for a connection.
1442 : *
1443 : * This function enable security (encryption) for a connection. If the device
1444 : * has bond information for the peer with sufficiently strong key encryption
1445 : * will be enabled. If the connection is already encrypted with sufficiently
1446 : * strong key this function does nothing.
1447 : *
1448 : * If the device has no bond information for the peer and is not already paired
1449 : * then the pairing procedure will be initiated. Note that @p sec has no effect
1450 : * on the security level selected for the pairing process. The selection is
1451 : * instead controlled by the values of the registered @ref bt_conn_auth_cb. If
1452 : * the device has bond information or is already paired and the keys are too
1453 : * weak then the pairing procedure will be initiated.
1454 : *
1455 : * This function may return an error if the required level of security defined using
1456 : * @p sec is not possible to achieve due to local or remote device limitation
1457 : * (e.g., input output capabilities), or if the maximum number of paired devices
1458 : * has been reached.
1459 : *
1460 : * This function may return an error if the pairing procedure has already been
1461 : * initiated by the local device or the peer device.
1462 : *
1463 : * @note When @kconfig{CONFIG_BT_SMP_SC_ONLY} is enabled then the security
1464 : * level will always be level 4.
1465 : *
1466 : * @note When @kconfig{CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY} is enabled then the
1467 : * security level will always be level 3.
1468 : *
1469 : * @note When @ref BT_SECURITY_FORCE_PAIR within @p sec is enabled then the pairing
1470 : * procedure will always be initiated.
1471 : *
1472 : * @param conn Connection object.
1473 : * @param sec Requested minimum security level.
1474 : *
1475 : * @return 0 on success or negative error
1476 : */
1477 1 : int bt_conn_set_security(struct bt_conn *conn, bt_security_t sec);
1478 :
1479 : /** @brief Get security level for a connection.
1480 : *
1481 : * @return Connection security level
1482 : */
1483 1 : bt_security_t bt_conn_get_security(const struct bt_conn *conn);
1484 :
1485 : /** @brief Get encryption key size.
1486 : *
1487 : * This function gets encryption key size.
1488 : * If there is no security (encryption) enabled 0 will be returned.
1489 : *
1490 : * @param conn Existing connection object.
1491 : *
1492 : * @return Encryption key size.
1493 : */
1494 1 : uint8_t bt_conn_enc_key_size(const struct bt_conn *conn);
1495 :
1496 0 : enum bt_security_err {
1497 : /** Security procedure successful. */
1498 : BT_SECURITY_ERR_SUCCESS,
1499 :
1500 : /** Authentication failed. */
1501 : BT_SECURITY_ERR_AUTH_FAIL,
1502 :
1503 : /** PIN or encryption key is missing. */
1504 : BT_SECURITY_ERR_PIN_OR_KEY_MISSING,
1505 :
1506 : /** OOB data is not available. */
1507 : BT_SECURITY_ERR_OOB_NOT_AVAILABLE,
1508 :
1509 : /** The requested security level could not be reached. */
1510 : BT_SECURITY_ERR_AUTH_REQUIREMENT,
1511 :
1512 : /** Pairing is not supported */
1513 : BT_SECURITY_ERR_PAIR_NOT_SUPPORTED,
1514 :
1515 : /** Pairing is not allowed. */
1516 : BT_SECURITY_ERR_PAIR_NOT_ALLOWED,
1517 :
1518 : /** Invalid parameters. */
1519 : BT_SECURITY_ERR_INVALID_PARAM,
1520 :
1521 : /** Distributed Key Rejected */
1522 : BT_SECURITY_ERR_KEY_REJECTED,
1523 :
1524 : /** Pairing failed but the exact reason could not be specified. */
1525 : BT_SECURITY_ERR_UNSPECIFIED,
1526 : };
1527 :
1528 0 : enum bt_conn_le_cs_procedure_enable_state {
1529 : BT_CONN_LE_CS_PROCEDURES_DISABLED = BT_HCI_OP_LE_CS_PROCEDURES_DISABLED,
1530 : BT_CONN_LE_CS_PROCEDURES_ENABLED = BT_HCI_OP_LE_CS_PROCEDURES_ENABLED,
1531 : };
1532 :
1533 : /** CS Test Tone Antennna Config Selection.
1534 : *
1535 : * These enum values are indices in the following table, where N_AP is the maximum
1536 : * number of antenna paths (in the range [1, 4]).
1537 : *
1538 : * +--------------+-------------+-------------------+-------------------+--------+
1539 : * | Config Index | Total Paths | Dev A: # Antennas | Dev B: # Antennas | Config |
1540 : * +--------------+-------------+-------------------+-------------------+--------+
1541 : * | 0 | 1 | 1 | 1 | 1:1 |
1542 : * | 1 | 2 | 2 | 1 | N_AP:1 |
1543 : * | 2 | 3 | 3 | 1 | N_AP:1 |
1544 : * | 3 | 4 | 4 | 1 | N_AP:1 |
1545 : * | 4 | 2 | 1 | 2 | 1:N_AP |
1546 : * | 5 | 3 | 1 | 3 | 1:N_AP |
1547 : * | 6 | 4 | 1 | 4 | 1:N_AP |
1548 : * | 7 | 4 | 2 | 2 | 2:2 |
1549 : * +--------------+-------------+-------------------+-------------------+--------+
1550 : *
1551 : * There are therefore four groups of possible antenna configurations:
1552 : *
1553 : * - 1:1 configuration, where both A and B support 1 antenna each
1554 : * - 1:N_AP configuration, where A supports 1 antenna, B supports N_AP antennas, and
1555 : * N_AP is a value in the range [2, 4]
1556 : * - N_AP:1 configuration, where A supports N_AP antennas, B supports 1 antenna, and
1557 : * N_AP is a value in the range [2, 4]
1558 : * - 2:2 configuration, where both A and B support 2 antennas and N_AP = 4
1559 : */
1560 0 : enum bt_conn_le_cs_tone_antenna_config_selection {
1561 : BT_LE_CS_TONE_ANTENNA_CONFIGURATION_INDEX_ONE = BT_HCI_OP_LE_CS_ACI_0,
1562 : BT_LE_CS_TONE_ANTENNA_CONFIGURATION_INDEX_TWO = BT_HCI_OP_LE_CS_ACI_1,
1563 : BT_LE_CS_TONE_ANTENNA_CONFIGURATION_INDEX_THREE = BT_HCI_OP_LE_CS_ACI_2,
1564 : BT_LE_CS_TONE_ANTENNA_CONFIGURATION_INDEX_FOUR = BT_HCI_OP_LE_CS_ACI_3,
1565 : BT_LE_CS_TONE_ANTENNA_CONFIGURATION_INDEX_FIVE = BT_HCI_OP_LE_CS_ACI_4,
1566 : BT_LE_CS_TONE_ANTENNA_CONFIGURATION_INDEX_SIX = BT_HCI_OP_LE_CS_ACI_5,
1567 : BT_LE_CS_TONE_ANTENNA_CONFIGURATION_INDEX_SEVEN = BT_HCI_OP_LE_CS_ACI_6,
1568 : BT_LE_CS_TONE_ANTENNA_CONFIGURATION_INDEX_EIGHT = BT_HCI_OP_LE_CS_ACI_7,
1569 : };
1570 :
1571 0 : struct bt_conn_le_cs_procedure_enable_complete {
1572 : /* The ID associated with the desired configuration (0 to 3) */
1573 0 : uint8_t config_id;
1574 :
1575 : /* State of the CS procedure */
1576 0 : enum bt_conn_le_cs_procedure_enable_state state;
1577 :
1578 : /* Antenna configuration index */
1579 0 : enum bt_conn_le_cs_tone_antenna_config_selection tone_antenna_config_selection;
1580 :
1581 : /* Transmit power level used for CS procedures (-127 to 20 dB; 0x7F if unavailable) */
1582 0 : int8_t selected_tx_power;
1583 :
1584 : /* Duration of each CS subevent in microseconds (1250 us to 4 s) */
1585 0 : uint32_t subevent_len;
1586 :
1587 : /* Number of CS subevents anchored off the same ACL connection event (0x01 to 0x20) */
1588 0 : uint8_t subevents_per_event;
1589 :
1590 : /* Time between consecutive CS subevents anchored off the same ACL connection event in
1591 : * units of 0.625 ms
1592 : */
1593 0 : uint16_t subevent_interval;
1594 :
1595 : /* Number of ACL connection events between consecutive CS event anchor points */
1596 0 : uint16_t event_interval;
1597 :
1598 : /* Number of ACL connection events between consecutive CS procedure anchor points */
1599 0 : uint16_t procedure_interval;
1600 :
1601 : /* Number of CS procedures to be scheduled (0 if procedures to continue until disabled) */
1602 0 : uint16_t procedure_count;
1603 :
1604 : /* Maximum duration for each procedure in units of 0.625 ms (0x0001 to 0xFFFF) */
1605 0 : uint16_t max_procedure_len;
1606 : };
1607 :
1608 : /** @brief Connection callback structure.
1609 : *
1610 : * This structure is used for tracking the state of a connection.
1611 : * It is registered with the help of the bt_conn_cb_register() API.
1612 : * It's permissible to register multiple instances of this @ref bt_conn_cb
1613 : * type, in case different modules of an application are interested in
1614 : * tracking the connection state. If a callback is not of interest for
1615 : * an instance, it may be set to NULL and will as a consequence not be
1616 : * used for that instance.
1617 : */
1618 1 : struct bt_conn_cb {
1619 : /** @brief A new connection has been established.
1620 : *
1621 : * This callback notifies the application of a new connection.
1622 : * In case the err parameter is non-zero it means that the
1623 : * connection establishment failed.
1624 : *
1625 : * @note If the connection was established from an advertising set then
1626 : * the advertising set cannot be restarted directly from this
1627 : * callback. Instead use the connected callback of the
1628 : * advertising set.
1629 : *
1630 : * @param conn New connection object.
1631 : * @param err HCI error. Zero for success, non-zero otherwise.
1632 : *
1633 : * @p err can mean either of the following:
1634 : * - @ref BT_HCI_ERR_UNKNOWN_CONN_ID Creating the connection started by
1635 : * @ref bt_conn_le_create was canceled either by the user through
1636 : * @ref bt_conn_disconnect or by the timeout in the host through
1637 : * @ref bt_conn_le_create_param timeout parameter, which defaults to
1638 : * @kconfig{CONFIG_BT_CREATE_CONN_TIMEOUT} seconds.
1639 : * - @p BT_HCI_ERR_ADV_TIMEOUT High duty cycle directed connectable
1640 : * advertiser started by @ref bt_le_adv_start failed to be connected
1641 : * within the timeout.
1642 : */
1643 1 : void (*connected)(struct bt_conn *conn, uint8_t err);
1644 :
1645 : /** @brief A connection has been disconnected.
1646 : *
1647 : * This callback notifies the application that a connection
1648 : * has been disconnected.
1649 : *
1650 : * When this callback is called the stack still has one reference to
1651 : * the connection object. If the application in this callback tries to
1652 : * start either a connectable advertiser or create a new connection
1653 : * this might fail because there are no free connection objects
1654 : * available.
1655 : * To avoid this issue it is recommended to either start connectable
1656 : * advertise or create a new connection using @ref k_work_submit or
1657 : * increase @kconfig{CONFIG_BT_MAX_CONN}.
1658 : *
1659 : * @param conn Connection object.
1660 : * @param reason BT_HCI_ERR_* reason for the disconnection.
1661 : */
1662 1 : void (*disconnected)(struct bt_conn *conn, uint8_t reason);
1663 :
1664 : /** @brief A connection object has been returned to the pool.
1665 : *
1666 : * This callback notifies the application that it might be able to
1667 : * allocate a connection object. No guarantee, first come, first serve.
1668 : *
1669 : * Use this to e.g. re-start connectable advertising or scanning.
1670 : *
1671 : * Treat this callback as an ISR, as it originates from
1672 : * @ref bt_conn_unref which is used by the BT stack. Making
1673 : * Bluetooth API calls in this context is error-prone and strongly
1674 : * discouraged.
1675 : */
1676 1 : void (*recycled)(void);
1677 :
1678 : /** @brief LE connection parameter update request.
1679 : *
1680 : * This callback notifies the application that a remote device
1681 : * is requesting to update the connection parameters. The
1682 : * application accepts the parameters by returning true, or
1683 : * rejects them by returning false. Before accepting, the
1684 : * application may also adjust the parameters to better suit
1685 : * its needs.
1686 : *
1687 : * It is recommended for an application to have just one of these
1688 : * callbacks for simplicity. However, if an application registers
1689 : * multiple it needs to manage the potentially different
1690 : * requirements for each callback. Each callback gets the
1691 : * parameters as returned by previous callbacks, i.e. they are not
1692 : * necessarily the same ones as the remote originally sent.
1693 : *
1694 : * If the application does not have this callback then the default
1695 : * is to accept the parameters.
1696 : *
1697 : * @param conn Connection object.
1698 : * @param param Proposed connection parameters.
1699 : *
1700 : * @return true to accept the parameters, or false to reject them.
1701 : */
1702 1 : bool (*le_param_req)(struct bt_conn *conn,
1703 : struct bt_le_conn_param *param);
1704 :
1705 : /** @brief The parameters for an LE connection have been updated.
1706 : *
1707 : * This callback notifies the application that the connection
1708 : * parameters for an LE connection have been updated.
1709 : *
1710 : * @param conn Connection object.
1711 : * @param interval Connection interval.
1712 : * @param latency Connection latency.
1713 : * @param timeout Connection supervision timeout.
1714 : */
1715 1 : void (*le_param_updated)(struct bt_conn *conn, uint16_t interval,
1716 : uint16_t latency, uint16_t timeout);
1717 : #if defined(CONFIG_BT_SMP)
1718 : /** @brief Remote Identity Address has been resolved.
1719 : *
1720 : * This callback notifies the application that a remote
1721 : * Identity Address has been resolved
1722 : *
1723 : * @param conn Connection object.
1724 : * @param rpa Resolvable Private Address.
1725 : * @param identity Identity Address.
1726 : */
1727 1 : void (*identity_resolved)(struct bt_conn *conn,
1728 : const bt_addr_le_t *rpa,
1729 : const bt_addr_le_t *identity);
1730 : #endif /* CONFIG_BT_SMP */
1731 : #if defined(CONFIG_BT_SMP) || defined(CONFIG_BT_CLASSIC)
1732 : /** @brief The security level of a connection has changed.
1733 : *
1734 : * This callback notifies the application that the security of a
1735 : * connection has changed.
1736 : *
1737 : * The security level of the connection can either have been increased
1738 : * or remain unchanged. An increased security level means that the
1739 : * pairing procedure has been performed or the bond information from
1740 : * a previous connection has been applied. If the security level
1741 : * remains unchanged this means that the encryption key has been
1742 : * refreshed for the connection.
1743 : *
1744 : * @param conn Connection object.
1745 : * @param level New security level of the connection.
1746 : * @param err Security error. Zero for success, non-zero otherwise.
1747 : */
1748 1 : void (*security_changed)(struct bt_conn *conn, bt_security_t level,
1749 : enum bt_security_err err);
1750 : #endif /* defined(CONFIG_BT_SMP) || defined(CONFIG_BT_CLASSIC) */
1751 :
1752 : #if defined(CONFIG_BT_REMOTE_INFO)
1753 : /** @brief Remote information procedures has completed.
1754 : *
1755 : * This callback notifies the application that the remote information
1756 : * has been retrieved from the remote peer.
1757 : *
1758 : * @param conn Connection object.
1759 : * @param remote_info Connection information of remote device.
1760 : */
1761 1 : void (*remote_info_available)(struct bt_conn *conn,
1762 : struct bt_conn_remote_info *remote_info);
1763 : #endif /* defined(CONFIG_BT_REMOTE_INFO) */
1764 :
1765 : #if defined(CONFIG_BT_USER_PHY_UPDATE)
1766 : /** @brief The PHY of the connection has changed.
1767 : *
1768 : * This callback notifies the application that the PHY of the
1769 : * connection has changed.
1770 : *
1771 : * @param conn Connection object.
1772 : * @param info Connection LE PHY information.
1773 : */
1774 1 : void (*le_phy_updated)(struct bt_conn *conn,
1775 : struct bt_conn_le_phy_info *param);
1776 : #endif /* defined(CONFIG_BT_USER_PHY_UPDATE) */
1777 :
1778 : #if defined(CONFIG_BT_USER_DATA_LEN_UPDATE)
1779 : /** @brief The data length parameters of the connection has changed.
1780 : *
1781 : * This callback notifies the application that the maximum Link Layer
1782 : * payload length or transmission time has changed.
1783 : *
1784 : * @param conn Connection object.
1785 : * @param info Connection data length information.
1786 : */
1787 1 : void (*le_data_len_updated)(struct bt_conn *conn,
1788 : struct bt_conn_le_data_len_info *info);
1789 : #endif /* defined(CONFIG_BT_USER_DATA_LEN_UPDATE) */
1790 :
1791 : #if defined(CONFIG_BT_DF_CONNECTION_CTE_RX)
1792 : /** @brief Callback for IQ samples report collected when sampling
1793 : * CTE received by data channel PDU.
1794 : *
1795 : * @param conn The connection object.
1796 : * @param iq_report Report data for collected IQ samples.
1797 : */
1798 : void (*cte_report_cb)(struct bt_conn *conn,
1799 : const struct bt_df_conn_iq_samples_report *iq_report);
1800 : #endif /* CONFIG_BT_DF_CONNECTION_CTE_RX */
1801 :
1802 : #if defined(CONFIG_BT_TRANSMIT_POWER_CONTROL)
1803 : /** @brief LE Read Remote Transmit Power Level procedure has completed or LE
1804 : * Transmit Power Reporting event.
1805 : *
1806 : * This callback notifies the application that either the remote transmit power level
1807 : * has been read from the peer or transmit power level has changed for the local or
1808 : * remote controller when transmit power reporting is enabled for the respective side
1809 : * using @ref bt_conn_le_set_tx_power_report_enable.
1810 : *
1811 : * @param conn Connection object.
1812 : * @param report Transmit power report.
1813 : */
1814 : void (*tx_power_report)(struct bt_conn *conn,
1815 : const struct bt_conn_le_tx_power_report *report);
1816 : #endif /* CONFIG_BT_TRANSMIT_POWER_CONTROL */
1817 :
1818 : #if defined(CONFIG_BT_PATH_LOSS_MONITORING)
1819 : /** @brief LE Path Loss Threshold event.
1820 : *
1821 : * This callback notifies the application that there has been a path loss threshold
1822 : * crossing or reporting the initial path loss threshold zone after using
1823 : * @ref bt_conn_le_set_path_loss_mon_enable.
1824 : *
1825 : * @param conn Connection object.
1826 : * @param report Path loss threshold report.
1827 : */
1828 : void (*path_loss_threshold_report)(struct bt_conn *conn,
1829 : const struct bt_conn_le_path_loss_threshold_report *report);
1830 : #endif /* CONFIG_BT_PATH_LOSS_MONITORING */
1831 :
1832 : #if defined(CONFIG_BT_SUBRATING)
1833 : /** @brief LE Subrate Changed event.
1834 : *
1835 : * This callback notifies the application that the subrating parameters
1836 : * of the connection may have changed.
1837 : * The connection subrating parameters will be unchanged
1838 : * if status is not BT_HCI_ERR_SUCCESS.
1839 : *
1840 : * @param conn Connection object.
1841 : * @param params New subrating parameters.
1842 : */
1843 : void (*subrate_changed)(struct bt_conn *conn,
1844 : const struct bt_conn_le_subrate_changed *params);
1845 : #endif /* CONFIG_BT_SUBRATING */
1846 :
1847 : #if defined(CONFIG_BT_CHANNEL_SOUNDING)
1848 : /** @brief LE CS Read Remote Supported Capabilities Complete event.
1849 : *
1850 : * This callback notifies the application that the remote channel
1851 : * sounding capabilities have been received from the peer.
1852 : *
1853 : * @param conn Connection object.
1854 : * @param remote_cs_capabilities Remote Channel Sounding Capabilities.
1855 : */
1856 : void (*le_cs_remote_capabilities_available)(struct bt_conn *conn,
1857 : struct bt_conn_le_cs_capabilities *params);
1858 :
1859 : /** @brief LE CS Read Remote FAE Table Complete event.
1860 : *
1861 : * This callback notifies the application that the remote mode-0
1862 : * FAE Table has been received from the peer.
1863 : *
1864 : * @param conn Connection object.
1865 : * @param params FAE Table.
1866 : */
1867 : void (*le_cs_remote_fae_table_available)(struct bt_conn *conn,
1868 : struct bt_conn_le_cs_fae_table *params);
1869 :
1870 : /** @brief LE CS Config created.
1871 : *
1872 : * This callback notifies the application that a Channel Sounding
1873 : * Configuration procedure has completed and a new CS config is created
1874 : *
1875 : * @param conn Connection object.
1876 : * @param config CS configuration.
1877 : */
1878 : void (*le_cs_config_created)(struct bt_conn *conn, struct bt_conn_le_cs_config *config);
1879 :
1880 : /** @brief LE CS Config removed.
1881 : *
1882 : * This callback notifies the application that a Channel Sounding
1883 : * Configuration procedure has completed and a CS config is removed
1884 : *
1885 : * @param conn Connection object.
1886 : * @param config_id ID of the CS configuration that was removed.
1887 : */
1888 : void (*le_cs_config_removed)(struct bt_conn *conn, uint8_t config_id);
1889 :
1890 : /** @brief Subevent Results from a CS procedure are available.
1891 : *
1892 : * This callback notifies the user that CS subevent results are
1893 : * available for the given connection object.
1894 : *
1895 : * @param conn Connection objects.
1896 : * @param result Subevent results
1897 : */
1898 : void (*le_cs_subevent_data_available)(struct bt_conn *conn,
1899 : struct bt_conn_le_cs_subevent_result *result);
1900 :
1901 : /** @brief LE CS Security Enabled.
1902 : *
1903 : * This callback notifies the application that a Channel Sounding
1904 : * Security Enable procedure has completed
1905 : *
1906 : * @param conn Connection object.
1907 : */
1908 : void (*le_cs_security_enabled)(struct bt_conn *conn);
1909 :
1910 : /** @brief LE CS Procedure Enabled.
1911 : *
1912 : * This callback notifies the application that a Channel Sounding
1913 : * Procedure Enable procedure has completed
1914 : *
1915 : * @param conn Connection object.
1916 : * @param params CS Procedure Enable parameters
1917 : */
1918 : void (*le_cs_procedure_enabled)(
1919 : struct bt_conn *conn, struct bt_conn_le_cs_procedure_enable_complete *params);
1920 :
1921 : #endif
1922 :
1923 : /** @internal Internally used field for list handling */
1924 : sys_snode_t _node;
1925 : };
1926 :
1927 : /** @brief Register connection callbacks.
1928 : *
1929 : * Register callbacks to monitor the state of connections.
1930 : *
1931 : * @param cb Callback struct. Must point to memory that remains valid.
1932 : *
1933 : * @retval 0 Success.
1934 : * @retval -EEXIST if @p cb was already registered.
1935 : */
1936 1 : int bt_conn_cb_register(struct bt_conn_cb *cb);
1937 :
1938 : /**
1939 : * @brief Unregister connection callbacks.
1940 : *
1941 : * Unregister the state of connections callbacks.
1942 : *
1943 : * @param cb Callback struct point to memory that remains valid.
1944 : *
1945 : * @retval 0 Success
1946 : * @retval -EINVAL If @p cb is NULL
1947 : * @retval -ENOENT if @p cb was not registered
1948 : */
1949 1 : int bt_conn_cb_unregister(struct bt_conn_cb *cb);
1950 :
1951 : /**
1952 : * @brief Register a callback structure for connection events.
1953 : *
1954 : * @param _name Name of callback structure.
1955 : */
1956 1 : #define BT_CONN_CB_DEFINE(_name) \
1957 : static const STRUCT_SECTION_ITERABLE(bt_conn_cb, \
1958 : _CONCAT(bt_conn_cb_, \
1959 : _name))
1960 :
1961 : /** Converts a security error to string.
1962 : *
1963 : * @return The string representation of the security error code.
1964 : * If @kconfig{CONFIG_BT_SECURITY_ERR_TO_STR} is not enabled,
1965 : * this just returns the empty string
1966 : */
1967 : #if defined(CONFIG_BT_SECURITY_ERR_TO_STR)
1968 : const char *bt_security_err_to_str(enum bt_security_err err);
1969 : #else
1970 1 : static inline const char *bt_security_err_to_str(enum bt_security_err err)
1971 : {
1972 : ARG_UNUSED(err);
1973 :
1974 : return "";
1975 : }
1976 : #endif
1977 :
1978 : /** @brief Enable/disable bonding.
1979 : *
1980 : * Set/clear the Bonding flag in the Authentication Requirements of
1981 : * SMP Pairing Request/Response data.
1982 : * The initial value of this flag depends on BT_BONDABLE Kconfig setting.
1983 : * For the vast majority of applications calling this function shouldn't be
1984 : * needed.
1985 : *
1986 : * @param enable Value allowing/disallowing to be bondable.
1987 : */
1988 1 : void bt_set_bondable(bool enable);
1989 :
1990 : /** @brief Get bonding flag.
1991 : *
1992 : * Get current bonding flag.
1993 : * The initial value of this flag depends on @kconfig{CONFIG_BT_BONDABLE} Kconfig
1994 : * setting.
1995 : * The Bonding flag can be updated using bt_set_bondable().
1996 : *
1997 : * @return Current bonding flag.
1998 : */
1999 1 : bool bt_get_bondable(void);
2000 :
2001 : /** @brief Set/clear the bonding flag for a given connection.
2002 : *
2003 : * Set/clear the Bonding flag in the Authentication Requirements of
2004 : * SMP Pairing Request/Response data for a given connection.
2005 : *
2006 : * The bonding flag for a given connection cannot be set/cleared if
2007 : * security procedures in the SMP module have already started.
2008 : * This function can be called only once per connection.
2009 : *
2010 : * If the bonding flag is not set/cleared for a given connection,
2011 : * the value will depend on global configuration which is set using
2012 : * bt_set_bondable.
2013 : * The default value of the global configuration is defined using
2014 : * CONFIG_BT_BONDABLE Kconfig option.
2015 : *
2016 : * @param conn Connection object.
2017 : * @param enable Value allowing/disallowing to be bondable.
2018 : */
2019 1 : int bt_conn_set_bondable(struct bt_conn *conn, bool enable);
2020 :
2021 : /** @brief Allow/disallow remote LE SC OOB data to be used for pairing.
2022 : *
2023 : * Set/clear the OOB data flag for LE SC SMP Pairing Request/Response data.
2024 : *
2025 : * @param enable Value allowing/disallowing remote LE SC OOB data.
2026 : */
2027 1 : void bt_le_oob_set_sc_flag(bool enable);
2028 :
2029 : /** @brief Allow/disallow remote legacy OOB data to be used for pairing.
2030 : *
2031 : * Set/clear the OOB data flag for legacy SMP Pairing Request/Response data.
2032 : *
2033 : * @param enable Value allowing/disallowing remote legacy OOB data.
2034 : */
2035 1 : void bt_le_oob_set_legacy_flag(bool enable);
2036 :
2037 : /** @brief Set OOB Temporary Key to be used for pairing
2038 : *
2039 : * This function allows to set OOB data for the LE legacy pairing procedure.
2040 : * The function should only be called in response to the oob_data_request()
2041 : * callback provided that the legacy method is user pairing.
2042 : *
2043 : * @param conn Connection object
2044 : * @param tk Pointer to 16 byte long TK array
2045 : *
2046 : * @return Zero on success or -EINVAL if NULL
2047 : */
2048 1 : int bt_le_oob_set_legacy_tk(struct bt_conn *conn, const uint8_t *tk);
2049 :
2050 : /** @brief Set OOB data during LE Secure Connections (SC) pairing procedure
2051 : *
2052 : * This function allows to set OOB data during the LE SC pairing procedure.
2053 : * The function should only be called in response to the oob_data_request()
2054 : * callback provided that LE SC method is used for pairing.
2055 : *
2056 : * The user should submit OOB data according to the information received in the
2057 : * callback. This may yield three different configurations: with only local OOB
2058 : * data present, with only remote OOB data present or with both local and
2059 : * remote OOB data present.
2060 : *
2061 : * @param conn Connection object
2062 : * @param oobd_local Local OOB data or NULL if not present
2063 : * @param oobd_remote Remote OOB data or NULL if not present
2064 : *
2065 : * @return Zero on success or error code otherwise, positive in case of
2066 : * protocol error or negative (POSIX) in case of stack internal error.
2067 : */
2068 1 : int bt_le_oob_set_sc_data(struct bt_conn *conn,
2069 : const struct bt_le_oob_sc_data *oobd_local,
2070 : const struct bt_le_oob_sc_data *oobd_remote);
2071 :
2072 : /** @brief Get OOB data used for LE Secure Connections (SC) pairing procedure
2073 : *
2074 : * This function allows to get OOB data during the LE SC pairing procedure that
2075 : * were set by the bt_le_oob_set_sc_data() API.
2076 : *
2077 : * @note The OOB data will only be available as long as the connection object
2078 : * associated with it is valid.
2079 : *
2080 : * @param conn Connection object
2081 : * @param oobd_local Local OOB data or NULL if not set
2082 : * @param oobd_remote Remote OOB data or NULL if not set
2083 : *
2084 : * @return Zero on success or error code otherwise, positive in case of
2085 : * protocol error or negative (POSIX) in case of stack internal error.
2086 : */
2087 1 : int bt_le_oob_get_sc_data(struct bt_conn *conn,
2088 : const struct bt_le_oob_sc_data **oobd_local,
2089 : const struct bt_le_oob_sc_data **oobd_remote);
2090 :
2091 : /**
2092 : * Special passkey value that can be used to disable a previously
2093 : * set fixed passkey.
2094 : */
2095 1 : #define BT_PASSKEY_INVALID 0xffffffff
2096 :
2097 : /** @brief Set a fixed passkey to be used for pairing.
2098 : *
2099 : * This API is only available when the CONFIG_BT_FIXED_PASSKEY
2100 : * configuration option has been enabled.
2101 : *
2102 : * Sets a fixed passkey to be used for pairing. If set, the
2103 : * pairing_confirm() callback will be called for all incoming pairings.
2104 : *
2105 : * @param passkey A valid passkey (0 - 999999) or BT_PASSKEY_INVALID
2106 : * to disable a previously set fixed passkey.
2107 : *
2108 : * @return 0 on success or a negative error code on failure.
2109 : */
2110 1 : int bt_passkey_set(unsigned int passkey);
2111 :
2112 : /** Info Structure for OOB pairing */
2113 1 : struct bt_conn_oob_info {
2114 : /** Type of OOB pairing method */
2115 1 : enum {
2116 : /** LE legacy pairing */
2117 : BT_CONN_OOB_LE_LEGACY,
2118 :
2119 : /** LE SC pairing */
2120 : BT_CONN_OOB_LE_SC,
2121 1 : } type;
2122 :
2123 : union {
2124 : /** LE Secure Connections OOB pairing parameters */
2125 : struct {
2126 : /** OOB data configuration */
2127 : enum {
2128 : /** Local OOB data requested */
2129 : BT_CONN_OOB_LOCAL_ONLY,
2130 :
2131 : /** Remote OOB data requested */
2132 : BT_CONN_OOB_REMOTE_ONLY,
2133 :
2134 : /** Both local and remote OOB data requested */
2135 : BT_CONN_OOB_BOTH_PEERS,
2136 :
2137 : /** No OOB data requested */
2138 : BT_CONN_OOB_NO_DATA,
2139 1 : } oob_config;
2140 1 : } lesc;
2141 0 : };
2142 : };
2143 :
2144 : #if defined(CONFIG_BT_SMP_APP_PAIRING_ACCEPT)
2145 : /** @brief Pairing request and pairing response info structure.
2146 : *
2147 : * This structure is the same for both smp_pairing_req and smp_pairing_rsp
2148 : * and a subset of the packet data, except for the initial Code octet.
2149 : * It is documented in Core Spec. Vol. 3, Part H, 3.5.1 and 3.5.2.
2150 : */
2151 1 : struct bt_conn_pairing_feat {
2152 : /** IO Capability, Core Spec. Vol 3, Part H, 3.5.1, Table 3.4 */
2153 1 : uint8_t io_capability;
2154 :
2155 : /** OOB data flag, Core Spec. Vol 3, Part H, 3.5.1, Table 3.5 */
2156 1 : uint8_t oob_data_flag;
2157 :
2158 : /** AuthReq, Core Spec. Vol 3, Part H, 3.5.1, Fig. 3.3 */
2159 1 : uint8_t auth_req;
2160 :
2161 : /** Maximum Encryption Key Size, Core Spec. Vol 3, Part H, 3.5.1 */
2162 1 : uint8_t max_enc_key_size;
2163 :
2164 : /** Initiator Key Distribution/Generation, Core Spec. Vol 3, Part H,
2165 : * 3.6.1, Fig. 3.11
2166 : */
2167 1 : uint8_t init_key_dist;
2168 :
2169 : /** Responder Key Distribution/Generation, Core Spec. Vol 3, Part H
2170 : * 3.6.1, Fig. 3.11
2171 : */
2172 1 : uint8_t resp_key_dist;
2173 : };
2174 : #endif /* CONFIG_BT_SMP_APP_PAIRING_ACCEPT */
2175 :
2176 : /** Authenticated pairing callback structure */
2177 1 : struct bt_conn_auth_cb {
2178 : #if defined(CONFIG_BT_SMP_APP_PAIRING_ACCEPT)
2179 : /** @brief Query to proceed incoming pairing or not.
2180 : *
2181 : * On any incoming pairing req/rsp this callback will be called for
2182 : * the application to decide whether to allow for the pairing to
2183 : * continue.
2184 : *
2185 : * The pairing info received from the peer is passed to assist
2186 : * making the decision.
2187 : *
2188 : * As this callback is synchronous the application should return
2189 : * a response value immediately. Otherwise it may affect the
2190 : * timing during pairing. Hence, this information should not be
2191 : * conveyed to the user to take action.
2192 : *
2193 : * The remaining callbacks are not affected by this, but do notice
2194 : * that other callbacks can be called during the pairing. Eg. if
2195 : * pairing_confirm is registered both will be called for Just-Works
2196 : * pairings.
2197 : *
2198 : * This callback may be unregistered in which case pairing continues
2199 : * as if the Kconfig flag was not set.
2200 : *
2201 : * For BR/EDR Secure Simple Pairing (SSP), this callback is called
2202 : * when receiving the BT_HCI_EVT_IO_CAPA_REQ hci event.
2203 : *
2204 : * @param conn Connection where pairing is initiated.
2205 : * @param feat Pairing req/resp info.
2206 : */
2207 : enum bt_security_err (*pairing_accept)(struct bt_conn *conn,
2208 : const struct bt_conn_pairing_feat *const feat);
2209 : #endif /* CONFIG_BT_SMP_APP_PAIRING_ACCEPT */
2210 :
2211 : /** @brief Display a passkey to the user.
2212 : *
2213 : * When called the application is expected to display the given
2214 : * passkey to the user, with the expectation that the passkey will
2215 : * then be entered on the peer device. The passkey will be in the
2216 : * range of 0 - 999999, and is expected to be padded with zeroes so
2217 : * that six digits are always shown. E.g. the value 37 should be
2218 : * shown as 000037.
2219 : *
2220 : * This callback may be set to NULL, which means that the local
2221 : * device lacks the ability do display a passkey. If set
2222 : * to non-NULL the cancel callback must also be provided, since
2223 : * this is the only way the application can find out that it should
2224 : * stop displaying the passkey.
2225 : *
2226 : * @param conn Connection where pairing is currently active.
2227 : * @param passkey Passkey to show to the user.
2228 : */
2229 1 : void (*passkey_display)(struct bt_conn *conn, unsigned int passkey);
2230 :
2231 : #if defined(CONFIG_BT_PASSKEY_KEYPRESS)
2232 : /** @brief Receive Passkey Keypress Notification during pairing
2233 : *
2234 : * This allows the remote device to use the local device to give users
2235 : * feedback on the progress of entering the passkey over there. This is
2236 : * useful when the remote device itself has no display suitable for
2237 : * showing the progress.
2238 : *
2239 : * The handler of this callback is expected to keep track of the number
2240 : * of digits entered and show a password-field-like feedback to the
2241 : * user.
2242 : *
2243 : * This callback is only relevant while the local side does Passkey
2244 : * Display.
2245 : *
2246 : * The event type is verified to be in range of the enum. No other
2247 : * sanitization has been done. The remote could send a large number of
2248 : * events of any type in any order.
2249 : *
2250 : * @param conn The related connection.
2251 : * @param type Type of event. Verified in range of the enum.
2252 : */
2253 : void (*passkey_display_keypress)(struct bt_conn *conn,
2254 : enum bt_conn_auth_keypress type);
2255 : #endif
2256 :
2257 : /** @brief Request the user to enter a passkey.
2258 : *
2259 : * When called the user is expected to enter a passkey. The passkey
2260 : * must be in the range of 0 - 999999, and should be expected to
2261 : * be zero-padded, as that's how the peer device will typically be
2262 : * showing it (e.g. 37 would be shown as 000037).
2263 : *
2264 : * Once the user has entered the passkey its value should be given
2265 : * to the stack using the bt_conn_auth_passkey_entry() API.
2266 : *
2267 : * This callback may be set to NULL, which means that the local
2268 : * device lacks the ability to enter a passkey. If set to non-NULL
2269 : * the cancel callback must also be provided, since this is the
2270 : * only way the application can find out that it should stop
2271 : * requesting the user to enter a passkey.
2272 : *
2273 : * @param conn Connection where pairing is currently active.
2274 : */
2275 1 : void (*passkey_entry)(struct bt_conn *conn);
2276 :
2277 : /** @brief Request the user to confirm a passkey.
2278 : *
2279 : * When called the user is expected to confirm that the given
2280 : * passkey is also shown on the peer device.. The passkey will
2281 : * be in the range of 0 - 999999, and should be zero-padded to
2282 : * always be six digits (e.g. 37 would be shown as 000037).
2283 : *
2284 : * Once the user has confirmed the passkey to match, the
2285 : * bt_conn_auth_passkey_confirm() API should be called. If the
2286 : * user concluded that the passkey doesn't match the
2287 : * bt_conn_auth_cancel() API should be called.
2288 : *
2289 : * This callback may be set to NULL, which means that the local
2290 : * device lacks the ability to confirm a passkey. If set to non-NULL
2291 : * the cancel callback must also be provided, since this is the
2292 : * only way the application can find out that it should stop
2293 : * requesting the user to confirm a passkey.
2294 : *
2295 : * @param conn Connection where pairing is currently active.
2296 : * @param passkey Passkey to be confirmed.
2297 : */
2298 1 : void (*passkey_confirm)(struct bt_conn *conn, unsigned int passkey);
2299 :
2300 : /** @brief Request the user to provide Out of Band (OOB) data.
2301 : *
2302 : * When called the user is expected to provide OOB data. The required
2303 : * data are indicated by the information structure.
2304 : *
2305 : * For LE Secure Connections OOB pairing, the user should provide
2306 : * local OOB data, remote OOB data or both depending on their
2307 : * availability. Their value should be given to the stack using the
2308 : * bt_le_oob_set_sc_data() API.
2309 : *
2310 : * This callback must be set to non-NULL in order to support OOB
2311 : * pairing.
2312 : *
2313 : * @param conn Connection where pairing is currently active.
2314 : * @param info OOB pairing information.
2315 : */
2316 1 : void (*oob_data_request)(struct bt_conn *conn,
2317 : struct bt_conn_oob_info *info);
2318 :
2319 : /** @brief Cancel the ongoing user request.
2320 : *
2321 : * This callback will be called to notify the application that it
2322 : * should cancel any previous user request (passkey display, entry
2323 : * or confirmation).
2324 : *
2325 : * This may be set to NULL, but must always be provided whenever the
2326 : * passkey_display, passkey_entry passkey_confirm or pairing_confirm
2327 : * callback has been provided.
2328 : *
2329 : * @param conn Connection where pairing is currently active.
2330 : */
2331 1 : void (*cancel)(struct bt_conn *conn);
2332 :
2333 : /** @brief Request confirmation for an incoming pairing.
2334 : *
2335 : * This callback will be called to confirm an incoming pairing
2336 : * request where none of the other user callbacks is applicable.
2337 : *
2338 : * If the user decides to accept the pairing the
2339 : * bt_conn_auth_pairing_confirm() API should be called. If the
2340 : * user decides to reject the pairing the bt_conn_auth_cancel() API
2341 : * should be called.
2342 : *
2343 : * This callback may be set to NULL, which means that the local
2344 : * device lacks the ability to confirm a pairing request. If set
2345 : * to non-NULL the cancel callback must also be provided, since
2346 : * this is the only way the application can find out that it should
2347 : * stop requesting the user to confirm a pairing request.
2348 : *
2349 : * @param conn Connection where pairing is currently active.
2350 : */
2351 1 : void (*pairing_confirm)(struct bt_conn *conn);
2352 :
2353 : #if defined(CONFIG_BT_CLASSIC)
2354 : /** @brief Request the user to enter a passkey.
2355 : *
2356 : * This callback will be called for a BR/EDR (Bluetooth Classic)
2357 : * connection where pairing is being performed. Once called the
2358 : * user is expected to enter a PIN code with a length between
2359 : * 1 and 16 digits. If the @a highsec parameter is set to true
2360 : * the PIN code must be 16 digits long.
2361 : *
2362 : * Once entered, the PIN code should be given to the stack using
2363 : * the bt_conn_auth_pincode_entry() API.
2364 : *
2365 : * This callback may be set to NULL, however in that case pairing
2366 : * over BR/EDR will not be possible. If provided, the cancel
2367 : * callback must be provided as well.
2368 : *
2369 : * @param conn Connection where pairing is currently active.
2370 : * @param highsec true if 16 digit PIN is required.
2371 : */
2372 1 : void (*pincode_entry)(struct bt_conn *conn, bool highsec);
2373 : #endif
2374 : };
2375 :
2376 : /** Authenticated pairing information callback structure */
2377 1 : struct bt_conn_auth_info_cb {
2378 : /** @brief notify that pairing procedure was complete.
2379 : *
2380 : * This callback notifies the application that the pairing procedure
2381 : * has been completed.
2382 : *
2383 : * @param conn Connection object.
2384 : * @param bonded Bond information has been distributed during the
2385 : * pairing procedure.
2386 : */
2387 1 : void (*pairing_complete)(struct bt_conn *conn, bool bonded);
2388 :
2389 : /** @brief notify that pairing process has failed.
2390 : *
2391 : * @param conn Connection object.
2392 : * @param reason Pairing failed reason
2393 : */
2394 1 : void (*pairing_failed)(struct bt_conn *conn,
2395 : enum bt_security_err reason);
2396 :
2397 : /** @brief Notify that bond has been deleted.
2398 : *
2399 : * This callback notifies the application that the bond information
2400 : * for the remote peer has been deleted
2401 : *
2402 : * @param id Which local identity had the bond.
2403 : * @param peer Remote address.
2404 : */
2405 1 : void (*bond_deleted)(uint8_t id, const bt_addr_le_t *peer);
2406 :
2407 : /** Internally used field for list handling */
2408 1 : sys_snode_t node;
2409 : };
2410 :
2411 : /** @brief Register authentication callbacks.
2412 : *
2413 : * Register callbacks to handle authenticated pairing. Passing NULL
2414 : * unregisters a previous callbacks structure.
2415 : *
2416 : * @param cb Callback struct.
2417 : *
2418 : * @return Zero on success or negative error code otherwise
2419 : */
2420 1 : int bt_conn_auth_cb_register(const struct bt_conn_auth_cb *cb);
2421 :
2422 : /** @brief Overlay authentication callbacks used for a given connection.
2423 : *
2424 : * This function can be used only for Bluetooth LE connections.
2425 : * The @kconfig{CONFIG_BT_SMP} must be enabled for this function.
2426 : *
2427 : * The authentication callbacks for a given connection cannot be overlaid if
2428 : * security procedures in the SMP module have already started. This function
2429 : * can be called only once per connection.
2430 : *
2431 : * @param conn Connection object.
2432 : * @param cb Callback struct.
2433 : *
2434 : * @return Zero on success or negative error code otherwise
2435 : */
2436 1 : int bt_conn_auth_cb_overlay(struct bt_conn *conn, const struct bt_conn_auth_cb *cb);
2437 :
2438 : /** @brief Register authentication information callbacks.
2439 : *
2440 : * Register callbacks to get authenticated pairing information. Multiple
2441 : * registrations can be done.
2442 : *
2443 : * @param cb Callback struct.
2444 : *
2445 : * @return Zero on success or negative error code otherwise
2446 : */
2447 1 : int bt_conn_auth_info_cb_register(struct bt_conn_auth_info_cb *cb);
2448 :
2449 : /** @brief Unregister authentication information callbacks.
2450 : *
2451 : * Unregister callbacks to stop getting authenticated pairing information.
2452 : *
2453 : * @param cb Callback struct.
2454 : *
2455 : * @return Zero on success or negative error code otherwise
2456 : */
2457 1 : int bt_conn_auth_info_cb_unregister(struct bt_conn_auth_info_cb *cb);
2458 :
2459 : /** @brief Reply with entered passkey.
2460 : *
2461 : * This function should be called only after passkey_entry callback from
2462 : * bt_conn_auth_cb structure was called.
2463 : *
2464 : * @param conn Connection object.
2465 : * @param passkey Entered passkey.
2466 : *
2467 : * @return Zero on success or negative error code otherwise
2468 : */
2469 1 : int bt_conn_auth_passkey_entry(struct bt_conn *conn, unsigned int passkey);
2470 :
2471 : /** @brief Send Passkey Keypress Notification during pairing
2472 : *
2473 : * This function may be called only after passkey_entry callback from
2474 : * bt_conn_auth_cb structure was called.
2475 : *
2476 : * Requires @kconfig{CONFIG_BT_PASSKEY_KEYPRESS}.
2477 : *
2478 : * @param conn Destination for the notification.
2479 : * @param type What keypress event type to send. @see bt_conn_auth_keypress.
2480 : *
2481 : * @retval 0 Success
2482 : * @retval -EINVAL Improper use of the API.
2483 : * @retval -ENOMEM Failed to allocate.
2484 : * @retval -ENOBUFS Failed to allocate.
2485 : */
2486 1 : int bt_conn_auth_keypress_notify(struct bt_conn *conn, enum bt_conn_auth_keypress type);
2487 :
2488 : /** @brief Cancel ongoing authenticated pairing.
2489 : *
2490 : * This function allows to cancel ongoing authenticated pairing.
2491 : *
2492 : * @param conn Connection object.
2493 : *
2494 : * @return Zero on success or negative error code otherwise
2495 : */
2496 1 : int bt_conn_auth_cancel(struct bt_conn *conn);
2497 :
2498 : /** @brief Reply if passkey was confirmed to match by user.
2499 : *
2500 : * This function should be called only after passkey_confirm callback from
2501 : * bt_conn_auth_cb structure was called.
2502 : *
2503 : * @param conn Connection object.
2504 : *
2505 : * @return Zero on success or negative error code otherwise
2506 : */
2507 1 : int bt_conn_auth_passkey_confirm(struct bt_conn *conn);
2508 :
2509 : /** @brief Reply if incoming pairing was confirmed by user.
2510 : *
2511 : * This function should be called only after pairing_confirm callback from
2512 : * bt_conn_auth_cb structure was called if user confirmed incoming pairing.
2513 : *
2514 : * @param conn Connection object.
2515 : *
2516 : * @return Zero on success or negative error code otherwise
2517 : */
2518 1 : int bt_conn_auth_pairing_confirm(struct bt_conn *conn);
2519 :
2520 : /** @brief Reply with entered PIN code.
2521 : *
2522 : * This function should be called only after PIN code callback from
2523 : * bt_conn_auth_cb structure was called. It's for legacy 2.0 devices.
2524 : *
2525 : * @param conn Connection object.
2526 : * @param pin Entered PIN code.
2527 : *
2528 : * @return Zero on success or negative error code otherwise
2529 : */
2530 1 : int bt_conn_auth_pincode_entry(struct bt_conn *conn, const char *pin);
2531 :
2532 : /** Connection parameters for BR/EDR connections */
2533 1 : struct bt_br_conn_param {
2534 0 : bool allow_role_switch;
2535 : };
2536 :
2537 : /** @brief Initialize BR/EDR connection parameters
2538 : *
2539 : * @param role_switch True if role switch is allowed
2540 : */
2541 1 : #define BT_BR_CONN_PARAM_INIT(role_switch) \
2542 : { \
2543 : .allow_role_switch = (role_switch), \
2544 : }
2545 :
2546 : /** Helper to declare BR/EDR connection parameters inline
2547 : *
2548 : * @param role_switch True if role switch is allowed
2549 : */
2550 1 : #define BT_BR_CONN_PARAM(role_switch) \
2551 : ((struct bt_br_conn_param[]) { \
2552 : BT_BR_CONN_PARAM_INIT(role_switch) \
2553 : })
2554 :
2555 : /** Default BR/EDR connection parameters:
2556 : * Role switch allowed
2557 : */
2558 1 : #define BT_BR_CONN_PARAM_DEFAULT BT_BR_CONN_PARAM(true)
2559 :
2560 :
2561 : /** @brief Initiate an BR/EDR connection to a remote device.
2562 : *
2563 : * Allows initiate new BR/EDR link to remote peer using its address.
2564 : *
2565 : * The caller gets a new reference to the connection object which must be
2566 : * released with bt_conn_unref() once done using the object.
2567 : *
2568 : * @param peer Remote address.
2569 : * @param param Initial connection parameters.
2570 : *
2571 : * @return Valid connection object on success or NULL otherwise.
2572 : */
2573 1 : struct bt_conn *bt_conn_create_br(const bt_addr_t *peer,
2574 : const struct bt_br_conn_param *param);
2575 :
2576 : #ifdef __cplusplus
2577 : }
2578 : #endif
2579 :
2580 : /**
2581 : * @}
2582 : */
2583 :
2584 : #endif /* ZEPHYR_INCLUDE_BLUETOOTH_CONN_H_ */
|