@@ -55,12 +55,6 @@ ZTEST(bt_psa_integration, test_rpa_creation_and_resolution)
55
55
ZTEST (bt_psa_integration , test_advertising_address_is_rpa ) {
56
56
int err ;
57
57
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
-
64
58
uint8_t irk [] = {0xDE , 0xAD , 0xBE , 0xEF , 0xDE , 0xAD , 0xBE , 0xEF ,
65
59
0xDE , 0xAD , 0xBE , 0xEF , 0xDE , 0xAD , 0xBE , 0xEF };
66
60
@@ -71,43 +65,40 @@ ZTEST(bt_psa_integration, test_advertising_address_is_rpa) {
71
65
bt_id_reset (id , NULL , irk );
72
66
73
67
k_sleep (K_SECONDS (1 ));
74
-
68
+ struct bt_le_ext_adv * adv ;
75
69
const struct bt_le_adv_param adv_params = {
76
70
.id = id ,
77
71
.options = BT_LE_ADV_OPT_CONN ,
78
72
.interval_min = BT_GAP_ADV_FAST_INT_MIN_2 ,
79
73
.interval_max = BT_GAP_ADV_FAST_INT_MAX_2 ,
80
74
};
81
75
76
+ err = bt_le_ext_adv_create (& adv_params , NULL , & adv );
77
+ zassert_equal (err , 0 , "Extended advertising object creation failed: %d" , err );
78
+
82
79
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 );
84
85
zassert_equal (err , 0 , "Advertising start failed: %d" , err );
85
86
86
87
k_sleep (K_SECONDS (1 ));
87
88
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 );
94
92
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" );
101
97
98
+ zassert_true (BT_ADDR_IS_RPA (& advertising_info .addr -> a ), "Advertiser address is not RPA" );
102
99
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 );
111
102
// bt_disable();
112
103
}
113
104
@@ -130,64 +121,61 @@ ZTEST(bt_psa_integration, test_rpa_rotation) {
130
121
bt_id_reset (id , NULL , irk );
131
122
132
123
k_sleep (K_SECONDS (1 ));
133
-
124
+ struct bt_le_ext_adv * adv ;
134
125
const struct bt_le_adv_param adv_params = {
135
126
.id = id ,
136
127
.options = BT_LE_ADV_OPT_CONN ,
137
128
.interval_min = BT_GAP_ADV_FAST_INT_MIN_2 ,
138
129
.interval_max = BT_GAP_ADV_FAST_INT_MAX_2 ,
139
130
};
140
131
132
+ err = bt_le_ext_adv_create (& adv_params , NULL , & adv );
133
+ zassert_equal (err , 0 , "Extended advertising object creation failed: %d" , err );
134
+
141
135
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 );
143
141
zassert_equal (err , 0 , "Advertising start failed: %d" , err );
144
142
145
143
k_sleep (K_SECONDS (1 ));
146
144
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 );
160
148
161
149
162
150
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 ;
170
159
err = bt_le_set_rpa_timeout (rpa_short_timeout );
171
160
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 ));
174
163
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 ;
179
167
180
168
LOG_INF ("Rotated address: %02X:%02X:%02X:%02X:%02X:%02X" ,
181
169
addr_after .a .val [5 ], addr_after .a .val [4 ], addr_after .a .val [3 ],
182
170
addr_after .a .val [2 ], addr_after .a .val [1 ], addr_after .a .val [0 ]);
183
171
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" );
185
173
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 ,
187
175
"RPA did not rotate" );
188
176
189
- bt_le_adv_stop ( );
190
- // bt_disable( );
177
+ bt_le_ext_adv_stop ( adv );
178
+ bt_le_ext_adv_delete ( adv );
191
179
}
192
180
193
181
ZTEST (bt_psa_integration , test_rpa_is_stable_before_timeout )
@@ -198,54 +186,122 @@ ZTEST(bt_psa_integration, test_rpa_is_stable_before_timeout)
198
186
int id = bt_id_create (NULL , irk );
199
187
zassert_true (id >= 0 , "ID creation failed" );
200
188
189
+ struct bt_le_ext_adv * adv ;
201
190
struct bt_le_adv_param adv_params = {
202
191
.id = id ,
203
192
.options = BT_LE_ADV_OPT_CONN ,
204
193
.interval_min = BT_GAP_ADV_FAST_INT_MIN_2 ,
205
194
.interval_max = BT_GAP_ADV_FAST_INT_MAX_2 ,
206
195
};
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 );
208
206
zassert_equal (err , 0 , "Adv start failed" );
209
207
210
208
// 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 );
232
241
}
233
242
234
243
ZTEST (bt_psa_integration , test_different_irks_yield_different_rpas )
235
244
{
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" );
238
298
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 );
242
300
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 );
246
302
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" );
249
305
}
250
306
251
307
ZTEST (bt_psa_integration , test_null_irk_generates_random_irk )
0 commit comments