Skip to content

Commit 57438fd

Browse files
committed
Update ADV to use extended API.
1 parent f86a548 commit 57438fd

File tree

2 files changed

+151
-93
lines changed

2 files changed

+151
-93
lines changed

testing/integration/rpa_psa_integration/prj.conf

+3-1
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,6 @@ CONFIG_BT_RPA_TIMEOUT=30
4848
CONFIG_BT_LOG_SNIFFER_INFO=y
4949
# Enable dynamic RPA timeout manipulation
5050
CONFIG_BT_RPA_TIMEOUT_DYNAMIC=y
51-
CONFIG_COVERAGE=y
51+
CONFIG_COVERAGE=y
52+
53+
CONFIG_BT_EXT_ADV=y

testing/integration/rpa_psa_integration/src/main.c

+148-92
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,6 @@ ZTEST(bt_psa_integration, test_rpa_creation_and_resolution)
5555
ZTEST(bt_psa_integration, test_advertising_address_is_rpa) {
5656
int err;
5757

58-
// LOG_INF("Enabling the bt stack");
59-
// err = bt_enable(NULL);
60-
// zassert_equal(err, 0, "Bluetooth init failed (err %d)", err);
61-
62-
// settings_load();
63-
6458
uint8_t irk[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xDE, 0xAD, 0xBE, 0xEF,
6559
0xDE, 0xAD, 0xBE, 0xEF, 0xDE, 0xAD, 0xBE, 0xEF};
6660

@@ -71,43 +65,40 @@ ZTEST(bt_psa_integration, test_advertising_address_is_rpa) {
7165
bt_id_reset(id, NULL, irk);
7266

7367
k_sleep(K_SECONDS(1));
74-
68+
struct bt_le_ext_adv *adv;
7569
const struct bt_le_adv_param adv_params = {
7670
.id = id,
7771
.options = BT_LE_ADV_OPT_CONN,
7872
.interval_min = BT_GAP_ADV_FAST_INT_MIN_2,
7973
.interval_max = BT_GAP_ADV_FAST_INT_MAX_2,
8074
};
8175

76+
err = bt_le_ext_adv_create(&adv_params, NULL, &adv);
77+
zassert_equal(err, 0, "Extended advertising object creation failed: %d", err);
78+
8279
LOG_INF("Starting advertising...");
83-
err = bt_le_adv_start(&adv_params, NULL, 0, NULL, 0);
80+
const struct bt_le_ext_adv_start_param ext_adv_params = {
81+
.timeout = 60,
82+
.num_events = 100,
83+
};
84+
err = bt_le_ext_adv_start(adv, &ext_adv_params);
8485
zassert_equal(err, 0, "Advertising start failed: %d", err);
8586

8687
k_sleep(K_SECONDS(1));
8788

88-
struct bt_le_oob oob;
89-
err = bt_le_oob_get_local(id, &oob);
90-
zassert_equal(err, 0, "Failed to get OOB info");
91-
92-
bt_addr_le_t addrs[CONFIG_BT_ID_MAX];
93-
size_t count = CONFIG_BT_ID_MAX;
89+
struct bt_le_ext_adv_info advertising_info;
90+
err = bt_le_ext_adv_get_info(adv, &advertising_info);
91+
zassert_equal(err, 0, "Failed to get advertising info: %d", err);
9492

95-
bt_id_get(addrs, &count);
96-
char addr_s[BT_ADDR_LE_STR_LEN];
97-
for (size_t i = 0; i < count; i++) {
98-
bt_addr_le_to_str(&addrs[i], addr_s, sizeof(addr_s));
99-
LOG_INF("addr: %s", addr_s);
100-
}
93+
LOG_INF("Advertising address (from advertising info): %02X:%02X:%02X:%02X:%02X:%02X (%s)",
94+
advertising_info.addr->a.val[5], advertising_info.addr->a.val[4], advertising_info.addr->a.val[3],
95+
advertising_info.addr->a.val[2], advertising_info.addr->a.val[1], advertising_info.addr->a.val[0],
96+
advertising_info.addr->type == BT_ADDR_LE_RANDOM ? "RANDOM" : "PUBLIC");
10197

98+
zassert_true(BT_ADDR_IS_RPA(&advertising_info.addr->a), "Advertiser address is not RPA");
10299

103-
LOG_INF("Advertising address (from OOB): %02X:%02X:%02X:%02X:%02X:%02X (%s)",
104-
oob.addr.a.val[5], oob.addr.a.val[4], oob.addr.a.val[3],
105-
oob.addr.a.val[2], oob.addr.a.val[1], oob.addr.a.val[0],
106-
oob.addr.type == BT_ADDR_LE_RANDOM ? "RANDOM" : "PUBLIC");
107-
108-
zassert_true(BT_ADDR_IS_RPA(&oob.addr.a), "Advertiser address is not RPA");
109-
110-
bt_le_adv_stop();
100+
bt_le_ext_adv_stop(adv);
101+
bt_le_ext_adv_delete(adv);
111102
// bt_disable();
112103
}
113104

@@ -130,64 +121,61 @@ ZTEST(bt_psa_integration, test_rpa_rotation) {
130121
bt_id_reset(id, NULL, irk);
131122

132123
k_sleep(K_SECONDS(1));
133-
124+
struct bt_le_ext_adv *adv;
134125
const struct bt_le_adv_param adv_params = {
135126
.id = id,
136127
.options = BT_LE_ADV_OPT_CONN,
137128
.interval_min = BT_GAP_ADV_FAST_INT_MIN_2,
138129
.interval_max = BT_GAP_ADV_FAST_INT_MAX_2,
139130
};
140131

132+
err = bt_le_ext_adv_create(&adv_params, NULL, &adv);
133+
zassert_equal(err, 0, "Extended advertising object creation failed: %d", err);
134+
141135
LOG_INF("Starting advertising...");
142-
err = bt_le_adv_start(&adv_params, NULL, 0, NULL, 0);
136+
const struct bt_le_ext_adv_start_param ext_adv_params = {
137+
.timeout = 0,
138+
.num_events = 0,
139+
};
140+
err = bt_le_ext_adv_start(adv, &ext_adv_params);
143141
zassert_equal(err, 0, "Advertising start failed: %d", err);
144142

145143
k_sleep(K_SECONDS(1));
146144

147-
struct bt_le_oob oob;
148-
err = bt_le_oob_get_local(id, &oob);
149-
zassert_equal(err, 0, "Failed to get OOB info");
150-
151-
bt_addr_le_t addrs[CONFIG_BT_ID_MAX];
152-
size_t count = CONFIG_BT_ID_MAX;
153-
154-
bt_id_get(addrs, &count);
155-
char addr_s[BT_ADDR_LE_STR_LEN];
156-
for (size_t i = 0; i < count; i++) {
157-
bt_addr_le_to_str(&addrs[i], addr_s, sizeof(addr_s));
158-
LOG_INF("addr: %s", addr_s);
159-
}
145+
struct bt_le_ext_adv_info advertising_info;
146+
err = bt_le_ext_adv_get_info(adv, &advertising_info);
147+
zassert_equal(err, 0, "Failed to get advertising info: %d", err);
160148

161149

162150
LOG_INF("Advertising address (from OOB): %02X:%02X:%02X:%02X:%02X:%02X (%s)",
163-
oob.addr.a.val[5], oob.addr.a.val[4], oob.addr.a.val[3],
164-
oob.addr.a.val[2], oob.addr.a.val[1], oob.addr.a.val[0],
165-
oob.addr.type == BT_ADDR_LE_RANDOM ? "RANDOM" : "PUBLIC");
166-
167-
zassert_true(BT_ADDR_IS_RPA(&oob.addr.a), "Advertiser address is not RPA");
168-
169-
uint16_t rpa_short_timeout = 3;
151+
advertising_info.addr->a.val[5], advertising_info.addr->a.val[4], advertising_info.addr->a.val[3],
152+
advertising_info.addr->a.val[2], advertising_info.addr->a.val[1], advertising_info.addr->a.val[0],
153+
advertising_info.addr->type == BT_ADDR_LE_RANDOM ? "RANDOM" : "PUBLIC");
154+
155+
bt_addr_le_t addr_before = *advertising_info.addr;
156+
zassert_true(BT_ADDR_IS_RPA(&advertising_info.addr->a), "Advertiser address is not RPA");
157+
158+
uint16_t rpa_short_timeout = 1;
170159
err = bt_le_set_rpa_timeout(rpa_short_timeout);
171160
zassert_equal(err, 0, "Failed to set RPA timeout");
172-
LOG_INF("Sleeping for RPA timeout...");
173-
k_sleep(K_SECONDS(rpa_short_timeout + 1));
161+
LOG_INF("Sleeping for RPA timeout [%d]...", rpa_short_timeout);
162+
k_sleep(K_SECONDS(rpa_short_timeout * 35));
174163

175-
struct bt_le_oob oob_after;
176-
err = bt_le_oob_get_local(id, &oob_after);
177-
zassert_equal(err, 0, "Failed to get new OOB address");
178-
bt_addr_le_t addr_after = oob_after.addr;
164+
err = bt_le_ext_adv_get_info(adv, &advertising_info);
165+
zassert_equal(err, 0, "Failed to get advertising info: %d", err);
166+
bt_addr_le_t addr_after = *advertising_info.addr;
179167

180168
LOG_INF("Rotated address: %02X:%02X:%02X:%02X:%02X:%02X",
181169
addr_after.a.val[5], addr_after.a.val[4], addr_after.a.val[3],
182170
addr_after.a.val[2], addr_after.a.val[1], addr_after.a.val[0]);
183171

184-
zassert_true(BT_ADDR_IS_RPA(&oob_after.addr.a), "Advertiser address is not RPA");
172+
zassert_true(BT_ADDR_IS_RPA(&addr_after.a), "Advertiser address is not RPA");
185173

186-
zassert_true(memcmp(oob.addr.a.val, addr_after.a.val, sizeof(bt_addr_t)) != 0,
174+
zassert_true(memcmp(addr_before.a.val, addr_after.a.val, sizeof(bt_addr_t)) != 0,
187175
"RPA did not rotate");
188176

189-
bt_le_adv_stop();
190-
// bt_disable();
177+
bt_le_ext_adv_stop(adv);
178+
bt_le_ext_adv_delete(adv);
191179
}
192180

193181
ZTEST(bt_psa_integration, test_rpa_is_stable_before_timeout)
@@ -198,54 +186,122 @@ ZTEST(bt_psa_integration, test_rpa_is_stable_before_timeout)
198186
int id = bt_id_create(NULL, irk);
199187
zassert_true(id >= 0, "ID creation failed");
200188

189+
struct bt_le_ext_adv *adv;
201190
struct bt_le_adv_param adv_params = {
202191
.id = id,
203192
.options = BT_LE_ADV_OPT_CONN,
204193
.interval_min = BT_GAP_ADV_FAST_INT_MIN_2,
205194
.interval_max = BT_GAP_ADV_FAST_INT_MAX_2,
206195
};
207-
err = bt_le_adv_start(&adv_params, NULL, 0, NULL, 0);
196+
197+
err = bt_le_ext_adv_create(&adv_params, NULL, &adv);
198+
zassert_equal(err, 0, "Extended advertising object creation failed: %d", err);
199+
200+
LOG_INF("Starting advertising...");
201+
const struct bt_le_ext_adv_start_param ext_adv_params = {
202+
.timeout = 60,
203+
.num_events = 100,
204+
};
205+
err = bt_le_ext_adv_start(adv, &ext_adv_params);
208206
zassert_equal(err, 0, "Adv start failed");
209207

210208
// Set timeout to something long
211-
// err = bt_le_set_rpa_timeout(10);
212-
// zassert_equal(err, 0, "RPA timeout set failed");
213-
bt_addr_le_t addrs[CONFIG_BT_ID_MAX];
214-
size_t count = CONFIG_BT_ID_MAX;
215-
216-
bt_id_get(addrs, &count);
217-
char addr_s[BT_ADDR_LE_STR_LEN];
218-
for (size_t i = 0; i < count; i++) {
219-
bt_addr_le_to_str(&addrs[i], addr_s, sizeof(addr_s));
220-
LOG_INF("[bt_id_get]addr: %s", addr_s);
221-
}
222-
223-
// struct bt_le_oob oob1, oob2;
224-
// bt_le_oob_get_local(id, &oob1);
225-
// k_sleep(K_SECONDS(1));
226-
// bt_le_oob_get_local(id, &oob2);
227-
228-
// Stop advertising before assertion
229-
bt_le_adv_stop();
230-
// zassert_true(memcmp(oob1.addr.a.val, oob2.addr.a.val, sizeof(bt_addr_t)) == 0,
231-
// "RPA changed unexpectedly");
209+
err = bt_le_set_rpa_timeout(30 * 2);
210+
zassert_equal(err, 0, "RPA timeout set failed");
211+
212+
struct bt_le_ext_adv_info advertising_info;
213+
err = bt_le_ext_adv_get_info(adv, &advertising_info);
214+
zassert_equal(err, 0, "Failed to get advertising info: %d", err);
215+
216+
LOG_INF("Advertising address (from advertising info): %02X:%02X:%02X:%02X:%02X:%02X (%s)",
217+
advertising_info.addr->a.val[5], advertising_info.addr->a.val[4], advertising_info.addr->a.val[3],
218+
advertising_info.addr->a.val[2], advertising_info.addr->a.val[1], advertising_info.addr->a.val[0],
219+
advertising_info.addr->type == BT_ADDR_LE_RANDOM ? "RANDOM" : "PUBLIC");
220+
221+
bt_addr_le_t addr_before = *advertising_info.addr;
222+
zassert_true(BT_ADDR_IS_RPA(&advertising_info.addr->a), "Advertiser address is not RPA");
223+
224+
k_sleep(K_SECONDS(5));
225+
226+
err = bt_le_ext_adv_get_info(adv, &advertising_info);
227+
zassert_equal(err, 0, "Failed to get advertising info: %d", err);
228+
bt_addr_le_t addr_after = *advertising_info.addr;
229+
230+
LOG_INF("Rotated address: %02X:%02X:%02X:%02X:%02X:%02X",
231+
addr_after.a.val[5], addr_after.a.val[4], addr_after.a.val[3],
232+
addr_after.a.val[2], addr_after.a.val[1], addr_after.a.val[0]);
233+
234+
zassert_true(BT_ADDR_IS_RPA(&addr_after.a), "Advertiser address is not RPA");
235+
236+
zassert_true(memcmp(addr_before.a.val, addr_after.a.val, sizeof(bt_addr_t)) == 0,
237+
"RPA changed unexpectedly");
238+
239+
bt_le_ext_adv_stop(adv);
240+
bt_le_ext_adv_delete(adv);
232241
}
233242

234243
ZTEST(bt_psa_integration, test_different_irks_yield_different_rpas)
235244
{
236-
uint8_t irk1[16] = { [0 ... 15] = 0x11 };
237-
uint8_t irk2[16] = { [0 ... 15] = 0x22 };
245+
int err;
246+
uint8_t irk1[16] = { [0 ... 15] = 0x11 };
247+
uint8_t irk2[16] = { [0 ... 15] = 0x22 };
248+
249+
int id1 = bt_id_create(NULL, irk1);
250+
int id2 = bt_id_create(NULL, irk2);
251+
zassert_true(id1 >= 0 && id2 >= 0, "Failed to create identities");
252+
253+
struct bt_le_ext_adv *adv1, *adv2;
254+
struct bt_le_ext_adv_info adv_info1, adv_info2;
255+
bt_addr_le_t addr1, addr2;
256+
257+
const struct bt_le_adv_param adv_params1 = {
258+
.id = id1,
259+
.options = BT_LE_ADV_OPT_CONN,
260+
.interval_min = BT_GAP_ADV_FAST_INT_MIN_2,
261+
.interval_max = BT_GAP_ADV_FAST_INT_MAX_2,
262+
.peer = NULL,
263+
};
264+
265+
const struct bt_le_adv_param adv_params2 = {
266+
.id = id2,
267+
.options = BT_LE_ADV_OPT_CONN,
268+
.interval_min = BT_GAP_ADV_FAST_INT_MIN_2,
269+
.interval_max = BT_GAP_ADV_FAST_INT_MAX_2,
270+
.peer = NULL,
271+
};
272+
273+
err = bt_le_ext_adv_create(&adv_params1, NULL, &adv1);
274+
zassert_equal(err, 0, "Failed to create advertising set 1: %d", err);
275+
276+
err = bt_le_ext_adv_get_info(adv1, &adv_info1);
277+
zassert_equal(err, 0, "Failed to get advertising info 1: %d", err);
278+
279+
LOG_INF("Advertising address (from advertising info): %02X:%02X:%02X:%02X:%02X:%02X (%s)",
280+
adv_info1.addr->a.val[5], adv_info1.addr->a.val[4], adv_info1.addr->a.val[3],
281+
adv_info1.addr->a.val[2], adv_info1.addr->a.val[1], adv_info1.addr->a.val[0],
282+
adv_info1.addr->type == BT_ADDR_LE_RANDOM ? "RANDOM" : "PUBLIC");
283+
284+
bt_addr_le_copy(&addr1, adv_info1.addr);
285+
286+
bt_le_ext_adv_delete(adv1);
287+
288+
err = bt_le_ext_adv_create(&adv_params2, NULL, &adv2);
289+
zassert_equal(err, 0, "Failed to create advertising set 2: %d", err);
290+
291+
err = bt_le_ext_adv_get_info(adv2, &adv_info2);
292+
zassert_equal(err, 0, "Failed to get advertising info 2: %d", err);
293+
294+
LOG_INF("Advertising address (from advertising info): %02X:%02X:%02X:%02X:%02X:%02X (%s)",
295+
adv_info2.addr->a.val[5], adv_info2.addr->a.val[4], adv_info2.addr->a.val[3],
296+
adv_info2.addr->a.val[2], adv_info2.addr->a.val[1], adv_info2.addr->a.val[0],
297+
adv_info2.addr->type == BT_ADDR_LE_RANDOM ? "RANDOM" : "PUBLIC");
238298

239-
int id1 = bt_id_create(NULL, irk1);
240-
int id2 = bt_id_create(NULL, irk2);
241-
zassert_true(id1 >= 0 && id2 >= 0, "Failed to create identities");
299+
bt_addr_le_copy(&addr2, adv_info2.addr);
242300

243-
struct bt_le_oob oob1, oob2;
244-
bt_le_oob_get_local(id1, &oob1);
245-
bt_le_oob_get_local(id2, &oob2);
301+
bt_le_ext_adv_delete(adv2);
246302

247-
zassert_false(bt_addr_le_cmp(&oob1.addr, &oob2.addr) == 0,
248-
"RPAs are unexpectedly equal");
303+
zassert_false(bt_addr_le_eq(&addr1, &addr2),
304+
"RPAs are unexpectedly equal");
249305
}
250306

251307
ZTEST(bt_psa_integration, test_null_irk_generates_random_irk)

0 commit comments

Comments
 (0)