diff --git a/doc/connectivity/bluetooth/shell/audio/cap.rst b/doc/connectivity/bluetooth/shell/audio/cap.rst index f7b34930d62..d1fcf583df5 100644 --- a/doc/connectivity/bluetooth/shell/audio/cap.rst +++ b/doc/connectivity/bluetooth/shell/audio/cap.rst @@ -40,7 +40,7 @@ Setting a new SIRK This command can modify the currently used SIRK. To get the new RSI to advertise on air, :code:`bt adv-data` or :code:`bt advertise` must be called again to set the new advertising data. -If :code:`CONFIG_BT_CSIP_SET_MEMBER_NOTIFIABLE` is enabled, this will also notify connected +If :code:`CONFIG_BT_CSIP_SET_MEMBER_SIRK_NOTIFIABLE` is enabled, this will also notify connected clients. .. code-block:: console diff --git a/doc/connectivity/bluetooth/shell/audio/csip.rst b/doc/connectivity/bluetooth/shell/audio/csip.rst index 25e725fa838..27613463442 100644 --- a/doc/connectivity/bluetooth/shell/audio/csip.rst +++ b/doc/connectivity/bluetooth/shell/audio/csip.rst @@ -144,15 +144,18 @@ Using the Set Member csip_set_member --help csip_set_member - Bluetooth CSIP set member shell commands - Subcommands: - register :Initialize the service and register callbacks [size ] - [rank ] [not-lockable] [sirk ] - lock :Lock the set - release :Release the set [force] - sirk :Set the currently used SIRK - get_sirk :Get the currently used SIRK - sirk_rsp :Set the response used in SIRK requests + Subcommands: + register : Initialize the service and register callbacks [size + ] [rank ] [not-lockable] [sirk ] + lock : Lock the set + release : Release the set [force] + sirk : Set the currently used SIRK + set_size_and_rank : Set the currently used size and rank + get_info : Get service info + sirk_rsp : Set the response used in SIRK requests + + Example Usage ============= @@ -171,7 +174,7 @@ Setting a new SIRK This command can modify the currently used SIRK. To get the new RSI to advertise on air, :code:`bt adv-data` or :code:`bt advertise` must be called again to set the new advertising data. -If :code:`CONFIG_BT_CSIP_SET_MEMBER_NOTIFIABLE` is enabled, this will also notify connected +If :code:`CONFIG_BT_CSIP_SET_MEMBER_SIRK_NOTIFIABLE` is enabled, this will also notify connected clients. .. code-block:: console @@ -179,14 +182,32 @@ clients. uart:~$ csip_set_member sirk 00112233445566778899aabbccddeeff SIRK updated -Getting the current SIRK +Setting a new set size and rank +------------------------------- + +This command can modify the set size and rank of a service instance. +This shall be done for all device in the set at the same time, +and all devices shall have the same set size. +The rank will be ignored if the set is not lockable, else the rank shall be <= the set size, +and shall be unique for this device in the set. + +.. code-block:: console + + uart:~$ csip_set_member set_size_and_rank 1 1 + Set size and rank updated to 1 and 1 + +Getting the current info ------------------------ -This command can get the currently used SIRK. +This command can get the currently used set info. .. code-block:: console - uart:~$ csip_set_member get_sirk - SIRK - 36 04 9a dc 66 3a a1 a1 |6...f:.. - 1d 9a 2f 41 01 73 3e 01 |../A.s>. + uart:~$ csip_set_member get_info + Info for 0x2003b0c8 + SIRK + 00000000: 20 37 0a 00 95 c4 04 20 00 00 00 00 f1 79 09 00 | 7..... .....y..| + Set size: 2 + Rank: 1 + Lockable: true + Locked: false diff --git a/doc/releases/migration-guide-4.2.rst b/doc/releases/migration-guide-4.2.rst index 6fca3d64f5c..fdcf721d453 100644 --- a/doc/releases/migration-guide-4.2.rst +++ b/doc/releases/migration-guide-4.2.rst @@ -44,6 +44,12 @@ Device Drivers and Devicetree Bluetooth ********* +Bluetooth Audio +=============== + +* ``CONFIG_BT_CSIP_SET_MEMBER_NOTIFIABLE`` has been renamed to + :kconfig:option:`CONFIG_BT_CSIP_SET_MEMBER_SIRK_NOTIFIABLE``. (:github:`86763``) + Bluetooth Host ============== diff --git a/doc/releases/release-notes-4.2.rst b/doc/releases/release-notes-4.2.rst index 08b9bac3709..7868c5c5abd 100644 --- a/doc/releases/release-notes-4.2.rst +++ b/doc/releases/release-notes-4.2.rst @@ -63,6 +63,26 @@ New APIs and options like you need to add more details, add them in the API documentation code instead. +* Bluetooth + + * Audio + + * :c:macro:`BT_BAP_ADV_PARAM_CONN_QUICK` + * :c:macro:`BT_BAP_ADV_PARAM_CONN_REDUCED` + * :c:macro:`BT_BAP_CONN_PARAM_SHORT_7_5` + * :c:macro:`BT_BAP_CONN_PARAM_SHORT_10` + * :c:macro:`BT_BAP_CONN_PARAM_RELAXED` + * :c:macro:`BT_BAP_ADV_PARAM_BROADCAST_FAST` + * :c:macro:`BT_BAP_ADV_PARAM_BROADCAST_SLOW` + * :c:macro:`BT_BAP_PER_ADV_PARAM_BROADCAST_FAST` + * :c:macro:`BT_BAP_PER_ADV_PARAM_BROADCAST_SLOW` + * :c:func:`bt_csip_set_member_set_size_and_rank` + * :c:func:`bt_csip_set_member_get_info` + + * Host + + * :c:func:`bt_le_get_local_features` + New Boards ********** diff --git a/include/zephyr/bluetooth/audio/bap.h b/include/zephyr/bluetooth/audio/bap.h index 17e53ca6c14..0c530f93bd8 100644 --- a/include/zephyr/bluetooth/audio/bap.h +++ b/include/zephyr/bluetooth/audio/bap.h @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -50,6 +51,100 @@ extern "C" { /** An invalid Broadcast ID */ #define BT_BAP_INVALID_BROADCAST_ID 0xFFFFFFFFU +/** + * @brief Recommended connectable advertising parameters + * + * If connection has not been established after 30 seconds, the device should switch to + * @ref BT_BAP_ADV_PARAM_CONN_REDUCED + * + * Defined by Table 8.1 in BAP 1.0.2 + */ +#define BT_BAP_ADV_PARAM_CONN_QUICK \ + BT_LE_ADV_PARAM(BT_LE_ADV_OPT_CONN | BT_LE_ADV_OPT_EXT_ADV, BT_GAP_MS_TO_ADV_INTERVAL(20), \ + BT_GAP_MS_TO_ADV_INTERVAL(30), NULL) + +/** + * @brief Reduced connectable advertising parameters + * + * Defined by Table 8.1 in BAP 1.0.2 + */ +#define BT_BAP_ADV_PARAM_CONN_REDUCED \ + BT_LE_ADV_PARAM(BT_LE_ADV_OPT_CONN | BT_LE_ADV_OPT_EXT_ADV, \ + BT_GAP_MS_TO_ADV_INTERVAL(150), BT_GAP_MS_TO_ADV_INTERVAL(150), NULL) + +/** + * @brief Recommended connection parameters for initial connection request for 7.5 ms SDU interval + * + * Once service discovery has completed and a stream is setup, it is recommended to switch to + * @ref BT_BAP_CONN_PARAM_RELAXED + * + * Defined by Table 8.3 in BAP 1.0.2 + */ +#define BT_BAP_CONN_PARAM_SHORT_7_5 \ + BT_LE_CONN_PARAM(BT_GAP_US_TO_CONN_INTERVAL(7500), BT_GAP_MS_TO_CONN_INTERVAL(30), 0, \ + BT_GAP_MS_TO_CONN_TIMEOUT(4000)) + +/** + * @brief Recommended connection parameters for initial connection request for 10 ms SDU interval + * + * Once service discovery has completed and a stream is setup, it is recommended to switch to + * @ref BT_BAP_CONN_PARAM_RELAXED + * + * Defined by Table 8.3 in BAP 1.0.2 + */ +#define BT_BAP_CONN_PARAM_SHORT_10 \ + BT_LE_CONN_PARAM(BT_GAP_MS_TO_CONN_INTERVAL(10), BT_GAP_MS_TO_CONN_INTERVAL(30), 0, \ + BT_GAP_MS_TO_CONN_TIMEOUT(4000)) + +/** + * @brief Recommended connection parameters for coexistence of ACL and ISO + * + * Defined by Table 8.3 in BAP 1.0.2 + */ +#define BT_BAP_CONN_PARAM_RELAXED \ + BT_LE_CONN_PARAM(BT_GAP_MS_TO_CONN_INTERVAL(50), BT_GAP_MS_TO_CONN_INTERVAL(70), 0, \ + BT_GAP_MS_TO_CONN_TIMEOUT(4000)) + +/** + * @brief Fast advertising parameters for broadcast audio + * + * This is suitable for both 7.5 ms and 10 ms SDU intervals, but prioritizes lower time to + * synchronize over coexistence with ISO and power consumption. + */ +#define BT_BAP_ADV_PARAM_BROADCAST_FAST \ + BT_LE_ADV_PARAM(BT_LE_ADV_OPT_EXT_ADV, BT_GAP_MS_TO_ADV_INTERVAL(60), \ + BT_GAP_MS_TO_ADV_INTERVAL(60), NULL) + +/** + * @brief Slow advertising parameters for broadcast audio + * + * This is suitable for both 7.5 ms and 10 ms SDU intervals, but prioritizes coexistence with ISO + * and power consumption over lower time to synchronize. + */ +#define BT_BAP_ADV_PARAM_BROADCAST_SLOW \ + BT_LE_ADV_PARAM(BT_LE_ADV_OPT_EXT_ADV, BT_GAP_MS_TO_ADV_INTERVAL(150), \ + BT_GAP_MS_TO_ADV_INTERVAL(150), NULL) + +/** + * @brief Fast advertising parameters for broadcast audio + * + * This is suitable for both 7.5 ms and 10 ms SDU intervals, but prioritizes lower time to + * synchronize over coexistence with ISO and power consumption. + */ +#define BT_BAP_PER_ADV_PARAM_BROADCAST_FAST \ + BT_LE_PER_ADV_PARAM(BT_GAP_MS_TO_PER_ADV_INTERVAL(60), BT_GAP_MS_TO_PER_ADV_INTERVAL(60), \ + BT_LE_PER_ADV_OPT_NONE) + +/** + * @brief Slow advertising parameters for broadcast audio + * + * This is suitable for both 7.5 ms and 10 ms SDU intervals, but prioritizes coexistence with ISO + * and power consumption over lower time to synchronize. + */ +#define BT_BAP_PER_ADV_PARAM_BROADCAST_SLOW \ + BT_LE_PER_ADV_PARAM(BT_GAP_MS_TO_PER_ADV_INTERVAL(150), \ + BT_GAP_MS_TO_PER_ADV_INTERVAL(150), BT_LE_PER_ADV_OPT_NONE) + /** * @brief Check if a BAP BASS BIS_Sync bitfield is valid * diff --git a/include/zephyr/bluetooth/audio/csip.h b/include/zephyr/bluetooth/audio/csip.h index e5e059d3e68..48540c6f5ee 100644 --- a/include/zephyr/bluetooth/audio/csip.h +++ b/include/zephyr/bluetooth/audio/csip.h @@ -32,6 +32,7 @@ #include #include +#include #include #include #include @@ -237,6 +238,70 @@ int bt_csip_set_member_sirk(struct bt_csip_set_member_svc_inst *svc_inst, int bt_csip_set_member_get_sirk(struct bt_csip_set_member_svc_inst *svc_inst, uint8_t sirk[BT_CSIP_SIRK_SIZE]); +/** + * @brief Set a new size and rank for a service instance + * + * This function can be used to dynamically change the size and rank of a service instance. + * It is important to note that a set cannot have multiple devices with the same rank in a set, + * and it is up to the caller of this function to ensure that. + * Similarly, it is important that the size is updated on all devices in the set at the same time. + * + * If @kconfig{CONFIG_BT_CSIP_SET_MEMBER_SIZE_NOTIFIABLE} is enabled, this will also send a + * notification to all connected or bonded clients. + * + * @param svc_inst The service instance. + * @param size The new set size. + * @param rank The new rank. Ignored if the @p svc_inst is not lockable. + * + * @retval -EINVAL @p svc_inst is NULL, @p size is less than 1, @p rank is less than 1 or higher + * than @p size for a lockable @p svc_inst. + * @retval -EALREADY @p size and @p rank are already the provided values. + * @retval 0 Success. + */ +int bt_csip_set_member_set_size_and_rank(struct bt_csip_set_member_svc_inst *svc_inst, uint8_t size, + uint8_t rank); + +/** Struct to hold information about a service instance */ +struct bt_csip_set_member_set_info { + /** The 16-octet SIRK */ + uint8_t sirk[BT_CSIP_SIRK_SIZE]; + + /** The set size */ + uint8_t set_size; + + /** + * @brief The rank + * + * May be 0 if the set is not lockable + */ + uint8_t rank; + + /** Whether the set is lockable */ + bool lockable: 1; + + /** Whether the set is currently locked */ + bool locked: 1; + + /** + * @brief The address of the client that currently holds the lock + * + * Will be @ref BT_ADDR_LE_NONE if the server holds the lock + */ + bt_addr_le_t lock_client_addr; +}; + +/** + * @brief Get information about a service instances + * + * @param svc_inst The service instance. + * @param info Pointer to a struct to store the information in. + * + * @retval -EINVAL @p svc_inst or @p info is NULL. + * @retval 0 Success. + */ +int bt_csip_set_member_get_info(const struct bt_csip_set_member_svc_inst *svc_inst, + struct bt_csip_set_member_set_info *info); + /** * @brief Generate the Resolvable Set Identifier (RSI) value. * @@ -382,6 +447,24 @@ typedef void (*bt_csip_set_coordinator_lock_changed_cb)( typedef void (*bt_csip_set_coordinator_sirk_changed_cb)( struct bt_csip_set_coordinator_csis_inst *inst); +/** + * @typedef bt_csip_set_coordinator_size_changed_cb + * @brief Callback when the size of a set of a connected device changes. + * + * Since all devices in a set shall have the same set size value. + * Each connected device may send the same new size set in a notification, + * assuming that the remote device supports notifications of the set size. + * + * The rank of each device in the set may also change as part of this, so it is advisable to call + * bt_csip_set_coordinator_discover() to rediscover and read the characteristic values of the sets + * on each device. + * + * @param inst The Coordinated Set Identification Service instance that was changed. + * The new size is stored in the @p inst->info.size. + */ +typedef void (*bt_csip_set_coordinator_size_changed_cb)( + struct bt_conn *conn, const struct bt_csip_set_coordinator_csis_inst *inst); + /** * @typedef bt_csip_set_coordinator_ordered_access_cb_t * @brief Callback for bt_csip_set_coordinator_ordered_access() @@ -417,6 +500,8 @@ struct bt_csip_set_coordinator_cb { bt_csip_set_coordinator_lock_changed_cb lock_changed; /** Callback when a set's SIRK has changed */ bt_csip_set_coordinator_sirk_changed_cb sirk_changed; + /** Callback when a set's size has changed */ + bt_csip_set_coordinator_size_changed_cb size_changed; /** Callback for the ordered access procedure */ bt_csip_set_coordinator_ordered_access_cb_t ordered_access; diff --git a/include/zephyr/bluetooth/bluetooth.h b/include/zephyr/bluetooth/bluetooth.h index d1618f98a3a..1b7add856c7 100644 --- a/include/zephyr/bluetooth/bluetooth.h +++ b/include/zephyr/bluetooth/bluetooth.h @@ -19,6 +19,7 @@ */ #include +#include #include #include @@ -48,6 +49,13 @@ extern "C" { */ #define BT_ID_DEFAULT 0 +/** + * @brief Number of octets for local supported + * + * The value of 8 correspond to page 0 in the LE Controller supported features + */ +#define BT_LE_LOCAL_SUPPORTED_FEATURES_SIZE 8 + /** Opaque type representing an advertiser. */ struct bt_le_ext_adv; @@ -517,6 +525,78 @@ size_t bt_data_get_len(const struct bt_data data[], size_t data_count); */ size_t bt_data_serialize(const struct bt_data *input, uint8_t *output); +struct bt_le_local_features { + /** + * @brief Local LE controller supported features. + * + * Refer to BT_LE_FEAT_BIT_* for values. + * Refer to the BT_FEAT_LE_* macros for value comparionson. + * See Bluetooth Core Specification, Vol 6, Part B, Section 4.6. + */ + uint8_t features[BT_LE_LOCAL_SUPPORTED_FEATURES_SIZE]; + + /** + * @brief Local LE controller supported states + * + * Refer to BT_LE_STATES_* for values. + * See Bluetooth Core Specification 6.0, Vol 4, Part E, Section 7.8.27 + */ + uint64_t states; + + /** + * @brief ACL data packet length + * + * This represents the maximum ACL HCI Data packet which can be sent from the Host to the + * Controller. + * The Host may support L2CAP and ATT MTUs larger than this value. + * See Bluetooth Core Specification, Vol 6, Part E, Section 7.8.2. + */ + uint16_t acl_mtu; + /** Total number of ACL data packets */ + uint8_t acl_pkts; + + /** + * @brief ISO data packet length + * + * This represents the maximum ISO HCI Data packet which can be sent from the Host to the + * Controller. + * ISO SDUs above this size can be fragmented assuming that the number of + * @ref bt_le_local_features.iso_pkts support the maximum size. + */ + uint16_t iso_mtu; + /** Total number of ISO data packets */ + uint8_t iso_pkts; + + /** + * @brief Maximum size of the controller resolving list. + * + * See Bluetooth Core Specification, Vol 6, Part E, Section 7.8.41. + */ + uint8_t rl_size; + + /** + * @brief Maximum advertising data length + * + * @note The maximum advertising data length also depends on advertising type. + * + * See Bluetooth Core Specification, Vol 6, Part E, Section 7.8.57. + */ + uint16_t max_adv_data_len; +}; + +/** + * @brief Get local Bluetooth LE controller features + * + * Can only be called after bt_enable() + * + * @param local_features Local features struct to be populated with information. + * + * @retval 0 Success + * @retval -EAGAIN The information is not yet available. + * @retval -EINVAL @p local_features is NULL. + */ +int bt_le_get_local_features(struct bt_le_local_features *local_features); + /** Advertising options */ enum { /** Convenience value when no options are specified. */ diff --git a/include/zephyr/bluetooth/hci_types.h b/include/zephyr/bluetooth/hci_types.h index 1a732790077..580385b4127 100644 --- a/include/zephyr/bluetooth/hci_types.h +++ b/include/zephyr/bluetooth/hci_types.h @@ -200,12 +200,14 @@ struct bt_hci_cmd_hdr { #define BT_LE_FEAT_BIT_CHANNEL_CLASSIFICATION 39 #define BT_LE_FEAT_BIT_ADV_CODING_SEL 40 #define BT_LE_FEAT_BIT_ADV_CODING_SEL_HOST 41 - +#define BT_LE_FEAT_BIT_DECISION_ADV_FILTER 42 #define BT_LE_FEAT_BIT_PAWR_ADVERTISER 43 #define BT_LE_FEAT_BIT_PAWR_SCANNER 44 - +#define BT_LE_FEAT_BIT_UNSEG_FRAMED_MODE 45 #define BT_LE_FEAT_BIT_CHANNEL_SOUNDING 46 #define BT_LE_FEAT_BIT_CHANNEL_SOUNDING_HOST 47 +#define BT_LE_FEAT_BIT_CHANNEL_SOUNDING_TONE_QUAL_IND 48 +#define BT_LE_FEAT_BIT_LL_EXTENDED_FEAT_SET 63 #define BT_LE_FEAT_TEST(feat, n) (feat[(n) >> 3] & \ BIT((n) & 7)) diff --git a/samples/bluetooth/bap_broadcast_assistant/src/main.c b/samples/bluetooth/bap_broadcast_assistant/src/main.c index 49b630d1dbb..a0471f2ee6f 100644 --- a/samples/bluetooth/bap_broadcast_assistant/src/main.c +++ b/samples/bluetooth/bap_broadcast_assistant/src/main.c @@ -383,8 +383,7 @@ static void scan_recv_cb(const struct bt_le_scan_recv_info *info, printk("Connecting to Broadcast Sink: %s\n", sr_info.bt_name); err = bt_conn_le_create(info->addr, BT_CONN_LE_CREATE_CONN, - BT_LE_CONN_PARAM_DEFAULT, - &broadcast_sink_conn); + BT_BAP_CONN_PARAM_RELAXED, &broadcast_sink_conn); if (err != 0) { printk("Failed creating connection (err=%u)\n", err); scan_for_broadcast_sink(); diff --git a/samples/bluetooth/bap_broadcast_sink/prj.conf b/samples/bluetooth/bap_broadcast_sink/prj.conf index 69c57526703..def80a0c1ba 100644 --- a/samples/bluetooth/bap_broadcast_sink/prj.conf +++ b/samples/bluetooth/bap_broadcast_sink/prj.conf @@ -4,6 +4,12 @@ CONFIG_BT_AUDIO=y CONFIG_BT_SMP=y CONFIG_BT_PAC_SNK=y CONFIG_BT_PERIPHERAL=y +CONFIG_BT_GAP_AUTO_UPDATE_CONN_PARAMS=n +# Set preferred values based on BT_BAP_CONN_PARAM_RELAXED +CONFIG_BT_PERIPHERAL_PREF_MIN_INT=50 +CONFIG_BT_PERIPHERAL_PREF_MAX_INT=70 +CONFIG_BT_PERIPHERAL_PREF_LATENCY=0 +CONFIG_BT_PERIPHERAL_PREF_TIMEOUT=400 CONFIG_BT_OBSERVER=y CONFIG_BT_GATT_DYNAMIC_DB=y CONFIG_BT_EXT_ADV=y diff --git a/samples/bluetooth/bap_broadcast_sink/src/main.c b/samples/bluetooth/bap_broadcast_sink/src/main.c index 902670aaee5..c10c9329447 100644 --- a/samples/bluetooth/bap_broadcast_sink/src/main.c +++ b/samples/bluetooth/bap_broadcast_sink/src/main.c @@ -1395,7 +1395,7 @@ static int start_adv(void) int err; /* Create a connectable advertising set */ - err = bt_le_ext_adv_create(BT_LE_EXT_ADV_CONN, NULL, &ext_adv); + err = bt_le_ext_adv_create(BT_BAP_ADV_PARAM_CONN_REDUCED, NULL, &ext_adv); if (err != 0) { printk("Failed to create advertising set (err %d)\n", err); diff --git a/samples/bluetooth/bap_broadcast_source/src/main.c b/samples/bluetooth/bap_broadcast_source/src/main.c index 0df0773cbf8..9448f91e330 100644 --- a/samples/bluetooth/bap_broadcast_source/src/main.c +++ b/samples/bluetooth/bap_broadcast_source/src/main.c @@ -29,20 +29,6 @@ BUILD_ASSERT(strlen(CONFIG_BROADCAST_CODE) <= BT_ISO_BROADCAST_CODE_SIZE, "Invalid broadcast code"); -/* Zephyr Controller works best while Extended Advertising interval to be a multiple - * of the ISO Interval minus 10 ms (max. advertising random delay). This is - * required to place the AUX_ADV_IND PDUs in a non-overlapping interval with the - * Broadcast ISO radio events. - * - * I.e. for a 7.5 ms ISO interval use 90 ms minus 10 ms ==> 80 ms advertising - * interval. - * And, for 10 ms ISO interval, can use 90 ms minus 10 ms ==> 80 ms advertising - * interval. - */ -#define BT_LE_EXT_ADV_CUSTOM \ - BT_LE_ADV_PARAM(BT_LE_ADV_OPT_EXT_ADV, BT_GAP_MS_TO_ADV_INTERVAL(80), \ - BT_GAP_MS_TO_ADV_INTERVAL(80), NULL) - /* When BROADCAST_ENQUEUE_COUNT > 1 we can enqueue enough buffers to ensure that * the controller is never idle */ @@ -517,14 +503,14 @@ int main(void) uint32_t broadcast_id; /* Create a connectable advertising set */ - err = bt_le_ext_adv_create(BT_LE_EXT_ADV_CUSTOM, NULL, &adv); + err = bt_le_ext_adv_create(BT_BAP_ADV_PARAM_BROADCAST_FAST, NULL, &adv); if (err != 0) { printk("Unable to create extended advertising set: %d\n", err); return 0; } /* Set periodic advertising parameters */ - err = bt_le_per_adv_set_param(adv, BT_LE_PER_ADV_DEFAULT); + err = bt_le_per_adv_set_param(adv, BT_BAP_PER_ADV_PARAM_BROADCAST_FAST); if (err) { printk("Failed to set periodic advertising parameters (err %d)\n", err); return 0; diff --git a/samples/bluetooth/bap_unicast_client/src/main.c b/samples/bluetooth/bap_unicast_client/src/main.c index 082b9fe7d52..fdc0ed249ff 100644 --- a/samples/bluetooth/bap_unicast_client/src/main.c +++ b/samples/bluetooth/bap_unicast_client/src/main.c @@ -162,8 +162,7 @@ static bool check_audio_support_and_connect(struct bt_data *data, printk("Audio server found with type %u, contexts 0x%08x and meta_len %u; connecting\n", announcement_type, audio_contexts, meta_len); - err = bt_conn_le_create(addr, BT_CONN_LE_CREATE_CONN, - BT_LE_CONN_PARAM_DEFAULT, + err = bt_conn_le_create(addr, BT_CONN_LE_CREATE_CONN, BT_BAP_CONN_PARAM_RELAXED, &default_conn); if (err != 0) { printk("Create conn to failed (%u)\n", err); diff --git a/samples/bluetooth/bap_unicast_server/prj.conf b/samples/bluetooth/bap_unicast_server/prj.conf index a102747bf04..103858af574 100644 --- a/samples/bluetooth/bap_unicast_server/prj.conf +++ b/samples/bluetooth/bap_unicast_server/prj.conf @@ -2,6 +2,12 @@ CONFIG_BT=y CONFIG_LOG=y CONFIG_BT_SMP=y CONFIG_BT_PERIPHERAL=y +CONFIG_BT_GAP_AUTO_UPDATE_CONN_PARAMS=n +# Set preferred values based on BT_BAP_CONN_PARAM_RELAXED +CONFIG_BT_PERIPHERAL_PREF_MIN_INT=50 +CONFIG_BT_PERIPHERAL_PREF_MAX_INT=70 +CONFIG_BT_PERIPHERAL_PREF_LATENCY=0 +CONFIG_BT_PERIPHERAL_PREF_TIMEOUT=400 CONFIG_BT_ISO_PERIPHERAL=y CONFIG_BT_AUDIO=y CONFIG_BT_GATT_DYNAMIC_DB=y diff --git a/samples/bluetooth/bap_unicast_server/src/main.c b/samples/bluetooth/bap_unicast_server/src/main.c index af31df408a1..c3e310b35d8 100644 --- a/samples/bluetooth/bap_unicast_server/src/main.c +++ b/samples/bluetooth/bap_unicast_server/src/main.c @@ -765,7 +765,7 @@ int main(void) } /* Create a connectable advertising set */ - err = bt_le_ext_adv_create(BT_LE_EXT_ADV_CONN, NULL, &adv); + err = bt_le_ext_adv_create(BT_BAP_ADV_PARAM_CONN_QUICK, NULL, &adv); if (err) { printk("Failed to create advertising set (err %d)\n", err); return 0; diff --git a/samples/bluetooth/cap_acceptor/prj.conf b/samples/bluetooth/cap_acceptor/prj.conf index 816ed1dcc9a..b2f6b49d671 100644 --- a/samples/bluetooth/cap_acceptor/prj.conf +++ b/samples/bluetooth/cap_acceptor/prj.conf @@ -1,6 +1,12 @@ CONFIG_BT=y CONFIG_LOG=y CONFIG_BT_PERIPHERAL=y +CONFIG_BT_GAP_AUTO_UPDATE_CONN_PARAMS=n +# Set preferred values based on BT_BAP_CONN_PARAM_RELAXED +CONFIG_BT_PERIPHERAL_PREF_MIN_INT=50 +CONFIG_BT_PERIPHERAL_PREF_MAX_INT=70 +CONFIG_BT_PERIPHERAL_PREF_LATENCY=0 +CONFIG_BT_PERIPHERAL_PREF_TIMEOUT=400 CONFIG_BT_GATT_DYNAMIC_DB=y CONFIG_BT_GATT_CLIENT=y CONFIG_BT_EXT_ADV=y diff --git a/samples/bluetooth/cap_acceptor/src/main.c b/samples/bluetooth/cap_acceptor/src/main.c index 37ba41d32ec..c7652551c01 100644 --- a/samples/bluetooth/cap_acceptor/src/main.c +++ b/samples/bluetooth/cap_acceptor/src/main.c @@ -12,6 +12,7 @@ #include #include +#include #include #include #include @@ -104,7 +105,7 @@ static int advertise(void) { int err; - err = bt_le_ext_adv_create(BT_LE_EXT_ADV_CONN, NULL, &adv); + err = bt_le_ext_adv_create(BT_BAP_ADV_PARAM_CONN_QUICK, NULL, &adv); if (err) { LOG_ERR("Failed to create advertising set: %d", err); diff --git a/samples/bluetooth/cap_initiator/src/cap_initiator_broadcast.c b/samples/bluetooth/cap_initiator/src/cap_initiator_broadcast.c index d55f0f6c3b7..f6c9d81f9dc 100644 --- a/samples/bluetooth/cap_initiator/src/cap_initiator_broadcast.c +++ b/samples/bluetooth/cap_initiator/src/cap_initiator_broadcast.c @@ -72,16 +72,14 @@ static int setup_extended_adv(struct bt_le_ext_adv **adv) int err; /* Create a non-connectable non-scannable advertising set */ - err = bt_le_ext_adv_create(BT_LE_EXT_ADV_NCONN, NULL, adv); + err = bt_le_ext_adv_create(BT_BAP_ADV_PARAM_BROADCAST_FAST, NULL, adv); if (err != 0) { LOG_ERR("Unable to create extended advertising set: %d", err); return err; } /* Set periodic advertising parameters */ - err = bt_le_per_adv_set_param(*adv, BT_LE_PER_ADV_PARAM(BT_GAP_PER_ADV_FAST_INT_MIN_2, - BT_GAP_PER_ADV_FAST_INT_MAX_2, - BT_LE_PER_ADV_OPT_NONE)); + err = bt_le_per_adv_set_param(*adv, BT_BAP_PER_ADV_PARAM_BROADCAST_FAST); if (err != 0) { LOG_ERR("Failed to set periodic advertising parameters: %d", err); return err; diff --git a/samples/bluetooth/cap_initiator/src/cap_initiator_unicast.c b/samples/bluetooth/cap_initiator/src/cap_initiator_unicast.c index 25dba8cc16d..df45dfcadaa 100644 --- a/samples/bluetooth/cap_initiator/src/cap_initiator_unicast.c +++ b/samples/bluetooth/cap_initiator/src/cap_initiator_unicast.c @@ -599,7 +599,8 @@ static bool check_audio_support_and_connect_cb(struct bt_data *data, void *user_ return false; } - err = bt_conn_le_create(addr, BT_CONN_LE_CREATE_CONN, BT_LE_CONN_PARAM_DEFAULT, &peer.conn); + err = bt_conn_le_create(addr, BT_CONN_LE_CREATE_CONN, BT_BAP_CONN_PARAM_RELAXED, + &peer.conn); if (err != 0) { LOG_WRN("Create conn to failed: %d, restarting scan", err); start_scan(); diff --git a/samples/bluetooth/hap_ha/prj.conf b/samples/bluetooth/hap_ha/prj.conf index 8260f2cb12a..964280e8d94 100644 --- a/samples/bluetooth/hap_ha/prj.conf +++ b/samples/bluetooth/hap_ha/prj.conf @@ -1,5 +1,11 @@ CONFIG_BT=y CONFIG_BT_PERIPHERAL=y +CONFIG_BT_GAP_AUTO_UPDATE_CONN_PARAMS=n +# Set preferred values based on BT_BAP_CONN_PARAM_RELAXED +CONFIG_BT_PERIPHERAL_PREF_MIN_INT=50 +CONFIG_BT_PERIPHERAL_PREF_MAX_INT=70 +CONFIG_BT_PERIPHERAL_PREF_LATENCY=0 +CONFIG_BT_PERIPHERAL_PREF_TIMEOUT=400 CONFIG_BT_ISO_PERIPHERAL=y CONFIG_BT_PRIVACY=y CONFIG_BT_GATT_DYNAMIC_DB=y diff --git a/samples/bluetooth/hap_ha/src/main.c b/samples/bluetooth/hap_ha/src/main.c index 586ed600469..04c865b984d 100644 --- a/samples/bluetooth/hap_ha/src/main.c +++ b/samples/bluetooth/hap_ha/src/main.c @@ -101,7 +101,7 @@ static void adv_work_handler(struct k_work *work) if (ext_adv == NULL) { /* Create a connectable advertising set */ - err = bt_le_ext_adv_create(BT_LE_EXT_ADV_CONN, &adv_cb, &ext_adv); + err = bt_le_ext_adv_create(BT_BAP_ADV_PARAM_CONN_QUICK, &adv_cb, &ext_adv); if (err) { printk("Failed to create advertising set (err %d)\n", err); } diff --git a/samples/bluetooth/pbp_public_broadcast_source/src/main.c b/samples/bluetooth/pbp_public_broadcast_source/src/main.c index 364adf0454f..00e12d95b9d 100644 --- a/samples/bluetooth/pbp_public_broadcast_source/src/main.c +++ b/samples/bluetooth/pbp_public_broadcast_source/src/main.c @@ -149,7 +149,7 @@ static int setup_extended_adv(struct bt_le_ext_adv **adv) int err; /* Create a non-connectable advertising set */ - err = bt_le_ext_adv_create(BT_LE_EXT_ADV_NCONN, NULL, adv); + err = bt_le_ext_adv_create(BT_BAP_ADV_PARAM_BROADCAST_FAST, NULL, adv); if (err != 0) { printk("Unable to create extended advertising set: %d\n", err); @@ -165,7 +165,7 @@ static int setup_extended_adv(struct bt_le_ext_adv **adv) } /* Set periodic advertising parameters */ - err = bt_le_per_adv_set_param(*adv, BT_LE_PER_ADV_DEFAULT); + err = bt_le_per_adv_set_param(*adv, BT_BAP_PER_ADV_PARAM_BROADCAST_FAST); if (err) { printk("Failed to set periodic advertising parameters: %d\n", err); diff --git a/samples/bluetooth/tmap_bms/src/cap_initiator.c b/samples/bluetooth/tmap_bms/src/cap_initiator.c index 5ea8f88475b..b7553d7d652 100644 --- a/samples/bluetooth/tmap_bms/src/cap_initiator.c +++ b/samples/bluetooth/tmap_bms/src/cap_initiator.c @@ -136,7 +136,7 @@ static int setup_extended_adv(struct bt_le_ext_adv **adv) int err; /* Create a non-connectable advertising set */ - err = bt_le_ext_adv_create(BT_LE_EXT_ADV_NCONN, NULL, adv); + err = bt_le_ext_adv_create(BT_BAP_ADV_PARAM_BROADCAST_FAST, NULL, adv); if (err != 0) { printk("Unable to create extended advertising set: %d\n", err); return err; @@ -150,7 +150,7 @@ static int setup_extended_adv(struct bt_le_ext_adv **adv) } /* Set periodic advertising parameters */ - err = bt_le_per_adv_set_param(*adv, BT_LE_PER_ADV_DEFAULT); + err = bt_le_per_adv_set_param(*adv, BT_BAP_PER_ADV_PARAM_BROADCAST_FAST); if (err) { printk("Failed to set periodic advertising parameters: %d\n", err); diff --git a/samples/bluetooth/tmap_central/src/main.c b/samples/bluetooth/tmap_central/src/main.c index 4c47e232bc0..a4f426f9276 100644 --- a/samples/bluetooth/tmap_central/src/main.c +++ b/samples/bluetooth/tmap_central/src/main.c @@ -188,8 +188,7 @@ static bool check_audio_support_and_connect(struct bt_data *data, void *user_dat return false; } - err = bt_conn_le_create(addr, BT_CONN_LE_CREATE_CONN, - BT_LE_CONN_PARAM_DEFAULT, + err = bt_conn_le_create(addr, BT_CONN_LE_CREATE_CONN, BT_BAP_CONN_PARAM_RELAXED, &default_conn); if (err != 0) { printk("Create conn to failed (%u)\n", err); diff --git a/samples/bluetooth/tmap_peripheral/prj.conf b/samples/bluetooth/tmap_peripheral/prj.conf index cf40172576a..837e3d4807f 100644 --- a/samples/bluetooth/tmap_peripheral/prj.conf +++ b/samples/bluetooth/tmap_peripheral/prj.conf @@ -1,6 +1,12 @@ CONFIG_BT=y CONFIG_LOG=y CONFIG_BT_PERIPHERAL=y +CONFIG_BT_GAP_AUTO_UPDATE_CONN_PARAMS=n +# Set preferred values based on BT_BAP_CONN_PARAM_RELAXED +CONFIG_BT_PERIPHERAL_PREF_MIN_INT=50 +CONFIG_BT_PERIPHERAL_PREF_MAX_INT=70 +CONFIG_BT_PERIPHERAL_PREF_LATENCY=0 +CONFIG_BT_PERIPHERAL_PREF_TIMEOUT=400 CONFIG_BT_ISO_PERIPHERAL=y CONFIG_BT_GATT_CLIENT=y CONFIG_BT_GATT_AUTO_DISCOVER_CCC=y diff --git a/samples/bluetooth/tmap_peripheral/src/main.c b/samples/bluetooth/tmap_peripheral/src/main.c index 30a1855493f..f26d65767f9 100644 --- a/samples/bluetooth/tmap_peripheral/src/main.c +++ b/samples/bluetooth/tmap_peripheral/src/main.c @@ -252,7 +252,7 @@ int main(void) } printk("BAP initialized\n"); - err = bt_le_ext_adv_create(BT_LE_EXT_ADV_CONN, &adv_cb, &adv); + err = bt_le_ext_adv_create(BT_BAP_ADV_PARAM_CONN_QUICK, &adv_cb, &adv); if (err) { printk("Failed to create advertising set (err %d)\n", err); return err; diff --git a/subsys/bluetooth/audio/Kconfig.csip b/subsys/bluetooth/audio/Kconfig.csip index 7ca25770c0f..b0a09606bcf 100644 --- a/subsys/bluetooth/audio/Kconfig.csip +++ b/subsys/bluetooth/audio/Kconfig.csip @@ -46,11 +46,16 @@ config BT_CSIP_SET_MEMBER_MAX_INSTANCE_COUNT Enabling BT_CAP_ACCEPTOR_SET_MEMBER will take one of the allocated instances. -config BT_CSIP_SET_MEMBER_NOTIFIABLE +config BT_CSIP_SET_MEMBER_SIRK_NOTIFIABLE bool "SIRK notifiable Support" help This option enables support for clients to be notified on SIRK changes. +config BT_CSIP_SET_MEMBER_SIZE_NOTIFIABLE + bool "Set Size notifiable support" + help + This option enables support for clients to be notified on Set Size changes. + endif # BT_CSIP_SET_MEMBER #################### Coordinated Set Identification Client #################### diff --git a/subsys/bluetooth/audio/csip_set_coordinator.c b/subsys/bluetooth/audio/csip_set_coordinator.c index a56ee7d5456..e5f29b9526c 100644 --- a/subsys/bluetooth/audio/csip_set_coordinator.c +++ b/subsys/bluetooth/audio/csip_set_coordinator.c @@ -317,6 +317,17 @@ static void sirk_changed(struct bt_csip_set_coordinator_csis_inst *inst) } } +static void size_changed(struct bt_conn *conn, struct bt_csip_set_coordinator_csis_inst *inst) +{ + struct bt_csip_set_coordinator_cb *listener; + + SYS_SLIST_FOR_EACH_CONTAINER(&csip_set_coordinator_cbs, listener, _node) { + if (listener->size_changed != NULL) { + listener->size_changed(conn, inst); + } + } +} + static void release_set_complete(int err) { struct bt_csip_set_coordinator_cb *listener; @@ -473,17 +484,19 @@ static uint8_t size_notify_func(struct bt_conn *conn, if (svc_inst != NULL) { if (length == sizeof(set_size)) { - struct bt_csip_set_coordinator_inst *client; struct bt_csip_set_coordinator_set_info *set_info; + struct bt_csip_set_coordinator_csis_inst *inst; + struct bt_csip_set_coordinator_inst *client; client = &client_insts[bt_conn_index(conn)]; - set_info = &client->set_member.insts[svc_inst->idx].info; + inst = &client->set_member.insts[svc_inst->idx]; + set_info = &inst->info; (void)memcpy(&set_size, data, length); LOG_DBG("Set size updated from %u to %u", set_info->set_size, set_size); set_info->set_size = set_size; - /* TODO: Notify app */ + size_changed(conn, inst); } else { LOG_DBG("Invalid length %u", length); } diff --git a/subsys/bluetooth/audio/csip_set_member.c b/subsys/bluetooth/audio/csip_set_member.c index f3e91beb8a5..d86d54c2d63 100644 --- a/subsys/bluetooth/audio/csip_set_member.c +++ b/subsys/bluetooth/audio/csip_set_member.c @@ -57,6 +57,7 @@ enum csip_flag { FLAG_ACTIVE, FLAG_NOTIFY_LOCK, FLAG_NOTIFY_SIRK, + FLAG_NOTIFY_SIZE, FLAG_NUM, }; @@ -72,6 +73,7 @@ struct bt_csip_set_member_svc_inst { uint8_t set_size; uint8_t set_lock; uint8_t rank; + bool lockable; struct bt_csip_set_member_cb *cb; struct k_work_delayable set_lock_timer; bt_addr_le_t lock_client_addr; @@ -80,7 +82,6 @@ struct bt_csip_set_member_svc_inst { }; static struct bt_csip_set_member_svc_inst svc_insts[CONFIG_BT_CSIP_SET_MEMBER_MAX_INSTANCE_COUNT]; -static bt_addr_le_t server_dummy_addr; /* 0'ed address */ static void deferred_nfy_work_handler(struct k_work *work); @@ -93,8 +94,7 @@ static bool is_last_client_to_write(const struct bt_csip_set_member_svc_inst *sv return bt_addr_le_eq(bt_conn_get_dst(conn), &svc_inst->lock_client_addr); } else { - return bt_addr_le_eq(&server_dummy_addr, - &svc_inst->lock_client_addr); + return bt_addr_le_eq(BT_ADDR_LE_NONE, &svc_inst->lock_client_addr); } } @@ -291,12 +291,12 @@ static ssize_t read_sirk(struct bt_conn *conn, const struct bt_gatt_attr *attr, sirk, sizeof(*sirk)); } -#if defined(CONFIG_BT_CSIP_SET_MEMBER_NOTIFIABLE) +#if defined(CONFIG_BT_CSIP_SET_MEMBER_SIRK_NOTIFIABLE) static void sirk_cfg_changed(const struct bt_gatt_attr *attr, uint16_t value) { LOG_DBG("value 0x%04x", value); } -#endif /* CONFIG_BT_CSIP_SET_MEMBER_NOTIFIABLE */ +#endif /* CONFIG_BT_CSIP_SET_MEMBER_SIRK_NOTIFIABLE */ static ssize_t read_set_size(struct bt_conn *conn, const struct bt_gatt_attr *attr, @@ -311,11 +311,13 @@ static ssize_t read_set_size(struct bt_conn *conn, sizeof(svc_inst->set_size)); } +#if defined(CONFIG_BT_CSIP_SET_MEMBER_SIZE_NOTIFIABLE) static void set_size_cfg_changed(const struct bt_gatt_attr *attr, uint16_t value) { LOG_DBG("value 0x%04x", value); } +#endif /* CONFIG_BT_CSIP_SET_MEMBER_SIZE_NOTIFIABLE */ static ssize_t read_set_lock(struct bt_conn *conn, const struct bt_gatt_attr *attr, @@ -373,8 +375,7 @@ static uint8_t set_lock(struct bt_conn *conn, (void)k_work_reschedule(&svc_inst->set_lock_timer, CSIP_SET_LOCK_TIMER_VALUE); } else { - (void)memset(&svc_inst->lock_client_addr, 0, - sizeof(svc_inst->lock_client_addr)); + bt_addr_le_copy(&svc_inst->lock_client_addr, BT_ADDR_LE_NONE); (void)k_work_cancel_delayable(&svc_inst->set_lock_timer); } @@ -495,8 +496,7 @@ static void handle_csip_disconnect(struct bt_csip_set_member_svc_inst *svc_inst, { LOG_DBG("Non-bonded device"); if (is_last_client_to_write(svc_inst, conn)) { - (void)memset(&svc_inst->lock_client_addr, 0, - sizeof(svc_inst->lock_client_addr)); + bt_addr_le_copy(&svc_inst->lock_client_addr, BT_ADDR_LE_NONE); svc_inst->set_lock = BT_CSIP_RELEASE_VALUE; notify_clients(svc_inst, NULL, FLAG_NOTIFY_LOCK); @@ -620,7 +620,7 @@ static struct bt_conn_auth_info_cb auth_callbacks = { .bond_deleted = csip_bond_deleted }; -#if defined(CONFIG_BT_CSIP_SET_MEMBER_NOTIFIABLE) +#if defined(CONFIG_BT_CSIP_SET_MEMBER_SIRK_NOTIFIABLE) #define BT_CSIS_CHR_SIRK(_csip) \ BT_AUDIO_CHRC(BT_UUID_CSIS_SIRK, BT_GATT_CHRC_READ | BT_GATT_CHRC_NOTIFY, \ BT_GATT_PERM_READ_ENCRYPT, read_sirk, NULL, &_csip), \ @@ -629,16 +629,23 @@ static struct bt_conn_auth_info_cb auth_callbacks = { #define BT_CSIS_CHR_SIRK(_csip) \ BT_AUDIO_CHRC(BT_UUID_CSIS_SIRK, BT_GATT_CHRC_READ, BT_GATT_PERM_READ_ENCRYPT, read_sirk, \ NULL, &_csip) -#endif /* CONFIG_BT_CSIP_SET_MEMBER_NOTIFIABLE */ +#endif /* CONFIG_BT_CSIP_SET_MEMBER_SIRK_NOTIFIABLE */ + +#if defined(CONFIG_BT_CSIP_SET_MEMBER_SIZE_NOTIFIABLE) +#define BT_CSIS_CHR_SIZE(_csip) \ + BT_AUDIO_CHRC(BT_UUID_CSIS_SET_SIZE, BT_GATT_CHRC_READ | BT_GATT_CHRC_NOTIFY, \ + BT_GATT_PERM_READ_ENCRYPT, read_set_size, NULL, &_csip), \ + BT_AUDIO_CCC(set_size_cfg_changed) +#else +#define BT_CSIS_CHR_SIZE(_csip) \ + BT_AUDIO_CHRC(BT_UUID_CSIS_SET_SIZE, BT_GATT_CHRC_READ, BT_GATT_PERM_READ_ENCRYPT, \ + read_set_size, NULL, &_csip) +#endif /* CONFIG_BT_CSIP_SET_MEMBER_SIZE_NOTIFIABLE */ #define BT_CSIP_SERVICE_DEFINITION(_csip) {\ BT_GATT_PRIMARY_SERVICE(BT_UUID_CSIS), \ BT_CSIS_CHR_SIRK(_csip), \ - BT_AUDIO_CHRC(BT_UUID_CSIS_SET_SIZE, \ - BT_GATT_CHRC_READ | BT_GATT_CHRC_NOTIFY, \ - BT_GATT_PERM_READ_ENCRYPT, \ - read_set_size, NULL, &_csip), \ - BT_AUDIO_CCC(set_size_cfg_changed), \ + BT_CSIS_CHR_SIZE(_csip), \ BT_AUDIO_CHRC(BT_UUID_CSIS_SET_LOCK, \ BT_GATT_CHRC_READ | BT_GATT_CHRC_NOTIFY | BT_GATT_CHRC_WRITE, \ BT_GATT_PERM_READ_ENCRYPT | BT_GATT_PERM_WRITE_ENCRYPT, \ @@ -775,11 +782,17 @@ static void notify_cb(struct bt_conn *conn, void *data) sizeof(svc_inst->set_lock)); } - if (IS_ENABLED(CONFIG_BT_CSIP_SET_MEMBER_NOTIFIABLE) && + if (IS_ENABLED(CONFIG_BT_CSIP_SET_MEMBER_SIRK_NOTIFIABLE) && atomic_test_and_clear_bit(client->flags, FLAG_NOTIFY_SIRK)) { notify(svc_inst, conn, BT_UUID_CSIS_SIRK, &svc_inst->sirk, sizeof(svc_inst->sirk)); } + + if (IS_ENABLED(CONFIG_BT_CSIP_SET_MEMBER_SIZE_NOTIFIABLE) && + atomic_test_and_clear_bit(client->flags, FLAG_NOTIFY_SIZE)) { + notify(svc_inst, conn, BT_UUID_CSIS_SET_SIZE, &svc_inst->set_size, + sizeof(svc_inst->set_size)); + } } } @@ -877,6 +890,8 @@ int bt_csip_set_member_register(const struct bt_csip_set_member_register_param * inst->set_lock = BT_CSIP_RELEASE_VALUE; inst->sirk.type = BT_CSIP_SIRK_TYPE_PLAIN; inst->cb = param->cb; + inst->lockable = param->lockable; + bt_addr_le_copy(&inst->lock_client_addr, BT_ADDR_LE_NONE); if (IS_ENABLED(CONFIG_BT_CSIP_SET_MEMBER_TEST_SAMPLE_DATA)) { uint8_t test_sirk[] = { @@ -928,9 +943,13 @@ int bt_csip_set_member_sirk(struct bt_csip_set_member_svc_inst *svc_inst, return -EINVAL; } - memcpy(svc_inst->sirk.value, sirk, BT_CSIP_SIRK_SIZE); + if (memcmp(sirk, svc_inst->sirk.value, BT_CSIP_SIRK_SIZE) != 0) { + memcpy(svc_inst->sirk.value, sirk, BT_CSIP_SIRK_SIZE); - notify_clients(svc_inst, NULL, FLAG_NOTIFY_SIRK); + if (IS_ENABLED(CONFIG_BT_CSIP_SET_MEMBER_SIRK_NOTIFIABLE)) { + notify_clients(svc_inst, NULL, FLAG_NOTIFY_SIRK); + } + } return 0; } @@ -953,6 +972,67 @@ int bt_csip_set_member_get_sirk(struct bt_csip_set_member_svc_inst *svc_inst, return 0; } +int bt_csip_set_member_set_size_and_rank(struct bt_csip_set_member_svc_inst *svc_inst, uint8_t size, + uint8_t rank) +{ + if (svc_inst == NULL) { + LOG_DBG("svc_inst is NULL"); + return -EINVAL; + } + + if (size < 1U) { + LOG_DBG("Invalid set size %u", size); + return -EINVAL; + } + + if (!svc_inst->lockable && rank != 0U) { + LOG_DBG("Invalid rank %u for non-lockable service", rank); + return -EINVAL; + } + + if (svc_inst->lockable && !IN_RANGE(rank, 1U, size)) { + LOG_DBG("Invalid rank: %u for size %u", rank, size); + return -EINVAL; + } + + if (svc_inst->set_size == size && svc_inst->rank == rank) { + LOG_DBG("Set size %u and rank %u is already set", size, rank); + return -EALREADY; + } + + svc_inst->set_size = size; + svc_inst->rank = svc_inst->lockable ? rank : 0U; + + if (IS_ENABLED(CONFIG_BT_CSIP_SET_MEMBER_SIZE_NOTIFIABLE)) { + notify_clients(svc_inst, NULL, FLAG_NOTIFY_SIZE); + } + + return 0; +} + +int bt_csip_set_member_get_info(const struct bt_csip_set_member_svc_inst *svc_inst, + struct bt_csip_set_member_set_info *info) +{ + if (svc_inst == NULL) { + LOG_DBG("svc_inst is NULL"); + return -EINVAL; + } + + if (info == NULL) { + LOG_DBG("info is NULL"); + return -EINVAL; + } + + info->lockable = svc_inst->lockable; + info->locked = svc_inst->set_lock == BT_CSIP_LOCK_VALUE; + info->rank = svc_inst->rank; + info->set_size = svc_inst->set_size; + memcpy(info->sirk, svc_inst->sirk.value, BT_CSIP_SIRK_SIZE); + bt_addr_le_copy(&info->lock_client_addr, &svc_inst->lock_client_addr); + + return 0; +} + int bt_csip_set_member_lock(struct bt_csip_set_member_svc_inst *svc_inst, bool lock, bool force) { diff --git a/subsys/bluetooth/audio/shell/csip_set_coordinator.c b/subsys/bluetooth/audio/shell/csip_set_coordinator.c index 45928934254..995fb7dfe83 100644 --- a/subsys/bluetooth/audio/shell/csip_set_coordinator.c +++ b/subsys/bluetooth/audio/shell/csip_set_coordinator.c @@ -152,11 +152,33 @@ static void csip_set_coordinator_ordered_access_cb( } } +static void csip_set_coordinator_lock_changed_cb(struct bt_csip_set_coordinator_csis_inst *inst, + bool locked) +{ + bt_shell_print("Inst %p %s\n", inst, locked ? "locked" : "released"); +} + +static void csip_set_coordinator_sirk_changed_cb(struct bt_csip_set_coordinator_csis_inst *inst) +{ + bt_shell_print("Inst %p SIRK changed\n", inst); + bt_shell_hexdump(inst->info.sirk, BT_CSIP_SIRK_SIZE); +} + +static void +csip_set_coordinator_size_changed_cb(struct bt_conn *conn, + const struct bt_csip_set_coordinator_csis_inst *inst) +{ + bt_shell_print("Inst %p size changed: %u\n", inst, inst->info.set_size); +} + static struct bt_csip_set_coordinator_cb cbs = { .lock_set = csip_set_coordinator_lock_set_cb, .release_set = csip_set_coordinator_release_set_cb, .discover = csip_discover_cb, - .ordered_access = csip_set_coordinator_ordered_access_cb + .ordered_access = csip_set_coordinator_ordered_access_cb, + .lock_changed = csip_set_coordinator_lock_changed_cb, + .sirk_changed = csip_set_coordinator_sirk_changed_cb, + .size_changed = csip_set_coordinator_size_changed_cb, }; static bool csip_set_coordinator_oap_cb(const struct bt_csip_set_coordinator_set_info *set_info, diff --git a/subsys/bluetooth/audio/shell/csip_set_member.c b/subsys/bluetooth/audio/shell/csip_set_member.c index 246483513a9..4c2870599a5 100644 --- a/subsys/bluetooth/audio/shell/csip_set_member.c +++ b/subsys/bluetooth/audio/shell/csip_set_member.c @@ -199,8 +199,65 @@ static int cmd_csip_set_member_sirk(const struct shell *sh, size_t argc, char *a return 0; } -static int cmd_csip_set_member_get_sirk(const struct shell *sh, size_t argc, char *argv[]) +static int cmd_csip_set_member_set_size_and_rank(const struct shell *sh, size_t argc, char *argv[]) { + struct bt_csip_set_member_set_info info; + unsigned long set_size; + unsigned long rank; + int err = 0; + + if (svc_inst == NULL) { + shell_error(sh, "CSIP set member not registered yet"); + + return -ENOEXEC; + } + + set_size = shell_strtoul(argv[1], 0, &err); + if (err != 0) { + shell_error(sh, "Could not parse set size from %s: %d", argv[1], err); + + return -ENOEXEC; + } + + rank = shell_strtoul(argv[2], 0, &err); + if (err != 0) { + shell_error(sh, "Could not parse rank from %s: %d", argv[2], err); + + return -ENOEXEC; + } + + err = bt_csip_set_member_get_info(svc_inst, &info); + if (err != 0) { + shell_error(sh, "Failed to get SIRK: %d", err); + return -ENOEXEC; + } + + if (!IN_RANGE(set_size, 1, UINT8_MAX)) { + shell_error(sh, "Invalid set size: %lu", set_size); + + return -ENOEXEC; + } + + if (info.lockable && !IN_RANGE(rank, 1, rank)) { + shell_error(sh, "Invalid rank: %lu", rank); + + return -ENOEXEC; + } + + err = bt_csip_set_member_set_size_and_rank(svc_inst, (uint8_t)set_size, (uint8_t)rank); + if (err != 0) { + shell_error(sh, "Failed to set set size and rank: %d", err); + return -ENOEXEC; + } + + shell_print(sh, "Set size and rank updated to %lu and %lu", set_size, rank); + + return 0; +} + +static int cmd_csip_set_member_get_info(const struct shell *sh, size_t argc, char *argv[]) +{ + struct bt_csip_set_member_set_info info; uint8_t sirk[BT_CSIP_SIRK_SIZE]; int err; @@ -210,14 +267,25 @@ static int cmd_csip_set_member_get_sirk(const struct shell *sh, size_t argc, cha return -ENOEXEC; } - err = bt_csip_set_member_get_sirk(svc_inst, sirk); + err = bt_csip_set_member_get_info(svc_inst, &info); if (err != 0) { shell_error(sh, "Failed to get SIRK: %d", err); return -ENOEXEC; } - shell_print(sh, "SIRK"); + shell_print(sh, "Info for %p", svc_inst); + shell_print(sh, "\tSIRK"); shell_hexdump(sh, sirk, sizeof(sirk)); + shell_print(sh, "\tSet size: %u", info.set_size); + shell_print(sh, "\tRank: %u", info.rank); + shell_print(sh, "\tLockable: %s", info.lockable ? "true" : "false"); + shell_print(sh, "\tLocked: %s", info.locked ? "true" : "false"); + if (info.locked) { + char addr_str[BT_ADDR_LE_STR_LEN]; + + bt_addr_le_to_str(&info.lock_client_addr, addr_str, sizeof(addr_str)); + shell_print(sh, "\tLock owner: %s", addr_str); + } return 0; } @@ -299,14 +367,14 @@ SHELL_STATIC_SUBCMD_SET_CREATE( SHELL_CMD_ARG(release, NULL, "Release the set [force]", cmd_csip_set_member_release, 1, 1), SHELL_CMD_ARG(sirk, NULL, "Set the currently used SIRK ", cmd_csip_set_member_sirk, 2, 0), - SHELL_CMD_ARG(get_sirk, NULL, "Get the currently used SIRK", cmd_csip_set_member_get_sirk, - 1, 0), + SHELL_CMD_ARG(set_size_and_rank, NULL, "Set the currently used size and rank ", + cmd_csip_set_member_set_size_and_rank, 3, 0), + SHELL_CMD_ARG(get_info, NULL, "Get service info", cmd_csip_set_member_get_info, 1, 0), SHELL_CMD_ARG(sirk_rsp, NULL, "Set the response used in SIRK requests " "", cmd_csip_set_member_sirk_rsp, 2, 0), - SHELL_SUBCMD_SET_END -); + SHELL_SUBCMD_SET_END); SHELL_CMD_ARG_REGISTER(csip_set_member, &csip_set_member_cmds, "Bluetooth CSIP set member shell commands", diff --git a/subsys/bluetooth/host/hci_core.c b/subsys/bluetooth/host/hci_core.c index 338cff5ba88..3f685ba9c78 100644 --- a/subsys/bluetooth/host/hci_core.c +++ b/subsys/bluetooth/host/hci_core.c @@ -1,12 +1,14 @@ /* hci_core.c - HCI core Bluetooth handling */ /* - * Copyright (c) 2017-2021 Nordic Semiconductor ASA + * Copyright (c) 2017-2025 Nordic Semiconductor ASA * Copyright (c) 2015-2016 Intel Corporation * * SPDX-License-Identifier: Apache-2.0 */ +#include + #include #include #include @@ -4509,6 +4511,29 @@ int bt_set_appearance(uint16_t appearance) } #endif +int bt_le_get_local_features(struct bt_le_local_features *remote_info) +{ + if (remote_info == NULL) { + return -EINVAL; + } + + if (!atomic_test_bit(bt_dev.flags, BT_DEV_READY)) { + return -EAGAIN; + } + + memcpy(remote_info->features, bt_dev.le.features, sizeof(remote_info->features)); + remote_info->states = bt_dev.le.states; + remote_info->acl_mtu = COND_CODE_1(CONFIG_BT_CONN, (bt_dev.le.acl_mtu), (0)); + remote_info->acl_pkts = COND_CODE_1(CONFIG_BT_CONN, (bt_dev.le.acl_pkts.limit), (0)); + remote_info->iso_mtu = COND_CODE_1(CONFIG_BT_ISO, (bt_dev.le.iso_mtu), (0)); + remote_info->iso_pkts = COND_CODE_1(CONFIG_BT_ISO, (bt_dev.le.iso_limit), (0)); + remote_info->rl_size = COND_CODE_1(CONFIG_BT_SMP, (bt_dev.le.rl_size), (0)); + remote_info->max_adv_data_len = + COND_CODE_1(CONFIG_BT_BROADCASTER, (bt_dev.le.max_adv_data_len), (0)); + + return 0; +} + bool bt_addr_le_is_bonded(uint8_t id, const bt_addr_le_t *addr) { if (IS_ENABLED(CONFIG_BT_SMP)) { diff --git a/subsys/bluetooth/host/hci_core.h b/subsys/bluetooth/host/hci_core.h index e501ae1d5fe..6502be80c3f 100644 --- a/subsys/bluetooth/host/hci_core.h +++ b/subsys/bluetooth/host/hci_core.h @@ -1,12 +1,14 @@ /* hci_core.h - Bluetooth HCI core access */ /* - * Copyright (c) 2021 Nordic Semiconductor ASA + * Copyright (c) 2021-2025 Nordic Semiconductor ASA * Copyright (c) 2015-2016 Intel Corporation * * SPDX-License-Identifier: Apache-2.0 */ +#include +#include #include /* LL connection parameters */ @@ -271,7 +273,7 @@ struct bt_le_per_adv_sync { struct bt_dev_le { /* LE features */ - uint8_t features[8]; + uint8_t features[BT_LE_LOCAL_SUPPORTED_FEATURES_SIZE]; /* LE states */ uint64_t states; diff --git a/subsys/bluetooth/host/shell/bt.c b/subsys/bluetooth/host/shell/bt.c index 50847d3c7b9..f216f61031f 100644 --- a/subsys/bluetooth/host/shell/bt.c +++ b/subsys/bluetooth/host/shell/bt.c @@ -12,6 +12,9 @@ */ #include +#include +#include +#include #include #include #include @@ -3247,11 +3250,18 @@ static int cmd_subrate_request(const struct shell *sh, size_t argc, char *argv[] #if defined(CONFIG_BT_CENTRAL) static int bt_do_connect_le(int *ercd, size_t argc, char *argv[]) { + struct bt_le_conn_param conn_param; int err; bt_addr_le_t addr; struct bt_conn *conn = NULL; uint32_t options = 0; + if (IS_ENABLED(CONFIG_BT_BAP_UNICAST) || IS_ENABLED(CONFIG_BT_BAP_BROADCAST_ASSISTANT)) { + conn_param = *BT_BAP_CONN_PARAM_RELAXED; + } else { + conn_param = *BT_LE_CONN_PARAM_DEFAULT; + } + *ercd = 0; /* When no arguments are specified, connect to the last scanned device. */ @@ -3288,7 +3298,7 @@ static int bt_do_connect_le(int *ercd, size_t argc, char *argv[]) BT_GAP_SCAN_FAST_INTERVAL, BT_GAP_SCAN_FAST_INTERVAL); - err = bt_conn_le_create(&addr, create_params, BT_LE_CONN_PARAM_DEFAULT, &conn); + err = bt_conn_le_create(&addr, create_params, &conn_param, &conn); if (err) { *ercd = err; return -ENOEXEC; diff --git a/tests/bluetooth/shell/audio.conf b/tests/bluetooth/shell/audio.conf index f09705ac681..697f3be4352 100644 --- a/tests/bluetooth/shell/audio.conf +++ b/tests/bluetooth/shell/audio.conf @@ -40,7 +40,6 @@ CONFIG_BT_KEYS_OVERWRITE_OLDEST=y CONFIG_BT_L2CAP_TX_MTU=128 CONFIG_BT_BUF_ACL_RX_SIZE=255 CONFIG_BT_BUF_ACL_TX_SIZE=251 - CONFIG_BT_SETTINGS=y CONFIG_FLASH=y CONFIG_FLASH_MAP=y @@ -53,6 +52,13 @@ CONFIG_BT_AUTO_DATA_LEN_UPDATE=y CONFIG_BT_USER_PHY_UPDATE=y CONFIG_BT_AUTO_PHY_UPDATE=y +CONFIG_BT_GAP_AUTO_UPDATE_CONN_PARAMS=n +# Set preferred values based on BT_BAP_CONN_PARAM_RELAXED +CONFIG_BT_PERIPHERAL_PREF_MIN_INT=50 +CONFIG_BT_PERIPHERAL_PREF_MAX_INT=70 +CONFIG_BT_PERIPHERAL_PREF_LATENCY=0 +CONFIG_BT_PERIPHERAL_PREF_TIMEOUT=400 + CONFIG_BT_PER_ADV_SYNC_TRANSFER_RECEIVER=y CONFIG_BT_PER_ADV_SYNC_TRANSFER_SENDER=y @@ -111,6 +117,8 @@ CONFIG_BT_MICP_MIC_CTLR_MAX_AICS_INST=1 # Coordinated Set Identification CONFIG_BT_CSIP_SET_MEMBER=y +CONFIG_BT_CSIP_SET_MEMBER_SIRK_NOTIFIABLE=y +CONFIG_BT_CSIP_SET_MEMBER_SIZE_NOTIFIABLE=y CONFIG_BT_CSIP_SET_COORDINATOR=y CONFIG_BT_CSIP_SET_COORDINATOR_MAX_CSIS_INSTANCES=2 diff --git a/tests/bluetooth/tester/overlay-le-audio.conf b/tests/bluetooth/tester/overlay-le-audio.conf index be5004d49e4..4b18c651be2 100644 --- a/tests/bluetooth/tester/overlay-le-audio.conf +++ b/tests/bluetooth/tester/overlay-le-audio.conf @@ -1,5 +1,11 @@ CONFIG_BT_AUDIO=y CONFIG_BT_PERIPHERAL=y +CONFIG_BT_GAP_AUTO_UPDATE_CONN_PARAMS=n +# Set preferred values based on BT_BAP_CONN_PARAM_RELAXED +CONFIG_BT_PERIPHERAL_PREF_MIN_INT=50 +CONFIG_BT_PERIPHERAL_PREF_MAX_INT=70 +CONFIG_BT_PERIPHERAL_PREF_LATENCY=0 +CONFIG_BT_PERIPHERAL_PREF_TIMEOUT=400 CONFIG_BT_CENTRAL=y CONFIG_BT_GATT_CLIENT=y CONFIG_BT_GATT_DYNAMIC_DB=y diff --git a/tests/bluetooth/tester/src/audio/btp_bap_broadcast.c b/tests/bluetooth/tester/src/audio/btp_bap_broadcast.c index b2f496b7a1b..f42eaa2340c 100644 --- a/tests/bluetooth/tester/src/audio/btp_bap_broadcast.c +++ b/tests/bluetooth/tester/src/audio/btp_bap_broadcast.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include "bap_endpoint.h" @@ -367,17 +368,8 @@ static int setup_broadcast_source(uint8_t streams_per_subgroup, uint8_t subgroup uint8_t btp_bap_broadcast_source_setup(const void *cmd, uint16_t cmd_len, void *rsp, uint16_t *rsp_len) { - struct bt_le_per_adv_param per_adv_param = - *BT_LE_PER_ADV_PARAM(BT_GAP_MS_TO_PER_ADV_INTERVAL(150), - BT_GAP_MS_TO_PER_ADV_INTERVAL(150), BT_LE_PER_ADV_OPT_NONE); - /* Zephyr Controller works best while Extended Advertising interval is a multiple - * of the ISO Interval minus 10 ms (max. advertising random delay). This is - * required to place the AUX_ADV_IND PDUs in a non-overlapping interval with the - * Broadcast ISO radio events. - */ - struct bt_le_adv_param ext_adv_param = - *BT_LE_ADV_PARAM(BT_LE_ADV_OPT_EXT_ADV, BT_GAP_MS_TO_ADV_INTERVAL(140), - BT_GAP_MS_TO_ADV_INTERVAL(140), NULL); + struct bt_le_per_adv_param per_adv_param = *BT_BAP_PER_ADV_PARAM_BROADCAST_SLOW; + struct bt_le_adv_param ext_adv_param = *BT_BAP_ADV_PARAM_BROADCAST_SLOW; int err; struct bt_audio_codec_cfg codec_cfg; const struct btp_bap_broadcast_source_setup_cmd *cp = cmd; @@ -404,6 +396,14 @@ uint8_t btp_bap_broadcast_source_setup(const void *cmd, uint16_t cmd_len, LOG_DBG(""); + /* Zephyr Controller works best while Extended Advertising interval is a multiple + * of the ISO Interval minus 10 ms (max. advertising random delay). This is + * required to place the AUX_ADV_IND PDUs in a non-overlapping interval with the + * Broadcast ISO radio events. + */ + ext_adv_param.interval_min -= BT_GAP_MS_TO_ADV_INTERVAL(10U); + ext_adv_param.interval_max -= BT_GAP_MS_TO_ADV_INTERVAL(10U); + memset(&codec_cfg, 0, sizeof(codec_cfg)); codec_cfg.id = cp->coding_format; codec_cfg.vid = cp->vid; diff --git a/tests/bluetooth/tester/src/btp_gap.c b/tests/bluetooth/tester/src/btp_gap.c index 547400d912c..bbd41e91092 100644 --- a/tests/bluetooth/tester/src/btp_gap.c +++ b/tests/bluetooth/tester/src/btp_gap.c @@ -7,9 +7,11 @@ */ #include +#include #include #include #include +#include #include #include @@ -1060,20 +1062,21 @@ static uint8_t stop_discovery(const void *cmd, uint16_t cmd_len, static uint8_t connect(const void *cmd, uint16_t cmd_len, void *rsp, uint16_t *rsp_len) { - /* The conn interval is set to 60ms (0x30). This is to better support test cases where we - * need to connect to multiple peripherals (up to 3). The connection interval should also be - * a multiple of 30ms, as that is ideal to support both 7.5ms and 10ms ISO intervals - */ - const uint16_t interval = BT_GAP_MS_TO_CONN_INTERVAL(60U); - const struct bt_le_conn_param *conn_param = - BT_LE_CONN_PARAM(interval, interval, 0U, BT_GAP_MS_TO_CONN_TIMEOUT(4000U)); + struct bt_le_conn_param conn_param; + + if (IS_ENABLED(CONFIG_BT_BAP_UNICAST) || IS_ENABLED(CONFIG_BT_BAP_BROADCAST_ASSISTANT)) { + conn_param = *BT_BAP_CONN_PARAM_RELAXED; + } else { + conn_param = *BT_LE_CONN_PARAM_DEFAULT; + } + const struct btp_gap_connect_cmd *cp = cmd; int err; if (!bt_addr_le_eq(&cp->address, BT_ADDR_LE_ANY)) { struct bt_conn *conn = NULL; - err = bt_conn_le_create(&cp->address, BT_CONN_LE_CREATE_CONN, conn_param, &conn); + err = bt_conn_le_create(&cp->address, BT_CONN_LE_CREATE_CONN, &conn_param, &conn); if (err) { LOG_ERR("Failed to create connection (%d)", err); return BTP_STATUS_FAILED; @@ -1081,7 +1084,7 @@ static uint8_t connect(const void *cmd, uint16_t cmd_len, bt_conn_unref(conn); } else { - err = bt_conn_le_create_auto(BT_CONN_LE_CREATE_CONN, conn_param); + err = bt_conn_le_create_auto(BT_CONN_LE_CREATE_CONN, &conn_param); if (err) { LOG_ERR("Failed to create auto connection (%d)", err); return BTP_STATUS_FAILED; diff --git a/tests/bsim/bluetooth/audio/prj.conf b/tests/bsim/bluetooth/audio/prj.conf index aa571104fa7..aa9911e5be6 100644 --- a/tests/bsim/bluetooth/audio/prj.conf +++ b/tests/bsim/bluetooth/audio/prj.conf @@ -54,6 +54,11 @@ CONFIG_BT_ISO_RX_MTU=310 CONFIG_BT_ISO_RX_BUF_COUNT=4 CONFIG_BT_GAP_AUTO_UPDATE_CONN_PARAMS=n +# Set preferred values based on BT_BAP_CONN_PARAM_RELAXED +CONFIG_BT_PERIPHERAL_PREF_MIN_INT=50 +CONFIG_BT_PERIPHERAL_PREF_MAX_INT=70 +CONFIG_BT_PERIPHERAL_PREF_LATENCY=0 +CONFIG_BT_PERIPHERAL_PREF_TIMEOUT=400 # Needed for Periodic Advertising Sync Transfer CONFIG_BT_PER_ADV_SYNC_TRANSFER_RECEIVER=y @@ -83,7 +88,8 @@ CONFIG_BT_MICP_MIC_CTLR_MAX_AICS_INST=2 # Coordinated Set Identification CONFIG_BT_CSIP_SET_MEMBER=y CONFIG_BT_CSIP_SET_MEMBER_TEST_SAMPLE_DATA=y -CONFIG_BT_CSIP_SET_MEMBER_NOTIFIABLE=y +CONFIG_BT_CSIP_SET_MEMBER_SIRK_NOTIFIABLE=y +CONFIG_BT_CSIP_SET_MEMBER_SIZE_NOTIFIABLE=y CONFIG_BT_CSIP_SET_COORDINATOR=y CONFIG_BT_CSIP_SET_COORDINATOR_TEST_SAMPLE_DATA=y diff --git a/tests/bsim/bluetooth/audio/src/bap_bass_broadcaster_test.c b/tests/bsim/bluetooth/audio/src/bap_bass_broadcaster_test.c index 68894d7a320..fb1da4e6904 100644 --- a/tests/bsim/bluetooth/audio/src/bap_bass_broadcaster_test.c +++ b/tests/bsim/bluetooth/audio/src/bap_bass_broadcaster_test.c @@ -7,6 +7,7 @@ #include #include +#include #include #include #include @@ -29,8 +30,7 @@ static void test_main(void) struct bt_le_ext_adv *adv; struct bt_data ad[2] = { BT_DATA_BYTES(BT_DATA_FLAGS, BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR), - BT_DATA_BYTES(BT_DATA_SVC_DATA16, - BT_UUID_16_ENCODE(BT_UUID_BROADCAST_AUDIO_VAL), + BT_DATA_BYTES(BT_DATA_SVC_DATA16, BT_UUID_16_ENCODE(BT_UUID_BROADCAST_AUDIO_VAL), BT_BYTES_LIST_LE24(broadcast_id)), }; @@ -42,19 +42,7 @@ static void test_main(void) printk("Bluetooth initialized\n"); - /* Create a non-connectable advertising set */ - err = bt_le_ext_adv_create(BT_LE_EXT_ADV_NCONN, NULL, &adv); - if (err) { - FAIL("Failed to create advertising set (err %d)\n", err); - return; - } - - /* Set periodic advertising parameters */ - err = bt_le_per_adv_set_param(adv, BT_LE_PER_ADV_DEFAULT); - if (err) { - FAIL("Failed to set periodic advertising parameters (err %d)\n", err); - return; - } + setup_broadcast_adv(&adv); /* Set adv data */ err = bt_le_ext_adv_set_data(adv, ad, ARRAY_SIZE(ad), NULL, 0); diff --git a/tests/bsim/bluetooth/audio/src/bap_broadcast_assistant_test.c b/tests/bsim/bluetooth/audio/src/bap_broadcast_assistant_test.c index cb1a3296df0..bb8f44c5b90 100644 --- a/tests/bsim/bluetooth/audio/src/bap_broadcast_assistant_test.c +++ b/tests/bsim/bluetooth/audio/src/bap_broadcast_assistant_test.c @@ -1,9 +1,10 @@ /* - * Copyright (c) 2021-2023 Nordic Semiconductor ASA + * Copyright (c) 2021-2025 Nordic Semiconductor ASA * * SPDX-License-Identifier: Apache-2.0 */ +#include #include #include #include @@ -27,22 +28,22 @@ #include "common.h" #include "bap_common.h" #include "bstests.h" +#include "syscalls/kernel.h" #ifdef CONFIG_BT_BAP_BROADCAST_ASSISTANT extern enum bst_result_t bst_result; /* BASS variables */ -static volatile uint8_t g_src_id; static volatile uint32_t g_broadcast_id; static volatile uint8_t g_recv_state_count; +static struct bt_bap_scan_delegator_recv_state recv_state; CREATE_FLAG(flag_discovery_complete); CREATE_FLAG(flag_write_complete); CREATE_FLAG(flag_cb_called); CREATE_FLAG(flag_broadcaster_found); CREATE_FLAG(flag_pa_synced); CREATE_FLAG(flag_pa_terminated); -CREATE_FLAG(flag_state_synced); CREATE_FLAG(flag_mtu_exchanged); CREATE_FLAG(flag_recv_state_read); CREATE_FLAG(flag_recv_state_updated); @@ -135,7 +136,7 @@ static void bap_broadcast_assistant_recv_state_cb( printk("BASS recv state: src_id %u, addr %s, sid %u, sync_state %u, encrypt_state %u%s%s\n", state->src_id, le_addr, state->adv_sid, state->pa_sync_state, state->encrypt_state, state->encrypt_state == BT_BAP_BIG_ENC_STATE_BAD_CODE ? ", bad code: " : "", - bad_code); + state->encrypt_state == BT_BAP_BIG_ENC_STATE_BAD_CODE ? bad_code : ""); if (state->encrypt_state == BT_BAP_BIG_ENC_STATE_BCODE_REQ) { SET_FLAG(flag_broadcast_code_requested); @@ -143,7 +144,7 @@ static void bap_broadcast_assistant_recv_state_cb( SET_FLAG(flag_incorrect_broadcast_code); if (memcmp(state->bad_code, INCORRECT_BROADCAST_CODE, BT_ISO_BROADCAST_CODE_SIZE) != 0) { - FAIL("Bad code is not what we sent"); + FAIL("Bad code is not what we sent\n"); return; } @@ -151,7 +152,7 @@ static void bap_broadcast_assistant_recv_state_cb( const struct bt_bap_bass_subgroup *subgroup = &state->subgroups[i]; if (subgroup->bis_sync != BT_BAP_BIS_SYNC_FAILED) { - FAIL("Invalid BIS sync value 0x%08X for failed sync", + FAIL("Invalid BIS sync value 0x%08X for failed sync\n", subgroup->bis_sync); return; } @@ -185,13 +186,8 @@ static void bap_broadcast_assistant_recv_state_cb( } #endif /* CONFIG_BT_PER_ADV_SYNC_TRANSFER_SENDER */ - if (state->pa_sync_state == BT_BAP_PA_STATE_SYNCED) { - SET_FLAG(flag_state_synced); - } - - g_src_id = state->src_id; + memcpy(&recv_state, state, sizeof(recv_state)); SET_FLAG(flag_cb_called); - SET_FLAG(flag_recv_state_updated); } @@ -451,27 +447,72 @@ static void test_bass_add_source(void) return; } + WAIT_FOR_FLAG(flag_recv_state_updated); + + if (!bt_addr_le_eq(&recv_state.addr, &add_src_param.addr)) { + char addr[BT_ADDR_LE_STR_LEN]; + char expected_addr[BT_ADDR_LE_STR_LEN]; + + bt_addr_le_to_str(&recv_state.addr, addr, sizeof(addr)); + bt_addr_le_to_str(&add_src_param.addr, expected_addr, sizeof(expected_addr)); + + FAIL("Unexpected addr %s != %s\n", addr, expected_addr); + return; + } + + if (recv_state.adv_sid != add_src_param.adv_sid) { + FAIL("Unexpected SID: %u\n", recv_state.adv_sid); + return; + } + + if (recv_state.pa_sync_state != BT_BAP_PA_STATE_NOT_SYNCED) { + FAIL("Unexpected PA sync state: %d\n", recv_state.pa_sync_state); + return; + } + + if (recv_state.encrypt_state != BT_BAP_BIG_ENC_STATE_NO_ENC) { + FAIL("Unexpected BIG encryption state: %d\n", recv_state.pa_sync_state); + return; + } + + if (recv_state.broadcast_id != add_src_param.broadcast_id) { + FAIL("Unexpected broadcast ID: 0x%06X != 0x%06X\n", recv_state.broadcast_id, + add_src_param.broadcast_id); + return; + } + + if (recv_state.num_subgroups != add_src_param.num_subgroups) { + FAIL("Unexpected number of subgroups: %u\n", recv_state.num_subgroups); + return; + } + WAIT_FOR_FLAG(flag_cb_called); WAIT_FOR_FLAG(flag_write_complete); + printk("Source added\n"); } -static void test_bass_mod_source(void) +static void test_bass_mod_source(uint32_t bis_sync) { int err; struct bt_bap_broadcast_assistant_mod_src_param mod_src_param = { 0 }; - struct bt_bap_bass_subgroup subgroup = { 0 }; + struct bt_bap_bass_subgroup subgroup = {0}; + uint32_t remote_bis_sync; printk("Modify source\n"); UNSET_FLAG(flag_cb_called); UNSET_FLAG(flag_write_complete); - mod_src_param.src_id = g_src_id; + UNSET_FLAG(flag_recv_state_updated); + mod_src_param.src_id = recv_state.src_id; mod_src_param.num_subgroups = 1; mod_src_param.pa_sync = true; mod_src_param.subgroups = &subgroup; mod_src_param.pa_interval = g_broadcaster_info.interval; - subgroup.bis_sync = BT_ISO_BIS_INDEX_BIT(1) | BT_ISO_BIS_INDEX_BIT(2); /* Indexes 1 and 2 */ - subgroup.metadata_len = 0; + subgroup.bis_sync = bis_sync; + + /* Leave metadata as is */ + subgroup.metadata_len = recv_state.subgroups[0].metadata_len; + memcpy(subgroup.metadata, recv_state.subgroups[0].metadata, sizeof(metadata)); err = bt_bap_broadcast_assistant_mod_src(default_conn, &mod_src_param); if (err != 0) { @@ -479,11 +520,83 @@ static void test_bass_mod_source(void) return; } + if (recv_state.pa_sync_state == BT_BAP_PA_STATE_NOT_SYNCED) { + printk("Source modified, waiting for server to PA sync\n"); + + WAIT_FOR_AND_CLEAR_FLAG(flag_recv_state_updated); + } + + if (recv_state.pa_sync_state == BT_BAP_PA_STATE_INFO_REQ) { + /* Wait for PAST to finish and then a new receive state */ + printk("Waiting for PAST sync\n"); + WAIT_FOR_AND_CLEAR_FLAG(flag_recv_state_updated); + } + + if (recv_state.pa_sync_state != BT_BAP_PA_STATE_SYNCED) { + FAIL("Unexpected PA sync state: %d\n", recv_state.pa_sync_state); + return; + } + + if (recv_state.encrypt_state != BT_BAP_BIG_ENC_STATE_NO_ENC) { + FAIL("Unexpected BIG encryption state: %d\n", recv_state.pa_sync_state); + return; + } + + if (recv_state.num_subgroups != mod_src_param.num_subgroups) { + FAIL("Unexpected number of subgroups: %u\n", recv_state.num_subgroups); + return; + } + + /* Wait for another notification that updates the metadata of the subgroups */ + if (recv_state.subgroups[0].metadata_len == 0U) { + printk("Waiting for another receive state update with metadata\n"); + WAIT_FOR_AND_CLEAR_FLAG(flag_recv_state_updated); + } + + remote_bis_sync = recv_state.subgroups[0].bis_sync; + if (subgroup.bis_sync == 0) { + if (remote_bis_sync != 0U) { + FAIL("Unexpected BIS sync value: %u\n", remote_bis_sync); + return; + } + } else { + printk("Waiting for BIS sync\n"); + + if (remote_bis_sync == 0U && + recv_state.encrypt_state == BT_BAP_BIG_ENC_STATE_NO_ENC) { + /* Wait for another notification, which will either request a broadcast code + * for encrypted broadcasts, or have the BIS sync values set + */ + printk("Waiting for another receive state update with BIS sync\n"); + WAIT_FOR_AND_CLEAR_FLAG(flag_recv_state_updated); + remote_bis_sync = recv_state.subgroups[0].bis_sync; + } + + if (recv_state.encrypt_state == BT_BAP_BIG_ENC_STATE_BCODE_REQ) { + printk("Remote is requesting broadcast code\n"); + if (remote_bis_sync != 0U) { + FAIL("Unexpected BIS sync value: %u", remote_bis_sync); + return; + } + } else if (recv_state.encrypt_state == BT_BAP_BIG_ENC_STATE_BAD_CODE) { + printk("Remote responded with bad code\n"); + if (remote_bis_sync != 0U) { + FAIL("Unexpected BIS sync value: %u", remote_bis_sync); + return; + } + } else { + WAIT_FOR_FLAG(flag_recv_state_updated_with_bis_sync); + if (remote_bis_sync != subgroup.bis_sync) { + FAIL("Unexpected BIS sync value: %u != %u\n", remote_bis_sync, + subgroup.bis_sync); + return; + } + } + } + WAIT_FOR_FLAG(flag_cb_called); WAIT_FOR_FLAG(flag_write_complete); - printk("Source added, waiting for server to PA sync\n"); - WAIT_FOR_FLAG(flag_state_synced) - printk("Server PA synced\n"); + printk("Source modified\n"); } static void test_bass_mod_source_long_meta(void) @@ -491,16 +604,18 @@ static void test_bass_mod_source_long_meta(void) int err; struct bt_bap_broadcast_assistant_mod_src_param mod_src_param = { 0 }; struct bt_bap_bass_subgroup subgroup = { 0 }; + uint32_t remote_bis_sync; printk("Long write\n"); UNSET_FLAG(flag_cb_called); UNSET_FLAG(flag_write_complete); - mod_src_param.src_id = g_src_id; + UNSET_FLAG(flag_recv_state_updated); + mod_src_param.src_id = recv_state.src_id; mod_src_param.num_subgroups = 1; mod_src_param.pa_sync = true; mod_src_param.subgroups = &subgroup; mod_src_param.pa_interval = g_broadcaster_info.interval; - subgroup.bis_sync = BT_ISO_BIS_INDEX_BIT(1) | BT_ISO_BIS_INDEX_BIT(2); + subgroup.bis_sync = recv_state.subgroups[0].bis_sync; subgroup.metadata_len = sizeof(metadata); memcpy(subgroup.metadata, metadata, sizeof(metadata)); @@ -509,12 +624,41 @@ static void test_bass_mod_source_long_meta(void) FAIL("Could not modify source (err %d)\n", err); return; } + printk("Source modified, waiting for receive state\n"); + + WAIT_FOR_FLAG(flag_recv_state_updated); + + remote_bis_sync = recv_state.subgroups[0].bis_sync; + if (recv_state.pa_sync_state != BT_BAP_PA_STATE_SYNCED) { + FAIL("Unexpected PA sync state: %d\n", recv_state.pa_sync_state); + return; + } + + if (recv_state.encrypt_state != BT_BAP_BIG_ENC_STATE_NO_ENC) { + FAIL("Unexpected BIG encryption state: %d\n", recv_state.pa_sync_state); + return; + } + + if (recv_state.num_subgroups != mod_src_param.num_subgroups) { + FAIL("Unexpected number of subgroups: %u\n", recv_state.num_subgroups); + return; + } + + if (remote_bis_sync != 0U && remote_bis_sync != subgroup.bis_sync) { + FAIL("Unexpected BIS sync value: %u\n", remote_bis_sync); + return; + } + + if (memcmp(recv_state.subgroups[0].metadata, subgroup.metadata, subgroup.metadata_len) != + 0) { + FAIL("Unexpected metadata (len %u / %u)\n", recv_state.subgroups[0].metadata_len, + subgroup.metadata_len); + return; + } WAIT_FOR_FLAG(flag_cb_called); WAIT_FOR_FLAG(flag_write_complete); - printk("Source added, waiting for server to PA sync\n"); - WAIT_FOR_FLAG(flag_state_synced) - printk("Server PA synced\n"); + printk("Source modified with long meta\n"); } static void test_bass_broadcast_code(const uint8_t broadcast_code[BT_ISO_BROADCAST_CODE_SIZE]) @@ -523,11 +667,17 @@ static void test_bass_broadcast_code(const uint8_t broadcast_code[BT_ISO_BROADCA printk("Adding broadcast code\n"); UNSET_FLAG(flag_write_complete); - err = bt_bap_broadcast_assistant_set_broadcast_code(default_conn, g_src_id, broadcast_code); - if (err != 0) { - FAIL("Could not add broadcast code (err %d)\n", err); - return; - } + + do { + err = bt_bap_broadcast_assistant_set_broadcast_code(default_conn, recv_state.src_id, + broadcast_code); + if (err == -EBUSY) { + k_sleep(BAP_RETRY_WAIT); + } else if (err != 0) { + FAIL("Could not add broadcast code (err %d)\n", err); + return; + } + } while (err == -EBUSY); WAIT_FOR_FLAG(flag_write_complete); printk("Broadcast code added\n"); @@ -540,7 +690,7 @@ static void test_bass_remove_source(void) printk("Removing source\n"); UNSET_FLAG(flag_cb_called); UNSET_FLAG(flag_write_complete); - err = bt_bap_broadcast_assistant_rem_src(default_conn, g_src_id); + err = bt_bap_broadcast_assistant_rem_src(default_conn, recv_state.src_id); if (err != 0) { FAIL("Could not remove source (err %d)\n", err); return; @@ -599,8 +749,9 @@ static void test_main_client_sync(void) test_bass_scan_stop(); test_bass_create_pa_sync(); test_bass_add_source(); - test_bass_mod_source(); + test_bass_mod_source(0); test_bass_mod_source_long_meta(); + test_bass_mod_source(BT_ISO_BIS_INDEX_BIT(1) | BT_ISO_BIS_INDEX_BIT(2)); test_bass_broadcast_code(BROADCAST_CODE); printk("Waiting for receive state with BIS sync\n"); @@ -625,7 +776,7 @@ static void test_main_client_sync_incorrect_code(void) test_bass_scan_stop(); test_bass_create_pa_sync(); test_bass_add_source(); - test_bass_mod_source(); + test_bass_mod_source(BT_ISO_BIS_INDEX_BIT(1)); WAIT_FOR_FLAG(flag_broadcast_code_requested); test_bass_broadcast_code(INCORRECT_BROADCAST_CODE); WAIT_FOR_FLAG(flag_incorrect_broadcast_code); diff --git a/tests/bsim/bluetooth/audio/src/bap_broadcast_sink_test.c b/tests/bsim/bluetooth/audio/src/bap_broadcast_sink_test.c index 6450bea3d57..27ec575e56b 100644 --- a/tests/bsim/bluetooth/audio/src/bap_broadcast_sink_test.c +++ b/tests/bsim/bluetooth/audio/src/bap_broadcast_sink_test.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2024 Nordic Semiconductor ASA + * Copyright (c) 2021-2025 Nordic Semiconductor ASA * * SPDX-License-Identifier: Apache-2.0 */ @@ -59,7 +59,6 @@ static uint32_t broadcaster_broadcast_id; static struct audio_test_stream broadcast_sink_streams[CONFIG_BT_BAP_BROADCAST_SNK_STREAM_COUNT]; static struct bt_bap_stream *streams[ARRAY_SIZE(broadcast_sink_streams)]; static uint32_t requested_bis_sync; -static struct bt_le_ext_adv *ext_adv; static const struct bt_bap_scan_delegator_recv_state *req_recv_state; static uint8_t recv_state_broadcast_code[BT_ISO_BROADCAST_CODE_SIZE]; @@ -251,7 +250,18 @@ static void base_recv_cb(struct bt_bap_broadcast_sink *sink, const struct bt_bap return; } - bis_index_bitfield = base_bis_index_bitfield & bis_index_mask; + if (requested_bis_sync == 0) { + bis_index_bitfield = base_bis_index_bitfield & bis_index_mask; + } else { + if ((requested_bis_sync & base_bis_index_bitfield) != requested_bis_sync) { + FAIL("Assistant has request BIS indexes 0x%08x that is not in the BASE " + "0x%08x\n", + requested_bis_sync, base_bis_index_bitfield); + return; + } + + bis_index_bitfield = requested_bis_sync & bis_index_mask; + } SET_FLAG(flag_base_received); } @@ -771,7 +781,7 @@ static void test_broadcast_sync(const uint8_t broadcast_code[BT_ISO_BROADCAST_CO { int err; - printk("Syncing sink %p\n", g_sink); + printk("Syncing sink %p to 0x%08x\n", g_sink, bis_index_bitfield); err = bt_bap_broadcast_sink_sync(g_sink, bis_index_bitfield, streams, broadcast_code); if (err != 0) { FAIL("Unable to sync the sink: %d\n", err); @@ -897,39 +907,6 @@ static void test_broadcast_delete_inval(void) } } -static void test_start_adv(void) -{ - const struct bt_data ad[] = { - BT_DATA_BYTES(BT_DATA_FLAGS, (BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR)), - BT_DATA_BYTES(BT_DATA_UUID16_ALL, BT_UUID_16_ENCODE(BT_UUID_BASS_VAL), - BT_UUID_16_ENCODE(BT_UUID_PACS_VAL)), - BT_DATA_BYTES(BT_DATA_SVC_DATA16, BT_UUID_16_ENCODE(BT_UUID_BASS_VAL)), - }; - int err; - - /* Create a connectable advertising set */ - err = bt_le_ext_adv_create(BT_LE_EXT_ADV_CONN, NULL, &ext_adv); - if (err != 0) { - FAIL("Failed to create advertising set (err %d)\n", err); - - return; - } - - err = bt_le_ext_adv_set_data(ext_adv, ad, ARRAY_SIZE(ad), NULL, 0); - if (err != 0) { - FAIL("Failed to set advertising data (err %d)\n", err); - - return; - } - - err = bt_le_ext_adv_start(ext_adv, BT_LE_EXT_ADV_START_DEFAULT); - if (err != 0) { - FAIL("Failed to start advertising set (err %d)\n", err); - - return; - } -} - static void test_common(void) { int err; @@ -1144,6 +1121,7 @@ static void test_sink_encrypted_incorrect_code(void) static void broadcast_sink_with_assistant(void) { + struct bt_le_ext_adv *ext_adv; int err; err = init(); @@ -1152,7 +1130,7 @@ static void broadcast_sink_with_assistant(void) return; } - test_start_adv(); + setup_connectable_adv(&ext_adv); WAIT_FOR_FLAG(flag_connected); printk("Waiting for PA sync request\n"); @@ -1200,6 +1178,7 @@ static void broadcast_sink_with_assistant(void) static void broadcast_sink_with_assistant_incorrect_code(void) { + struct bt_le_ext_adv *ext_adv; int err; err = init(); @@ -1208,7 +1187,7 @@ static void broadcast_sink_with_assistant_incorrect_code(void) return; } - test_start_adv(); + setup_connectable_adv(&ext_adv); WAIT_FOR_FLAG(flag_connected); printk("Waiting for PA sync request\n"); diff --git a/tests/bsim/bluetooth/audio/src/bap_broadcast_source_test.c b/tests/bsim/bluetooth/audio/src/bap_broadcast_source_test.c index d53da1c5fec..838eab27f2e 100644 --- a/tests/bsim/bluetooth/audio/src/bap_broadcast_source_test.c +++ b/tests/bsim/bluetooth/audio/src/bap_broadcast_source_test.c @@ -334,30 +334,14 @@ static void test_broadcast_source_get_base(struct bt_bap_broadcast_source *sourc static int setup_extended_adv(struct bt_bap_broadcast_source *source, struct bt_le_ext_adv **adv) { /* Broadcast Audio Streaming Endpoint advertising data */ - NET_BUF_SIMPLE_DEFINE(ad_buf, - BT_UUID_SIZE_16 + BT_AUDIO_BROADCAST_ID_SIZE); - struct bt_le_adv_param adv_param = BT_LE_ADV_PARAM_INIT( - BT_LE_ADV_OPT_EXT_ADV, 0x80, 0x80, NULL); + NET_BUF_SIMPLE_DEFINE(ad_buf, BT_UUID_SIZE_16 + BT_AUDIO_BROADCAST_ID_SIZE); NET_BUF_SIMPLE_DEFINE(base_buf, 128); struct bt_data ext_ad; struct bt_data per_ad; uint32_t broadcast_id; int err; - /* Create a non-connectable advertising set */ - err = bt_le_ext_adv_create(&adv_param, NULL, adv); - if (err != 0) { - printk("Unable to create extended advertising set: %d\n", err); - return err; - } - - /* Set periodic advertising parameters */ - err = bt_le_per_adv_set_param(*adv, BT_LE_PER_ADV_DEFAULT); - if (err) { - printk("Failed to set periodic advertising parameters: %d\n", - err); - return err; - } + setup_broadcast_adv(adv); err = bt_rand(&broadcast_id, BT_AUDIO_BROADCAST_ID_SIZE); if (err) { diff --git a/tests/bsim/bluetooth/audio/src/bap_common.h b/tests/bsim/bluetooth/audio/src/bap_common.h index 1a6e2f3a1bc..88f445cddc4 100644 --- a/tests/bsim/bluetooth/audio/src/bap_common.h +++ b/tests/bsim/bluetooth/audio/src/bap_common.h @@ -16,6 +16,7 @@ #include #include #include +#include #define LONG_META 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, \ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, \ @@ -43,6 +44,9 @@ #define INCORRECT_BROADCAST_CODE \ ((uint8_t[]){0xDE, 0xAD, 0xBE, 0xEF, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, \ 0xdd, 0xee, 0xff}) + +#define BAP_RETRY_WAIT K_MSEC(100) + struct unicast_stream { struct bt_cap_stream stream; struct bt_audio_codec_cfg codec_cfg; diff --git a/tests/bsim/bluetooth/audio/src/bap_scan_delegator_test.c b/tests/bsim/bluetooth/audio/src/bap_scan_delegator_test.c index a904c4a5cda..640f2bd58dd 100644 --- a/tests/bsim/bluetooth/audio/src/bap_scan_delegator_test.c +++ b/tests/bsim/bluetooth/audio/src/bap_scan_delegator_test.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2022 Nordic Semiconductor ASA + * Copyright (c) 2021-2025 Nordic Semiconductor ASA * * SPDX-License-Identifier: Apache-2.0 */ @@ -648,17 +648,18 @@ static void remove_all_sources(void) static int sync_broadcast(struct sync_state *state) { int err; - uint32_t bis_sync[CONFIG_BT_BAP_BASS_MAX_SUBGROUPS]; UNSET_FLAG(flag_recv_state_updated); - for (size_t i = 0U; i < CONFIG_BT_BAP_BASS_MAX_SUBGROUPS; i++) { - bis_sync[i] = BT_ISO_BIS_INDEX_BIT(i + 1); + if (!TEST_FLAG(flag_bis_sync_requested)) { + /* If we have not received a sync request, set a value ourselves */ + for (size_t i = 0U; i < ARRAY_SIZE(state->bis_sync_req); i++) { + state->bis_sync_req[i] = BIT(i); + } } /* We don't actually need to sync to the BIG/BISes */ - err = bt_bap_scan_delegator_set_bis_sync_state(state->src_id, bis_sync); - + err = bt_bap_scan_delegator_set_bis_sync_state(state->src_id, state->bis_sync_req); if (err) { return err; } @@ -691,6 +692,7 @@ static void sync_all_broadcasts(void) static int common_init(void) { + struct bt_le_ext_adv *ext_adv; int err; err = bt_enable(NULL); @@ -709,13 +711,7 @@ static int common_init(void) bt_le_per_adv_sync_cb_register(&pa_sync_cb); - err = bt_le_adv_start(BT_LE_ADV_CONN_FAST_1, ad, AD_SIZE, NULL, 0); - if (err) { - FAIL("Advertising failed to start (err %d)\n", err); - return err; - } - - printk("Advertising successfully started\n"); + setup_connectable_adv(&ext_adv); WAIT_FOR_FLAG(flag_connected); @@ -733,21 +729,25 @@ static void test_main_client_sync(void) } /* Wait for broadcast assistant to request us to sync to PA */ + printk("Waiting for flag_pa_synced\n"); WAIT_FOR_FLAG(flag_pa_synced); - /* Wait for broadcast assistant to send us broadcast code */ - WAIT_FOR_FLAG(flag_broadcast_code_received); - /* Mod all sources by modifying the metadata */ mod_all_sources(); /* Wait for broadcast assistant to tell us to BIS sync */ + printk("Waiting for flag_bis_sync_requested\n"); WAIT_FOR_FLAG(flag_bis_sync_requested); /* Set the BIS sync state */ sync_all_broadcasts(); + /* Wait for broadcast assistant to send us broadcast code */ + printk("Waiting for flag_broadcast_code_received\n"); + WAIT_FOR_FLAG(flag_broadcast_code_received); + /* Wait for broadcast assistant to remove source and terminate PA sync */ + printk("Waiting for flag_pa_terminated\n"); WAIT_FOR_FLAG(flag_pa_terminated); PASS("BAP Scan Delegator Client Sync passed\n"); @@ -772,12 +772,14 @@ static void test_main_server_sync_client_rem(void) } /* Wait for PA to sync */ + printk("Waiting for flag_pa_synced\n"); WAIT_FOR_FLAG(flag_pa_synced); /* Add PAs as receive state sources */ add_all_sources(); /* Wait for broadcast assistant to send us broadcast code */ + printk("Waiting for flag_broadcast_code_received\n"); WAIT_FOR_FLAG(flag_broadcast_code_received); /* Mod all sources by modifying the metadata */ @@ -787,6 +789,7 @@ static void test_main_server_sync_client_rem(void) sync_all_broadcasts(); /* For for client to remove source and thus terminate the PA */ + printk("Waiting for flag_pa_terminated\n"); WAIT_FOR_FLAG(flag_pa_terminated); PASS("BAP Scan Delegator Server Sync Client Remove passed\n"); @@ -811,12 +814,14 @@ static void test_main_server_sync_server_rem(void) } /* Wait for PA to sync */ + printk("Waiting for flag_pa_synced\n"); WAIT_FOR_FLAG(flag_pa_synced); /* Add PAs as receive state sources */ add_all_sources(); /* Wait for broadcast assistant to send us broadcast code */ + printk("Waiting for flag_broadcast_code_received\n"); WAIT_FOR_FLAG(flag_broadcast_code_received); /* Mod all sources by modifying the metadata */ @@ -829,6 +834,7 @@ static void test_main_server_sync_server_rem(void) remove_all_sources(); /* Wait for PA sync to be terminated */ + printk("Waiting for flag_pa_terminated\n"); WAIT_FOR_FLAG(flag_pa_terminated); PASS("BAP Scan Delegator Server Sync Server Remove passed\n"); diff --git a/tests/bsim/bluetooth/audio/src/bap_unicast_client_test.c b/tests/bsim/bluetooth/audio/src/bap_unicast_client_test.c index 6563185249e..a00dff69e4b 100644 --- a/tests/bsim/bluetooth/audio/src/bap_unicast_client_test.c +++ b/tests/bsim/bluetooth/audio/src/bap_unicast_client_test.c @@ -37,8 +37,6 @@ #if defined(CONFIG_BT_BAP_UNICAST_CLIENT) -#define BAP_STREAM_RETRY_WAIT K_MSEC(100) - extern enum bst_result_t bst_result; static struct audio_test_stream test_streams[CONFIG_BT_BAP_UNICAST_CLIENT_ASE_SNK_COUNT]; @@ -426,7 +424,7 @@ static bool parse_ascs_ad_data(struct bt_data *data, void *user_data) return false; } - err = bt_conn_le_create(info->addr, BT_CONN_LE_CREATE_CONN, BT_LE_CONN_PARAM_DEFAULT, + err = bt_conn_le_create(info->addr, BT_CONN_LE_CREATE_CONN, BT_BAP_CONN_PARAM_RELAXED, &default_conn); if (err) { FAIL("Could not connect to peer: %d", err); @@ -582,7 +580,7 @@ static int codec_configure_stream(struct bt_bap_stream *stream, struct bt_bap_ep err = bt_bap_stream_config(default_conn, stream, ep, codec_cfg); if (err == -EBUSY) { - k_sleep(BAP_STREAM_RETRY_WAIT); + k_sleep(BAP_RETRY_WAIT); } else if (err != 0) { FAIL("Could not configure stream %p: %d\n", stream, err); return err; @@ -632,7 +630,7 @@ static void qos_configure_streams(struct bt_bap_unicast_group *unicast_group, do { err = bt_bap_stream_qos(default_conn, unicast_group); if (err == -EBUSY) { - k_sleep(BAP_STREAM_RETRY_WAIT); + k_sleep(BAP_RETRY_WAIT); } else if (err != 0) { FAIL("Unable to QoS configure streams: %d\n", err); return; @@ -653,7 +651,7 @@ static int enable_stream(struct bt_bap_stream *stream) do { err = bt_bap_stream_enable(stream, NULL, 0); if (err == -EBUSY) { - k_sleep(BAP_STREAM_RETRY_WAIT); + k_sleep(BAP_RETRY_WAIT); } else if (err != 0) { FAIL("Could not enable stream %p: %d\n", stream, err); return err; @@ -692,7 +690,7 @@ static int metadata_update_stream(struct bt_bap_stream *stream) do { err = bt_bap_stream_metadata(stream, new_meta, ARRAY_SIZE(new_meta)); if (err == -EBUSY) { - k_sleep(BAP_STREAM_RETRY_WAIT); + k_sleep(BAP_RETRY_WAIT); } else if (err != 0) { FAIL("Could not metadata update stream %p: %d\n", stream, err); return err; @@ -786,7 +784,7 @@ static int start_stream(struct bt_bap_stream *stream) do { err = bt_bap_stream_start(stream); if (err == -EBUSY) { - k_sleep(BAP_STREAM_RETRY_WAIT); + k_sleep(BAP_RETRY_WAIT); } else if (err != 0) { FAIL("Could not start stream %p: %d\n", stream, err); return err; @@ -851,7 +849,7 @@ static void disable_streams(size_t stream_cnt) err = bt_bap_stream_disable( bap_stream_from_audio_test_stream(&test_streams[i])); if (err == -EBUSY) { - k_sleep(BAP_STREAM_RETRY_WAIT); + k_sleep(BAP_RETRY_WAIT); } else if (err != 0) { FAIL("Could not disable stream: %d\n", err); return; @@ -885,7 +883,7 @@ static void stop_streams(size_t stream_cnt) do { err = bt_bap_stream_stop(source_stream); if (err == -EBUSY) { - k_sleep(BAP_STREAM_RETRY_WAIT); + k_sleep(BAP_RETRY_WAIT); } else if (err != 0) { FAIL("Could not stop stream: %d\n", err); return; @@ -911,7 +909,7 @@ static void release_streams(size_t stream_cnt) err = bt_bap_stream_release( bap_stream_from_audio_test_stream(&test_streams[i])); if (err == -EBUSY) { - k_sleep(BAP_STREAM_RETRY_WAIT); + k_sleep(BAP_RETRY_WAIT); } else if (err != 0) { FAIL("Could not release stream: %d\n", err); return; diff --git a/tests/bsim/bluetooth/audio/src/bap_unicast_server_test.c b/tests/bsim/bluetooth/audio/src/bap_unicast_server_test.c index f8f7205a9b0..406a1ce822c 100644 --- a/tests/bsim/bluetooth/audio/src/bap_unicast_server_test.c +++ b/tests/bsim/bluetooth/audio/src/bap_unicast_server_test.c @@ -70,19 +70,6 @@ static struct audio_test_stream static const struct bt_bap_qos_cfg_pref qos_pref = BT_BAP_QOS_CFG_PREF(true, BT_GAP_LE_PHY_2M, 0x02, 10, 40000, 40000, 40000, 40000); -static uint8_t unicast_server_addata[] = { - BT_UUID_16_ENCODE(BT_UUID_ASCS_VAL), /* ASCS UUID */ - BT_AUDIO_UNICAST_ANNOUNCEMENT_TARGETED, /* Target Announcement */ - BT_BYTES_LIST_LE16(PREF_CONTEXT), - BT_BYTES_LIST_LE16(PREF_CONTEXT), - 0x00, /* Metadata length */ -}; - -static const struct bt_data unicast_server_ad[] = { - BT_DATA_BYTES(BT_DATA_FLAGS, (BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR)), - BT_DATA_BYTES(BT_DATA_UUID16_ALL, BT_UUID_16_ENCODE(BT_UUID_ASCS_VAL)), - BT_DATA(BT_DATA_SVC_DATA16, unicast_server_addata, ARRAY_SIZE(unicast_server_addata)), -}; static struct bt_le_ext_adv *ext_adv; CREATE_FLAG(flag_stream_configured); @@ -460,26 +447,7 @@ static void init(void) &stream_ops); } - /* Create a connectable advertising set */ - err = bt_le_ext_adv_create(BT_LE_EXT_ADV_CONN, NULL, &ext_adv); - if (err != 0) { - FAIL("Failed to create advertising set (err %d)\n", err); - return; - } - - err = bt_le_ext_adv_set_data(ext_adv, unicast_server_ad, ARRAY_SIZE(unicast_server_ad), - NULL, 0); - if (err != 0) { - FAIL("Failed to set advertising data (err %d)\n", err); - return; - } - - err = bt_le_ext_adv_start(ext_adv, BT_LE_EXT_ADV_START_DEFAULT); - if (err != 0) { - FAIL("Failed to start advertising set (err %d)\n", err); - return; - } - printk("Advertising started\n"); + setup_connectable_adv(&ext_adv); } static void test_main(void) @@ -540,22 +508,7 @@ static void test_main_acl_disconnect(void) * bt_conn object is properly unref'ed by the stack */ for (size_t i = 0U; i < ARRAY_SIZE(dummy_ext_adv); i++) { - const struct bt_le_adv_param param = BT_LE_ADV_PARAM_INIT( - (BT_LE_ADV_OPT_EXT_ADV | BT_LE_ADV_OPT_CONN), BT_GAP_ADV_SLOW_INT_MAX, - BT_GAP_ADV_SLOW_INT_MAX, NULL); - int err; - - err = bt_le_ext_adv_create(¶m, NULL, &dummy_ext_adv[i]); - if (err != 0) { - FAIL("Failed to create advertising set[%zu] (err %d)\n", i, err); - return; - } - - err = bt_le_ext_adv_start(dummy_ext_adv[i], BT_LE_EXT_ADV_START_DEFAULT); - if (err != 0) { - FAIL("Failed to start advertising set[%zu] (err %d)\n", i, err); - return; - } + setup_connectable_adv(&dummy_ext_adv[i]); } bt_conn_cb_register(&conn_callbacks); diff --git a/tests/bsim/bluetooth/audio/src/cap_acceptor_test.c b/tests/bsim/bluetooth/audio/src/cap_acceptor_test.c index 034c5b22c60..a081326baea 100644 --- a/tests/bsim/bluetooth/audio/src/cap_acceptor_test.c +++ b/tests/bsim/bluetooth/audio/src/cap_acceptor_test.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022-2023 Nordic Semiconductor ASA + * Copyright (c) 2022-2025 Nordic Semiconductor ASA * * SPDX-License-Identifier: Apache-2.0 */ @@ -40,24 +40,8 @@ #include "bap_common.h" #if defined(CONFIG_BT_CAP_ACCEPTOR) -/* Zephyr Controller works best while Extended Advertising interval to be a multiple - * of the ISO Interval minus 10 ms (max. advertising random delay). This is - * required to place the AUX_ADV_IND PDUs in a non-overlapping interval with the - * Broadcast ISO radio events. - */ -#define BT_LE_EXT_ADV_CONN_CUSTOM \ - BT_LE_ADV_PARAM(BT_LE_ADV_OPT_EXT_ADV | BT_LE_ADV_OPT_CONN, \ - BT_GAP_MS_TO_ADV_INTERVAL(140), \ - BT_GAP_MS_TO_ADV_INTERVAL(140), \ - NULL) - extern enum bst_result_t bst_result; -#define SINK_CONTEXT \ - (BT_AUDIO_CONTEXT_TYPE_UNSPECIFIED | BT_AUDIO_CONTEXT_TYPE_MEDIA | \ - BT_AUDIO_CONTEXT_TYPE_CONVERSATIONAL) -#define SOURCE_CONTEXT (BT_AUDIO_CONTEXT_TYPE_UNSPECIFIED | BT_AUDIO_CONTEXT_TYPE_NOTIFICATIONS) - CREATE_FLAG(flag_broadcaster_found); CREATE_FLAG(flag_broadcast_code); CREATE_FLAG(flag_base_received); @@ -415,27 +399,6 @@ static struct bt_bap_scan_delegator_cb scan_delegator_cbs = { .broadcast_code = broadcast_code_cb, }; -/* TODO: Expand with CAP service data */ -static const struct bt_data cap_acceptor_ad[] = { - BT_DATA_BYTES(BT_DATA_FLAGS, (BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR)), - BT_DATA(BT_DATA_NAME_COMPLETE, CONFIG_BT_DEVICE_NAME, sizeof(CONFIG_BT_DEVICE_NAME) - 1), - BT_DATA_BYTES(BT_DATA_UUID16_SOME, BT_UUID_16_ENCODE(BT_UUID_ASCS_VAL), - BT_UUID_16_ENCODE(BT_UUID_CAS_VAL)), - BT_DATA_BYTES(BT_DATA_SVC_DATA16, BT_UUID_16_ENCODE(BT_UUID_CAS_VAL), - BT_AUDIO_UNICAST_ANNOUNCEMENT_TARGETED), - IF_ENABLED(CONFIG_BT_BAP_UNICAST_SERVER, - (BT_DATA_BYTES(BT_DATA_SVC_DATA16, - BT_UUID_16_ENCODE(BT_UUID_ASCS_VAL), - BT_AUDIO_UNICAST_ANNOUNCEMENT_TARGETED, - BT_BYTES_LIST_LE16(SINK_CONTEXT), - BT_BYTES_LIST_LE16(SOURCE_CONTEXT), - 0x00, /* Metadata length */), - )) - IF_ENABLED(CONFIG_BT_BAP_SCAN_DELEGATOR, - (BT_DATA_BYTES(BT_DATA_SVC_DATA16, BT_UUID_16_ENCODE(BT_UUID_BASS_VAL)), - )) -}; - static struct bt_csip_set_member_svc_inst *csip_set_member; static struct bt_bap_stream *unicast_stream_alloc(void) @@ -636,32 +599,9 @@ static int set_supported_contexts(void) void test_start_adv(void) { - int err; struct bt_le_ext_adv *ext_adv; - /* Create a connectable non-scannable advertising set */ - err = bt_le_ext_adv_create(BT_LE_EXT_ADV_CONN_CUSTOM, NULL, &ext_adv); - if (err != 0) { - FAIL("Failed to create advertising set (err %d)\n", err); - - return; - } - - /* Add cap acceptor advertising data */ - err = bt_le_ext_adv_set_data(ext_adv, cap_acceptor_ad, ARRAY_SIZE(cap_acceptor_ad), NULL, - 0); - if (err != 0) { - FAIL("Failed to set advertising data (err %d)\n", err); - - return; - } - - err = bt_le_ext_adv_start(ext_adv, BT_LE_EXT_ADV_START_DEFAULT); - if (err != 0) { - FAIL("Failed to start advertising set (err %d)\n", err); - - return; - } + setup_connectable_adv(&ext_adv); } static void set_available_contexts(void) @@ -966,7 +906,7 @@ static void create_and_sync_sink(struct bt_bap_stream *bap_streams[], size_t *st bap_streams[i] = bap_stream_from_audio_test_stream(&broadcast_sink_streams[i]); } - printk("Syncing the sink\n"); + printk("Syncing the sink to 0x%08x\n", bis_index_bitfield); *stream_count = 0; for (int i = 1; i < BT_ISO_MAX_GROUP_ISO_COUNT; i++) { if ((bis_index_bitfield & BIT(i)) != 0) { diff --git a/tests/bsim/bluetooth/audio/src/cap_commander_test.c b/tests/bsim/bluetooth/audio/src/cap_commander_test.c index 63f3ad61ef4..de623142a09 100644 --- a/tests/bsim/bluetooth/audio/src/cap_commander_test.c +++ b/tests/bsim/bluetooth/audio/src/cap_commander_test.c @@ -585,9 +585,7 @@ static bool check_audio_support_and_connect_cb(struct bt_data *data, void *user_ return false; } - err = bt_conn_le_create(addr, BT_CONN_LE_CREATE_CONN, - BT_LE_CONN_PARAM(BT_GAP_INIT_CONN_INT_MIN, BT_GAP_INIT_CONN_INT_MIN, - 0, BT_GAP_MS_TO_CONN_TIMEOUT(4000)), + err = bt_conn_le_create(addr, BT_CONN_LE_CREATE_CONN, BT_BAP_CONN_PARAM_RELAXED, &connected_conns[connected_conn_cnt]); if (err != 0) { FAIL("Could not connect to peer: %d", err); diff --git a/tests/bsim/bluetooth/audio/src/cap_initiator_broadcast_test.c b/tests/bsim/bluetooth/audio/src/cap_initiator_broadcast_test.c index 209560af009..abd43e98f79 100644 --- a/tests/bsim/bluetooth/audio/src/cap_initiator_broadcast_test.c +++ b/tests/bsim/bluetooth/audio/src/cap_initiator_broadcast_test.c @@ -36,19 +36,6 @@ #if defined(CONFIG_BT_CAP_INITIATOR) && defined(CONFIG_BT_BAP_BROADCAST_SOURCE) CREATE_FLAG(flag_source_started); -/* Zephyr Controller works best while Extended Advertising interval to be a multiple - * of the ISO Interval minus 10 ms (max. advertising random delay). This is - * required to place the AUX_ADV_IND PDUs in a non-overlapping interval with the - * Broadcast ISO radio events. - */ -#define BT_LE_EXT_ADV_CUSTOM \ - BT_LE_ADV_PARAM(BT_LE_ADV_OPT_EXT_ADV, BT_GAP_MS_TO_ADV_INTERVAL(140), \ - BT_GAP_MS_TO_ADV_INTERVAL(140), NULL) - -#define BT_LE_PER_ADV_CUSTOM \ - BT_LE_PER_ADV_PARAM(BT_GAP_MS_TO_PER_ADV_INTERVAL(150), \ - BT_GAP_MS_TO_PER_ADV_INTERVAL(150), BT_LE_PER_ADV_OPT_NONE) - #define BROADCAST_STREMT_CNT CONFIG_BT_BAP_BROADCAST_SRC_STREAM_COUNT #define CAP_AC_MAX_STREAM 2 #define LOCATION (BT_AUDIO_LOCATION_FRONT_LEFT | BT_AUDIO_LOCATION_FRONT_RIGHT) @@ -214,25 +201,6 @@ static void init(void) } } -static void setup_extended_adv(struct bt_le_ext_adv **adv) -{ - int err; - - /* Create a non-connectable advertising set */ - err = bt_le_ext_adv_create(BT_LE_EXT_ADV_CUSTOM, NULL, adv); - if (err != 0) { - FAIL("Unable to create extended advertising set: %d\n", err); - return; - } - - /* Set periodic advertising parameters */ - err = bt_le_per_adv_set_param(*adv, BT_LE_PER_ADV_CUSTOM); - if (err) { - FAIL("Failed to set periodic advertising parameters: %d\n", err); - return; - } -} - static void setup_extended_adv_data(struct bt_cap_broadcast_source *source, struct bt_le_ext_adv *adv) { @@ -653,7 +621,7 @@ static void test_main_cap_initiator_broadcast(void) init(); - setup_extended_adv(&adv); + setup_broadcast_adv(&adv); test_broadcast_audio_create_inval(); test_broadcast_audio_create(&broadcast_source); @@ -743,7 +711,7 @@ static int test_cap_initiator_ac(const struct cap_initiator_ac_param *param) create_param.qos = &qos; init(); - setup_extended_adv(&adv); + setup_broadcast_adv(&adv); err = bt_cap_initiator_broadcast_audio_create(&create_param, &broadcast_source); if (err != 0) { diff --git a/tests/bsim/bluetooth/audio/src/cap_initiator_unicast_test.c b/tests/bsim/bluetooth/audio/src/cap_initiator_unicast_test.c index 1c6b44e80ba..fdf6eb909ab 100644 --- a/tests/bsim/bluetooth/audio/src/cap_initiator_unicast_test.c +++ b/tests/bsim/bluetooth/audio/src/cap_initiator_unicast_test.c @@ -402,9 +402,7 @@ static bool check_audio_support_and_connect_cb(struct bt_data *data, void *user_ return false; } - err = bt_conn_le_create(addr, BT_CONN_LE_CREATE_CONN, - BT_LE_CONN_PARAM(BT_GAP_INIT_CONN_INT_MIN, BT_GAP_INIT_CONN_INT_MIN, - 0, BT_GAP_MS_TO_CONN_TIMEOUT(4000)), + err = bt_conn_le_create(addr, BT_CONN_LE_CREATE_CONN, BT_BAP_CONN_PARAM_RELAXED, &connected_conns[connected_conn_cnt]); if (err != 0) { FAIL("Could not connect to peer: %d", err); diff --git a/tests/bsim/bluetooth/audio/src/common.c b/tests/bsim/bluetooth/audio/src/common.c index 7fcac688a13..c842b2b91e8 100644 --- a/tests/bsim/bluetooth/audio/src/common.c +++ b/tests/bsim/bluetooth/audio/src/common.c @@ -1,6 +1,6 @@ /* * Copyright (c) 2019 Bose Corporation - * Copyright (c) 2020-2021 Nordic Semiconductor ASA + * Copyright (c) 2020-2025 Nordic Semiconductor ASA * * SPDX-License-Identifier: Apache-2.0 */ @@ -9,17 +9,24 @@ #include #include +#include #include +#include #include +#include +#include #include +#include #include #include +#include #include #include #include #include #include #include +#include #include "bs_cmd_line.h" #include "bs_dynargs.h" @@ -37,9 +44,37 @@ atomic_t flag_disconnected; atomic_t flag_conn_updated; atomic_t flag_audio_received; volatile bt_security_t security_level; - -const struct bt_data ad[AD_SIZE] = { - BT_DATA_BYTES(BT_DATA_FLAGS, (BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR)) +#if defined(CONFIG_BT_CSIP_SET_MEMBER) +uint8_t csip_rsi[BT_CSIP_RSI_SIZE]; +#endif /* CONFIG_BT_CSIP_SET_MEMBER */ + +static const struct bt_data connectable_ad[] = { + BT_DATA_BYTES(BT_DATA_FLAGS, (BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR)), + BT_DATA(BT_DATA_NAME_COMPLETE, CONFIG_BT_DEVICE_NAME, sizeof(CONFIG_BT_DEVICE_NAME) - 1), + BT_DATA_BYTES(BT_DATA_UUID16_SOME, BT_UUID_16_ENCODE(BT_UUID_ASCS_VAL), + BT_UUID_16_ENCODE(BT_UUID_CAS_VAL)), + BT_DATA_BYTES(BT_DATA_UUID16_ALL, BT_UUID_16_ENCODE(BT_UUID_BASS_VAL), + BT_UUID_16_ENCODE(BT_UUID_PACS_VAL)), +#if defined(CONFIG_BT_CAP_ACCEPTOR) + BT_DATA_BYTES(BT_DATA_SVC_DATA16, BT_UUID_16_ENCODE(BT_UUID_CAS_VAL), + BT_AUDIO_UNICAST_ANNOUNCEMENT_TARGETED), +#endif /* CONFIG_BT_CAP_ACCEPTOR */ +#if defined(CONFIG_BT_BAP_UNICAST_SERVER) + BT_DATA_BYTES(BT_DATA_SVC_DATA16, BT_UUID_16_ENCODE(BT_UUID_ASCS_VAL), + BT_AUDIO_UNICAST_ANNOUNCEMENT_TARGETED, BT_BYTES_LIST_LE16(SINK_CONTEXT), + BT_BYTES_LIST_LE16(SOURCE_CONTEXT), 0x00, + /* Metadata length */), +#endif /* CONFIG_BT_BAP_UNICAST_SERVER */ +#if defined(CONFIG_BT_BAP_SCAN_DELEGATOR) + BT_DATA_BYTES(BT_DATA_SVC_DATA16, BT_UUID_16_ENCODE(BT_UUID_BASS_VAL)), +#endif /* CONFIG_BT_BAP_SCAN_DELEGATOR */ +#if defined(CONFIG_BT_CSIP_SET_MEMBER) + BT_DATA(BT_DATA_CSIS_RSI, csip_rsi, BT_CSIP_RSI_SIZE), +#endif /* CONFIG_BT_CSIP_SET_MEMBER */ +#if defined(CONFIG_BT_TMAP) + BT_DATA_BYTES(BT_DATA_SVC_DATA16, BT_UUID_16_ENCODE(BT_UUID_TMAS_VAL), + BT_UUID_16_ENCODE(TMAP_ROLE_SUPPORTED)), +#endif /* CONFIG_BT_TMAP */ }; static void device_found(const struct bt_le_scan_recv_info *info, struct net_buf_simple *ad_buf) @@ -51,8 +86,9 @@ static void device_found(const struct bt_le_scan_recv_info *info, struct net_buf return; } - /* We're only interested in connectable events */ - if ((info->adv_props & BT_GAP_ADV_PROP_CONNECTABLE) == 0) { + /* We're only interested in extended advertising connectable events */ + if (((info->adv_props & BT_GAP_ADV_PROP_EXT_ADV) == 0U || + (info->adv_props & BT_GAP_ADV_PROP_CONNECTABLE) == 0U)) { return; } @@ -71,7 +107,7 @@ static void device_found(const struct bt_le_scan_recv_info *info, struct net_buf return; } - err = bt_conn_le_create(info->addr, BT_CONN_LE_CREATE_CONN, BT_LE_CONN_PARAM_DEFAULT, + err = bt_conn_le_create(info->addr, BT_CONN_LE_CREATE_CONN, BT_BAP_CONN_PARAM_RELAXED, &default_conn); if (err) { FAIL("Could not connect to peer: %d", err); @@ -150,6 +186,67 @@ BT_CONN_CB_DEFINE(conn_callbacks) = { .security_changed = security_changed_cb, }; + +void setup_connectable_adv(struct bt_le_ext_adv **ext_adv) +{ + int err; + + /* Create a non-connectable advertising set */ + err = bt_le_ext_adv_create(BT_BAP_ADV_PARAM_CONN_QUICK, NULL, ext_adv); + if (err != 0) { + FAIL("Unable to create extended advertising set: %d\n", err); + return; + } + + err = bt_le_ext_adv_set_data(*ext_adv, connectable_ad, ARRAY_SIZE(connectable_ad), NULL, 0); + if (err != 0) { + FAIL("Unable to set extended advertising data: %d\n", err); + + bt_le_ext_adv_delete(*ext_adv); + + return; + } + + err = bt_le_ext_adv_start(*ext_adv, BT_LE_EXT_ADV_START_DEFAULT); + if (err != 0) { + FAIL("Failed to start advertising set (err %d)\n", err); + + bt_le_ext_adv_delete(*ext_adv); + + return; + } + + printk("Advertising started\n"); +} + +void setup_broadcast_adv(struct bt_le_ext_adv **adv) +{ + struct bt_le_adv_param ext_adv_param = *BT_BAP_ADV_PARAM_BROADCAST_SLOW; + int err; + + /* Zephyr Controller works best while Extended Advertising interval is a multiple + * of the ISO Interval minus 10 ms (max. advertising random delay). This is + * required to place the AUX_ADV_IND PDUs in a non-overlapping interval with the + * Broadcast ISO radio events. + */ + ext_adv_param.interval_min -= BT_GAP_MS_TO_ADV_INTERVAL(10U); + ext_adv_param.interval_max -= BT_GAP_MS_TO_ADV_INTERVAL(10U); + + /* Create a non-connectable advertising set */ + err = bt_le_ext_adv_create(&ext_adv_param, NULL, adv); + if (err != 0) { + FAIL("Unable to create extended advertising set: %d\n", err); + return; + } + + /* Set periodic advertising parameters */ + err = bt_le_per_adv_set_param(*adv, BT_BAP_PER_ADV_PARAM_BROADCAST_SLOW); + if (err) { + FAIL("Failed to set periodic advertising parameters: %d\n", err); + return; + } +} + void test_tick(bs_time_t HW_device_time) { if (bst_result != Passed) { diff --git a/tests/bsim/bluetooth/audio/src/common.h b/tests/bsim/bluetooth/audio/src/common.h index 9e9b8a354b8..8584b7ea91a 100644 --- a/tests/bsim/bluetooth/audio/src/common.h +++ b/tests/bsim/bluetooth/audio/src/common.h @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -26,6 +27,7 @@ #include #include #include +#include #include #include @@ -80,9 +82,13 @@ static const uint8_t mock_iso_data[] = { #define SET_FLAG(flag) (void)atomic_set(&flag, (atomic_t)true) #define UNSET_FLAG(flag) (void)atomic_clear(&flag) #define TEST_FLAG(flag) (atomic_get(&flag) == (atomic_t)true) -#define WAIT_FOR_FLAG(flag) \ - while (!(bool)atomic_get(&flag)) { \ - (void)k_sleep(K_MSEC(1)); \ +#define WAIT_FOR_FLAG(flag) \ + while (!(bool)atomic_get(&flag)) { \ + (void)k_sleep(K_MSEC(1)); \ + } +#define WAIT_FOR_AND_CLEAR_FLAG(flag) \ + while (!(bool)atomic_clear(&flag)) { \ + (void)k_sleep(K_MSEC(1)); \ } #define WAIT_FOR_UNSET_FLAG(flag) \ while (atomic_get(&flag) != (atomic_t)false) { \ @@ -102,23 +108,38 @@ extern enum bst_result_t bst_result; bs_trace_info_time(1, "PASSED: " __VA_ARGS__); \ } while (0) -#define AD_SIZE 1 - #define PA_SYNC_INTERVAL_TO_TIMEOUT_RATIO 20 /* Set the timeout relative to interval */ #define PA_SYNC_SKIP 5 #define PBP_STREAMS_TO_SEND 2 +#define SINK_CONTEXT \ + (BT_AUDIO_CONTEXT_TYPE_UNSPECIFIED | BT_AUDIO_CONTEXT_TYPE_MEDIA | \ + BT_AUDIO_CONTEXT_TYPE_CONVERSATIONAL) +#define SOURCE_CONTEXT \ + (BT_AUDIO_CONTEXT_TYPE_UNSPECIFIED | BT_AUDIO_CONTEXT_TYPE_CONVERSATIONAL | \ + BT_AUDIO_CONTEXT_TYPE_NOTIFICATIONS) + +#define TMAP_ROLE_SUPPORTED \ + ((IS_ENABLED(CONFIG_BT_TMAP_CG_SUPPORTED) ? BT_TMAP_ROLE_CG : 0U) | \ + (IS_ENABLED(CONFIG_BT_TMAP_CT_SUPPORTED) ? BT_TMAP_ROLE_CT : 0U) | \ + (IS_ENABLED(CONFIG_BT_TMAP_UMS_SUPPORTED) ? BT_TMAP_ROLE_UMS : 0U) | \ + (IS_ENABLED(CONFIG_BT_TMAP_UMR_SUPPORTED) ? BT_TMAP_ROLE_UMR : 0U) | \ + (IS_ENABLED(CONFIG_BT_TMAP_BMS_SUPPORTED) ? BT_TMAP_ROLE_BMS : 0U) | \ + (IS_ENABLED(CONFIG_BT_TMAP_BMR_SUPPORTED) ? BT_TMAP_ROLE_BMR : 0U)) + extern struct bt_le_scan_cb common_scan_cb; -extern const struct bt_data ad[AD_SIZE]; extern struct bt_conn *default_conn; extern atomic_t flag_connected; extern atomic_t flag_disconnected; extern atomic_t flag_conn_updated; extern atomic_t flag_audio_received; extern volatile bt_security_t security_level; +extern uint8_t csip_rsi[BT_CSIP_RSI_SIZE]; void disconnected(struct bt_conn *conn, uint8_t reason); +void setup_connectable_adv(struct bt_le_ext_adv **ext_adv); +void setup_broadcast_adv(struct bt_le_ext_adv **adv); void test_tick(bs_time_t HW_device_time); void test_init(void); uint16_t get_dev_cnt(void); diff --git a/tests/bsim/bluetooth/audio/src/csip_notify_server_test.c b/tests/bsim/bluetooth/audio/src/csip_notify_server_test.c index 0f804ed15c9..f1254e9822d 100644 --- a/tests/bsim/bluetooth/audio/src/csip_notify_server_test.c +++ b/tests/bsim/bluetooth/audio/src/csip_notify_server_test.c @@ -52,15 +52,13 @@ static struct bt_csip_set_member_cb csip_cb = { static void test_main(void) { int err; - const struct bt_data ad[] = { - BT_DATA_BYTES(BT_DATA_FLAGS, (BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR)), - }; struct bt_csip_set_member_register_param csip_params = { .set_size = 1, .rank = 1, .lockable = true, - .cb = &csip_cb, + .cb = &csip_cb, }; + struct bt_le_ext_adv *ext_adv; printk("Enabling Bluetooth\n"); err = bt_enable(NULL); @@ -77,12 +75,7 @@ static void test_main(void) return; } - printk("Start Advertising\n"); - err = bt_le_adv_start(BT_LE_ADV_CONN_FAST_1, ad, ARRAY_SIZE(ad), NULL, 0); - if (err != 0) { - FAIL("Advertising failed to start (err %d)\n", err); - return; - } + setup_connectable_adv(&ext_adv); printk("Waiting to be connected\n"); WAIT_FOR_FLAG(flag_connected); @@ -100,17 +93,11 @@ static void test_main(void) return; } - /* Now wait for client to disconnect, then stop adv so it does not reconnect */ + /* Now wait for client to disconnect */ printk("Wait for client disconnect\n"); WAIT_FOR_UNSET_FLAG(flag_connected); printk("Client disconnected\n"); - err = bt_le_adv_stop(); - if (err != 0) { - FAIL("Advertising failed to stop (err %d)\n", err); - return; - } - /* Trigger changes while device is disconnected */ err = bt_csip_set_member_lock(svc_inst, false, false); if (err != 0) { @@ -119,9 +106,12 @@ static void test_main(void) } printk("Start Advertising\n"); - err = bt_le_adv_start(BT_LE_ADV_CONN_FAST_1, ad, ARRAY_SIZE(ad), NULL, 0); + err = bt_le_ext_adv_start(ext_adv, BT_LE_EXT_ADV_START_DEFAULT); if (err != 0) { - FAIL("Advertising failed to start (err %d)\n", err); + FAIL("Failed to start advertising set (err %d)\n", err); + + bt_le_ext_adv_delete(ext_adv); + return; } diff --git a/tests/bsim/bluetooth/audio/src/csip_set_coordinator_test.c b/tests/bsim/bluetooth/audio/src/csip_set_coordinator_test.c index f312fe44b7e..294002ec307 100644 --- a/tests/bsim/bluetooth/audio/src/csip_set_coordinator_test.c +++ b/tests/bsim/bluetooth/audio/src/csip_set_coordinator_test.c @@ -10,6 +10,7 @@ #include #include +#include #include #include #include @@ -39,6 +40,7 @@ static volatile bool ordered_access_locked; static volatile bool ordered_access_unlocked; static const struct bt_csip_set_coordinator_csis_inst *primary_inst; CREATE_FLAG(flag_sirk_changed); +CREATE_FLAG(flag_size_changed); static uint8_t connected_member_count; static uint8_t members_found; @@ -138,6 +140,14 @@ static void csip_sirk_changed_cb(struct bt_csip_set_coordinator_csis_inst *inst) SET_FLAG(flag_sirk_changed); } +static void csip_size_changed_cb(struct bt_conn *conn, + const struct bt_csip_set_coordinator_csis_inst *inst) +{ + printk("Inst %p size changed: %u\n", inst, inst->info.set_size); + + SET_FLAG(flag_size_changed); +} + static void csip_set_coordinator_ordered_access_cb( const struct bt_csip_set_coordinator_set_info *set_info, int err, bool locked, struct bt_csip_set_coordinator_set_member *member) @@ -159,6 +169,7 @@ static struct bt_csip_set_coordinator_cb cbs = { .discover = csip_discover_cb, .lock_changed = csip_lock_changed_cb, .sirk_changed = csip_sirk_changed_cb, + .size_changed = csip_size_changed_cb, .ordered_access = csip_set_coordinator_ordered_access_cb, }; @@ -185,7 +196,8 @@ static bool is_discovered(const bt_addr_le_t *addr) static bool csip_found(struct bt_data *data, void *user_data) { - if (bt_csip_set_coordinator_is_set_member(primary_inst->info.sirk, data)) { + if (primary_inst == NULL || + bt_csip_set_coordinator_is_set_member(primary_inst->info.sirk, data)) { const bt_addr_le_t *addr = user_data; char addr_str[BT_ADDR_LE_STR_LEN]; @@ -200,7 +212,7 @@ static bool csip_found(struct bt_data *data, void *user_data) bt_addr_le_copy(&addr_found[members_found++], addr); - if (primary_inst->info.set_size == 0) { + if (primary_inst == NULL || primary_inst->info.set_size == 0) { printk("Found member %u\n", members_found); } else { printk("Found member (%u / %u)\n", members_found, @@ -218,16 +230,9 @@ static void csip_set_coordinator_scan_recv(const struct bt_le_scan_recv_info *in struct net_buf_simple *ad) { /* We're only interested in connectable events */ - if (info->adv_props & BT_GAP_ADV_PROP_CONNECTABLE) { - if (primary_inst == NULL) { - /* Scanning for the first device */ - if (members_found == 0) { - bt_addr_le_copy(&addr_found[members_found++], - info->addr); - } - } else { /* Scanning for set members */ - bt_data_parse(ad, csip_found, (void *)info->addr); - } + if ((info->adv_props & BT_GAP_ADV_PROP_EXT_ADV) != 0U && + (info->adv_props & BT_GAP_ADV_PROP_CONNECTABLE) != 0U) { + bt_data_parse(ad, csip_found, (void *)info->addr); } } @@ -334,8 +339,8 @@ static void connect_set(void) } bt_addr_le_to_str(&addr_found[0], addr, sizeof(addr)); - err = bt_conn_le_create(&addr_found[0], BT_CONN_LE_CREATE_CONN, - BT_LE_CONN_PARAM_DEFAULT, &conns[0]); + err = bt_conn_le_create(&addr_found[0], BT_CONN_LE_CREATE_CONN, BT_BAP_CONN_PARAM_RELAXED, + &conns[0]); if (err != 0) { FAIL("Failed to connect to %s: %d\n", err); @@ -519,6 +524,24 @@ static void test_new_sirk(void) PASS("All members disconnected\n"); } +static void test_new_size_and_rank(void) +{ + init(); + connect_set(); + + backchannel_sync_send_all(); + backchannel_sync_wait_all(); + + /* We won't get a new rank in a notification. For this test we only verify that we get a new + * size + */ + WAIT_FOR_FLAG(flag_size_changed); + + disconnect_set(); + + PASS("All members disconnected\n"); +} + static void test_args(int argc, char *argv[]) { for (int argn = 0; argn < argc; argn++) { @@ -551,6 +574,13 @@ static const struct bst_test_instance test_connect[] = { .test_main_f = test_new_sirk, .test_args_f = test_args, }, + { + .test_id = "csip_set_coordinator_new_size_and_rank", + .test_pre_init_f = test_init, + .test_tick_f = test_tick, + .test_main_f = test_new_size_and_rank, + .test_args_f = test_args, + }, BSTEST_END_MARKER, }; diff --git a/tests/bsim/bluetooth/audio/src/csip_set_member_test.c b/tests/bsim/bluetooth/audio/src/csip_set_member_test.c index e144866ab32..faa7dbdaff5 100644 --- a/tests/bsim/bluetooth/audio/src/csip_set_member_test.c +++ b/tests/bsim/bluetooth/audio/src/csip_set_member_test.c @@ -24,12 +24,10 @@ extern enum bst_result_t bst_result; static volatile bool g_locked; static uint8_t sirk_read_req_rsp = BT_CSIP_READ_SIRK_REQ_RSP_ACCEPT; struct bt_csip_set_member_register_param param = { - .set_size = 3, - .rank = 1, .lockable = true, /* Using the CSIS test sample SIRK */ - .sirk = { 0xcd, 0xcc, 0x72, 0xdd, 0x86, 0x8c, 0xcd, 0xce, - 0x22, 0xfd, 0xa1, 0x21, 0x09, 0x7d, 0x7d, 0x45 }, + .sirk = {0xcd, 0xcc, 0x72, 0xdd, 0x86, 0x8c, 0xcd, 0xce, 0x22, 0xfd, 0xa1, 0x21, 0x09, 0x7d, + 0x7d, 0x45}, }; static void csip_lock_changed_cb(struct bt_conn *conn, @@ -53,11 +51,7 @@ static struct bt_csip_set_member_cb csip_cbs = { static void bt_ready(int err) { - uint8_t rsi[BT_CSIP_RSI_SIZE]; - struct bt_data ad[] = { - BT_DATA_BYTES(BT_DATA_FLAGS, (BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR)), - BT_CSIP_DATA_RSI(rsi), - }; + struct bt_le_ext_adv *ext_adv; if (err != 0) { FAIL("Bluetooth init failed (err %d)\n", err); @@ -74,16 +68,13 @@ static void bt_ready(int err) return; } - err = bt_csip_set_member_generate_rsi(svc_inst, rsi); + err = bt_csip_set_member_generate_rsi(svc_inst, csip_rsi); if (err != 0) { FAIL("Failed to generate RSI (err %d)\n", err); return; } - err = bt_le_adv_start(BT_LE_ADV_CONN_FAST_1, ad, ARRAY_SIZE(ad), NULL, 0); - if (err != 0) { - FAIL("Advertising failed to start (err %d)\n", err); - } + setup_connectable_adv(&ext_adv); } static void test_sirk(void) @@ -115,6 +106,56 @@ static void test_sirk(void) printk("New SIRK correctly set and retrieved\n"); } +static void update_set_size_and_rank(void) +{ + struct bt_csip_set_member_set_info info; + uint8_t old_set_size; + uint8_t old_rank; + uint8_t new_set_size; + uint8_t new_rank; + int err; + + err = bt_csip_set_member_get_info(svc_inst, &info); + if (err != 0) { + FAIL("Failed to get SIRK: %d\n", err); + return; + } + + /* Simulate a new device being added as rank 1 to the set, making the set size increase by 1 + * and this device's rank increase by 1 + */ + old_set_size = info.set_size; + old_rank = info.rank; + new_set_size = old_set_size + 1U; + new_rank = old_rank + 1U; + + printk("Setting new SIRK\n"); + err = bt_csip_set_member_set_size_and_rank(svc_inst, new_set_size, new_rank); + if (err != 0) { + FAIL("Failed to set new size and rank: %d\n", err); + return; + } + + printk("Getting new SIRK\n"); + err = bt_csip_set_member_get_info(svc_inst, &info); + if (err != 0) { + FAIL("Failed to get SIRK: %d\n", err); + return; + } + + if (info.set_size != new_set_size) { + FAIL("Unexpected set size %u != %u\n", info.set_size, new_set_size); + return; + } + + if (info.rank != new_rank) { + FAIL("Unexpected rank %u != %u\n", info.rank, new_rank); + return; + } + + printk("New size correctly set and retrieved\n"); +} + static void test_main(void) { int err; @@ -217,6 +258,36 @@ static void test_new_sirk(void) PASS("CSIP Set member passed: Client successfully disconnected\n"); } +static void test_new_set_size_and_rank(void) +{ + int err; + + err = bt_enable(bt_ready); + + if (err != 0) { + FAIL("Bluetooth init failed (err %d)\n", err); + return; + } + + WAIT_FOR_FLAG(flag_connected); + + backchannel_sync_send_all(); + backchannel_sync_wait_all(); + + update_set_size_and_rank(); + + WAIT_FOR_UNSET_FLAG(flag_connected); + + err = bt_csip_set_member_unregister(svc_inst); + if (err != 0) { + FAIL("Could not unregister CSIP (err %d)\n", err); + return; + } + svc_inst = NULL; + + PASS("CSIP Set member passed: Client successfully disconnected\n"); +} + static void test_args(int argc, char *argv[]) { for (size_t argn = 0; argn < argc; argn++) { @@ -274,6 +345,13 @@ static const struct bst_test_instance test_connect[] = { .test_main_f = test_new_sirk, .test_args_f = test_args, }, + { + .test_id = "csip_set_member_new_size_and_rank", + .test_pre_init_f = test_init, + .test_tick_f = test_tick, + .test_main_f = test_new_set_size_and_rank, + .test_args_f = test_args, + }, BSTEST_END_MARKER, }; diff --git a/tests/bsim/bluetooth/audio/src/gmap_ugg_test.c b/tests/bsim/bluetooth/audio/src/gmap_ugg_test.c index 6d9b735f834..0e048416a13 100644 --- a/tests/bsim/bluetooth/audio/src/gmap_ugg_test.c +++ b/tests/bsim/bluetooth/audio/src/gmap_ugg_test.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -40,18 +41,6 @@ #include "bap_common.h" #if defined(CONFIG_BT_GMAP) -/* Zephyr Controller works best while Extended Advertising interval to be a multiple - * of the ISO Interval minus 10 ms (max. advertising random delay). This is - * required to place the AUX_ADV_IND PDUs in a non-overlapping interval with the - * Broadcast ISO radio events. - */ -#define BT_LE_EXT_ADV_CUSTOM \ - BT_LE_ADV_PARAM(BT_LE_ADV_OPT_EXT_ADV, BT_GAP_MS_TO_ADV_INTERVAL(80), \ - BT_GAP_MS_TO_ADV_INTERVAL(80), NULL) - -#define BT_LE_PER_ADV_CUSTOM \ - BT_LE_PER_ADV_PARAM(BT_GAP_MS_TO_PER_ADV_INTERVAL(90), BT_GAP_MS_TO_PER_ADV_INTERVAL(90), \ - BT_LE_PER_ADV_OPT_NONE) #define UNICAST_SINK_SUPPORTED (CONFIG_BT_BAP_UNICAST_CLIENT_ASE_SNK_COUNT > 0) #define UNICAST_SRC_SUPPORTED (CONFIG_BT_BAP_UNICAST_CLIENT_ASE_SRC_COUNT > 0) @@ -424,6 +413,49 @@ static const struct bt_gmap_cb gmap_cb = { .discover = gmap_discover_cb, }; +static void scan_recv_cb(const struct bt_le_scan_recv_info *info, struct net_buf_simple *buf) +{ + char addr_str[BT_ADDR_LE_STR_LEN]; + struct bt_conn *conn; + int err; + + /* Check for connectable, extended advertising */ + if (((info->adv_props & BT_GAP_ADV_PROP_EXT_ADV) == 0) || + ((info->adv_props & BT_GAP_ADV_PROP_CONNECTABLE)) == 0) { + /* We're only interested in connectable extended advertising */ + } + + conn = bt_conn_lookup_addr_le(BT_ID_DEFAULT, info->addr); + if (conn != NULL) { + /* Already connected to this device */ + bt_conn_unref(conn); + return; + } + + bt_addr_le_to_str(info->addr, addr_str, sizeof(addr_str)); + printk("Device found: %s (RSSI %d)\n", addr_str, info->rssi); + + /* connect only to devices in close proximity */ + if (info->rssi < -70) { + FAIL("RSSI too low"); + return; + } + + printk("Stopping scan\n"); + if (bt_le_scan_stop()) { + FAIL("Could not stop scan"); + return; + } + + err = bt_conn_le_create(info->addr, BT_CONN_LE_CREATE_CONN, + BT_LE_CONN_PARAM(BT_GAP_INIT_CONN_INT_MIN, BT_GAP_INIT_CONN_INT_MIN, + 0, BT_GAP_MS_TO_CONN_TIMEOUT(4000)), + &connected_conns[connected_conn_cnt]); + if (err != 0) { + FAIL("Could not connect to peer: %d", err); + } +} + static void init(void) { const struct bt_gmap_feat features = { @@ -431,6 +463,9 @@ static void init(void) BT_GMAP_UGG_FEAT_MULTISINK), }; const enum bt_gmap_role role = BT_GMAP_ROLE_UGG; + static struct bt_le_scan_cb scan_cb = { + .recv = scan_recv_cb, + }; int err; err = bt_enable(NULL); @@ -443,6 +478,11 @@ static void init(void) bap_stream_tx_init(); bt_gatt_cb_register(&gatt_callbacks); + err = bt_le_scan_cb_register(&scan_cb); + if (err != 0) { + FAIL("Failed to register scan callbacks (err %d)\n", err); + return; + } err = bt_bap_unicast_client_register_cb(&unicast_client_cbs); if (err != 0) { @@ -480,56 +520,13 @@ static void init(void) } } -static void gmap_device_found(const bt_addr_le_t *addr, int8_t rssi, uint8_t type, - struct net_buf_simple *ad) -{ - char addr_str[BT_ADDR_LE_STR_LEN]; - struct bt_conn *conn; - int err; - - /* We're only interested in connectable events */ - if (type != BT_HCI_ADV_IND && type != BT_HCI_ADV_DIRECT_IND) { - return; - } - - conn = bt_conn_lookup_addr_le(BT_ID_DEFAULT, addr); - if (conn != NULL) { - /* Already connected to this device */ - bt_conn_unref(conn); - return; - } - - bt_addr_le_to_str(addr, addr_str, sizeof(addr_str)); - printk("Device found: %s (RSSI %d)\n", addr_str, rssi); - - /* connect only to devices in close proximity */ - if (rssi < -70) { - FAIL("RSSI too low"); - return; - } - - printk("Stopping scan\n"); - if (bt_le_scan_stop()) { - FAIL("Could not stop scan"); - return; - } - - err = bt_conn_le_create(addr, BT_CONN_LE_CREATE_CONN, - BT_LE_CONN_PARAM(BT_GAP_INIT_CONN_INT_MIN, BT_GAP_INIT_CONN_INT_MIN, - 0, BT_GAP_MS_TO_CONN_TIMEOUT(4000)), - &connected_conns[connected_conn_cnt]); - if (err) { - FAIL("Could not connect to peer: %d", err); - } -} - static void scan_and_connect(void) { int err; UNSET_FLAG(flag_connected); - err = bt_le_scan_start(BT_LE_SCAN_PASSIVE, gmap_device_found); + err = bt_le_scan_start(BT_LE_SCAN_PASSIVE, NULL); if (err != 0) { FAIL("Scanning failed to start (err %d)\n", err); return; @@ -993,25 +990,6 @@ static void test_gmap_ugg_unicast_ac(const struct gmap_unicast_ac_param *param) param->src_named_preset != NULL ? param->src_named_preset->name : "None"); } -static void setup_extended_adv(struct bt_le_ext_adv **adv) -{ - int err; - - /* Create a non-connectable advertising set */ - err = bt_le_ext_adv_create(BT_LE_EXT_ADV_CUSTOM, NULL, adv); - if (err != 0) { - FAIL("Unable to create extended advertising set: %d\n", err); - return; - } - - /* Set periodic advertising parameters */ - err = bt_le_per_adv_set_param(*adv, BT_LE_PER_ADV_CUSTOM); - if (err) { - FAIL("Failed to set periodic advertising parameters: %d\n", err); - return; - } -} - static void setup_extended_adv_data(struct bt_cap_broadcast_source *source, struct bt_le_ext_adv *adv) { @@ -1198,7 +1176,7 @@ static int test_gmap_ugg_broadcast_ac(const struct gmap_broadcast_ac_param *para create_param.qos = &qos; init(); - setup_extended_adv(&adv); + setup_broadcast_adv(&adv); err = bt_cap_initiator_broadcast_audio_create(&create_param, &broadcast_source); if (err != 0) { diff --git a/tests/bsim/bluetooth/audio/src/gmap_ugt_test.c b/tests/bsim/bluetooth/audio/src/gmap_ugt_test.c index d5ba537596f..d8c259199ca 100644 --- a/tests/bsim/bluetooth/audio/src/gmap_ugt_test.c +++ b/tests/bsim/bluetooth/audio/src/gmap_ugt_test.c @@ -88,12 +88,6 @@ static struct bt_bap_stream_ops unicast_stream_ops = { .started = unicast_stream_started_cb, }; -/* TODO: Expand with GMAP service data */ -static const struct bt_data gmap_acceptor_ad[] = { - BT_DATA_BYTES(BT_DATA_FLAGS, (BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR)), - BT_DATA_BYTES(BT_DATA_UUID16_ALL, BT_UUID_16_ENCODE(BT_UUID_CAS_VAL)), -}; - static struct bt_csip_set_member_svc_inst *csip_set_member; static struct bt_bap_stream *unicast_stream_alloc(void) @@ -368,6 +362,7 @@ static void test_main(void) static struct bt_pacs_cap unicast_cap = { .codec_cap = &codec_cap, }; + struct bt_le_ext_adv *ext_adv; int err; err = bt_enable(NULL); @@ -445,12 +440,7 @@ static void test_main(void) return; } - err = bt_le_adv_start(BT_LE_ADV_CONN_FAST_1, gmap_acceptor_ad, ARRAY_SIZE(gmap_acceptor_ad), - NULL, 0); - if (err != 0) { - FAIL("Advertising failed to start (err %d)\n", err); - return; - } + setup_connectable_adv(&ext_adv); WAIT_FOR_FLAG(flag_connected); diff --git a/tests/bsim/bluetooth/audio/src/has_test.c b/tests/bsim/bluetooth/audio/src/has_test.c index ca74bb5d345..83a73367369 100644 --- a/tests/bsim/bluetooth/audio/src/has_test.c +++ b/tests/bsim/bluetooth/audio/src/has_test.c @@ -41,15 +41,9 @@ static const struct bt_has_preset_ops preset_ops = { static void start_adv(void) { - int err; - - err = bt_le_adv_start(BT_LE_ADV_CONN_FAST_1, ad, AD_SIZE, NULL, 0); - if (err) { - FAIL("Advertising failed to start (err %d)\n", err); - return; - } + struct bt_le_ext_adv *ext_adv; - LOG_DBG("Advertising successfully started"); + setup_connectable_adv(&ext_adv); } static void test_common(void) diff --git a/tests/bsim/bluetooth/audio/src/ias_test.c b/tests/bsim/bluetooth/audio/src/ias_test.c index b7c93af20d4..a951a5f57f3 100644 --- a/tests/bsim/bluetooth/audio/src/ias_test.c +++ b/tests/bsim/bluetooth/audio/src/ias_test.c @@ -50,6 +50,7 @@ BT_IAS_CB_DEFINE(ias_callbacks) = { static void test_main(void) { + struct bt_le_ext_adv *ext_adv; int err; err = bt_enable(NULL); @@ -58,13 +59,7 @@ static void test_main(void) return; } - err = bt_le_adv_start(BT_LE_ADV_CONN_FAST_1, ad, AD_SIZE, NULL, 0); - if (err) { - FAIL("Advertising failed to start (err %d)\n", err); - return; - } - - printk("Advertising successfully started\n"); + setup_connectable_adv(&ext_adv); WAIT_FOR_FLAG(flag_connected); diff --git a/tests/bsim/bluetooth/audio/src/mcs_test.c b/tests/bsim/bluetooth/audio/src/mcs_test.c index c049bc911d7..d87d0560f60 100644 --- a/tests/bsim/bluetooth/audio/src/mcs_test.c +++ b/tests/bsim/bluetooth/audio/src/mcs_test.c @@ -16,21 +16,9 @@ #ifdef CONFIG_BT_MCS extern enum bst_result_t bst_result; -static void start_adv(void) -{ - int err; - - err = bt_le_adv_start(BT_LE_ADV_CONN_FAST_1, ad, AD_SIZE, NULL, 0); - if (err) { - FAIL("Advertising failed to start (err %d)\n", err); - return; - } - - printk("Advertising successfully started\n"); -} - static void test_main(void) { + struct bt_le_ext_adv *ext_adv; int err; printk("Media Control Server test application. Board: %s\n", CONFIG_BOARD); @@ -50,12 +38,22 @@ static void test_main(void) } printk("Bluetooth initialized\n"); + setup_connectable_adv(&ext_adv); + PASS("MCS passed\n"); while (1) { - start_adv(); WAIT_FOR_FLAG(flag_connected); WAIT_FOR_UNSET_FLAG(flag_connected); + + err = bt_le_ext_adv_start(ext_adv, BT_LE_EXT_ADV_START_DEFAULT); + if (err != 0) { + FAIL("Failed to start advertising set (err %d)\n", err); + + bt_le_ext_adv_delete(ext_adv); + + return; + } } } diff --git a/tests/bsim/bluetooth/audio/src/media_controller_test.c b/tests/bsim/bluetooth/audio/src/media_controller_test.c index 34faffc0dbb..5a307de3789 100644 --- a/tests/bsim/bluetooth/audio/src/media_controller_test.c +++ b/tests/bsim/bluetooth/audio/src/media_controller_test.c @@ -1649,16 +1649,14 @@ void test_media_controller_local_player(void) /* BabbleSim entry point for remote player test */ void test_media_controller_remote_player(void) { - int err; + struct bt_le_ext_adv *ext_adv; + printk("Media Control remote player test application. Board: %s\n", CONFIG_BOARD); initialize_bluetooth(); initialize_media(); - err = bt_le_adv_start(BT_LE_ADV_CONN_FAST_1, ad, AD_SIZE, NULL, 0); - if (err) { - FAIL("Advertising failed to start (err %d)\n", err); - } + setup_connectable_adv(&ext_adv); WAIT_FOR_FLAG(flag_connected); diff --git a/tests/bsim/bluetooth/audio/src/micp_mic_dev_test.c b/tests/bsim/bluetooth/audio/src/micp_mic_dev_test.c index bc8c820b702..b6281b7f6a6 100644 --- a/tests/bsim/bluetooth/audio/src/micp_mic_dev_test.c +++ b/tests/bsim/bluetooth/audio/src/micp_mic_dev_test.c @@ -385,6 +385,7 @@ static void test_main(void) { int err; struct bt_micp_mic_dev_register_param micp_param; + struct bt_le_ext_adv *ext_adv; err = bt_enable(NULL); if (err != 0) { @@ -431,14 +432,7 @@ static void test_main(void) } printk("MICP initialized\n"); - - err = bt_le_adv_start(BT_LE_ADV_CONN_FAST_1, ad, AD_SIZE, NULL, 0); - if (err != 0) { - FAIL("Advertising failed to start (err %d)\n", err); - return; - } - - printk("Advertising successfully started\n"); + setup_connectable_adv(&ext_adv); WAIT_FOR_FLAG(flag_connected); diff --git a/tests/bsim/bluetooth/audio/src/pacs_notify_server_test.c b/tests/bsim/bluetooth/audio/src/pacs_notify_server_test.c index cbd4fc75111..a9ebce0e73d 100644 --- a/tests/bsim/bluetooth/audio/src/pacs_notify_server_test.c +++ b/tests/bsim/bluetooth/audio/src/pacs_notify_server_test.c @@ -158,9 +158,7 @@ static void test_main(void) { int err; enum bt_audio_context available, available_for_conn; - const struct bt_data ad[] = { - BT_DATA_BYTES(BT_DATA_FLAGS, (BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR)), - }; + struct bt_le_ext_adv *ext_adv; LOG_DBG("Enabling Bluetooth"); err = bt_enable(NULL); @@ -191,11 +189,7 @@ static void test_main(void) } LOG_DBG("Start Advertising"); - err = bt_le_adv_start(BT_LE_ADV_CONN_FAST_1, ad, ARRAY_SIZE(ad), NULL, 0); - if (err != 0) { - FAIL("Advertising failed to start (err %d)", err); - return; - } + setup_connectable_adv(&ext_adv); LOG_DBG("Waiting to be connected"); WAIT_FOR_FLAG(flag_connected); @@ -210,24 +204,21 @@ static void test_main(void) LOG_INF("Trigger changes while device is connected"); trigger_notifications(); - /* Now wait for client to disconnect, then stop adv so it does not reconnect */ + /* Now wait for client to disconnect */ LOG_DBG("Wait for client disconnect"); WAIT_FOR_UNSET_FLAG(flag_connected); LOG_DBG("Client disconnected"); - err = bt_le_adv_stop(); - if (err != 0) { - FAIL("Advertising failed to stop (err %d)", err); - return; - } - LOG_INF("Trigger changes while device is disconnected"); trigger_notifications(); LOG_DBG("Start Advertising"); - err = bt_le_adv_start(BT_LE_ADV_CONN_FAST_1, ad, ARRAY_SIZE(ad), NULL, 0); + err = bt_le_ext_adv_start(ext_adv, BT_LE_EXT_ADV_START_DEFAULT); if (err != 0) { - FAIL("Advertising failed to start (err %d)", err); + FAIL("Failed to start advertising set (err %d)\n", err); + + bt_le_ext_adv_delete(ext_adv); + return; } @@ -235,16 +226,13 @@ static void test_main(void) WAIT_FOR_UNSET_FLAG(flag_connected); LOG_DBG("Client disconnected"); - err = bt_le_adv_stop(); - if (err != 0) { - FAIL("Advertising failed to stop (err %d)", err); - return; - } - LOG_DBG("Start Advertising"); - err = bt_le_adv_start(BT_LE_ADV_CONN_FAST_1, ad, ARRAY_SIZE(ad), NULL, 0); + err = bt_le_ext_adv_start(ext_adv, BT_LE_EXT_ADV_START_DEFAULT); if (err != 0) { - FAIL("Advertising failed to start (err %d)", err); + FAIL("Failed to start advertising set (err %d)\n", err); + + bt_le_ext_adv_delete(ext_adv); + return; } @@ -269,16 +257,13 @@ static void test_main(void) WAIT_FOR_UNSET_FLAG(flag_connected); LOG_DBG("Client disconnected"); - err = bt_le_adv_stop(); - if (err != 0) { - FAIL("Advertising failed to stop (err %d)", err); - return; - } - LOG_DBG("Start Advertising"); - err = bt_le_adv_start(BT_LE_ADV_CONN_FAST_1, ad, ARRAY_SIZE(ad), NULL, 0); + err = bt_le_ext_adv_start(ext_adv, BT_LE_EXT_ADV_START_DEFAULT); if (err != 0) { - FAIL("Advertising failed to start (err %d)", err); + FAIL("Failed to start advertising set (err %d)\n", err); + + bt_le_ext_adv_delete(ext_adv); + return; } diff --git a/tests/bsim/bluetooth/audio/src/pbp_public_broadcast_source_test.c b/tests/bsim/bluetooth/audio/src/pbp_public_broadcast_source_test.c index 65f49f675b6..9bce5941be4 100644 --- a/tests/bsim/bluetooth/audio/src/pbp_public_broadcast_source_test.c +++ b/tests/bsim/bluetooth/audio/src/pbp_public_broadcast_source_test.c @@ -197,29 +197,6 @@ static int start_extended_adv(struct bt_le_ext_adv *adv) return 0; } -static int setup_extended_adv(struct bt_le_ext_adv **adv) -{ - int err; - - /* Create a non-connectable advertising set */ - err = bt_le_ext_adv_create(BT_LE_EXT_ADV_NCONN, NULL, adv); - if (err != 0) { - printk("Unable to create extended advertising set: %d\n", err); - - return err; - } - - /* Set periodic advertising parameters */ - err = bt_le_per_adv_set_param(*adv, BT_LE_PER_ADV_DEFAULT); - if (err) { - printk("Failed to set periodic advertising parameters: %d\n", err); - - return err; - } - - return 0; -} - static int stop_extended_adv(struct bt_le_ext_adv *adv) { int err; @@ -291,11 +268,7 @@ static void test_main(void) k_sem_reset(&sem_started); k_sem_reset(&sem_stopped); - err = setup_extended_adv(&adv); - if (err != 0) { - printk("Unable to setup extended advertiser: %d\n", err); - FAIL("Public Broadcast source failed\n"); - } + setup_broadcast_adv(&adv); err = bt_cap_initiator_broadcast_audio_create(&create_param, &broadcast_source); if (err != 0) { diff --git a/tests/bsim/bluetooth/audio/src/tbs_client_test.c b/tests/bsim/bluetooth/audio/src/tbs_client_test.c index 6c1c91b42e3..d0bfd06d7ad 100644 --- a/tests/bsim/bluetooth/audio/src/tbs_client_test.c +++ b/tests/bsim/bluetooth/audio/src/tbs_client_test.c @@ -481,6 +481,7 @@ static void discover_tbs(void) static void test_main(void) { + struct bt_le_ext_adv *ext_adv; int err; int index = 0; @@ -503,11 +504,7 @@ static void test_main(void) printk("Audio Server: Bluetooth discovered\n"); - err = bt_le_adv_start(BT_LE_ADV_CONN_FAST_1, ad, AD_SIZE, NULL, 0); - if (err != 0) { - FAIL("Advertising failed to start (err %d)\n", err); - return; - } + setup_connectable_adv(&ext_adv); printk("Advertising successfully started\n"); diff --git a/tests/bsim/bluetooth/audio/src/tmap_client_test.c b/tests/bsim/bluetooth/audio/src/tmap_client_test.c index ba5bbb02ee8..2aebbb0e0f1 100644 --- a/tests/bsim/bluetooth/audio/src/tmap_client_test.c +++ b/tests/bsim/bluetooth/audio/src/tmap_client_test.c @@ -1,5 +1,6 @@ /* * Copyright 2023 NXP + * Copyright (c) 2025 Nordic Semiconductor ASA * * SPDX-License-Identifier: Apache-2.0 */ @@ -9,6 +10,7 @@ #include #include +#include #include #include #include @@ -86,8 +88,7 @@ static bool check_audio_support_and_connect(struct bt_data *data, void *user_dat return false; } - err = bt_conn_le_create(addr, BT_CONN_LE_CREATE_CONN, - BT_LE_CONN_PARAM_DEFAULT, + err = bt_conn_le_create(addr, BT_CONN_LE_CREATE_CONN, BT_BAP_CONN_PARAM_RELAXED, &default_conn); if (err != 0) { printk("Create conn to failed (%u)\n", err); diff --git a/tests/bsim/bluetooth/audio/src/tmap_server_test.c b/tests/bsim/bluetooth/audio/src/tmap_server_test.c index 57d5d3ab274..1be606ed61d 100644 --- a/tests/bsim/bluetooth/audio/src/tmap_server_test.c +++ b/tests/bsim/bluetooth/audio/src/tmap_server_test.c @@ -7,6 +7,7 @@ #include #include +#include #include #include #include @@ -24,21 +25,10 @@ #ifdef CONFIG_BT_TMAP extern enum bst_result_t bst_result; -static uint8_t tmap_addata[] = { - BT_UUID_16_ENCODE(BT_UUID_TMAS_VAL), /* TMAS UUID */ - (BT_TMAP_ROLE_UMR | BT_TMAP_ROLE_CT), 0x00, /* TMAP Role */ -}; - -static const struct bt_data ad_tmas[] = { - BT_DATA_BYTES(BT_DATA_FLAGS, (BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR)), - BT_DATA_BYTES(BT_DATA_GAP_APPEARANCE, 0x09, 0x41), /* Appearance - Earbud */ - BT_DATA(BT_DATA_SVC_DATA16, tmap_addata, ARRAY_SIZE(tmap_addata)), -}; - static void test_main(void) { int err; - struct bt_le_ext_adv *adv; + struct bt_le_ext_adv *ext_adv; err = bt_enable(NULL); if (err != 0) { @@ -48,31 +38,13 @@ static void test_main(void) printk("Bluetooth initialized\n"); /* Initialize TMAP */ - err = bt_tmap_register(BT_TMAP_ROLE_CT | BT_TMAP_ROLE_UMR); + err = bt_tmap_register(TMAP_ROLE_SUPPORTED); if (err != 0) { return; } printk("TMAP initialized. Start advertising...\n"); - /* Create a connectable extended advertising set */ - err = bt_le_ext_adv_create(BT_LE_EXT_ADV_CONN, NULL, &adv); - if (err) { - printk("Failed to create advertising set (err %d)\n", err); - return; - } - - err = bt_le_ext_adv_set_data(adv, ad_tmas, ARRAY_SIZE(ad_tmas), NULL, 0); - if (err) { - printk("Failed to set advertising data (err %d)\n", err); - return; - } - - err = bt_le_ext_adv_start(adv, BT_LE_EXT_ADV_START_DEFAULT); - if (err) { - printk("Failed to start advertising set (err %d)\n", err); - return; - } + setup_connectable_adv(&ext_adv); - printk("Advertising successfully started\n"); WAIT_FOR_FLAG(flag_connected); printk("Connected!\n"); diff --git a/tests/bsim/bluetooth/audio/src/vcp_vol_rend_test.c b/tests/bsim/bluetooth/audio/src/vcp_vol_rend_test.c index 59575f37144..dbadaba57a0 100644 --- a/tests/bsim/bluetooth/audio/src/vcp_vol_rend_test.c +++ b/tests/bsim/bluetooth/audio/src/vcp_vol_rend_test.c @@ -1029,6 +1029,7 @@ static void test_standalone(void) static void test_main(void) { + struct bt_le_ext_adv *ext_adv; int err; err = bt_enable(NULL); @@ -1044,13 +1045,7 @@ static void test_main(void) printk("VCP initialized\n"); - err = bt_le_adv_start(BT_LE_ADV_CONN_FAST_1, ad, AD_SIZE, NULL, 0); - if (err != 0) { - FAIL("Advertising failed to start (err %d)\n", err); - return; - } - - printk("Advertising successfully started\n"); + setup_connectable_adv(&ext_adv); WAIT_FOR_FLAG(flag_connected); diff --git a/tests/bsim/bluetooth/audio/test_scripts/_bap_bass.sh b/tests/bsim/bluetooth/audio/test_scripts/_bap_bass.sh index ad73f02e383..818b63d657d 100755 --- a/tests/bsim/bluetooth/audio/test_scripts/_bap_bass.sh +++ b/tests/bsim/bluetooth/audio/test_scripts/_bap_bass.sh @@ -1,13 +1,17 @@ #!/usr/bin/env bash # -# Copyright (c) 2022 Nordic Semiconductor ASA +# Copyright (c) 2022-2025 Nordic Semiconductor ASA # # SPDX-License-Identifier: Apache-2.0 dir_path=$(dirname "$0") -$dir_path/bap_bass_client_sync.sh +set -e # Exit on error -$dir_path/bap_bass_server_sync_client_rem.sh - -$dir_path/bap_bass_server_sync_server_rem.sh +# Run all bap_bass* tests +for file in "$dir_path"/bap_bass*.sh; do + if [ -f "$file" ]; then + echo "Running $file" + $file + fi +done diff --git a/tests/bsim/bluetooth/audio/test_scripts/bap_broadcast_audio_assistant.sh b/tests/bsim/bluetooth/audio/test_scripts/bap_broadcast_audio_assistant.sh index f6333809f42..45bbba49f3f 100755 --- a/tests/bsim/bluetooth/audio/test_scripts/bap_broadcast_audio_assistant.sh +++ b/tests/bsim/bluetooth/audio/test_scripts/bap_broadcast_audio_assistant.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # -# Copyright (c) 2023 Nordic Semiconductor ASA +# Copyright (c) 2023-2025 Nordic Semiconductor ASA # # SPDX-License-Identifier: Apache-2.0 @@ -24,7 +24,8 @@ Execute ./bs_${BOARD_TS}_tests_bsim_bluetooth_audio_prj_conf \ Execute ./bs_${BOARD_TS}_tests_bsim_bluetooth_audio_prj_conf \ -v=${VERBOSITY_LEVEL} -s=${SIMULATION_ID} -d=2 \ - -testid=broadcast_source -RealEncryption=1 -rs=69 -D=3 + -testid=broadcast_source -RealEncryption=1 -rs=69 -D=3 \ + -start_offset=2e3 -argstest subgroup_cnt 1 streams_per_subgroup_cnt 2 # Simulation time should be larger than the WAIT_TIME in common.h Execute ./bs_2G4_phy_v1 -v=${VERBOSITY_LEVEL} -s=${SIMULATION_ID} -D=3 -sim_length=60e6 $@ diff --git a/tests/bsim/bluetooth/audio/test_scripts/ccp.sh b/tests/bsim/bluetooth/audio/test_scripts/ccp.sh index cac742afbd8..ed5d1021e4a 100755 --- a/tests/bsim/bluetooth/audio/test_scripts/ccp.sh +++ b/tests/bsim/bluetooth/audio/test_scripts/ccp.sh @@ -13,7 +13,7 @@ cd ${BSIM_OUT_PATH}/bin SIMULATION_ID="ccp" Execute ./bs_${BOARD_TS}_tests_bsim_bluetooth_audio_prj_conf \ - -v=${VERBOSITY_LEVEL} -s=${SIMULATION_ID} -d=0 -testid=ccp_call_control_server -rs=1 -D=1 + -v=${VERBOSITY_LEVEL} -s=${SIMULATION_ID} -d=0 -testid=ccp_call_control_server -rs=10 -D=1 # Simulation time should be larger than the WAIT_TIME in common.h Execute ./bs_2G4_phy_v1 -v=${VERBOSITY_LEVEL} -s=${SIMULATION_ID} \ diff --git a/tests/bsim/bluetooth/audio/test_scripts/csip.sh b/tests/bsim/bluetooth/audio/test_scripts/csip.sh index 8d2c4380dc5..99c88c6eb11 100755 --- a/tests/bsim/bluetooth/audio/test_scripts/csip.sh +++ b/tests/bsim/bluetooth/audio/test_scripts/csip.sh @@ -18,19 +18,19 @@ SIMULATION_ID="csip" Execute ./bs_${BOARD_TS}_tests_bsim_bluetooth_audio_prj_conf \ -v=${VERBOSITY_LEVEL} -s=${SIMULATION_ID} -d=0 -testid=csip_set_coordinator \ - -RealEncryption=1 -rs=1 -D=4 + -RealEncryption=1 -rs=10 -D=4 Execute ./bs_${BOARD_TS}_tests_bsim_bluetooth_audio_prj_conf \ -v=${VERBOSITY_LEVEL} -s=${SIMULATION_ID} -d=1 -testid=csip_set_member \ - -RealEncryption=1 -rs=2 -D=4 -argstest rank 1 + -RealEncryption=1 -rs=20 -D=4 -argstest rank 1 size 3 Execute ./bs_${BOARD_TS}_tests_bsim_bluetooth_audio_prj_conf \ -v=${VERBOSITY_LEVEL} -s=${SIMULATION_ID} -d=2 -testid=csip_set_member \ - -RealEncryption=1 -rs=3 -D=4 -argstest rank 2 + -RealEncryption=1 -rs=30 -D=4 -argstest rank 2 size 3 Execute ./bs_${BOARD_TS}_tests_bsim_bluetooth_audio_prj_conf \ -v=${VERBOSITY_LEVEL} -s=${SIMULATION_ID} -d=3 -testid=csip_set_member \ - -RealEncryption=1 -rs=4 -D=4 -argstest rank 3 + -RealEncryption=1 -rs=40 -D=4 -argstest rank 3 size 3 # Simulation time should be larger than the WAIT_TIME in common.h Execute ./bs_2G4_phy_v1 -v=${VERBOSITY_LEVEL} -s=${SIMULATION_ID} \ diff --git a/tests/bsim/bluetooth/audio/test_scripts/csip_encrypted_sirk.sh b/tests/bsim/bluetooth/audio/test_scripts/csip_encrypted_sirk.sh index 08e5ed82d62..b4898ee8958 100755 --- a/tests/bsim/bluetooth/audio/test_scripts/csip_encrypted_sirk.sh +++ b/tests/bsim/bluetooth/audio/test_scripts/csip_encrypted_sirk.sh @@ -18,19 +18,19 @@ SIMULATION_ID="csip_sirk_encrypted" printf "\n\n======== Running test with SIRK encrypted ========\n\n" Execute ./bs_${BOARD_TS}_tests_bsim_bluetooth_audio_prj_conf \ -v=${VERBOSITY_LEVEL} -s=${SIMULATION_ID} -d=0 -testid=csip_set_coordinator \ - -RealEncryption=1 -rs=1 -D=4 + -RealEncryption=1 -rs=10 -D=4 Execute ./bs_${BOARD_TS}_tests_bsim_bluetooth_audio_prj_conf \ -v=${VERBOSITY_LEVEL} -s=${SIMULATION_ID} -d=1 -testid=csip_set_member_enc \ - -RealEncryption=1 -rs=2 -D=4 -argstest rank 1 + -RealEncryption=1 -rs=20 -D=4 -argstest rank 1 size 3 Execute ./bs_${BOARD_TS}_tests_bsim_bluetooth_audio_prj_conf \ -v=${VERBOSITY_LEVEL} -s=${SIMULATION_ID} -d=2 -testid=csip_set_member_enc \ - -RealEncryption=1 -rs=3 -D=4 -argstest rank 2 + -RealEncryption=1 -rs=30 -D=4 -argstest rank 2 size 3 Execute ./bs_${BOARD_TS}_tests_bsim_bluetooth_audio_prj_conf \ -v=${VERBOSITY_LEVEL} -s=${SIMULATION_ID} -d=3 -testid=csip_set_member_enc \ - -RealEncryption=1 -rs=4 -D=4 -argstest rank 3 + -RealEncryption=1 -rs=40 -D=4 -argstest rank 3 size 3 # Simulation time should be larger than the WAIT_TIME in common.h Execute ./bs_2G4_phy_v1 -v=${VERBOSITY_LEVEL} -s=${SIMULATION_ID} \ diff --git a/tests/bsim/bluetooth/audio/test_scripts/csip_forced_release.sh b/tests/bsim/bluetooth/audio/test_scripts/csip_forced_release.sh index d7cd32365e8..f151a37e933 100755 --- a/tests/bsim/bluetooth/audio/test_scripts/csip_forced_release.sh +++ b/tests/bsim/bluetooth/audio/test_scripts/csip_forced_release.sh @@ -18,19 +18,19 @@ SIMULATION_ID="csip_forced_release" printf "\n\n======== Running test with forced release of lock ========\n\n" Execute ./bs_${BOARD_TS}_tests_bsim_bluetooth_audio_prj_conf \ -v=${VERBOSITY_LEVEL} -s=${SIMULATION_ID} -d=0 -testid=csip_set_coordinator \ - -RealEncryption=1 -rs=1 -D=4 + -RealEncryption=1 -rs=10 -D=4 Execute ./bs_${BOARD_TS}_tests_bsim_bluetooth_audio_prj_conf \ -v=${VERBOSITY_LEVEL} -s=${SIMULATION_ID} -d=1 -testid=csip_set_member \ - -RealEncryption=1 -rs=2 -D=4 -argstest rank 1 + -RealEncryption=1 -rs=20 -D=4 -argstest rank 1 size 3 Execute ./bs_${BOARD_TS}_tests_bsim_bluetooth_audio_prj_conf \ -v=${VERBOSITY_LEVEL} -s=${SIMULATION_ID} -d=2 -testid=csip_set_member \ - -RealEncryption=1 -rs=3 -D=4 -argstest rank 2 + -RealEncryption=1 -rs=30 -D=4 -argstest rank 2 size 3 Execute ./bs_${BOARD_TS}_tests_bsim_bluetooth_audio_prj_conf \ -v=${VERBOSITY_LEVEL} -s=${SIMULATION_ID} -d=3 -testid=csip_set_member_release \ - -RealEncryption=1 -rs=4 -D=4 -argstest rank 3 + -RealEncryption=1 -rs=40 -D=4 -argstest rank 3 size 3 # Simulation time should be larger than the WAIT_TIME in common.h Execute ./bs_2G4_phy_v1 -v=${VERBOSITY_LEVEL} -s=${SIMULATION_ID} \ diff --git a/tests/bsim/bluetooth/audio/test_scripts/csip_new_sirk.sh b/tests/bsim/bluetooth/audio/test_scripts/csip_new_sirk.sh index 84c36fc674f..b5e98a0b147 100755 --- a/tests/bsim/bluetooth/audio/test_scripts/csip_new_sirk.sh +++ b/tests/bsim/bluetooth/audio/test_scripts/csip_new_sirk.sh @@ -18,19 +18,19 @@ SIMULATION_ID="csip_new_sirk" Execute ./bs_${BOARD_TS}_tests_bsim_bluetooth_audio_prj_conf \ -v=${VERBOSITY_LEVEL} -s=${SIMULATION_ID} -d=0 -testid=csip_set_coordinator_new_sirk \ - -RealEncryption=1 -rs=1 -D=4 + -RealEncryption=1 -rs=10 -D=4 Execute ./bs_${BOARD_TS}_tests_bsim_bluetooth_audio_prj_conf \ -v=${VERBOSITY_LEVEL} -s=${SIMULATION_ID} -d=1 -testid=csip_set_member_new_sirk \ - -RealEncryption=1 -rs=2 -D=4 -argstest rank 1 + -RealEncryption=1 -rs=20 -D=4 -argstest rank 1 size 3 Execute ./bs_${BOARD_TS}_tests_bsim_bluetooth_audio_prj_conf \ -v=${VERBOSITY_LEVEL} -s=${SIMULATION_ID} -d=2 -testid=csip_set_member_new_sirk \ - -RealEncryption=1 -rs=3 -D=4 -argstest rank 2 + -RealEncryption=1 -rs=30 -D=4 -argstest rank 2 size 3 Execute ./bs_${BOARD_TS}_tests_bsim_bluetooth_audio_prj_conf \ -v=${VERBOSITY_LEVEL} -s=${SIMULATION_ID} -d=3 -testid=csip_set_member_new_sirk \ - -RealEncryption=1 -rs=4 -D=4 -argstest rank 3 + -RealEncryption=1 -rs=40 -D=4 -argstest rank 3 size 3 # Simulation time should be larger than the WAIT_TIME in common.h Execute ./bs_2G4_phy_v1 -v=${VERBOSITY_LEVEL} -s=${SIMULATION_ID} \ diff --git a/tests/bsim/bluetooth/audio/test_scripts/csip_new_size_and_rank.sh b/tests/bsim/bluetooth/audio/test_scripts/csip_new_size_and_rank.sh new file mode 100755 index 00000000000..3488018cc09 --- /dev/null +++ b/tests/bsim/bluetooth/audio/test_scripts/csip_new_size_and_rank.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash +# +# Copyright (c) 2025 Nordic Semiconductor ASA +# +# SPDX-License-Identifier: Apache-2.0 + +# CSIP test where a set coordinator connects a set members and then waits for a set size +# notification + +source ${ZEPHYR_BASE}/tests/bsim/sh_common.source + +VERBOSITY_LEVEL=2 +EXECUTE_TIMEOUT=20 + +cd ${BSIM_OUT_PATH}/bin + +SIMULATION_ID="csip_new_size" + +Execute ./bs_${BOARD_TS}_tests_bsim_bluetooth_audio_prj_conf \ + -v=${VERBOSITY_LEVEL} -s=${SIMULATION_ID} -d=0 -testid=csip_set_coordinator_new_size_and_rank \ + -RealEncryption=1 -rs=10 -D=2 + +Execute ./bs_${BOARD_TS}_tests_bsim_bluetooth_audio_prj_conf \ + -v=${VERBOSITY_LEVEL} -s=${SIMULATION_ID} -d=1 -testid=csip_set_member_new_size_and_rank \ + -RealEncryption=1 -rs=20 -D=2 -argstest rank 1 size 1 + +# Simulation time should be larger than the WAIT_TIME in common.h +Execute ./bs_2G4_phy_v1 -v=${VERBOSITY_LEVEL} -s=${SIMULATION_ID} \ + -D=2 -sim_length=20e6 $@ + +wait_for_background_jobs diff --git a/tests/bsim/bluetooth/audio/test_scripts/csip_no_lock.sh b/tests/bsim/bluetooth/audio/test_scripts/csip_no_lock.sh index 17fe61052a7..453409cb574 100755 --- a/tests/bsim/bluetooth/audio/test_scripts/csip_no_lock.sh +++ b/tests/bsim/bluetooth/audio/test_scripts/csip_no_lock.sh @@ -17,19 +17,19 @@ SIMULATION_ID="csip_no_lock" Execute ./bs_${BOARD_TS}_tests_bsim_bluetooth_audio_prj_conf \ -v=${VERBOSITY_LEVEL} -s=${SIMULATION_ID} -d=0 -testid=csip_set_coordinator \ - -RealEncryption=1 -rs=1 -D=4 -argstest no-lock + -RealEncryption=1 -rs=10 -D=4 -argstest no-lock Execute ./bs_${BOARD_TS}_tests_bsim_bluetooth_audio_prj_conf \ -v=${VERBOSITY_LEVEL} -s=${SIMULATION_ID} -d=1 -testid=csip_set_member \ - -RealEncryption=1 -rs=2 -D=4 -argstest rank 1 not-lockable + -RealEncryption=1 -rs=20 -D=4 -argstest rank 1 size 3 not-lockable Execute ./bs_${BOARD_TS}_tests_bsim_bluetooth_audio_prj_conf \ -v=${VERBOSITY_LEVEL} -s=${SIMULATION_ID} -d=2 -testid=csip_set_member \ - -RealEncryption=1 -rs=3 -D=4 -argstest rank 2 not-lockable + -RealEncryption=1 -rs=30 -D=4 -argstest rank 2 size 3 not-lockable Execute ./bs_${BOARD_TS}_tests_bsim_bluetooth_audio_prj_conf \ -v=${VERBOSITY_LEVEL} -s=${SIMULATION_ID} -d=3 -testid=csip_set_member \ - -RealEncryption=1 -rs=4 -D=4 -argstest rank 3 not-lockable + -RealEncryption=1 -rs=40 -D=4 -argstest rank 3 size 3 not-lockable # Simulation time should be larger than the WAIT_TIME in common.h Execute ./bs_2G4_phy_v1 -v=${VERBOSITY_LEVEL} -s=${SIMULATION_ID} \ diff --git a/tests/bsim/bluetooth/audio/test_scripts/csip_no_rank.sh b/tests/bsim/bluetooth/audio/test_scripts/csip_no_rank.sh index 54adbad5692..bb82e2a0a41 100755 --- a/tests/bsim/bluetooth/audio/test_scripts/csip_no_rank.sh +++ b/tests/bsim/bluetooth/audio/test_scripts/csip_no_rank.sh @@ -17,19 +17,19 @@ SIMULATION_ID="csip_no_rank" Execute ./bs_${BOARD_TS}_tests_bsim_bluetooth_audio_prj_conf \ -v=${VERBOSITY_LEVEL} -s=${SIMULATION_ID} -d=0 -testid=csip_set_coordinator \ - -RealEncryption=1 -rs=1 -D=4 -argstest no-rank no-lock + -RealEncryption=1 -rs=10 -D=4 -argstest no-rank no-lock Execute ./bs_${BOARD_TS}_tests_bsim_bluetooth_audio_prj_conf \ -v=${VERBOSITY_LEVEL} -s=${SIMULATION_ID} -d=1 -testid=csip_set_member \ - -RealEncryption=1 -rs=2 -D=4 -argstest rank 0 not-lockable + -RealEncryption=1 -rs=20 -D=4 -argstest rank 0 size 3 not-lockable Execute ./bs_${BOARD_TS}_tests_bsim_bluetooth_audio_prj_conf \ -v=${VERBOSITY_LEVEL} -s=${SIMULATION_ID} -d=2 -testid=csip_set_member \ - -RealEncryption=1 -rs=3 -D=4 -argstest rank 0 not-lockable + -RealEncryption=1 -rs=30 -D=4 -argstest rank 0 size 3 not-lockable Execute ./bs_${BOARD_TS}_tests_bsim_bluetooth_audio_prj_conf \ -v=${VERBOSITY_LEVEL} -s=${SIMULATION_ID} -d=3 -testid=csip_set_member \ - -RealEncryption=1 -rs=4 -D=4 -argstest rank 0 not-lockable + -RealEncryption=1 -rs=40 -D=4 -argstest rank 0 size 3 not-lockable # Simulation time should be larger than the WAIT_TIME in common.h Execute ./bs_2G4_phy_v1 -v=${VERBOSITY_LEVEL} -s=${SIMULATION_ID} \ diff --git a/tests/bsim/bluetooth/audio/test_scripts/csip_no_size.sh b/tests/bsim/bluetooth/audio/test_scripts/csip_no_size.sh index bd04c4c3968..75a71bc3a41 100755 --- a/tests/bsim/bluetooth/audio/test_scripts/csip_no_size.sh +++ b/tests/bsim/bluetooth/audio/test_scripts/csip_no_size.sh @@ -17,19 +17,19 @@ SIMULATION_ID="csip_no_size" Execute ./bs_${BOARD_TS}_tests_bsim_bluetooth_audio_prj_conf \ -v=${VERBOSITY_LEVEL} -s=${SIMULATION_ID} -d=0 -testid=csip_set_coordinator \ - -RealEncryption=1 -rs=1 -D=4 -argstest no-size + -RealEncryption=1 -rs=10 -D=4 -argstest no-size Execute ./bs_${BOARD_TS}_tests_bsim_bluetooth_audio_prj_conf \ -v=${VERBOSITY_LEVEL} -s=${SIMULATION_ID} -d=1 -testid=csip_set_member \ - -RealEncryption=1 -rs=2 -D=4 -argstest rank 1 size 0 + -RealEncryption=1 -rs=20 -D=4 -argstest rank 1 size 0 Execute ./bs_${BOARD_TS}_tests_bsim_bluetooth_audio_prj_conf \ -v=${VERBOSITY_LEVEL} -s=${SIMULATION_ID} -d=2 -testid=csip_set_member \ - -RealEncryption=1 -rs=3 -D=4 -argstest rank 2 size 0 + -RealEncryption=1 -rs=30 -D=4 -argstest rank 2 size 0 Execute ./bs_${BOARD_TS}_tests_bsim_bluetooth_audio_prj_conf \ -v=${VERBOSITY_LEVEL} -s=${SIMULATION_ID} -d=3 -testid=csip_set_member \ - -RealEncryption=1 -rs=4 -D=4 -argstest rank 3s size 0 + -RealEncryption=1 -rs=40 -D=4 -argstest rank 3 size 0 # Simulation time should be larger than the WAIT_TIME in common.h Execute ./bs_2G4_phy_v1 -v=${VERBOSITY_LEVEL} -s=${SIMULATION_ID} \ diff --git a/tests/bsim/bluetooth/audio_samples/bap_unicast_client/src/unicast_client_sample_test.c b/tests/bsim/bluetooth/audio_samples/bap_unicast_client/src/unicast_client_sample_test.c index da47934e1f9..50aaece72fe 100644 --- a/tests/bsim/bluetooth/audio_samples/bap_unicast_client/src/unicast_client_sample_test.c +++ b/tests/bsim/bluetooth/audio_samples/bap_unicast_client/src/unicast_client_sample_test.c @@ -11,7 +11,7 @@ #include "time_machine.h" #include "bstests.h" -#define WAIT_TIME 10 /* Seconds */ +#define WAIT_TIME 20 /* Seconds */ #define PASS_THRESHOLD 100 /* Audio packets */ diff --git a/tests/bsim/bluetooth/host/gatt/general/src/gatt_client_test.c b/tests/bsim/bluetooth/host/gatt/general/src/gatt_client_test.c index a754f08649f..e4b609aba42 100644 --- a/tests/bsim/bluetooth/host/gatt/general/src/gatt_client_test.c +++ b/tests/bsim/bluetooth/host/gatt/general/src/gatt_client_test.c @@ -6,6 +6,7 @@ #include +#include #include #include #include @@ -363,6 +364,7 @@ static void gatt_read(uint16_t handle, uint8_t expect_att_err) static void test_main(void) { + struct bt_le_local_features local_features; int err; bt_conn_cb_register(&conn_callbacks); @@ -372,6 +374,13 @@ static void test_main(void) TEST_FAIL("Bluetooth discover failed (err %d)", err); } + err = bt_le_get_local_features(&local_features); + TEST_ASSERT(err == 0, "Failed to get local features"); + TEST_ASSERT(local_features.acl_mtu > 0U, "Invalid ACL MTU"); + TEST_ASSERT(local_features.acl_pkts > 0U, "Invalid ACL packet count"); + TEST_ASSERT(sys_get_le64(local_features.features) > 0U, "Invalid features"); + TEST_ASSERT(local_features.states > 0U, "Invalid states"); + err = bt_le_scan_start(BT_LE_SCAN_PASSIVE, device_found); if (err != 0) { TEST_FAIL("Scanning failed to start (err %d)", err);