1 /** @file
2  *  @brief Bluetooth subsystem core APIs.
3  */
4 
5 /*
6  * Copyright (c) 2017 Nordic Semiconductor ASA
7  * Copyright (c) 2015-2016 Intel Corporation
8  *
9  * SPDX-License-Identifier: Apache-2.0
10  */
11 #ifndef ZEPHYR_INCLUDE_BLUETOOTH_BLUETOOTH_H_
12 #define ZEPHYR_INCLUDE_BLUETOOTH_BLUETOOTH_H_
13 
14 /**
15  * @brief Bluetooth APIs
16  * @defgroup bluetooth Bluetooth APIs
17  * @ingroup connectivity
18  * @{
19  */
20 
21 #include <stdbool.h>
22 #include <string.h>
23 
24 #include <zephyr/sys/util.h>
25 #include <zephyr/net_buf.h>
26 #include <zephyr/bluetooth/gap.h>
27 #include <zephyr/bluetooth/addr.h>
28 #include <zephyr/bluetooth/crypto.h>
29 #include <zephyr/bluetooth/classic/classic.h>
30 
31 #ifdef __cplusplus
32 extern "C" {
33 #endif
34 
35 /**
36  * @brief Generic Access Profile (GAP)
37  * @defgroup bt_gap Generic Access Profile (GAP)
38  * @since 1.0
39  * @version 1.0.0
40  * @ingroup bluetooth
41  * @{
42  */
43 
44 /**
45  * Convenience macro for specifying the default identity. This helps
46  * make the code more readable, especially when only one identity is
47  * supported.
48  */
49 #define BT_ID_DEFAULT 0
50 
51 /** Opaque type representing an advertiser. */
52 struct bt_le_ext_adv;
53 
54 /** Opaque type representing an periodic advertising sync. */
55 struct bt_le_per_adv_sync;
56 
57 /* Don't require everyone to include conn.h */
58 struct bt_conn;
59 
60 /* Don't require everyone to include iso.h */
61 struct bt_iso_biginfo;
62 
63 /* Don't require everyone to include direction.h */
64 struct bt_df_per_adv_sync_iq_samples_report;
65 
66 struct bt_le_ext_adv_sent_info {
67 	/** The number of advertising events completed. */
68 	uint8_t num_sent;
69 };
70 
71 struct bt_le_ext_adv_connected_info {
72 	/** Connection object of the new connection */
73 	struct bt_conn *conn;
74 };
75 
76 struct bt_le_ext_adv_scanned_info {
77 	/** Active scanner LE address and type */
78 	bt_addr_le_t *addr;
79 };
80 
81 struct bt_le_per_adv_data_request {
82 	/** The first subevent data can be set for */
83 	uint8_t start;
84 
85 	/** The number of subevents data can be set for */
86 	uint8_t count;
87 };
88 
89 struct bt_le_per_adv_response_info {
90 	/** The subevent the response was received in */
91 	uint8_t subevent;
92 
93 	/** @brief Status of the subevent indication.
94 	 *
95 	 * 0 if subevent indication was transmitted.
96 	 * 1 if subevent indication was not transmitted.
97 	 * All other values RFU.
98 	 */
99 	uint8_t tx_status;
100 
101 	/** The TX power of the response in dBm */
102 	int8_t tx_power;
103 
104 	/** The RSSI of the response in dBm */
105 	int8_t rssi;
106 
107 	/** The Constant Tone Extension (CTE) of the advertisement (@ref bt_df_cte_type) */
108 	uint8_t cte_type;
109 
110 	/** The slot the response was received in */
111 	uint8_t response_slot;
112 };
113 
114 struct bt_le_ext_adv_cb {
115 	/**
116 	 * @brief The advertising set has finished sending adv data.
117 	 *
118 	 * This callback notifies the application that the advertising set has
119 	 * finished sending advertising data.
120 	 * The advertising set can either have been stopped by a timeout or
121 	 * because the specified number of advertising events has been reached.
122 	 *
123 	 * @param adv  The advertising set object.
124 	 * @param info Information about the sent event.
125 	 */
126 	void (*sent)(struct bt_le_ext_adv *adv,
127 		     struct bt_le_ext_adv_sent_info *info);
128 
129 	/**
130 	 * @brief The advertising set has accepted a new connection.
131 	 *
132 	 * This callback notifies the application that the advertising set has
133 	 * accepted a new connection.
134 	 *
135 	 * @param adv  The advertising set object.
136 	 * @param info Information about the connected event.
137 	 */
138 	void (*connected)(struct bt_le_ext_adv *adv,
139 			  struct bt_le_ext_adv_connected_info *info);
140 
141 	/**
142 	 * @brief The advertising set has sent scan response data.
143 	 *
144 	 * This callback notifies the application that the advertising set has
145 	 * has received a Scan Request packet, and has sent a Scan Response
146 	 * packet.
147 	 *
148 	 * @param adv  The advertising set object.
149 	 * @param addr Information about the scanned event.
150 	 */
151 	void (*scanned)(struct bt_le_ext_adv *adv,
152 			struct bt_le_ext_adv_scanned_info *info);
153 
154 #if defined(CONFIG_BT_PRIVACY)
155 	/**
156 	 * @brief The RPA validity of the advertising set has expired.
157 	 *
158 	 * This callback notifies the application that the RPA validity of
159 	 * the advertising set has expired. The user can use this callback
160 	 * to synchronize the advertising payload update with the RPA rotation.
161 	 *
162 	 * If rpa sharing is enabled and rpa expired cb of any adv-sets belonging
163 	 * to same adv id returns false, then adv-sets will continue with old rpa
164 	 * through out the rpa rotations.
165 	 *
166 	 * @param adv  The advertising set object.
167 	 *
168 	 * @return true to rotate the current RPA, or false to use it for the
169 	 *         next rotation period.
170 	 */
171 	bool (*rpa_expired)(struct bt_le_ext_adv *adv);
172 #endif /* defined(CONFIG_BT_PRIVACY) */
173 
174 #if defined(CONFIG_BT_PER_ADV_RSP)
175 	/**
176 	 * @brief The Controller indicates it is ready to transmit one or more subevent.
177 	 *
178 	 * This callback notifies the application that the controller has requested
179 	 * data for upcoming subevents.
180 	 *
181 	 * @param adv     The advertising set object.
182 	 * @param request Information about the upcoming subevents.
183 	 */
184 	void (*pawr_data_request)(struct bt_le_ext_adv *adv,
185 				  const struct bt_le_per_adv_data_request *request);
186 	/**
187 	 * @brief The Controller indicates that one or more synced devices have
188 	 * responded to a periodic advertising subevent indication.
189 	 *
190 	 * @param adv  The advertising set object.
191 	 * @param info Information about the responses received.
192 	 * @param buf  The received data. NULL if the controller reported
193 	 *             that it did not receive any response.
194 	 */
195 	void (*pawr_response)(struct bt_le_ext_adv *adv, struct bt_le_per_adv_response_info *info,
196 			      struct net_buf_simple *buf);
197 
198 #endif /* defined(CONFIG_BT_PER_ADV_RSP) */
199 };
200 
201 /**
202  * @typedef bt_ready_cb_t
203  * @brief Callback for notifying that Bluetooth has been enabled.
204  *
205  * @param err zero on success or (negative) error code otherwise.
206  */
207 typedef void (*bt_ready_cb_t)(int err);
208 
209 /**
210  * @brief Enable Bluetooth
211  *
212  * Enable Bluetooth. Must be the called before any calls that
213  * require communication with the local Bluetooth hardware.
214  *
215  * When @kconfig{CONFIG_BT_SETTINGS} is enabled, the application must load the
216  * Bluetooth settings after this API call successfully completes before
217  * Bluetooth APIs can be used. Loading the settings before calling this function
218  * is insufficient. Bluetooth settings can be loaded with settings_load() or
219  * settings_load_subtree() with argument "bt". The latter selectively loads only
220  * Bluetooth settings and is recommended if settings_load() has been called
221  * earlier.
222  *
223  * @param cb Callback to notify completion or NULL to perform the
224  * enabling synchronously. The callback is called from the system workqueue.
225  *
226  * @return Zero on success or (negative) error code otherwise.
227  */
228 int bt_enable(bt_ready_cb_t cb);
229 
230 /**
231  * @brief Disable Bluetooth
232  *
233  * Disable Bluetooth. Can't be called before bt_enable has completed.
234  *
235  * This API will clear all configured identities and keys that are not persistently
236  * stored with @kconfig{CONFIG_BT_SETTINGS}. These can be restored
237  * with settings_load() before reenabling the stack.
238  *
239  * This API does _not_ clear previously registered callbacks
240  * like @ref bt_le_scan_cb_register, @ref bt_conn_cb_register
241  * AND @ref bt_br_discovery_cb_register.
242  * That is, the application shall not re-register them when
243  * the Bluetooth subsystem is re-enabled later.
244  *
245  * Close and release HCI resources. Result is architecture dependent.
246  *
247  * @return Zero on success or (negative) error code otherwise.
248  */
249 int bt_disable(void);
250 
251 /**
252  * @brief Check if Bluetooth is ready
253  *
254  * @return true when Bluetooth is ready, false otherwise
255  */
256 bool bt_is_ready(void);
257 
258 /**
259  * @brief Set Bluetooth Device Name
260  *
261  * Set Bluetooth GAP Device Name.
262  *
263  * When advertising with device name in the advertising data the name should
264  * be updated by calling @ref bt_le_adv_update_data or
265  * @ref bt_le_ext_adv_set_data.
266  *
267  * @note Requires @kconfig{CONFIG_BT_DEVICE_NAME_DYNAMIC}.
268  *
269  * @sa @kconfig{CONFIG_BT_DEVICE_NAME_MAX}.
270  *
271  * @param name New name
272  *
273  * @return Zero on success or (negative) error code otherwise.
274  */
275 int bt_set_name(const char *name);
276 
277 /**
278  * @brief Get Bluetooth Device Name
279  *
280  * Get Bluetooth GAP Device Name.
281  *
282  * @return Bluetooth Device Name
283  */
284 const char *bt_get_name(void);
285 
286 /**
287  * @brief Get local Bluetooth appearance
288  *
289  * Bluetooth Appearance is a description of the external appearance of a device
290  * in terms of an Appearance Value.
291  *
292  * @see https://specificationrefs.bluetooth.com/assigned-values/Appearance%20Values.pdf
293  *
294  * @returns Appearance Value of local Bluetooth host.
295  */
296 uint16_t bt_get_appearance(void);
297 
298 /**
299  * @brief Set local Bluetooth appearance
300  *
301  * Automatically preserves the new appearance across reboots if
302  * @kconfig{CONFIG_BT_SETTINGS} is enabled.
303  *
304  * This symbol is linkable if @kconfig{CONFIG_BT_DEVICE_APPEARANCE_DYNAMIC} is
305  * enabled.
306  *
307  * @param new_appearance Appearance Value
308  *
309  * @retval 0 Success.
310  * @retval other Persistent storage failed. Appearance was not updated.
311  */
312 int bt_set_appearance(uint16_t new_appearance);
313 
314 /**
315  * @brief Get the currently configured identities.
316  *
317  * Returns an array of the currently configured identity addresses. To
318  * make sure all available identities can be retrieved, the number of
319  * elements in the @a addrs array should be CONFIG_BT_ID_MAX. The identity
320  * identifier that some APIs expect (such as advertising parameters) is
321  * simply the index of the identity in the @a addrs array.
322  *
323  * If @a addrs is passed as NULL, then returned @a count contains the
324  * count of all available identities that can be retrieved with a
325  * subsequent call to this function with non-NULL @a addrs parameter.
326  *
327  * @note Deleted identities may show up as @ref BT_ADDR_LE_ANY in the returned
328  * array.
329  *
330  * @param addrs Array where to store the configured identities.
331  * @param count Should be initialized to the array size. Once the function
332  *              returns it will contain the number of returned identities.
333  */
334 void bt_id_get(bt_addr_le_t *addrs, size_t *count);
335 
336 /**
337  * @brief Create a new identity.
338  *
339  * Create a new identity using the given address and IRK. This function can be
340  * called before calling bt_enable(). However, the new identity will only be
341  * stored persistently in flash when this API is used after bt_enable(). The
342  * reason is that the persistent settings are loaded after bt_enable() and would
343  * therefore cause potential conflicts with the stack blindly overwriting what's
344  * stored in flash. The identity will also not be written to flash in case a
345  * pre-defined address is provided, since in such a situation the app clearly
346  * has some place it got the address from and will be able to repeat the
347  * procedure on every power cycle, i.e. it would be redundant to also store the
348  * information in flash.
349  *
350  * Generating random static address or random IRK is not supported when calling
351  * this function before bt_enable().
352  *
353  * If the application wants to have the stack randomly generate identities
354  * and store them in flash for later recovery, the way to do it would be
355  * to first initialize the stack (using bt_enable), then call settings_load(),
356  * and after that check with bt_id_get() how many identities were recovered.
357  * If an insufficient amount of identities were recovered the app may then
358  * call bt_id_create() to create new ones.
359  *
360  * If supported by the HCI driver (indicated by setting
361  * @kconfig{CONFIG_BT_HCI_SET_PUBLIC_ADDR}), the first call to this function can be
362  * used to set the controller's public identity address. This call must happen
363  * before calling bt_enable(). Subsequent calls always add/generate random
364  * static addresses.
365  *
366  * @param addr Address to use for the new identity. If NULL or initialized
367  *             to BT_ADDR_LE_ANY the stack will generate a new random
368  *             static address for the identity and copy it to the given
369  *             parameter upon return from this function (in case the
370  *             parameter was non-NULL).
371  * @param irk  Identity Resolving Key (16 bytes) to be used with this
372  *             identity. If set to all zeroes or NULL, the stack will
373  *             generate a random IRK for the identity and copy it back
374  *             to the parameter upon return from this function (in case
375  *             the parameter was non-NULL). If privacy
376  *             @kconfig{CONFIG_BT_PRIVACY} is not enabled this parameter must
377  *             be NULL.
378  *
379  * @return Identity identifier (>= 0) in case of success, or a negative
380  *         error code on failure.
381  */
382 int bt_id_create(bt_addr_le_t *addr, uint8_t *irk);
383 
384 /**
385  * @brief Reset/reclaim an identity for reuse.
386  *
387  * The semantics of the @a addr and @a irk parameters of this function
388  * are the same as with bt_id_create(). The difference is the first
389  * @a id parameter that needs to be an existing identity (if it doesn't
390  * exist this function will return an error). When given an existing
391  * identity this function will disconnect any connections created using it,
392  * remove any pairing keys or other data associated with it, and then create
393  * a new identity in the same slot, based on the @a addr and @a irk
394  * parameters.
395  *
396  * @note the default identity (BT_ID_DEFAULT) cannot be reset, i.e. this
397  * API will return an error if asked to do that.
398  *
399  * @param id   Existing identity identifier.
400  * @param addr Address to use for the new identity. If NULL or initialized
401  *             to BT_ADDR_LE_ANY the stack will generate a new static
402  *             random address for the identity and copy it to the given
403  *             parameter upon return from this function (in case the
404  *             parameter was non-NULL).
405  * @param irk  Identity Resolving Key (16 bytes) to be used with this
406  *             identity. If set to all zeroes or NULL, the stack will
407  *             generate a random IRK for the identity and copy it back
408  *             to the parameter upon return from this function (in case
409  *             the parameter was non-NULL). If privacy
410  *             @kconfig{CONFIG_BT_PRIVACY} is not enabled this parameter must
411  *             be NULL.
412  *
413  * @return Identity identifier (>= 0) in case of success, or a negative
414  *         error code on failure.
415  */
416 int bt_id_reset(uint8_t id, bt_addr_le_t *addr, uint8_t *irk);
417 
418 /**
419  * @brief Delete an identity.
420  *
421  * When given a valid identity this function will disconnect any connections
422  * created using it, remove any pairing keys or other data associated with
423  * it, and then flag is as deleted, so that it can not be used for any
424  * operations. To take back into use the slot the identity was occupying the
425  * bt_id_reset() API needs to be used.
426  *
427  * @note the default identity (BT_ID_DEFAULT) cannot be deleted, i.e. this
428  * API will return an error if asked to do that.
429  *
430  * @param id   Existing identity identifier.
431  *
432  * @return 0 in case of success, or a negative error code on failure.
433  */
434 int bt_id_delete(uint8_t id);
435 
436 /**
437  * @brief Bluetooth data serialized size.
438  *
439  * Get the size of a serialized @ref bt_data given its data length.
440  *
441  * Size of 'AD Structure'->'Length' field, equal to 1.
442  * Size of 'AD Structure'->'Data'->'AD Type' field, equal to 1.
443  * Size of 'AD Structure'->'Data'->'AD Data' field, equal to data_len.
444  *
445  * See Core Specification Version 5.4 Vol. 3 Part C, 11, Figure 11.1.
446  */
447 #define BT_DATA_SERIALIZED_SIZE(data_len) ((data_len) + 2)
448 
449 /**
450  * @brief Bluetooth data.
451  *
452  * Description of different data types that can be encoded into
453  * advertising data. Used to form arrays that are passed to the
454  * bt_le_adv_start() function.
455  */
456 struct bt_data {
457 	uint8_t type;
458 	uint8_t data_len;
459 	const uint8_t *data;
460 };
461 
462 /**
463  * @brief Helper to declare elements of bt_data arrays
464  *
465  * This macro is mainly for creating an array of struct bt_data
466  * elements which is then passed to e.g. @ref bt_le_adv_start().
467  *
468  * @param _type Type of advertising data field
469  * @param _data Pointer to the data field payload
470  * @param _data_len Number of bytes behind the _data pointer
471  */
472 #define BT_DATA(_type, _data, _data_len) \
473 	{ \
474 		.type = (_type), \
475 		.data_len = (_data_len), \
476 		.data = (const uint8_t *)(_data), \
477 	}
478 
479 /**
480  * @brief Helper to declare elements of bt_data arrays
481  *
482  * This macro is mainly for creating an array of struct bt_data
483  * elements which is then passed to e.g. @ref bt_le_adv_start().
484  *
485  * @param _type Type of advertising data field
486  * @param _bytes Variable number of single-byte parameters
487  */
488 #define BT_DATA_BYTES(_type, _bytes...) \
489 	BT_DATA(_type, ((uint8_t []) { _bytes }), \
490 		sizeof((uint8_t []) { _bytes }))
491 
492 /**
493  * @brief Get the total size (in bytes) of a given set of @ref bt_data
494  * structures.
495  *
496  * @param[in] data Array of @ref bt_data structures.
497  * @param[in] data_count Number of @ref bt_data structures in @p data.
498  *
499  * @return Size of the concatenated data, built from the @ref bt_data structure
500  *         set.
501  */
502 size_t bt_data_get_len(const struct bt_data data[], size_t data_count);
503 
504 /**
505  * @brief Serialize a @ref bt_data struct into an advertising structure (a flat
506  * byte array).
507  *
508  * The data are formatted according to the Bluetooth Core Specification v. 5.4,
509  * vol. 3, part C, 11.
510  *
511  * @param[in]  input Single @ref bt_data structure to read from.
512  * @param[out] output Buffer large enough to store the advertising structure in
513  *             @p input. The size of it must be at least the size of the
514  *             `input->data_len + 2` (for the type and the length).
515  *
516  * @return Number of bytes written in @p output.
517  */
518 size_t bt_data_serialize(const struct bt_data *input, uint8_t *output);
519 
520 /** Advertising options */
521 enum {
522 	/** Convenience value when no options are specified. */
523 	BT_LE_ADV_OPT_NONE = 0,
524 
525 	/**
526 	 * @brief Advertise as connectable.
527 	 *
528 	 * @deprecated Use @ref BT_LE_ADV_OPT_CONN instead.
529 	 *
530 	 * Advertise as connectable. If not connectable then the type of
531 	 * advertising is determined by providing scan response data.
532 	 * The advertiser address is determined by the type of advertising
533 	 * and/or enabling privacy @kconfig{CONFIG_BT_PRIVACY}.
534 	 *
535 	 * Starting connectable advertising preallocates a connection
536 	 * object. If this fails, the API returns @c -ENOMEM.
537 	 *
538 	 * When an advertiser set results in a connection creation, the
539 	 * controller automatically disables that advertising set.
540 	 *
541 	 * If the advertising set was started with @ref bt_le_adv_start
542 	 * without @ref BT_LE_ADV_OPT_ONE_TIME, the host will attempt to
543 	 * resume the advertiser under some conditions.
544 	 */
545 	BT_LE_ADV_OPT_CONNECTABLE __deprecated = BIT(0),
546 
547 	/**
548 	 * @internal
549 	 *
550 	 * Internal access to the deprecated value to maintain the
551 	 * implementation of the deprecated feature.
552 	 *
553 	 * At the end of the deprecation period, ABI will change so
554 	 * `BT_LE_ADV_OPT_CONN` is just `BIT(0)`, removing the need for this
555 	 * symbol.
556 	 */
557 	_BT_LE_ADV_OPT_CONNECTABLE = BIT(0),
558 
559 	/**
560 	 * @brief Advertise one time.
561 	 *
562 	 * @deprecated Use @ref BT_LE_ADV_OPT_CONN instead.
563 	 *
564 	 * Don't try to resume connectable advertising after a connection.
565 	 * This option is only meaningful when used together with
566 	 * BT_LE_ADV_OPT_CONNECTABLE. If set the advertising will be stopped
567 	 * when bt_le_adv_stop() is called or when an incoming (peripheral)
568 	 * connection happens. If this option is not set the stack will
569 	 * take care of keeping advertising enabled even as connections
570 	 * occur.
571 	 * If Advertising directed or the advertiser was started with
572 	 * @ref bt_le_ext_adv_start then this behavior is the default behavior
573 	 * and this flag has no effect.
574 	 */
575 	BT_LE_ADV_OPT_ONE_TIME __deprecated = BIT(1),
576 
577 	/**
578 	 * @internal
579 	 *
580 	 * Internal access to the deprecated value to maintain
581 	 * the implementation of the deprecated feature.
582 	 */
583 	_BT_LE_ADV_OPT_ONE_TIME = BIT(1),
584 
585 	/**
586 	 * @brief Connectable advertising
587 	 *
588 	 * Starting connectable advertising preallocates a connection
589 	 * object. If this fails, the API returns @c -ENOMEM.
590 	 *
591 	 * The advertising set stops immediately after it creates a
592 	 * connection. This happens automatically in the controller.
593 	 *
594 	 * @note To continue advertising after a connection is created,
595 	 * the application should listen for the @ref bt_conn_cb.connected
596 	 * event and start the advertising set again. Note that the
597 	 * advertiser cannot be started when all connection objects are
598 	 * in use. In that case, defer starting the advertiser until
599 	 * @ref bt_conn_cb.recycled. To continue after a disconnection,
600 	 * listen for @ref bt_conn_cb.recycled.
601 
602 	 */
603 	BT_LE_ADV_OPT_CONN = BIT(0) | BIT(1),
604 
605 	/**
606 	 * @brief Advertise using identity address.
607 	 *
608 	 * Advertise using the identity address as the advertiser address.
609 	 * @warning This will compromise the privacy of the device, so care
610 	 *          must be taken when using this option.
611 	 * @note The address used for advertising will not be the same as
612 	 *        returned by @ref bt_le_oob_get_local, instead @ref bt_id_get
613 	 *        should be used to get the LE address.
614 	 */
615 	BT_LE_ADV_OPT_USE_IDENTITY = BIT(2),
616 
617 	/**
618 	 * @deprecated This option will be removed in the near future, see
619 	 * https://github.com/zephyrproject-rtos/zephyr/issues/71686
620 	 *
621 	 * @brief Advertise using GAP device name.
622 	 *
623 	 * Include the GAP device name automatically when advertising.
624 	 * By default the GAP device name is put at the end of the scan
625 	 * response data.
626 	 * When advertising using @ref BT_LE_ADV_OPT_EXT_ADV and not
627 	 * @ref BT_LE_ADV_OPT_SCANNABLE then it will be put at the end of the
628 	 * advertising data.
629 	 * If the GAP device name does not fit into advertising data it will be
630 	 * converted to a shortened name if possible.
631 	 * @ref BT_LE_ADV_OPT_FORCE_NAME_IN_AD can be used to force the device
632 	 * name to appear in the advertising data of an advert with scan
633 	 * response data.
634 	 *
635 	 * The application can set the device name itself by including the
636 	 * following in the advertising data.
637 	 * @code
638 	 * BT_DATA(BT_DATA_NAME_COMPLETE, name, sizeof(name) - 1)
639 	 * @endcode
640 	 */
641 	BT_LE_ADV_OPT_USE_NAME = BIT(3),
642 
643 	/**
644 	 * @brief Low duty cycle directed advertising.
645 	 *
646 	 * Use low duty directed advertising mode, otherwise high duty mode
647 	 * will be used.
648 	 */
649 	BT_LE_ADV_OPT_DIR_MODE_LOW_DUTY = BIT(4),
650 
651 	/**
652 	 * @brief Directed advertising to privacy-enabled peer.
653 	 *
654 	 * Enable use of Resolvable Private Address (RPA) as the target address
655 	 * in directed advertisements.
656 	 * This is required if the remote device is privacy-enabled and
657 	 * supports address resolution of the target address in directed
658 	 * advertisement.
659 	 * It is the responsibility of the application to check that the remote
660 	 * device supports address resolution of directed advertisements by
661 	 * reading its Central Address Resolution characteristic.
662 	 */
663 	BT_LE_ADV_OPT_DIR_ADDR_RPA = BIT(5),
664 
665 	/** Use filter accept list to filter devices that can request scan
666 	 *  response data.
667 	 */
668 	BT_LE_ADV_OPT_FILTER_SCAN_REQ = BIT(6),
669 
670 	/** Use filter accept list to filter devices that can connect. */
671 	BT_LE_ADV_OPT_FILTER_CONN = BIT(7),
672 
673 	/** Notify the application when a scan response data has been sent to an
674 	 *  active scanner.
675 	 */
676 	BT_LE_ADV_OPT_NOTIFY_SCAN_REQ = BIT(8),
677 
678 	/**
679 	 * @brief Support scan response data.
680 	 *
681 	 * When used together with @ref BT_LE_ADV_OPT_EXT_ADV then this option
682 	 * cannot be used together with the @ref BT_LE_ADV_OPT_CONN option.
683 	 * When used together with @ref BT_LE_ADV_OPT_EXT_ADV then scan
684 	 * response data must be set.
685 	 */
686 	BT_LE_ADV_OPT_SCANNABLE = BIT(9),
687 
688 	/**
689 	 * @brief Advertise with extended advertising.
690 	 *
691 	 * This options enables extended advertising in the advertising set.
692 	 * In extended advertising the advertising set will send a small header
693 	 * packet on the three primary advertising channels. This small header
694 	 * points to the advertising data packet that will be sent on one of
695 	 * the 37 secondary advertising channels.
696 	 * The advertiser will send primary advertising on LE 1M PHY, and
697 	 * secondary advertising on LE 2M PHY.
698 	 * Connections will be established on LE 2M PHY.
699 	 *
700 	 * Without this option the advertiser will send advertising data on the
701 	 * three primary advertising channels.
702 	 *
703 	 * @note Enabling this option requires extended advertising support in
704 	 *       the peer devices scanning for advertisement packets.
705 	 *
706 	 * @note This cannot be used with bt_le_adv_start().
707 	 */
708 	BT_LE_ADV_OPT_EXT_ADV = BIT(10),
709 
710 	/**
711 	 * @brief Disable use of LE 2M PHY on the secondary advertising
712 	 * channel.
713 	 *
714 	 * Disabling the use of LE 2M PHY could be necessary if scanners don't
715 	 * support the LE 2M PHY.
716 	 * The advertiser will send primary advertising on LE 1M PHY, and
717 	 * secondary advertising on LE 1M PHY.
718 	 * Connections will be established on LE 1M PHY.
719 	 *
720 	 * @note Cannot be set if BT_LE_ADV_OPT_CODED is set.
721 	 *
722 	 * @note Requires @ref BT_LE_ADV_OPT_EXT_ADV.
723 	 */
724 	BT_LE_ADV_OPT_NO_2M = BIT(11),
725 
726 	/**
727 	 * @brief Advertise on the LE Coded PHY (Long Range).
728 	 *
729 	 * The advertiser will send both primary and secondary advertising
730 	 * on the LE Coded PHY. This gives the advertiser increased range with
731 	 * the trade-off of lower data rate and higher power consumption.
732 	 * Connections will be established on LE Coded PHY.
733 	 *
734 	 * @note Requires @ref BT_LE_ADV_OPT_EXT_ADV
735 	 */
736 	BT_LE_ADV_OPT_CODED = BIT(12),
737 
738 	/**
739 	 * @brief Advertise without a device address (identity or RPA).
740 	 *
741 	 * @note Requires @ref BT_LE_ADV_OPT_EXT_ADV
742 	 */
743 	BT_LE_ADV_OPT_ANONYMOUS = BIT(13),
744 
745 	/**
746 	 * @brief Advertise with transmit power.
747 	 *
748 	 * @note Requires @ref BT_LE_ADV_OPT_EXT_ADV
749 	 */
750 	BT_LE_ADV_OPT_USE_TX_POWER = BIT(14),
751 
752 	/** Disable advertising on channel index 37. */
753 	BT_LE_ADV_OPT_DISABLE_CHAN_37 = BIT(15),
754 
755 	/** Disable advertising on channel index 38. */
756 	BT_LE_ADV_OPT_DISABLE_CHAN_38 = BIT(16),
757 
758 	/** Disable advertising on channel index 39. */
759 	BT_LE_ADV_OPT_DISABLE_CHAN_39 = BIT(17),
760 
761 	/**
762 	 * @deprecated This option will be removed in the near future, see
763 	 * https://github.com/zephyrproject-rtos/zephyr/issues/71686
764 	 *
765 	 * @brief Put GAP device name into advert data
766 	 *
767 	 * Will place the GAP device name into the advertising data rather than
768 	 * the scan response data.
769 	 *
770 	 * @note Requires @ref BT_LE_ADV_OPT_USE_NAME
771 	 */
772 	BT_LE_ADV_OPT_FORCE_NAME_IN_AD = BIT(18),
773 
774 	/**
775 	 * @brief Advertise using a Non-Resolvable Private Address.
776 	 *
777 	 * A new NRPA is set when updating the advertising parameters.
778 	 *
779 	 * This is an advanced feature; most users will want to enable
780 	 * @kconfig{CONFIG_BT_EXT_ADV} instead.
781 	 *
782 	 * @note Not implemented when @kconfig{CONFIG_BT_PRIVACY}.
783 	 *
784 	 * @note Mutually exclusive with BT_LE_ADV_OPT_USE_IDENTITY.
785 	 */
786 	BT_LE_ADV_OPT_USE_NRPA = BIT(19),
787 };
788 
789 /** LE Advertising Parameters. */
790 struct bt_le_adv_param {
791 	/**
792 	 * @brief Local identity.
793 	 *
794 	 * @note When extended advertising @kconfig{CONFIG_BT_EXT_ADV} is not
795 	 *       enabled or not supported by the controller it is not possible
796 	 *       to scan and advertise simultaneously using two different
797 	 *       random addresses.
798 	 */
799 	uint8_t  id;
800 
801 	/**
802 	 * @brief Advertising Set Identifier, valid range 0x00 - 0x0f.
803 	 *
804 	 * @note Requires @ref BT_LE_ADV_OPT_EXT_ADV
805 	 **/
806 	uint8_t  sid;
807 
808 	/**
809 	 * @brief Secondary channel maximum skip count.
810 	 *
811 	 * Maximum advertising events the advertiser can skip before it must
812 	 * send advertising data on the secondary advertising channel.
813 	 *
814 	 * @note Requires @ref BT_LE_ADV_OPT_EXT_ADV
815 	 */
816 	uint8_t  secondary_max_skip;
817 
818 	/** Bit-field of advertising options */
819 	uint32_t options;
820 
821 	/** Minimum Advertising Interval (N * 0.625 milliseconds)
822 	 * Minimum Advertising Interval shall be less than or equal to the
823 	 * Maximum Advertising Interval. The Minimum Advertising Interval and
824 	 * Maximum Advertising Interval should not be the same value (as stated
825 	 * in Bluetooth Core Spec 5.2, section 7.8.5)
826 	 * Range: 0x0020 to 0x4000
827 	 */
828 	uint32_t interval_min;
829 
830 	/** Maximum Advertising Interval (N * 0.625 milliseconds)
831 	 * Minimum Advertising Interval shall be less than or equal to the
832 	 * Maximum Advertising Interval. The Minimum Advertising Interval and
833 	 * Maximum Advertising Interval should not be the same value (as stated
834 	 * in Bluetooth Core Spec 5.2, section 7.8.5)
835 	 * Range: 0x0020 to 0x4000
836 	 */
837 	uint32_t interval_max;
838 
839 	/**
840 	 * @brief Directed advertising to peer
841 	 *
842 	 * When this parameter is set the advertiser will send directed
843 	 * advertising to the remote device.
844 	 *
845 	 * The advertising type will either be high duty cycle, or low duty
846 	 * cycle if the BT_LE_ADV_OPT_DIR_MODE_LOW_DUTY option is enabled.
847 	 * When using @ref BT_LE_ADV_OPT_EXT_ADV then only low duty cycle is
848 	 * allowed.
849 	 *
850 	 * In case of connectable high duty cycle if the connection could not
851 	 * be established within the timeout the connected() callback will be
852 	 * called with the status set to @ref BT_HCI_ERR_ADV_TIMEOUT.
853 	 */
854 	const bt_addr_le_t *peer;
855 };
856 
857 
858 /** Periodic Advertising options */
859 enum {
860 	/** Convenience value when no options are specified. */
861 	BT_LE_PER_ADV_OPT_NONE = 0,
862 
863 	/**
864 	 * @brief Advertise with transmit power.
865 	 *
866 	 * @note Requires @ref BT_LE_ADV_OPT_EXT_ADV
867 	 */
868 	BT_LE_PER_ADV_OPT_USE_TX_POWER = BIT(1),
869 
870 	/**
871 	 * @brief Advertise with included AdvDataInfo (ADI).
872 	 *
873 	 * @note Requires @ref BT_LE_ADV_OPT_EXT_ADV
874 	 */
875 	BT_LE_PER_ADV_OPT_INCLUDE_ADI = BIT(2),
876 };
877 
878 struct bt_le_per_adv_param {
879 	/**
880 	 * @brief Minimum Periodic Advertising Interval (N * 1.25 ms)
881 	 *
882 	 * Shall be greater or equal to BT_GAP_PER_ADV_MIN_INTERVAL and
883 	 * less or equal to interval_max.
884 	 */
885 	uint16_t interval_min;
886 
887 	/**
888 	 * @brief Maximum Periodic Advertising Interval (N * 1.25 ms)
889 	 *
890 	 * Shall be less or equal to BT_GAP_PER_ADV_MAX_INTERVAL and
891 	 * greater or equal to interval_min.
892 	 */
893 	uint16_t interval_max;
894 
895 	/** Bit-field of periodic advertising options */
896 	uint32_t options;
897 
898 #if defined(CONFIG_BT_PER_ADV_RSP)
899 	/**
900 	 * @brief Number of subevents
901 	 *
902 	 * If zero, the periodic advertiser will be a broadcaster, without responses.
903 	 */
904 	uint8_t num_subevents;
905 
906 	/**
907 	 * @brief Interval between subevents (N * 1.25 ms)
908 	 *
909 	 * Shall be between 7.5ms and 318.75 ms.
910 	 */
911 	uint8_t subevent_interval;
912 
913 	/**
914 	 * @brief Time between the advertising packet in a subevent and the
915 	 * first response slot (N * 1.25 ms)
916 	 *
917 	 */
918 	uint8_t response_slot_delay;
919 
920 	/**
921 	 * @brief Time between response slots (N * 0.125 ms)
922 	 *
923 	 * Shall be between 0.25 and 31.875 ms.
924 	 */
925 	uint8_t response_slot_spacing;
926 
927 	/**
928 	 * @brief Number of subevent response slots
929 	 *
930 	 * If zero, response_slot_delay and response_slot_spacing are ignored.
931 	 */
932 	uint8_t num_response_slots;
933 #endif /* CONFIG_BT_PER_ADV_RSP */
934 };
935 
936 /**
937  * @brief Initialize advertising parameters
938  *
939  * @param _options   Advertising Options
940  * @param _int_min   Minimum advertising interval
941  * @param _int_max   Maximum advertising interval
942  * @param _peer      Peer address, set to NULL for undirected advertising or
943  *                   address of peer for directed advertising.
944  */
945 #define BT_LE_ADV_PARAM_INIT(_options, _int_min, _int_max, _peer) \
946 { \
947 	.id = BT_ID_DEFAULT, \
948 	.sid = 0, \
949 	.secondary_max_skip = 0, \
950 	.options = (_options), \
951 	.interval_min = (_int_min), \
952 	.interval_max = (_int_max), \
953 	.peer = (_peer), \
954 }
955 
956 /**
957  * @brief Helper to declare advertising parameters inline
958  *
959  * @param _options   Advertising Options
960  * @param _int_min   Minimum advertising interval
961  * @param _int_max   Maximum advertising interval
962  * @param _peer      Peer address, set to NULL for undirected advertising or
963  *                   address of peer for directed advertising.
964  */
965 #define BT_LE_ADV_PARAM(_options, _int_min, _int_max, _peer) \
966 	((const struct bt_le_adv_param[]) { \
967 		BT_LE_ADV_PARAM_INIT(_options, _int_min, _int_max, _peer) \
968 	 })
969 
970 #define BT_LE_ADV_CONN_DIR(_peer) BT_LE_ADV_PARAM(BT_LE_ADV_OPT_CONN, 0, 0, _peer)
971 
972 /**
973  * @deprecated This is a convenience macro for @ref
974  * BT_LE_ADV_OPT_CONNECTABLE, which is deprecated. Please use
975  * @ref BT_LE_ADV_CONN_FAST_1 or @ref BT_LE_ADV_CONN_FAST_2
976  * instead.
977  */
978 #define BT_LE_ADV_CONN                                                                             \
979 	BT_LE_ADV_PARAM(BT_LE_ADV_OPT_CONNECTABLE, BT_GAP_ADV_FAST_INT_MIN_2,                      \
980 			BT_GAP_ADV_FAST_INT_MAX_2, NULL)                                           \
981 	__DEPRECATED_MACRO
982 
983 /** @brief GAP recommended connectable advertising
984  *
985  * This is the recommended default for when a person is likely
986  * to be waiting the device to connect or be discovered.
987  *
988  * Use a longer interval to conserve battery at the cost of
989  * responsiveness. Consider entering a lower power state with
990  * longer intervals after a timeout.
991  *
992  * GAP recommends advertisers use this "when user-initiated".
993  * The application developer decides what this means. It can by
994  * any time the user interacts with the device, a press on a
995  * dedicated Bluetooth wakeup button, or anything in-between.
996  *
997  * This is the recommended setting for limited discoverable
998  * mode.
999  *
1000  * See Bluetooth Core Specification:
1001  * - 3.C.A "Timers and Constants", T_GAP(adv_fast_interval1)
1002  * - 3.C.9.3.11 "Connection Establishment Timing parameters"
1003  */
1004 #define BT_LE_ADV_CONN_FAST_1                                                                      \
1005 	BT_LE_ADV_PARAM(BT_LE_ADV_OPT_CONN, BT_GAP_ADV_FAST_INT_MIN_1, BT_GAP_ADV_FAST_INT_MAX_1,  \
1006 			NULL)
1007 
1008 /** @brief Connectable advertising with
1009  * T_GAP(adv_fast_interval2)
1010  *
1011  * The advertising interval corresponds to what was offered as
1012  * `BT_LE_ADV_CONN` in Zephyr 3.6 and earlier, but unlike
1013  * `BT_LE_ADV_CONN`, the host does not automatically resume the
1014  * advertiser after it results in a connection.
1015  *
1016  * See Bluetooth Core Specification:
1017  * - 3.C.A "Timers and Constants", T_GAP(adv_fast_interval1)
1018  * - 3.C.9.3.11 "Connection Establishment Timing parameters"
1019  */
1020 #define BT_LE_ADV_CONN_FAST_2                                                                      \
1021 	BT_LE_ADV_PARAM(BT_LE_ADV_OPT_CONN, BT_GAP_ADV_FAST_INT_MIN_2, BT_GAP_ADV_FAST_INT_MAX_2,  \
1022 			NULL)
1023 
1024 #define BT_LE_ADV_CONN_ONE_TIME BT_LE_ADV_CONN_FAST_2 __DEPRECATED_MACRO
1025 
1026 /**
1027  * @deprecated This macro will be removed in the near future, see
1028  * https://github.com/zephyrproject-rtos/zephyr/issues/71686
1029  */
1030 #define BT_LE_ADV_CONN_NAME BT_LE_ADV_PARAM(BT_LE_ADV_OPT_CONNECTABLE | \
1031 					    BT_LE_ADV_OPT_USE_NAME, \
1032 					    BT_GAP_ADV_FAST_INT_MIN_2, \
1033 					    BT_GAP_ADV_FAST_INT_MAX_2, NULL) \
1034 					    __DEPRECATED_MACRO
1035 
1036 /**
1037  * @deprecated This macro will be removed in the near future, see
1038  * https://github.com/zephyrproject-rtos/zephyr/issues/71686
1039  */
1040 #define BT_LE_ADV_CONN_NAME_AD BT_LE_ADV_PARAM(BT_LE_ADV_OPT_CONNECTABLE | \
1041 					    BT_LE_ADV_OPT_USE_NAME | \
1042 					    BT_LE_ADV_OPT_FORCE_NAME_IN_AD, \
1043 					    BT_GAP_ADV_FAST_INT_MIN_2, \
1044 					    BT_GAP_ADV_FAST_INT_MAX_2, NULL) \
1045 					    __DEPRECATED_MACRO
1046 
1047 #define BT_LE_ADV_CONN_DIR_LOW_DUTY(_peer)                                                         \
1048 	BT_LE_ADV_PARAM(BT_LE_ADV_OPT_CONN | BT_LE_ADV_OPT_DIR_MODE_LOW_DUTY,                      \
1049 			BT_GAP_ADV_FAST_INT_MIN_2, BT_GAP_ADV_FAST_INT_MAX_2, _peer)
1050 
1051 /** Non-connectable advertising with private address */
1052 #define BT_LE_ADV_NCONN BT_LE_ADV_PARAM(0, BT_GAP_ADV_FAST_INT_MIN_2, \
1053 					BT_GAP_ADV_FAST_INT_MAX_2, NULL)
1054 
1055 /**
1056  * @deprecated This macro will be removed in the near future, see
1057  * https://github.com/zephyrproject-rtos/zephyr/issues/71686
1058  *
1059  * Non-connectable advertising with @ref BT_LE_ADV_OPT_USE_NAME
1060  */
1061 #define BT_LE_ADV_NCONN_NAME BT_LE_ADV_PARAM(BT_LE_ADV_OPT_USE_NAME, \
1062 					     BT_GAP_ADV_FAST_INT_MIN_2, \
1063 					     BT_GAP_ADV_FAST_INT_MAX_2, NULL) \
1064 					     __DEPRECATED_MACRO
1065 
1066 /** Non-connectable advertising with @ref BT_LE_ADV_OPT_USE_IDENTITY */
1067 #define BT_LE_ADV_NCONN_IDENTITY BT_LE_ADV_PARAM(BT_LE_ADV_OPT_USE_IDENTITY, \
1068 						 BT_GAP_ADV_FAST_INT_MIN_2, \
1069 						 BT_GAP_ADV_FAST_INT_MAX_2, \
1070 						 NULL)
1071 
1072 /** Connectable extended advertising */
1073 #define BT_LE_EXT_ADV_CONN                                                                         \
1074 	BT_LE_ADV_PARAM(BT_LE_ADV_OPT_EXT_ADV | BT_LE_ADV_OPT_CONN, BT_GAP_ADV_FAST_INT_MIN_2,     \
1075 			BT_GAP_ADV_FAST_INT_MAX_2, NULL)
1076 
1077 /**
1078  * @deprecated This macro will be removed in the near future, see
1079  * https://github.com/zephyrproject-rtos/zephyr/issues/71686
1080  *
1081  * Connectable extended advertising with @ref BT_LE_ADV_OPT_USE_NAME
1082  */
1083 #define BT_LE_EXT_ADV_CONN_NAME BT_LE_ADV_PARAM(BT_LE_ADV_OPT_EXT_ADV | \
1084 						BT_LE_ADV_OPT_CONNECTABLE | \
1085 						BT_LE_ADV_OPT_USE_NAME, \
1086 						BT_GAP_ADV_FAST_INT_MIN_2, \
1087 						BT_GAP_ADV_FAST_INT_MAX_2, \
1088 						NULL) \
1089 						__DEPRECATED_MACRO
1090 
1091 /** Scannable extended advertising */
1092 #define BT_LE_EXT_ADV_SCAN BT_LE_ADV_PARAM(BT_LE_ADV_OPT_EXT_ADV | \
1093 					   BT_LE_ADV_OPT_SCANNABLE, \
1094 					   BT_GAP_ADV_FAST_INT_MIN_2, \
1095 					   BT_GAP_ADV_FAST_INT_MAX_2, \
1096 					   NULL)
1097 
1098 /**
1099  * @deprecated This macro will be removed in the near future, see
1100  * https://github.com/zephyrproject-rtos/zephyr/issues/71686
1101  *
1102  * Scannable extended advertising with @ref BT_LE_ADV_OPT_USE_NAME
1103  */
1104 #define BT_LE_EXT_ADV_SCAN_NAME BT_LE_ADV_PARAM(BT_LE_ADV_OPT_EXT_ADV | \
1105 						BT_LE_ADV_OPT_SCANNABLE | \
1106 						BT_LE_ADV_OPT_USE_NAME, \
1107 						BT_GAP_ADV_FAST_INT_MIN_2, \
1108 						BT_GAP_ADV_FAST_INT_MAX_2, \
1109 						NULL) \
1110 						__DEPRECATED_MACRO
1111 
1112 /** Non-connectable extended advertising with private address */
1113 #define BT_LE_EXT_ADV_NCONN BT_LE_ADV_PARAM(BT_LE_ADV_OPT_EXT_ADV, \
1114 					    BT_GAP_ADV_FAST_INT_MIN_2, \
1115 					    BT_GAP_ADV_FAST_INT_MAX_2, NULL)
1116 
1117 /**
1118  * @deprecated This macro will be removed in the near future, see
1119  * https://github.com/zephyrproject-rtos/zephyr/issues/71686
1120  *
1121  * Non-connectable extended advertising with @ref BT_LE_ADV_OPT_USE_NAME
1122  */
1123 #define BT_LE_EXT_ADV_NCONN_NAME BT_LE_ADV_PARAM(BT_LE_ADV_OPT_EXT_ADV | \
1124 						 BT_LE_ADV_OPT_USE_NAME, \
1125 						 BT_GAP_ADV_FAST_INT_MIN_2, \
1126 						 BT_GAP_ADV_FAST_INT_MAX_2, \
1127 						 NULL) \
1128 						 __DEPRECATED_MACRO
1129 
1130 /** Non-connectable extended advertising with @ref BT_LE_ADV_OPT_USE_IDENTITY */
1131 #define BT_LE_EXT_ADV_NCONN_IDENTITY \
1132 		BT_LE_ADV_PARAM(BT_LE_ADV_OPT_EXT_ADV | \
1133 				BT_LE_ADV_OPT_USE_IDENTITY, \
1134 				BT_GAP_ADV_FAST_INT_MIN_2, \
1135 				BT_GAP_ADV_FAST_INT_MAX_2, NULL)
1136 
1137 /** Non-connectable extended advertising on coded PHY with private address */
1138 #define BT_LE_EXT_ADV_CODED_NCONN BT_LE_ADV_PARAM(BT_LE_ADV_OPT_EXT_ADV | \
1139 						  BT_LE_ADV_OPT_CODED, \
1140 						  BT_GAP_ADV_FAST_INT_MIN_2, \
1141 						  BT_GAP_ADV_FAST_INT_MAX_2, \
1142 						  NULL)
1143 
1144 /**
1145  * @deprecated This macro will be removed in the near future, see
1146  * https://github.com/zephyrproject-rtos/zephyr/issues/71686
1147  *
1148  * Non-connectable extended advertising on coded PHY with
1149  * @ref BT_LE_ADV_OPT_USE_NAME
1150  */
1151 #define BT_LE_EXT_ADV_CODED_NCONN_NAME \
1152 		BT_LE_ADV_PARAM(BT_LE_ADV_OPT_EXT_ADV | BT_LE_ADV_OPT_CODED | \
1153 				BT_LE_ADV_OPT_USE_NAME, \
1154 				BT_GAP_ADV_FAST_INT_MIN_2, \
1155 				BT_GAP_ADV_FAST_INT_MAX_2, NULL) \
1156 				__DEPRECATED_MACRO
1157 
1158 /** Non-connectable extended advertising on coded PHY with
1159  *  @ref BT_LE_ADV_OPT_USE_IDENTITY
1160  */
1161 #define BT_LE_EXT_ADV_CODED_NCONN_IDENTITY \
1162 		BT_LE_ADV_PARAM(BT_LE_ADV_OPT_EXT_ADV | BT_LE_ADV_OPT_CODED | \
1163 				BT_LE_ADV_OPT_USE_IDENTITY, \
1164 				BT_GAP_ADV_FAST_INT_MIN_2, \
1165 				BT_GAP_ADV_FAST_INT_MAX_2, NULL)
1166 
1167 /**
1168  * Helper to initialize extended advertising start parameters inline
1169  *
1170  * @param _timeout Advertiser timeout
1171  * @param _n_evts  Number of advertising events
1172  */
1173 #define BT_LE_EXT_ADV_START_PARAM_INIT(_timeout, _n_evts) \
1174 { \
1175 	.timeout = (_timeout), \
1176 	.num_events = (_n_evts), \
1177 }
1178 
1179 /**
1180  * Helper to declare extended advertising start parameters inline
1181  *
1182  * @param _timeout Advertiser timeout
1183  * @param _n_evts  Number of advertising events
1184  */
1185 #define BT_LE_EXT_ADV_START_PARAM(_timeout, _n_evts) \
1186 	((const struct bt_le_ext_adv_start_param[]) { \
1187 		BT_LE_EXT_ADV_START_PARAM_INIT((_timeout), (_n_evts)) \
1188 	})
1189 
1190 #define BT_LE_EXT_ADV_START_DEFAULT BT_LE_EXT_ADV_START_PARAM(0, 0)
1191 
1192 /**
1193  * Helper to declare periodic advertising parameters inline
1194  *
1195  * @param _int_min     Minimum periodic advertising interval
1196  * @param _int_max     Maximum periodic advertising interval
1197  * @param _options     Periodic advertising properties bitfield.
1198  */
1199 #define BT_LE_PER_ADV_PARAM_INIT(_int_min, _int_max, _options) \
1200 { \
1201 	.interval_min = (_int_min), \
1202 	.interval_max = (_int_max), \
1203 	.options = (_options), \
1204 }
1205 
1206 /**
1207  * Helper to declare periodic advertising parameters inline
1208  *
1209  * @param _int_min     Minimum periodic advertising interval
1210  * @param _int_max     Maximum periodic advertising interval
1211  * @param _options     Periodic advertising properties bitfield.
1212  */
1213 #define BT_LE_PER_ADV_PARAM(_int_min, _int_max, _options) \
1214 	((struct bt_le_per_adv_param[]) { \
1215 		BT_LE_PER_ADV_PARAM_INIT(_int_min, _int_max, _options) \
1216 	})
1217 
1218 #define BT_LE_PER_ADV_DEFAULT BT_LE_PER_ADV_PARAM(BT_GAP_PER_ADV_SLOW_INT_MIN, \
1219 						  BT_GAP_PER_ADV_SLOW_INT_MAX, \
1220 						  BT_LE_PER_ADV_OPT_NONE)
1221 
1222 /**
1223  * @brief Start advertising
1224  *
1225  * Set advertisement data, scan response data, advertisement parameters
1226  * and start advertising.
1227  *
1228  * When the advertisement parameter peer address has been set the advertising
1229  * will be directed to the peer. In this case advertisement data and scan
1230  * response data parameters are ignored. If the mode is high duty cycle
1231  * the timeout will be @ref BT_GAP_ADV_HIGH_DUTY_CYCLE_MAX_TIMEOUT.
1232  *
1233  * This function cannot be used with @ref BT_LE_ADV_OPT_EXT_ADV in the @p param.options.
1234  * For extended advertising, the bt_le_ext_adv_* functions must be used.
1235  *
1236  * @param param Advertising parameters.
1237  * @param ad Data to be used in advertisement packets.
1238  * @param ad_len Number of elements in ad
1239  * @param sd Data to be used in scan response packets.
1240  * @param sd_len Number of elements in sd
1241  *
1242  * @return Zero on success or (negative) error code otherwise.
1243  * @return -ENOMEM No free connection objects available for connectable
1244  *                 advertiser.
1245  * @return -ECONNREFUSED When connectable advertising is requested and there
1246  *                       is already maximum number of connections established
1247  *                       in the controller.
1248  *                       This error code is only guaranteed when using Zephyr
1249  *                       controller, for other controllers code returned in
1250  *                       this case may be -EIO.
1251  */
1252 int bt_le_adv_start(const struct bt_le_adv_param *param,
1253 		    const struct bt_data *ad, size_t ad_len,
1254 		    const struct bt_data *sd, size_t sd_len);
1255 
1256 /**
1257  * @brief Update advertising
1258  *
1259  * Update advertisement and scan response data.
1260  *
1261  * @param ad Data to be used in advertisement packets.
1262  * @param ad_len Number of elements in ad
1263  * @param sd Data to be used in scan response packets.
1264  * @param sd_len Number of elements in sd
1265  *
1266  * @return Zero on success or (negative) error code otherwise.
1267  */
1268 int bt_le_adv_update_data(const struct bt_data *ad, size_t ad_len,
1269 			  const struct bt_data *sd, size_t sd_len);
1270 
1271 /**
1272  * @brief Stop advertising
1273  *
1274  * Stops ongoing advertising.
1275  *
1276  * @return Zero on success or (negative) error code otherwise.
1277  */
1278 int bt_le_adv_stop(void);
1279 
1280 /**
1281  * @brief Create advertising set.
1282  *
1283  * Create a new advertising set and set advertising parameters.
1284  * Advertising parameters can be updated with @ref bt_le_ext_adv_update_param.
1285  *
1286  * @param[in] param Advertising parameters.
1287  * @param[in] cb    Callback struct to notify about advertiser activity. Can be
1288  *                  NULL. Must point to valid memory during the lifetime of the
1289  *                  advertising set.
1290  * @param[out] adv  Valid advertising set object on success.
1291  *
1292  * @return Zero on success or (negative) error code otherwise.
1293  */
1294 int bt_le_ext_adv_create(const struct bt_le_adv_param *param,
1295 			 const struct bt_le_ext_adv_cb *cb,
1296 			 struct bt_le_ext_adv **adv);
1297 
1298 struct bt_le_ext_adv_start_param {
1299 	/**
1300 	 * @brief Advertiser timeout (N * 10 ms).
1301 	 *
1302 	 * Application will be notified by the advertiser sent callback.
1303 	 * Set to zero for no timeout.
1304 	 *
1305 	 * When using high duty cycle directed connectable advertising then
1306 	 * this parameters must be set to a non-zero value less than or equal
1307 	 * to the maximum of @ref BT_GAP_ADV_HIGH_DUTY_CYCLE_MAX_TIMEOUT.
1308 	 *
1309 	 * If privacy @kconfig{CONFIG_BT_PRIVACY} is enabled then the timeout
1310 	 * must be less than @kconfig{CONFIG_BT_RPA_TIMEOUT}.
1311 	 */
1312 	uint16_t timeout;
1313 	/**
1314 	 * @brief Number of advertising events.
1315 	 *
1316 	 * Application will be notified by the advertiser sent callback.
1317 	 * Set to zero for no limit.
1318 	 */
1319 	uint8_t  num_events;
1320 };
1321 
1322 /**
1323  * @brief Start advertising with the given advertising set
1324  *
1325  * If the advertiser is limited by either the timeout or number of advertising
1326  * events the application will be notified by the advertiser sent callback once
1327  * the limit is reached.
1328  * If the advertiser is limited by both the timeout and the number of
1329  * advertising events then the limit that is reached first will stop the
1330  * advertiser.
1331  *
1332  * @param adv    Advertising set object.
1333  * @param param  Advertise start parameters.
1334  */
1335 int bt_le_ext_adv_start(struct bt_le_ext_adv *adv,
1336 			const struct bt_le_ext_adv_start_param *param);
1337 
1338 /**
1339  * @brief Stop advertising with the given advertising set
1340  *
1341  * Stop advertising with a specific advertising set. When using this function
1342  * the advertising sent callback will not be called.
1343  *
1344  * @param adv Advertising set object.
1345  *
1346  * @return Zero on success or (negative) error code otherwise.
1347  */
1348 int bt_le_ext_adv_stop(struct bt_le_ext_adv *adv);
1349 
1350 /**
1351  * @brief Set an advertising set's advertising or scan response data.
1352  *
1353  * Set advertisement data or scan response data. If the advertising set is
1354  * currently advertising then the advertising data will be updated in
1355  * subsequent advertising events.
1356  *
1357  * When both @ref BT_LE_ADV_OPT_EXT_ADV and @ref BT_LE_ADV_OPT_SCANNABLE are
1358  * enabled then advertising data is ignored.
1359  * When @ref BT_LE_ADV_OPT_SCANNABLE is not enabled then scan response data is
1360  * ignored.
1361  *
1362  * If the advertising set has been configured to send advertising data on the
1363  * primary advertising channels then the maximum data length is
1364  * @ref BT_GAP_ADV_MAX_ADV_DATA_LEN bytes.
1365  * If the advertising set has been configured for extended advertising,
1366  * then the maximum data length is defined by the controller with the maximum
1367  * possible of @ref BT_GAP_ADV_MAX_EXT_ADV_DATA_LEN bytes.
1368  *
1369  * @note Not all scanners support extended data length advertising data.
1370  *
1371  * @note When updating the advertising data while advertising the advertising
1372  *       data and scan response data length must be smaller or equal to what
1373  *       can be fit in a single advertising packet. Otherwise the
1374  *       advertiser must be stopped.
1375  *
1376  * @param adv     Advertising set object.
1377  * @param ad      Data to be used in advertisement packets.
1378  * @param ad_len  Number of elements in ad
1379  * @param sd      Data to be used in scan response packets.
1380  * @param sd_len  Number of elements in sd
1381  *
1382  * @return Zero on success or (negative) error code otherwise.
1383  */
1384 int bt_le_ext_adv_set_data(struct bt_le_ext_adv *adv,
1385 			   const struct bt_data *ad, size_t ad_len,
1386 			   const struct bt_data *sd, size_t sd_len);
1387 
1388 /**
1389  * @brief Update advertising parameters.
1390  *
1391  * Update the advertising parameters. The function will return an error if the
1392  * advertiser set is currently advertising. Stop the advertising set before
1393  * calling this function.
1394  *
1395  * @note When changing the option @ref BT_LE_ADV_OPT_USE_NAME then
1396  *       @ref bt_le_ext_adv_set_data needs to be called in order to update the
1397  *       advertising data and scan response data.
1398  *
1399  * @param adv   Advertising set object.
1400  * @param param Advertising parameters.
1401  *
1402  * @return Zero on success or (negative) error code otherwise.
1403  */
1404 int bt_le_ext_adv_update_param(struct bt_le_ext_adv *adv,
1405 			       const struct bt_le_adv_param *param);
1406 
1407 /**
1408  * @brief Delete advertising set.
1409  *
1410  * Delete advertising set. This will free up the advertising set and make it
1411  * possible to create a new advertising set.
1412  *
1413  * @return Zero on success or (negative) error code otherwise.
1414  */
1415 int bt_le_ext_adv_delete(struct bt_le_ext_adv *adv);
1416 
1417 /**
1418  * @brief Get array index of an advertising set.
1419  *
1420  * This function is used to map bt_adv to index of an array of
1421  * advertising sets. The array has CONFIG_BT_EXT_ADV_MAX_ADV_SET elements.
1422  *
1423  * @param adv Advertising set.
1424  *
1425  * @return Index of the advertising set object.
1426  * The range of the returned value is 0..CONFIG_BT_EXT_ADV_MAX_ADV_SET-1
1427  */
1428 uint8_t bt_le_ext_adv_get_index(struct bt_le_ext_adv *adv);
1429 
1430 /** @brief Advertising set info structure. */
1431 struct bt_le_ext_adv_info {
1432 	/* Local identity */
1433 	uint8_t                    id;
1434 
1435 	/** Currently selected Transmit Power (dBM). */
1436 	int8_t                     tx_power;
1437 
1438 	/** Current local advertising address used. */
1439 	const bt_addr_le_t         *addr;
1440 };
1441 
1442 /**
1443  * @brief Get advertising set info
1444  *
1445  * @param adv Advertising set object
1446  * @param info Advertising set info object
1447  *
1448  * @return Zero on success or (negative) error code on failure.
1449  */
1450 int bt_le_ext_adv_get_info(const struct bt_le_ext_adv *adv,
1451 			   struct bt_le_ext_adv_info *info);
1452 
1453 /**
1454  * @typedef bt_le_scan_cb_t
1455  * @brief Callback type for reporting LE scan results.
1456  *
1457  * A function of this type is given to the bt_le_scan_start() function
1458  * and will be called for any discovered LE device.
1459  *
1460  * @param addr Advertiser LE address and type.
1461  * @param rssi Strength of advertiser signal.
1462  * @param adv_type Type of advertising response from advertiser.
1463  *                 Uses the BT_GAP_ADV_TYPE_* values.
1464  * @param buf Buffer containing advertiser data.
1465  */
1466 typedef void bt_le_scan_cb_t(const bt_addr_le_t *addr, int8_t rssi,
1467 			     uint8_t adv_type, struct net_buf_simple *buf);
1468 
1469 /**
1470  * @brief Set or update the periodic advertising parameters.
1471  *
1472  * The periodic advertising parameters can only be set or updated on an
1473  * extended advertisement set which is neither scannable, connectable nor
1474  * anonymous.
1475  *
1476  * @param adv   Advertising set object.
1477  * @param param Advertising parameters.
1478  *
1479  * @return Zero on success or (negative) error code otherwise.
1480  */
1481 int bt_le_per_adv_set_param(struct bt_le_ext_adv *adv,
1482 			    const struct bt_le_per_adv_param *param);
1483 
1484 /**
1485  * @brief Set or update the periodic advertising data.
1486  *
1487  * The periodic advertisement data can only be set or updated on an
1488  * extended advertisement set which is neither scannable, connectable nor
1489  * anonymous.
1490  *
1491  * @param adv       Advertising set object.
1492  * @param ad        Advertising data.
1493  * @param ad_len    Advertising data length.
1494  *
1495  * @return          Zero on success or (negative) error code otherwise.
1496  */
1497 int bt_le_per_adv_set_data(const struct bt_le_ext_adv *adv,
1498 			   const struct bt_data *ad, size_t ad_len);
1499 
1500 struct bt_le_per_adv_subevent_data_params {
1501 	/** The subevent to set data for */
1502 	uint8_t subevent;
1503 
1504 	/** The first response slot to listen to */
1505 	uint8_t response_slot_start;
1506 
1507 	/** The number of response slots to listen to */
1508 	uint8_t response_slot_count;
1509 
1510 	/** The data to send */
1511 	const struct net_buf_simple *data;
1512 };
1513 
1514 /**
1515  * @brief Set the periodic advertising with response subevent data.
1516  *
1517  * Set the data for one or more subevents of a Periodic Advertising with
1518  * Responses Advertiser in reply data request.
1519  *
1520  * @pre There are @p num_subevents elements in @p params.
1521  * @pre The controller has requested data for the subevents in @p params.
1522  *
1523  * @param adv           The extended advertiser the PAwR train belongs to.
1524  * @param num_subevents The number of subevents to set data for.
1525  * @param params        Subevent parameters.
1526  *
1527  * @return Zero on success or (negative) error code otherwise.
1528  */
1529 int bt_le_per_adv_set_subevent_data(const struct bt_le_ext_adv *adv, uint8_t num_subevents,
1530 				    const struct bt_le_per_adv_subevent_data_params *params);
1531 
1532 /**
1533  * @brief Starts periodic advertising.
1534  *
1535  * Enabling the periodic advertising can be done independently of extended
1536  * advertising, but both periodic advertising and extended advertising
1537  * shall be enabled before any periodic advertising data is sent. The
1538  * periodic advertising and extended advertising can be enabled in any order.
1539  *
1540  * Once periodic advertising has been enabled, it will continue advertising
1541  * until @ref bt_le_per_adv_stop() has been called, or if the advertising set
1542  * is deleted by @ref bt_le_ext_adv_delete(). Calling @ref bt_le_ext_adv_stop()
1543  * will not stop the periodic advertising.
1544  *
1545  * @param adv      Advertising set object.
1546  *
1547  * @return         Zero on success or (negative) error code otherwise.
1548  */
1549 int bt_le_per_adv_start(struct bt_le_ext_adv *adv);
1550 
1551 /**
1552  * @brief Stops periodic advertising.
1553  *
1554  * Disabling the periodic advertising can be done independently of extended
1555  * advertising. Disabling periodic advertising will not disable extended
1556  * advertising.
1557  *
1558  * @param adv      Advertising set object.
1559  *
1560  * @return         Zero on success or (negative) error code otherwise.
1561  */
1562 int bt_le_per_adv_stop(struct bt_le_ext_adv *adv);
1563 
1564 struct bt_le_per_adv_sync_synced_info {
1565 	/** Advertiser LE address and type. */
1566 	const bt_addr_le_t *addr;
1567 
1568 	/** Advertiser SID */
1569 	uint8_t sid;
1570 
1571 	/** Periodic advertising interval (N * 1.25 ms) */
1572 	uint16_t interval;
1573 
1574 	/** Advertiser PHY */
1575 	uint8_t phy;
1576 
1577 	/** True if receiving periodic advertisements, false otherwise. */
1578 	bool recv_enabled;
1579 
1580 	/**
1581 	 * @brief Service Data provided by the peer when sync is transferred
1582 	 *
1583 	 * Will always be 0 when the sync is locally created.
1584 	 */
1585 	uint16_t service_data;
1586 
1587 	/**
1588 	 * @brief Peer that transferred the periodic advertising sync
1589 	 *
1590 	 * Will always be 0 when the sync is locally created.
1591 	 *
1592 	 */
1593 	struct bt_conn *conn;
1594 #if defined(CONFIG_BT_PER_ADV_SYNC_RSP)
1595 	/** Number of subevents */
1596 	uint8_t num_subevents;
1597 
1598 	/** Subevent interval (N * 1.25 ms) */
1599 	uint8_t subevent_interval;
1600 
1601 	/** Response slot delay (N * 1.25 ms) */
1602 	uint8_t response_slot_delay;
1603 
1604 	/** Response slot spacing (N * 1.25 ms) */
1605 	uint8_t response_slot_spacing;
1606 
1607 #endif /* CONFIG_BT_PER_ADV_SYNC_RSP */
1608 };
1609 
1610 struct bt_le_per_adv_sync_term_info {
1611 	/** Advertiser LE address and type. */
1612 	const bt_addr_le_t *addr;
1613 
1614 	/** Advertiser SID */
1615 	uint8_t sid;
1616 
1617 	/** Cause of periodic advertising termination */
1618 	uint8_t reason;
1619 };
1620 
1621 struct bt_le_per_adv_sync_recv_info {
1622 	/** Advertiser LE address and type. */
1623 	const bt_addr_le_t *addr;
1624 
1625 	/** Advertiser SID */
1626 	uint8_t sid;
1627 
1628 	/** The TX power of the advertisement. */
1629 	int8_t tx_power;
1630 
1631 	/** The RSSI of the advertisement excluding any CTE. */
1632 	int8_t rssi;
1633 
1634 	/** The Constant Tone Extension (CTE) of the advertisement (@ref bt_df_cte_type) */
1635 	uint8_t cte_type;
1636 #if defined(CONFIG_BT_PER_ADV_SYNC_RSP)
1637 	/** The value of the event counter where the subevent indication was received. */
1638 	uint16_t periodic_event_counter;
1639 
1640 	/** The subevent where the subevent indication was received. */
1641 	uint8_t subevent;
1642 #endif /* CONFIG_BT_PER_ADV_SYNC_RSP */
1643 };
1644 
1645 
1646 struct bt_le_per_adv_sync_state_info {
1647 	/** True if receiving periodic advertisements, false otherwise. */
1648 	bool recv_enabled;
1649 };
1650 
1651 struct bt_le_per_adv_sync_cb {
1652 	/**
1653 	 * @brief The periodic advertising has been successfully synced.
1654 	 *
1655 	 * This callback notifies the application that the periodic advertising
1656 	 * set has been successfully synced, and will now start to
1657 	 * receive periodic advertising reports.
1658 	 *
1659 	 * @param sync The periodic advertising sync object.
1660 	 * @param info Information about the sync event.
1661 	 */
1662 	void (*synced)(struct bt_le_per_adv_sync *sync,
1663 		       struct bt_le_per_adv_sync_synced_info *info);
1664 
1665 	/**
1666 	 * @brief The periodic advertising sync has been terminated.
1667 	 *
1668 	 * This callback notifies the application that the periodic advertising
1669 	 * sync has been terminated, either by local request, remote request or
1670 	 * because due to missing data, e.g. by being out of range or sync.
1671 	 *
1672 	 * @param sync  The periodic advertising sync object.
1673 	 */
1674 	void (*term)(struct bt_le_per_adv_sync *sync,
1675 		     const struct bt_le_per_adv_sync_term_info *info);
1676 
1677 	/**
1678 	 * @brief Periodic advertising data received.
1679 	 *
1680 	 * This callback notifies the application of an periodic advertising
1681 	 * report.
1682 	 *
1683 	 * @param sync  The advertising set object.
1684 	 * @param info  Information about the periodic advertising event.
1685 	 * @param buf   Buffer containing the periodic advertising data.
1686 	 *              NULL if the controller failed to receive a subevent
1687 	 *              indication. Only happens if
1688 	 *              @kconfig{CONFIG_BT_PER_ADV_SYNC_RSP} is enabled.
1689 	 */
1690 	void (*recv)(struct bt_le_per_adv_sync *sync,
1691 		     const struct bt_le_per_adv_sync_recv_info *info,
1692 		     struct net_buf_simple *buf);
1693 
1694 	/**
1695 	 * @brief The periodic advertising sync state has changed.
1696 	 *
1697 	 * This callback notifies the application about changes to the sync
1698 	 * state. Initialize sync and termination is handled by their individual
1699 	 * callbacks, and won't be notified here.
1700 	 *
1701 	 * @param sync  The periodic advertising sync object.
1702 	 * @param info  Information about the state change.
1703 	 */
1704 	void (*state_changed)(struct bt_le_per_adv_sync *sync,
1705 			      const struct bt_le_per_adv_sync_state_info *info);
1706 
1707 	/**
1708 	 * @brief BIGInfo advertising report received.
1709 	 *
1710 	 * This callback notifies the application of a BIGInfo advertising report.
1711 	 * This is received if the advertiser is broadcasting isochronous streams in a BIG.
1712 	 * See iso.h for more information.
1713 	 *
1714 	 * @param sync     The advertising set object.
1715 	 * @param biginfo  The BIGInfo report.
1716 	 */
1717 	void (*biginfo)(struct bt_le_per_adv_sync *sync, const struct bt_iso_biginfo *biginfo);
1718 
1719 	/**
1720 	 * @brief Callback for IQ samples report collected when sampling
1721 	 *        CTE received with periodic advertising PDU.
1722 	 *
1723 	 * @param sync The periodic advertising sync object.
1724 	 * @param info Information about the sync event.
1725 	 */
1726 	void (*cte_report_cb)(struct bt_le_per_adv_sync *sync,
1727 			      struct bt_df_per_adv_sync_iq_samples_report const *info);
1728 
1729 	sys_snode_t node;
1730 };
1731 
1732 /** Periodic advertising sync options */
1733 enum {
1734 	/** Convenience value when no options are specified. */
1735 	BT_LE_PER_ADV_SYNC_OPT_NONE = 0,
1736 
1737 	/**
1738 	 * @brief Use the periodic advertising list to sync with advertiser
1739 	 *
1740 	 * When this option is set, the address and SID of the parameters
1741 	 * are ignored.
1742 	 */
1743 	BT_LE_PER_ADV_SYNC_OPT_USE_PER_ADV_LIST = BIT(0),
1744 
1745 	/**
1746 	 * @brief Disables periodic advertising reports
1747 	 *
1748 	 * No advertisement reports will be handled until enabled.
1749 	 */
1750 	BT_LE_PER_ADV_SYNC_OPT_REPORTING_INITIALLY_DISABLED = BIT(1),
1751 
1752 	/** Filter duplicate Periodic Advertising reports */
1753 	BT_LE_PER_ADV_SYNC_OPT_FILTER_DUPLICATE = BIT(2),
1754 
1755 	/** Sync with Angle of Arrival (AoA) constant tone extension */
1756 	BT_LE_PER_ADV_SYNC_OPT_DONT_SYNC_AOA = BIT(3),
1757 
1758 	/** Sync with Angle of Departure (AoD) 1 us constant tone extension */
1759 	BT_LE_PER_ADV_SYNC_OPT_DONT_SYNC_AOD_1US = BIT(4),
1760 
1761 	/** Sync with Angle of Departure (AoD) 2 us constant tone extension */
1762 	BT_LE_PER_ADV_SYNC_OPT_DONT_SYNC_AOD_2US = BIT(5),
1763 
1764 	/** Do not sync to packets without a constant tone extension */
1765 	BT_LE_PER_ADV_SYNC_OPT_SYNC_ONLY_CONST_TONE_EXT = BIT(6),
1766 };
1767 
1768 struct bt_le_per_adv_sync_param {
1769 	/**
1770 	 * @brief Periodic Advertiser Address
1771 	 *
1772 	 * Only valid if not using the periodic advertising list
1773 	 * (BT_LE_PER_ADV_SYNC_OPT_USE_PER_ADV_LIST)
1774 	 */
1775 	bt_addr_le_t addr;
1776 
1777 	/**
1778 	 * @brief Advertiser SID
1779 	 *
1780 	 * Only valid if not using the periodic advertising list
1781 	 * (BT_LE_PER_ADV_SYNC_OPT_USE_PER_ADV_LIST)
1782 	 */
1783 	uint8_t sid;
1784 
1785 	/** Bit-field of periodic advertising sync options. */
1786 	uint32_t options;
1787 
1788 	/**
1789 	 * @brief Maximum event skip
1790 	 *
1791 	 * Maximum number of periodic advertising events that can be
1792 	 * skipped after a successful receive.
1793 	 * Range: 0x0000 to 0x01F3
1794 	 */
1795 	uint16_t skip;
1796 
1797 	/**
1798 	 * @brief Synchronization timeout (N * 10 ms)
1799 	 *
1800 	 * Synchronization timeout for the periodic advertising sync.
1801 	 * Range 0x000A to 0x4000 (100 ms to 163840 ms)
1802 	 */
1803 	uint16_t timeout;
1804 };
1805 
1806 /**
1807  * @brief Get array index of an periodic advertising sync object.
1808  *
1809  * This function is get the index of an array of periodic advertising sync
1810  * objects. The array has CONFIG_BT_PER_ADV_SYNC_MAX elements.
1811  *
1812  * @param per_adv_sync The periodic advertising sync object.
1813  *
1814  * @return Index of the periodic advertising sync object.
1815  * The range of the returned value is 0..CONFIG_BT_PER_ADV_SYNC_MAX-1
1816  */
1817 uint8_t bt_le_per_adv_sync_get_index(struct bt_le_per_adv_sync *per_adv_sync);
1818 
1819 /**
1820  * @brief Get a periodic advertising sync object from the array index.
1821  *
1822  * This function is to get the periodic advertising sync object from
1823  * the array index.
1824  * The array has CONFIG_BT_PER_ADV_SYNC_MAX elements.
1825  *
1826  * @param index The index of the periodic advertising sync object.
1827  *              The range of the index value is 0..CONFIG_BT_PER_ADV_SYNC_MAX-1
1828  *
1829  * @return The periodic advertising sync object of the array index or NULL if invalid index.
1830  */
1831 struct bt_le_per_adv_sync *bt_le_per_adv_sync_lookup_index(uint8_t index);
1832 
1833 /** @brief Advertising set info structure. */
1834 struct bt_le_per_adv_sync_info {
1835 	/** Periodic Advertiser Address */
1836 	bt_addr_le_t addr;
1837 
1838 	/** Advertiser SID */
1839 	uint8_t sid;
1840 
1841 	/** Periodic advertising interval (N * 1.25 ms) */
1842 	uint16_t interval;
1843 
1844 	/** Advertiser PHY */
1845 	uint8_t phy;
1846 };
1847 
1848 /**
1849  * @brief Get periodic adv sync information.
1850  *
1851  * @param per_adv_sync Periodic advertising sync object.
1852  * @param info          Periodic advertising sync info object
1853  *
1854  * @return Zero on success or (negative) error code on failure.
1855  */
1856 int bt_le_per_adv_sync_get_info(struct bt_le_per_adv_sync *per_adv_sync,
1857 				struct bt_le_per_adv_sync_info *info);
1858 
1859 /**
1860  * @brief Look up an existing periodic advertising sync object by advertiser address.
1861  *
1862  * @param adv_addr Advertiser address.
1863  * @param sid      The advertising set ID.
1864  *
1865  * @return Periodic advertising sync object or NULL if not found.
1866  */
1867 struct bt_le_per_adv_sync *bt_le_per_adv_sync_lookup_addr(const bt_addr_le_t *adv_addr,
1868 							  uint8_t sid);
1869 
1870 /**
1871  * @brief Create a periodic advertising sync object.
1872  *
1873  * Create a periodic advertising sync object that can try to synchronize
1874  * to periodic advertising reports from an advertiser. Scan shall either be
1875  * disabled or extended scan shall be enabled.
1876  *
1877  * This function does not timeout, and will continue to look for an advertiser until it either
1878  * finds it or bt_le_per_adv_sync_delete() is called. It is thus suggested to implement a timeout
1879  * when using this, if it is expected to find the advertiser within a reasonable timeframe.
1880  *
1881  * @param[in]  param     Periodic advertising sync parameters.
1882  * @param[out] out_sync  Periodic advertising sync object on.
1883  *
1884  * @return Zero on success or (negative) error code otherwise.
1885  */
1886 int bt_le_per_adv_sync_create(const struct bt_le_per_adv_sync_param *param,
1887 			      struct bt_le_per_adv_sync **out_sync);
1888 
1889 /**
1890  * @brief Delete periodic advertising sync.
1891  *
1892  * Delete the periodic advertising sync object. Can be called regardless of the
1893  * state of the sync. If the syncing is currently syncing, the syncing is
1894  * cancelled. If the sync has been established, it is terminated. The
1895  * periodic advertising sync object will be invalidated afterwards.
1896  *
1897  * If the state of the sync object is syncing, then a new periodic advertising
1898  * sync object may not be created until the controller has finished canceling
1899  * this object.
1900  *
1901  * @param per_adv_sync The periodic advertising sync object.
1902  *
1903  * @return Zero on success or (negative) error code otherwise.
1904  */
1905 int bt_le_per_adv_sync_delete(struct bt_le_per_adv_sync *per_adv_sync);
1906 
1907 /**
1908  * @brief Register periodic advertising sync callbacks.
1909  *
1910  * Adds the callback structure to the list of callback structures for periodic
1911  * advertising syncs.
1912  *
1913  * This callback will be called for all periodic advertising sync activity,
1914  * such as synced, terminated and when data is received.
1915  *
1916  * @param cb Callback struct. Must point to memory that remains valid.
1917  *
1918  * @retval 0 Success.
1919  * @retval -EEXIST if @p cb was already registered.
1920  */
1921 int bt_le_per_adv_sync_cb_register(struct bt_le_per_adv_sync_cb *cb);
1922 
1923 /**
1924  * @brief Enables receiving periodic advertising reports for a sync.
1925  *
1926  * If the sync is already receiving the reports, -EALREADY is returned.
1927  *
1928  * @param per_adv_sync The periodic advertising sync object.
1929  *
1930  * @return Zero on success or (negative) error code otherwise.
1931  */
1932 int bt_le_per_adv_sync_recv_enable(struct bt_le_per_adv_sync *per_adv_sync);
1933 
1934 /**
1935  * @brief Disables receiving periodic advertising reports for a sync.
1936  *
1937  * If the sync report receiving is already disabled, -EALREADY is returned.
1938  *
1939  * @param per_adv_sync The periodic advertising sync object.
1940  *
1941  * @return Zero on success or (negative) error code otherwise.
1942  */
1943 int bt_le_per_adv_sync_recv_disable(struct bt_le_per_adv_sync *per_adv_sync);
1944 
1945 /** Periodic Advertising Sync Transfer options */
1946 enum {
1947 	/** Convenience value when no options are specified. */
1948 	BT_LE_PER_ADV_SYNC_TRANSFER_OPT_NONE = 0,
1949 
1950 	/**
1951 	 * @brief No Angle of Arrival (AoA)
1952 	 *
1953 	 * Do not sync with Angle of Arrival (AoA) constant tone extension
1954 	 **/
1955 	BT_LE_PER_ADV_SYNC_TRANSFER_OPT_SYNC_NO_AOA = BIT(0),
1956 
1957 	/**
1958 	 * @brief No Angle of Departure (AoD) 1 us
1959 	 *
1960 	 * Do not sync with Angle of Departure (AoD) 1 us
1961 	 * constant tone extension
1962 	 */
1963 	BT_LE_PER_ADV_SYNC_TRANSFER_OPT_SYNC_NO_AOD_1US = BIT(1),
1964 
1965 	/**
1966 	 * @brief No Angle of Departure (AoD) 2
1967 	 *
1968 	 * Do not sync with Angle of Departure (AoD) 2 us
1969 	 * constant tone extension
1970 	 */
1971 	BT_LE_PER_ADV_SYNC_TRANSFER_OPT_SYNC_NO_AOD_2US = BIT(2),
1972 
1973 	/** Only sync to packets with constant tone extension */
1974 	BT_LE_PER_ADV_SYNC_TRANSFER_OPT_SYNC_ONLY_CTE = BIT(3),
1975 
1976 	/**
1977 	 * @brief Sync to received PAST packets but don't generate sync reports
1978 	 *
1979 	 * This option must not be set at the same time as
1980 	 * @ref BT_LE_PER_ADV_SYNC_TRANSFER_OPT_FILTER_DUPLICATES.
1981 	 */
1982 	BT_LE_PER_ADV_SYNC_TRANSFER_OPT_REPORTING_INITIALLY_DISABLED = BIT(4),
1983 
1984 	/**
1985 	 * @brief Sync to received PAST packets and generate sync reports with duplicate filtering
1986 	 *
1987 	 * This option must not be set at the same time as
1988 	 * @ref BT_LE_PER_ADV_SYNC_TRANSFER_OPT_REPORTING_INITIALLY_DISABLED.
1989 	 */
1990 	BT_LE_PER_ADV_SYNC_TRANSFER_OPT_FILTER_DUPLICATES = BIT(5),
1991 };
1992 
1993 struct bt_le_per_adv_sync_transfer_param {
1994 	/**
1995 	 * @brief Maximum event skip
1996 	 *
1997 	 * The number of periodic advertising packets that can be skipped
1998 	 * after a successful receive.
1999 	 */
2000 	uint16_t skip;
2001 
2002 	/**
2003 	 * @brief Synchronization timeout (N * 10 ms)
2004 	 *
2005 	 * Synchronization timeout for the periodic advertising sync.
2006 	 * Range 0x000A to 0x4000 (100 ms to 163840 ms)
2007 	 */
2008 	uint16_t timeout;
2009 
2010 	/** Periodic Advertising Sync Transfer options */
2011 	uint32_t options;
2012 };
2013 
2014 /**
2015  * @brief Transfer the periodic advertising sync information to a peer device.
2016  *
2017  * This will allow another device to quickly synchronize to the same periodic
2018  * advertising train that this device is currently synced to.
2019  *
2020  * @param per_adv_sync  The periodic advertising sync to transfer.
2021  * @param conn          The peer device that will receive the sync information.
2022  * @param service_data  Application service data provided to the remote host.
2023  *
2024  * @return Zero on success or (negative) error code otherwise.
2025  */
2026 int bt_le_per_adv_sync_transfer(const struct bt_le_per_adv_sync *per_adv_sync,
2027 				const struct bt_conn *conn,
2028 				uint16_t service_data);
2029 
2030 
2031 /**
2032  * @brief Transfer the information about a periodic advertising set.
2033  *
2034  * This will allow another device to quickly synchronize to periodic
2035  * advertising set from this device.
2036  *
2037  * @param adv           The periodic advertising set to transfer info of.
2038  * @param conn          The peer device that will receive the information.
2039  * @param service_data  Application service data provided to the remote host.
2040  *
2041  * @return Zero on success or (negative) error code otherwise.
2042  */
2043 int bt_le_per_adv_set_info_transfer(const struct bt_le_ext_adv *adv,
2044 				    const struct bt_conn *conn,
2045 				    uint16_t service_data);
2046 
2047 /**
2048  * @brief Subscribe to periodic advertising sync transfers (PASTs).
2049  *
2050  * Sets the parameters and allow other devices to transfer periodic advertising
2051  * syncs.
2052  *
2053  * @param conn    The connection to set the parameters for. If NULL default
2054  *                parameters for all connections will be set. Parameters set
2055  *                for specific connection will always have precedence.
2056  * @param param   The periodic advertising sync transfer parameters.
2057  *
2058  * @return Zero on success or (negative) error code otherwise.
2059  */
2060 int bt_le_per_adv_sync_transfer_subscribe(
2061 	const struct bt_conn *conn,
2062 	const struct bt_le_per_adv_sync_transfer_param *param);
2063 
2064 /**
2065  * @brief Unsubscribe from periodic advertising sync transfers (PASTs).
2066  *
2067  * Remove the parameters that allow other devices to transfer periodic
2068  * advertising syncs.
2069  *
2070  * @param conn    The connection to remove the parameters for. If NULL default
2071  *                parameters for all connections will be removed. Unsubscribing
2072  *                for a specific device, will still allow other devices to
2073  *                transfer periodic advertising syncs.
2074  *
2075  * @return Zero on success or (negative) error code otherwise.
2076  */
2077 int bt_le_per_adv_sync_transfer_unsubscribe(const struct bt_conn *conn);
2078 
2079 /**
2080  * @brief Add a device to the periodic advertising list.
2081  *
2082  * Add peer device LE address to the periodic advertising list. This will make
2083  * it possibly to automatically create a periodic advertising sync to this
2084  * device.
2085  *
2086  * @param addr Bluetooth LE identity address.
2087  * @param sid  The advertising set ID. This value is obtained from the
2088  *             @ref bt_le_scan_recv_info in the scan callback.
2089  *
2090  * @return Zero on success or (negative) error code otherwise.
2091  */
2092 int bt_le_per_adv_list_add(const bt_addr_le_t *addr, uint8_t sid);
2093 
2094 /**
2095  * @brief Remove a device from the periodic advertising list.
2096  *
2097  * Removes peer device LE address from the periodic advertising list.
2098  *
2099  * @param addr Bluetooth LE identity address.
2100  * @param sid  The advertising set ID. This value is obtained from the
2101  *             @ref bt_le_scan_recv_info in the scan callback.
2102  *
2103  * @return Zero on success or (negative) error code otherwise.
2104  */
2105 int bt_le_per_adv_list_remove(const bt_addr_le_t *addr, uint8_t sid);
2106 
2107 /**
2108  * @brief Clear the periodic advertising list.
2109  *
2110  * Clears the entire periodic advertising list.
2111  *
2112  * @return Zero on success or (negative) error code otherwise.
2113  */
2114 int bt_le_per_adv_list_clear(void);
2115 
2116 
2117 enum {
2118 	/** Convenience value when no options are specified. */
2119 	BT_LE_SCAN_OPT_NONE = 0,
2120 
2121 	/** Filter duplicates. */
2122 	BT_LE_SCAN_OPT_FILTER_DUPLICATE = BIT(0),
2123 
2124 	/** Filter using filter accept list. */
2125 	BT_LE_SCAN_OPT_FILTER_ACCEPT_LIST = BIT(1),
2126 
2127 	/** Enable scan on coded PHY (Long Range).*/
2128 	BT_LE_SCAN_OPT_CODED = BIT(2),
2129 
2130 	/**
2131 	 * @brief Disable scan on 1M phy.
2132 	 *
2133 	 * @note Requires @ref BT_LE_SCAN_OPT_CODED.
2134 	 */
2135 	BT_LE_SCAN_OPT_NO_1M = BIT(3),
2136 };
2137 
2138 #define BT_LE_SCAN_OPT_FILTER_WHITELIST __DEPRECATED_MACRO BT_LE_SCAN_OPT_FILTER_ACCEPT_LIST
2139 
2140 enum {
2141 	/** Scan without requesting additional information from advertisers. */
2142 	BT_LE_SCAN_TYPE_PASSIVE = 0x00,
2143 
2144 	/**
2145 	 * @brief Scan and request additional information from advertisers.
2146 	 *
2147 	 * Using this scan type will automatically send scan requests to all
2148 	 * devices. Scan responses are received in the same manner and using the
2149 	 * same callbacks as advertising reports.
2150 	 */
2151 	BT_LE_SCAN_TYPE_ACTIVE = 0x01,
2152 };
2153 
2154 /** LE scan parameters */
2155 struct bt_le_scan_param {
2156 	/** Scan type (BT_LE_SCAN_TYPE_ACTIVE or BT_LE_SCAN_TYPE_PASSIVE) */
2157 	uint8_t  type;
2158 
2159 	/** Bit-field of scanning options. */
2160 	uint8_t options;
2161 
2162 	/** Scan interval (N * 0.625 ms).
2163 	 *
2164 	 * @note When @kconfig{CONFIG_BT_SCAN_AND_INITIATE_IN_PARALLEL} is enabled
2165 	 *       and the application wants to scan and connect in parallel,
2166 	 *       the Bluetooth Controller may require the scan interval used
2167 	 *       for scanning and connection establishment to be equal to
2168 	 *       obtain the best performance.
2169 	 */
2170 	uint16_t interval;
2171 
2172 	/** Scan window (N * 0.625 ms)
2173 	 *
2174 	 * @note When @kconfig{CONFIG_BT_SCAN_AND_INITIATE_IN_PARALLEL} is enabled
2175 	 *       and the application wants to scan and connect in parallel,
2176 	 *       the Bluetooth Controller may require the scan window used
2177 	 *       for scanning and connection establishment to be equal to
2178 	 *       obtain the best performance.
2179 	 */
2180 	uint16_t window;
2181 
2182 	/**
2183 	 * @brief Scan timeout (N * 10 ms)
2184 	 *
2185 	 * Application will be notified by the scan timeout callback.
2186 	 * Set zero to disable timeout.
2187 	 */
2188 	uint16_t timeout;
2189 
2190 	/**
2191 	 * @brief Scan interval LE Coded PHY (N * 0.625 MS)
2192 	 *
2193 	 * Set zero to use same as LE 1M PHY scan interval.
2194 	 */
2195 	uint16_t interval_coded;
2196 
2197 	/**
2198 	 * @brief Scan window LE Coded PHY (N * 0.625 MS)
2199 	 *
2200 	 * Set zero to use same as LE 1M PHY scan window.
2201 	 */
2202 	uint16_t window_coded;
2203 };
2204 
2205 /** LE advertisement and scan response packet information */
2206 struct bt_le_scan_recv_info {
2207 	/**
2208 	 * @brief Advertiser LE address and type.
2209 	 *
2210 	 * If advertiser is anonymous then this address will be
2211 	 * @ref BT_ADDR_LE_ANY.
2212 	 */
2213 	const bt_addr_le_t *addr;
2214 
2215 	/** Advertising Set Identifier. */
2216 	uint8_t sid;
2217 
2218 	/** Strength of advertiser signal. */
2219 	int8_t rssi;
2220 
2221 	/** Transmit power of the advertiser. */
2222 	int8_t tx_power;
2223 
2224 	/**
2225 	 * @brief Advertising packet type.
2226 	 *
2227 	 * Uses the BT_GAP_ADV_TYPE_* value.
2228 	 *
2229 	 * May indicate that this is a scan response if the type is
2230 	 * @ref BT_GAP_ADV_TYPE_SCAN_RSP.
2231 	 */
2232 	uint8_t adv_type;
2233 
2234 	/**
2235 	 * @brief Advertising packet properties bitfield.
2236 	 *
2237 	 * Uses the BT_GAP_ADV_PROP_* values.
2238 	 * May indicate that this is a scan response if the value contains the
2239 	 * @ref BT_GAP_ADV_PROP_SCAN_RESPONSE bit.
2240 	 *
2241 	 */
2242 	uint16_t adv_props;
2243 
2244 	/**
2245 	 * @brief Periodic advertising interval (N * 1.25 ms).
2246 	 *
2247 	 * If 0 there is no periodic advertising.
2248 	 */
2249 	uint16_t interval;
2250 
2251 	/** Primary advertising channel PHY. */
2252 	uint8_t primary_phy;
2253 
2254 	/** Secondary advertising channel PHY. */
2255 	uint8_t secondary_phy;
2256 };
2257 
2258 /** Listener context for (LE) scanning. */
2259 struct bt_le_scan_cb {
2260 
2261 	/**
2262 	 * @brief Advertisement packet and scan response received callback.
2263 	 *
2264 	 * @param info Advertiser packet and scan response information.
2265 	 * @param buf  Buffer containing advertiser data.
2266 	 */
2267 	void (*recv)(const struct bt_le_scan_recv_info *info,
2268 		     struct net_buf_simple *buf);
2269 
2270 	/** @brief The scanner has stopped scanning after scan timeout. */
2271 	void (*timeout)(void);
2272 
2273 	sys_snode_t node;
2274 };
2275 
2276 /**
2277  * @brief Initialize scan parameters
2278  *
2279  * @param _type     Scan Type, BT_LE_SCAN_TYPE_ACTIVE or
2280  *                  BT_LE_SCAN_TYPE_PASSIVE.
2281  * @param _options  Scan options
2282  * @param _interval Scan Interval (N * 0.625 ms)
2283  * @param _window   Scan Window (N * 0.625 ms)
2284  */
2285 #define BT_LE_SCAN_PARAM_INIT(_type, _options, _interval, _window) \
2286 { \
2287 	.type = (_type), \
2288 	.options = (_options), \
2289 	.interval = (_interval), \
2290 	.window = (_window), \
2291 	.timeout = 0, \
2292 	.interval_coded = 0, \
2293 	.window_coded = 0, \
2294 }
2295 
2296 /**
2297  * @brief Helper to declare scan parameters inline
2298  *
2299  * @param _type     Scan Type, BT_LE_SCAN_TYPE_ACTIVE or
2300  *                  BT_LE_SCAN_TYPE_PASSIVE.
2301  * @param _options  Scan options
2302  * @param _interval Scan Interval (N * 0.625 ms)
2303  * @param _window   Scan Window (N * 0.625 ms)
2304  */
2305 #define BT_LE_SCAN_PARAM(_type, _options, _interval, _window) \
2306 	((struct bt_le_scan_param[]) { \
2307 		BT_LE_SCAN_PARAM_INIT(_type, _options, _interval, _window) \
2308 	 })
2309 
2310 /**
2311  * @brief Helper macro to enable active scanning to discover new devices.
2312  */
2313 #define BT_LE_SCAN_ACTIVE BT_LE_SCAN_PARAM(BT_LE_SCAN_TYPE_ACTIVE, \
2314 					   BT_LE_SCAN_OPT_FILTER_DUPLICATE, \
2315 					   BT_GAP_SCAN_FAST_INTERVAL, \
2316 					   BT_GAP_SCAN_FAST_WINDOW)
2317 
2318 /**
2319  * @brief Helper macro to enable active scanning to discover new devices with window == interval.
2320  *
2321  * Continuous scanning should be used to maximize the chances of receiving advertising packets.
2322  */
2323 #define BT_LE_SCAN_ACTIVE_CONTINUOUS BT_LE_SCAN_PARAM(BT_LE_SCAN_TYPE_ACTIVE, \
2324 						      BT_LE_SCAN_OPT_FILTER_DUPLICATE, \
2325 						      BT_GAP_SCAN_FAST_INTERVAL_MIN, \
2326 						      BT_GAP_SCAN_FAST_WINDOW)
2327 BUILD_ASSERT(BT_GAP_SCAN_FAST_WINDOW == BT_GAP_SCAN_FAST_INTERVAL_MIN,
2328 	     "Continuous scanning is requested by setting window and interval equal.");
2329 
2330 /**
2331  * @brief Helper macro to enable passive scanning to discover new devices.
2332  *
2333  * This macro should be used if information required for device identification
2334  * (e.g., UUID) are known to be placed in Advertising Data.
2335  */
2336 #define BT_LE_SCAN_PASSIVE BT_LE_SCAN_PARAM(BT_LE_SCAN_TYPE_PASSIVE, \
2337 					    BT_LE_SCAN_OPT_FILTER_DUPLICATE, \
2338 					    BT_GAP_SCAN_FAST_INTERVAL, \
2339 					    BT_GAP_SCAN_FAST_WINDOW)
2340 
2341 /**
2342  * @brief Helper macro to enable passive scanning to discover new devices with window==interval.
2343  *
2344  * This macro should be used if information required for device identification
2345  * (e.g., UUID) are known to be placed in Advertising Data.
2346  */
2347 #define BT_LE_SCAN_PASSIVE_CONTINUOUS BT_LE_SCAN_PARAM(BT_LE_SCAN_TYPE_PASSIVE, \
2348 						       BT_LE_SCAN_OPT_FILTER_DUPLICATE, \
2349 						       BT_GAP_SCAN_FAST_INTERVAL_MIN, \
2350 						       BT_GAP_SCAN_FAST_WINDOW)
2351 BUILD_ASSERT(BT_GAP_SCAN_FAST_WINDOW == BT_GAP_SCAN_FAST_INTERVAL_MIN,
2352 	     "Continuous scanning is requested by setting window and interval equal.");
2353 
2354 /**
2355  * @brief Helper macro to enable active scanning to discover new devices.
2356  * Include scanning on Coded PHY in addition to 1M PHY.
2357  */
2358 #define BT_LE_SCAN_CODED_ACTIVE \
2359 		BT_LE_SCAN_PARAM(BT_LE_SCAN_TYPE_ACTIVE, \
2360 				 BT_LE_SCAN_OPT_CODED | \
2361 				 BT_LE_SCAN_OPT_FILTER_DUPLICATE, \
2362 				 BT_GAP_SCAN_FAST_INTERVAL, \
2363 				 BT_GAP_SCAN_FAST_WINDOW)
2364 
2365 /**
2366  * @brief Helper macro to enable passive scanning to discover new devices.
2367  * Include scanning on Coded PHY in addition to 1M PHY.
2368  *
2369  * This macro should be used if information required for device identification
2370  * (e.g., UUID) are known to be placed in Advertising Data.
2371  */
2372 #define BT_LE_SCAN_CODED_PASSIVE \
2373 		BT_LE_SCAN_PARAM(BT_LE_SCAN_TYPE_PASSIVE, \
2374 				 BT_LE_SCAN_OPT_CODED | \
2375 				 BT_LE_SCAN_OPT_FILTER_DUPLICATE, \
2376 				 BT_GAP_SCAN_FAST_INTERVAL, \
2377 				 BT_GAP_SCAN_FAST_WINDOW)
2378 
2379 /**
2380  * @brief Start (LE) scanning
2381  *
2382  * Start LE scanning with given parameters and provide results through
2383  * the specified callback.
2384  *
2385  * @note The LE scanner by default does not use the Identity Address of the
2386  *       local device when @kconfig{CONFIG_BT_PRIVACY} is disabled. This is to
2387  *       prevent the active scanner from disclosing the identity information
2388  *       when requesting additional information from advertisers.
2389  *       In order to enable directed advertiser reports then
2390  *       @kconfig{CONFIG_BT_SCAN_WITH_IDENTITY} must be enabled.
2391  *
2392  * @note Setting the `param.timeout` parameter is not supported when
2393  *       @kconfig{CONFIG_BT_PRIVACY} is enabled, when the param.type is @ref
2394  *       BT_LE_SCAN_TYPE_ACTIVE. Supplying a non-zero timeout will result in an
2395  *       -EINVAL error code.
2396  *
2397  * @param param Scan parameters.
2398  * @param cb Callback to notify scan results. May be NULL if callback
2399  *           registration through @ref bt_le_scan_cb_register is preferred.
2400  *
2401  * @return Zero on success or error code otherwise, positive in case of
2402  *         protocol error or negative (POSIX) in case of stack internal error.
2403  * @retval -EBUSY if the scanner is already being started in a different thread.
2404  */
2405 int bt_le_scan_start(const struct bt_le_scan_param *param, bt_le_scan_cb_t cb);
2406 
2407 /**
2408  * @brief Stop (LE) scanning.
2409  *
2410  * Stops ongoing LE scanning.
2411  *
2412  * @return Zero on success or error code otherwise, positive in case of
2413  *         protocol error or negative (POSIX) in case of stack internal error.
2414  */
2415 int bt_le_scan_stop(void);
2416 
2417 /**
2418  * @brief Register scanner packet callbacks.
2419  *
2420  * Adds the callback structure to the list of callback structures that monitors
2421  * scanner activity.
2422  *
2423  * This callback will be called for all scanner activity, regardless of what
2424  * API was used to start the scanner.
2425  *
2426  * @param cb Callback struct. Must point to memory that remains valid.
2427  *
2428  * @retval 0 Success.
2429  * @retval -EEXIST if @p cb was already registered.
2430  */
2431 int bt_le_scan_cb_register(struct bt_le_scan_cb *cb);
2432 
2433 /**
2434  * @brief Unregister scanner packet callbacks.
2435  *
2436  * Remove the callback structure from the list of scanner callbacks.
2437  *
2438  * @param cb Callback struct. Must point to memory that remains valid.
2439  */
2440 void bt_le_scan_cb_unregister(struct bt_le_scan_cb *cb);
2441 
2442 /**
2443  * @brief Add device (LE) to filter accept list.
2444  *
2445  * Add peer device LE address to the filter accept list.
2446  *
2447  * @note The filter accept list cannot be modified when an LE role is using
2448  * the filter accept list, i.e advertiser or scanner using a filter accept list
2449  * or automatic connecting to devices using filter accept list.
2450  *
2451  * @param addr Bluetooth LE identity address.
2452  *
2453  * @return Zero on success or error code otherwise, positive in case of
2454  *         protocol error or negative (POSIX) in case of stack internal error.
2455  */
2456 int bt_le_filter_accept_list_add(const bt_addr_le_t *addr);
2457 
2458 /**
2459  * @brief Remove device (LE) from filter accept list.
2460  *
2461  * Remove peer device LE address from the filter accept list.
2462  *
2463  * @note The filter accept list cannot be modified when an LE role is using
2464  * the filter accept list, i.e advertiser or scanner using a filter accept list
2465  * or automatic connecting to devices using filter accept list.
2466  *
2467  * @param addr Bluetooth LE identity address.
2468  *
2469  * @return Zero on success or error code otherwise, positive in case of
2470  *         protocol error or negative (POSIX) in case of stack internal error.
2471  */
2472 int bt_le_filter_accept_list_remove(const bt_addr_le_t *addr);
2473 
2474 /**
2475  * @brief Clear filter accept list.
2476  *
2477  * Clear all devices from the filter accept list.
2478  *
2479  * @note The filter accept list cannot be modified when an LE role is using
2480  * the filter accept list, i.e advertiser or scanner using a filter accept
2481  * list or automatic connecting to devices using filter accept list.
2482  *
2483  * @return Zero on success or error code otherwise, positive in case of
2484  *         protocol error or negative (POSIX) in case of stack internal error.
2485  */
2486 int bt_le_filter_accept_list_clear(void);
2487 
2488 /**
2489  * @brief Set (LE) channel map.
2490  *
2491  * @param chan_map Channel map.
2492  *
2493  * @return Zero on success or error code otherwise, positive in case of
2494  *         protocol error or negative (POSIX) in case of stack internal error.
2495  */
2496 int bt_le_set_chan_map(uint8_t chan_map[5]);
2497 
2498 /**
2499  * @brief Set the Resolvable Private Address timeout in runtime
2500  *
2501  * The new RPA timeout value will be used for the next RPA rotation
2502  * and all subsequent rotations until another override is scheduled
2503  * with this API.
2504  *
2505  * Initially, the if @kconfig{CONFIG_BT_RPA_TIMEOUT} is used as the
2506  * RPA timeout.
2507  *
2508  * This symbol is linkable if @kconfig{CONFIG_BT_RPA_TIMEOUT_DYNAMIC}
2509  * is enabled.
2510  *
2511  * @param new_rpa_timeout Resolvable Private Address timeout in seconds
2512  *
2513  * @retval 0 Success.
2514  * @retval -EINVAL RPA timeout value is invalid. Valid range is 1s - 3600s.
2515  */
2516 int bt_le_set_rpa_timeout(uint16_t new_rpa_timeout);
2517 
2518 /**
2519  * @brief Helper for parsing advertising (or EIR or OOB) data.
2520  *
2521  * A helper for parsing the basic data types used for Extended Inquiry
2522  * Response (EIR), Advertising Data (AD), and OOB data blocks. The most
2523  * common scenario is to call this helper on the advertising data
2524  * received in the callback that was given to bt_le_scan_start().
2525  *
2526  * @warning This helper function will consume `ad` when parsing. The user should
2527  *          make a copy if the original data is to be used afterwards
2528  *
2529  * @param ad        Advertising data as given to the bt_le_scan_cb_t callback.
2530  * @param func      Callback function which will be called for each element
2531  *                  that's found in the data. The callback should return
2532  *                  true to continue parsing, or false to stop parsing.
2533  * @param user_data User data to be passed to the callback.
2534  */
2535 void bt_data_parse(struct net_buf_simple *ad,
2536 		   bool (*func)(struct bt_data *data, void *user_data),
2537 		   void *user_data);
2538 
2539 /** LE Secure Connections pairing Out of Band data. */
2540 struct bt_le_oob_sc_data {
2541 	/** Random Number. */
2542 	uint8_t r[16];
2543 
2544 	/** Confirm Value. */
2545 	uint8_t c[16];
2546 };
2547 
2548 /** LE Out of Band information. */
2549 struct bt_le_oob {
2550 	/** LE address. If privacy is enabled this is a Resolvable Private
2551 	 *  Address.
2552 	 */
2553 	bt_addr_le_t addr;
2554 
2555 	/** LE Secure Connections pairing Out of Band data. */
2556 	struct bt_le_oob_sc_data le_sc_data;
2557 };
2558 
2559 /**
2560  * @brief Get local LE Out of Band (OOB) information.
2561  *
2562  * This function allows to get local information that are useful for
2563  * Out of Band pairing or connection creation.
2564  *
2565  * If privacy @kconfig{CONFIG_BT_PRIVACY} is enabled this will result in
2566  * generating new Resolvable Private Address (RPA) that is valid for
2567  * @kconfig{CONFIG_BT_RPA_TIMEOUT} seconds. This address will be used for
2568  * advertising started by @ref bt_le_adv_start, active scanning and
2569  * connection creation.
2570  *
2571  * @note If privacy is enabled the RPA cannot be refreshed in the following
2572  *       cases:
2573  *       - Creating a connection in progress, wait for the connected callback.
2574  *      In addition when extended advertising @kconfig{CONFIG_BT_EXT_ADV} is
2575  *      not enabled or not supported by the controller:
2576  *       - Advertiser is enabled using a Random Static Identity Address for a
2577  *         different local identity.
2578  *       - The local identity conflicts with the local identity used by other
2579  *         roles.
2580  *
2581  * @param[in]  id  Local identity, in most cases BT_ID_DEFAULT.
2582  * @param[out] oob LE OOB information
2583  *
2584  * @return Zero on success or error code otherwise, positive in case of
2585  *         protocol error or negative (POSIX) in case of stack internal error.
2586  */
2587 int bt_le_oob_get_local(uint8_t id, struct bt_le_oob *oob);
2588 
2589 /**
2590  * @brief Get local LE Out of Band (OOB) information.
2591  *
2592  * This function allows to get local information that are useful for
2593  * Out of Band pairing or connection creation.
2594  *
2595  * If privacy @kconfig{CONFIG_BT_PRIVACY} is enabled this will result in
2596  * generating new Resolvable Private Address (RPA) that is valid for
2597  * @kconfig{CONFIG_BT_RPA_TIMEOUT} seconds. This address will be used by the
2598  * advertising set.
2599  *
2600  * @note When generating OOB information for multiple advertising set all
2601  *       OOB information needs to be generated at the same time.
2602  *
2603  * @note If privacy is enabled the RPA cannot be refreshed in the following
2604  *       cases:
2605  *       - Creating a connection in progress, wait for the connected callback.
2606  *
2607  * @param[in]  adv The advertising set object
2608  * @param[out] oob LE OOB information
2609  *
2610  * @return Zero on success or error code otherwise, positive in case
2611  * of protocol error or negative (POSIX) in case of stack internal error.
2612  */
2613 int bt_le_ext_adv_oob_get_local(struct bt_le_ext_adv *adv,
2614 				struct bt_le_oob *oob);
2615 
2616 /**
2617  * @brief Clear pairing information.
2618  *
2619  * @param id    Local identity (mostly just BT_ID_DEFAULT).
2620  * @param addr  Remote address, NULL or BT_ADDR_LE_ANY to clear all remote
2621  *              devices.
2622  *
2623  * @return 0 on success or negative error value on failure.
2624  */
2625 int bt_unpair(uint8_t id, const bt_addr_le_t *addr);
2626 
2627 /** Information about a bond with a remote device. */
2628 struct bt_bond_info {
2629 	/** Address of the remote device. */
2630 	bt_addr_le_t addr;
2631 };
2632 
2633 /**
2634  * @brief Iterate through all existing bonds.
2635  *
2636  * @param id         Local identity (mostly just BT_ID_DEFAULT).
2637  * @param func       Function to call for each bond.
2638  * @param user_data  Data to pass to the callback function.
2639  */
2640 void bt_foreach_bond(uint8_t id, void (*func)(const struct bt_bond_info *info,
2641 					   void *user_data),
2642 		     void *user_data);
2643 
2644 /** @brief Configure vendor data path
2645  *
2646  *  Request the Controller to configure the data transport path in a given direction between
2647  *  the Controller and the Host.
2648  *
2649  *  @param dir            Direction to be configured, BT_HCI_DATAPATH_DIR_HOST_TO_CTLR or
2650  *                        BT_HCI_DATAPATH_DIR_CTLR_TO_HOST
2651  *  @param id             Vendor specific logical transport channel ID, range
2652  *                        [BT_HCI_DATAPATH_ID_VS..BT_HCI_DATAPATH_ID_VS_END]
2653  *  @param vs_config_len  Length of additional vendor specific configuration data
2654  *  @param vs_config      Pointer to additional vendor specific configuration data
2655  *
2656  *  @return 0 in case of success or negative value in case of error.
2657  */
2658 int bt_configure_data_path(uint8_t dir, uint8_t id, uint8_t vs_config_len,
2659 			   const uint8_t *vs_config);
2660 
2661 struct bt_le_per_adv_sync_subevent_params {
2662 	/** @brief Periodic Advertising Properties.
2663 	 *
2664 	 * Bit 6 is include TxPower, all others RFU.
2665 	 *
2666 	 */
2667 	uint16_t properties;
2668 
2669 	/** Number of subevents to sync to */
2670 	uint8_t num_subevents;
2671 
2672 	/** @brief The subevent(s) to synchronize with
2673 	 *
2674 	 * The array must have @ref num_subevents elements.
2675 	 *
2676 	 */
2677 	uint8_t *subevents;
2678 };
2679 
2680 /** @brief Synchronize with a subset of subevents
2681  *
2682  *  Until this command is issued, the subevent(s) the controller is synchronized
2683  *  to is unspecified.
2684  *
2685  *  @param per_adv_sync   The periodic advertising sync object.
2686  *  @param params         Parameters.
2687  *
2688  *  @return 0 in case of success or negative value in case of error.
2689  */
2690 int bt_le_per_adv_sync_subevent(struct bt_le_per_adv_sync *per_adv_sync,
2691 				struct bt_le_per_adv_sync_subevent_params *params);
2692 
2693 struct bt_le_per_adv_response_params {
2694 	/** @brief The periodic event counter of the request the response is sent to.
2695 	 *
2696 	 * @ref bt_le_per_adv_sync_recv_info
2697 	 *
2698 	 * @note The response can be sent up to one periodic interval after
2699 	 * the request was received.
2700 	 *
2701 	 */
2702 	uint16_t request_event;
2703 
2704 	/** @brief The subevent counter of the request the response is sent to.
2705 	 *
2706 	 * @ref bt_le_per_adv_sync_recv_info
2707 	 *
2708 	 */
2709 	uint8_t request_subevent;
2710 
2711 	/** The subevent the response shall be sent in */
2712 	uint8_t response_subevent;
2713 
2714 	/** The response slot the response shall be sent in */
2715 	uint8_t response_slot;
2716 };
2717 
2718 /**
2719  * @brief Set the data for a response slot in a specific subevent of the PAwR.
2720  *
2721  * This function is called by the application to set the response data.
2722  * The data for a response slot shall be transmitted only once.
2723  *
2724  * @param per_adv_sync The periodic advertising sync object.
2725  * @param params       Parameters.
2726  * @param data         The response data to send.
2727  *
2728  * @return Zero on success or (negative) error code otherwise.
2729  */
2730 int bt_le_per_adv_set_response_data(struct bt_le_per_adv_sync *per_adv_sync,
2731 				    const struct bt_le_per_adv_response_params *params,
2732 				    const struct net_buf_simple *data);
2733 
2734 /**
2735  * @}
2736  */
2737 
2738 #ifdef __cplusplus
2739 }
2740 #endif
2741 /**
2742  * @}
2743  */
2744 
2745 #endif /* ZEPHYR_INCLUDE_BLUETOOTH_BLUETOOTH_H_ */
2746