@@ -38,6 +38,8 @@ LOG_MODULE_REGISTER(LOG_MODULE_NAME);
3838#define  WAIT_TIME  120 /*seconds*/ 
3939#define  IS_RPR_PRESENT   (CONFIG_BT_MESH_RPR_SRV && CONFIG_BT_MESH_RPR_CLI)
4040#define  IMPOSTER_MODEL_ID  0xe000
41+ /* Rough estimate of the time it should take the provisionee to stop sending unprov beacons. */ 
42+ #define  PROV_DELTA_THRESH_MS  100
4143
4244enum  test_flags  {
4345	IS_PROVISIONER ,
@@ -97,17 +99,26 @@ static uint32_t link_close_timestamp;
9799
98100/* Set prov_bearer to non-zero invalid value. */ 
99101static  bt_mesh_prov_bearer_t  prov_bearer  =  0xF8 ;
102+ static  bt_mesh_prov_bearer_t  prov_to_use ;
100103
101104static  void  test_args_parse (int  argc , char  * argv [])
102105{
103106	bs_args_struct_t  args_struct [] =  {
104107		{
105108			.dest  =  & prov_bearer ,
106109			.type  =  'i' ,
107- 			.name  =  "{invalid, PB-ADV, PB-GATT}" ,
110+ 			.name  =  "{invalid, PB-ADV, PB-GATT, (PB-ADV | PB-GATT) }" ,
108111			.option  =  "prov-bearer" ,
109112			.descript  =  "Provisioning bearer that is to be used." 
110113		},
114+ 		{
115+ 			.dest  =  & prov_to_use ,
116+ 			.type  =  'i' ,
117+ 			.name  =  "{PB-ADV, PB-GATT}" ,
118+ 			.option  =  "prov-to-use" ,
119+ 			.descript  =  "Provisioning bearer that is to be used in the case that " 
120+ 				    "multiple provisioning bearers are enabled in prov_bearer." 
121+ 		},
111122	};
112123
113124	bs_args_parse_all_cmd_line (argc , argv , args_struct );
@@ -275,6 +286,42 @@ static void test_terminate(void)
275286	}
276287}
277288
289+ static  uint64_t  prov_started_time_ms ;
290+ static  uint8_t  prov_uuid [16 ];
291+ 
292+ static  void  provision (uint8_t  uuid [16 ], bt_mesh_prov_bearer_t  bearer )
293+ {
294+ 	int  err ;
295+ 
296+ 	switch  (bearer ) {
297+ 	case  BT_MESH_PROV_ADV :
298+ 		err  =  bt_mesh_provision_adv (uuid , 0 , prov_addr , 0 );
299+ 		break ;
300+ 	case  BT_MESH_PROV_GATT :
301+ 		err  =  bt_mesh_provision_gatt (uuid , 0 , prov_addr , 0 );
302+ 		break ;
303+ 	default :
304+ 		err  =  - ENOTSUP ;
305+ 	}
306+ 
307+ 	if  (!err ) {
308+ 		LOG_INF ("Provisioning over %s started." ,
309+ 			bearer  ==  BT_MESH_PROV_ADV  ? "PB-ADV"  : "PB-GATT" );
310+ 		prov_started_time_ms  =  k_uptime_get ();
311+ 		memcpy (prov_uuid , uuid , 16 );
312+ 	}
313+ }
314+ 
315+ static  void  provisionee_beacon_check (uint8_t  uuid [16 ], bt_mesh_prov_bearer_t  bearer )
316+ {
317+ 	if  (memcmp (uuid , prov_uuid , 16 ) ==  0 ) {
318+ 		ASSERT_FALSE_MSG ((prov_started_time_ms  && 
319+ 				  (k_uptime_delta (& prov_started_time_ms ) >  PROV_DELTA_THRESH_MS )),
320+ 				 "Received %s beacon from provisionee after provisioning started." ,
321+ 				 bearer  ==  BT_MESH_PROV_ADV  ? "PB-ADV"  : "PB-GATT" );
322+ 	}
323+ }
324+ 
278325static  void  unprovisioned_beacon (uint8_t  uuid [16 ],
279326				 bt_mesh_prov_oob_info_t  oob_info ,
280327				 uint32_t  * uri_hash )
@@ -286,7 +333,12 @@ static void unprovisioned_beacon(uint8_t uuid[16],
286333	if  (uuid_to_provision  &&  memcmp (uuid , uuid_to_provision , 16 )) {
287334		return ;
288335	}
289- 	bt_mesh_provision_adv (uuid , 0 , prov_addr , 0 );
336+ 
337+ 	provisionee_beacon_check (uuid , BT_MESH_PROV_ADV );
338+ 
339+ 	if  (!prov_to_use  ||  prov_to_use  ==  BT_MESH_PROV_ADV ) {
340+ 		provision (uuid , BT_MESH_PROV_ADV );
341+ 	}
290342}
291343
292344static  void  unprovisioned_beacon_gatt (uint8_t  uuid [16 ], bt_mesh_prov_oob_info_t  oob_info )
@@ -299,7 +351,11 @@ static void unprovisioned_beacon_gatt(uint8_t uuid[16], bt_mesh_prov_oob_info_t
299351		return ;
300352	}
301353
302- 	bt_mesh_provision_gatt (uuid , 0 , prov_addr , 0 );
354+ 	provisionee_beacon_check (uuid , BT_MESH_PROV_GATT );
355+ 
356+ 	if  (!prov_to_use  ||  prov_to_use  ==  BT_MESH_PROV_GATT ) {
357+ 		provision (uuid , BT_MESH_PROV_GATT );
358+ 	}
303359}
304360
305361static  void  prov_complete (uint16_t  net_idx , uint16_t  addr )
@@ -324,6 +380,8 @@ static void prov_node_added(uint16_t net_idx, uint8_t uuid[16], uint16_t addr,
324380{
325381	LOG_INF ("Device 0x%04x provisioned" , prov_addr );
326382	current_dev_addr  =  prov_addr ++ ;
383+ 	prov_started_time_ms  =  0 ;
384+ 	memset (prov_uuid , 0 , 16 );
327385	k_sem_give (& prov_sem );
328386}
329387
@@ -340,6 +398,7 @@ static void prov_reset(void)
340398
341399static  bt_mesh_input_action_t  gact ;
342400static  uint8_t  gsize ;
401+ static  bool  oob_wait_unprov_int ;
343402static  int  input (bt_mesh_input_action_t  act , uint8_t  size )
344403{
345404	/* The test system requests the input OOB data earlier than 
@@ -350,7 +409,9 @@ static int input(bt_mesh_input_action_t act, uint8_t size)
350409	gact  =  act ;
351410	gsize  =  size ;
352411
353- 	k_work_reschedule (& oob_timer , K_SECONDS (1 ));
412+ 	k_work_reschedule (& oob_timer , oob_wait_unprov_int 
413+ 					      ? K_SECONDS (CONFIG_BT_MESH_UNPROV_BEACON_INT  +  1 )
414+ 					      : K_SECONDS (1 ));
354415
355416	return  0 ;
356417}
@@ -734,6 +795,49 @@ static void test_provisioner_oob_auth_no_oob_public_key(void)
734795	PASS ();
735796}
736797
798+ static  void  test_provisioner_pb_cancel (void )
799+ {
800+ 	k_sem_init (& prov_sem , 0 , 1 );
801+ 
802+ 	bt_mesh_device_setup (& prov , & comp );
803+ 
804+ 	ASSERT_OK (bt_mesh_cdb_create (test_net_key ));
805+ 
806+ 	ASSERT_OK (bt_mesh_provision (test_net_key , 0 , 0 , 0 , 0x0001 , dev_key ));
807+ 
808+ 	prov .static_val  =  0 ;
809+ 	prov .static_val_len  =  0 ;
810+ 	prov .output_size  =  0 ;
811+ 	prov .output_actions  =  0 ;
812+ 	prov .input_size  =  8 ;
813+ 	prov .input_actions  =  BT_MESH_ENTER_NUMBER ;
814+ 
815+ 	ASSERT_OK (k_sem_take (& prov_sem , K_SECONDS (20 )));
816+ 
817+ 	PASS ();
818+ }
819+ 
820+ static  void  test_device_pb_cancel (void )
821+ {
822+ 	oob_wait_unprov_int  =  true;
823+ 	k_sem_init (& prov_sem , 0 , 1 );
824+ 
825+ 	bt_mesh_device_setup (& prov , & comp );
826+ 
827+ 	prov .static_val  =  0 ;
828+ 	prov .static_val_len  =  0 ;
829+ 	prov .output_size  =  0 ;
830+ 	prov .output_actions  =  0 ;
831+ 	prov .input_size  =  8 ;
832+ 	prov .input_actions  =  BT_MESH_ENTER_NUMBER ;
833+ 
834+ 	ASSERT_OK (bt_mesh_prov_enable (prov_bearer ));
835+ 
836+ 	ASSERT_OK (k_sem_take (& prov_sem , K_SECONDS (20 )));
837+ 
838+ 	PASS ();
839+ }
840+ 
737841/** @brief Verify that the provisioner can provision multiple devices in a row 
738842 */ 
739843static  void  test_provisioner_multi (void )
@@ -1798,6 +1902,7 @@ static const struct bst_test_instance test_connect[] = {
17981902	TEST_CASE_WBACKCHANNEL (device , oob_public_key ,
17991903			       "Device: provisioning use oob public key" ),
18001904	TEST_CASE (device , reprovision , "Device: provisioning, reprovision" ),
1905+ 	TEST_CASE_WBACKCHANNEL (device , pb_cancel , "Device: provisioning, cancel prov bearers." ),
18011906#if  IS_RPR_PRESENT 
18021907	TEST_CASE (device , pb_remote_server_unproved ,
18031908		  "Device: used for remote provisioning, starts unprovisioned" ),
@@ -1828,6 +1933,8 @@ static const struct bst_test_instance test_connect[] = {
18281933	TEST_CASE (
18291934		provisioner , reprovision ,
18301935		"Provisioner: provisioning, resetting and reprovisioning multiple times." ),
1936+ 	TEST_CASE_WBACKCHANNEL (
1937+ 		provisioner , pb_cancel , "Provisioner: provisioning, cancel prov bearers." ),
18311938#if  IS_RPR_PRESENT 
18321939	TEST_CASE (provisioner , pb_remote_client_reprovision ,
18331940		  "Provisioner: pb-remote provisioning, resetting and reprov-ing multiple times." ),
0 commit comments