diff --git a/tests/bsim/bluetooth/ll/compile.sh b/tests/bsim/bluetooth/ll/compile.sh index 4937c72951d..5b7e374510a 100755 --- a/tests/bsim/bluetooth/ll/compile.sh +++ b/tests/bsim/bluetooth/ll/compile.sh @@ -17,6 +17,7 @@ app=tests/bsim/bluetooth/ll/advx \ conf_overlay=overlay-ticker_expire_info.conf compile app=tests/bsim/bluetooth/ll/conn conf_file=prj_split.conf compile +app=tests/bsim/bluetooth/ll/conn conf_file=prj_split_1ms.conf compile app=tests/bsim/bluetooth/ll/conn conf_file=prj_split_tx_defer.conf compile app=tests/bsim/bluetooth/ll/conn conf_file=prj_split_privacy.conf compile app=tests/bsim/bluetooth/ll/conn conf_file=prj_split_low_lat.conf compile diff --git a/tests/bsim/bluetooth/ll/conn/Kconfig b/tests/bsim/bluetooth/ll/conn/Kconfig new file mode 100644 index 00000000000..87a403f2d7d --- /dev/null +++ b/tests/bsim/bluetooth/ll/conn/Kconfig @@ -0,0 +1,11 @@ +# Copyright (c) 2024 Nordic Semiconductor ASA +# SPDX-License-Identifier: Apache-2.0 + +config TEST_CONN_INTERVAL_1MS + bool "Test 1 ms connection interval support" + help + Test 1 ms connection interval support. + +menu "Zephyr Kernel" +source "Kconfig.zephyr" +endmenu diff --git a/tests/bsim/bluetooth/ll/conn/prj_split_1ms.conf b/tests/bsim/bluetooth/ll/conn/prj_split_1ms.conf new file mode 100644 index 00000000000..58276bd991e --- /dev/null +++ b/tests/bsim/bluetooth/ll/conn/prj_split_1ms.conf @@ -0,0 +1,23 @@ +CONFIG_BT=y +CONFIG_LOG=y +CONFIG_BT_CENTRAL=y +CONFIG_BT_PERIPHERAL=y +CONFIG_BT_PRIVACY=y +CONFIG_BT_SMP=y +CONFIG_BT_SIGNING=y +CONFIG_BT_BAS=y +CONFIG_BT_HRS=y +CONFIG_BT_ATT_PREPARE_COUNT=2 +CONFIG_BT_GATT_CLIENT=y +CONFIG_BT_L2CAP_DYNAMIC_CHANNEL=y +CONFIG_BT_DEVICE_NAME="bsim_test_split_1m" +CONFIG_BT_L2CAP_TX_BUF_COUNT=6 + +CONFIG_BT_CTLR_PRIVACY=n + +CONFIG_BT_CONN_PARAM_ANY=y + +CONFIG_BT_CTLR_ADVANCED_FEATURES=y +CONFIG_BT_CTLR_CONN_INTERVAL_LOW_LATENCY=y + +CONFIG_TEST_CONN_INTERVAL_1MS=y diff --git a/tests/bsim/bluetooth/ll/conn/src/test_connect1.c b/tests/bsim/bluetooth/ll/conn/src/test_connect1.c index d1373084da5..a31ff3d0d9a 100644 --- a/tests/bsim/bluetooth/ll/conn/src/test_connect1.c +++ b/tests/bsim/bluetooth/ll/conn/src/test_connect1.c @@ -29,10 +29,19 @@ static struct bt_uuid_16 uuid = BT_UUID_INIT_16(0); static struct bt_gatt_discover_params discover_params; static struct bt_gatt_subscribe_params subscribe_params; +#if defined(CONFIG_TEST_CONN_INTERVAL_1MS) +#define UPDATE_PARAM_INTERVAL_MIN 1 +#define UPDATE_PARAM_INTERVAL_MAX 1 +#define UPDATE_PARAM_LATENCY 0 +#define UPDATE_PARAM_TIMEOUT 10 +#define TEST_NOTIFY_COUNT 3000 +#else /* !CONFIG_TEST_CONN_INTERVAL_1MS */ #define UPDATE_PARAM_INTERVAL_MIN 25 #define UPDATE_PARAM_INTERVAL_MAX 45 #define UPDATE_PARAM_LATENCY 1 #define UPDATE_PARAM_TIMEOUT 250 +#define TEST_NOTIFY_COUNT 3 +#endif /* !CONFIG_TEST_CONN_INTERVAL_1MS */ static struct bt_le_conn_param update_params = { .interval_min = UPDATE_PARAM_INTERVAL_MIN, @@ -124,16 +133,32 @@ static uint8_t notify_func(struct bt_conn *conn, struct bt_gatt_subscribe_params *params, const void *data, uint16_t length) { + static uint32_t cycle_stamp; static int notify_count; + uint32_t cycle_now; + uint64_t delta; + if (!data) { printk("[UNSUBSCRIBED]\n"); params->value_handle = 0U; return BT_GATT_ITER_STOP; } - printk("[NOTIFICATION] data %p length %u\n", data, length); + cycle_now = k_cycle_get_32(); + delta = cycle_now - cycle_stamp; + cycle_stamp = cycle_now; + delta = k_cyc_to_ns_floor64(delta); + + if (!IS_ENABLED(CONFIG_TEST_CONN_INTERVAL_1MS) || + ((delta > (NSEC_PER_MSEC / 2U)) && + (delta < (NSEC_PER_MSEC + (NSEC_PER_MSEC / 2U))))) { + notify_count++; + } + + printk("[NOTIFICATION] %u. data %p length %u in %llu ns\n", + notify_count, data, length, delta); - if (notify_count++ >= 1) { /* We consider it passed */ + if (notify_count >= TEST_NOTIFY_COUNT) { /* We consider it passed */ int err; /* Disconnect before actually passing */ diff --git a/tests/bsim/bluetooth/ll/conn/src/test_connect2.c b/tests/bsim/bluetooth/ll/conn/src/test_connect2.c index 54551f01b50..f648d2d2d90 100644 --- a/tests/bsim/bluetooth/ll/conn/src/test_connect2.c +++ b/tests/bsim/bluetooth/ll/conn/src/test_connect2.c @@ -209,7 +209,8 @@ static void test_con2_main(void) * of starting delayed work so we do it here */ while (1) { - if (IS_ENABLED(CONFIG_BT_CTLR_TX_DEFER)) { + if (IS_ENABLED(CONFIG_TEST_CONN_INTERVAL_1MS) || + IS_ENABLED(CONFIG_BT_CTLR_TX_DEFER)) { k_sleep(K_MSEC(1)); } else { k_sleep(K_SECONDS(1)); diff --git a/tests/bsim/bluetooth/ll/conn/tests_scripts/basic_conn_split_1ms.sh b/tests/bsim/bluetooth/ll/conn/tests_scripts/basic_conn_split_1ms.sh new file mode 100755 index 00000000000..0be845f12d6 --- /dev/null +++ b/tests/bsim/bluetooth/ll/conn/tests_scripts/basic_conn_split_1ms.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash +# Copyright 2024 Nordic Semiconductor ASA +# SPDX-License-Identifier: Apache-2.0 + +source ${ZEPHYR_BASE}/tests/bsim/sh_common.source + +# Basic connection test: a central connects to a peripheral and expects a +# notification, using the split controller (ULL LLL) and 1ms connection +# interval +simulation_id="basic_conn_split_1ms" +verbosity_level=2 + +cd ${BSIM_OUT_PATH}/bin + +Execute ./bs_${BOARD_TS}_tests_bsim_bluetooth_ll_conn_prj_split_1ms_conf \ + -v=${verbosity_level} -s=${simulation_id} -d=0 -RealEncryption=1 \ + -testid=peripheral -rs=23 + +Execute ./bs_${BOARD_TS}_tests_bsim_bluetooth_ll_conn_prj_split_1ms_conf\ + -v=${verbosity_level} -s=${simulation_id} -d=1 -RealEncryption=1 \ + -testid=central -rs=6 + +Execute ./bs_2G4_phy_v1 -v=${verbosity_level} -s=${simulation_id} \ + -D=2 -sim_length=20e6 $@ + +wait_for_background_jobs