39
39
40
40
#include "../host/conn_internal.h"
41
41
#include "../host/keys.h"
42
+ #include "../host/settings.h"
42
43
43
44
#include "common/bt_str.h"
44
45
#include "audio_internal.h"
@@ -81,8 +82,23 @@ struct bt_csip_set_member_svc_inst {
81
82
};
82
83
83
84
static struct bt_csip_set_member_svc_inst svc_insts [CONFIG_BT_CSIP_SET_MEMBER_MAX_INSTANCE_COUNT ];
85
+ static struct k_mutex svc_inst_lock ;
84
86
85
87
static void deferred_nfy_work_handler (struct k_work * work );
88
+ static void add_bonded_addr_to_client_list (const struct bt_bond_info * info , void * data );
89
+
90
+ #if defined(CONFIG_BT_SETTINGS )
91
+ static int csip_settings_commit (void )
92
+ {
93
+ bt_foreach_bond (BT_ID_DEFAULT , add_bonded_addr_to_client_list , NULL );
94
+
95
+ LOG_DBG ("Restored CSIP client list from bonded devices" );
96
+
97
+ return 0 ;
98
+ }
99
+
100
+ BT_SETTINGS_DEFINE (csip_set_member , "csip" , NULL , csip_settings_commit );
101
+ #endif /* CONFIG_BT_SETTINGS */
86
102
87
103
static K_WORK_DELAYABLE_DEFINE (deferred_nfy_work , deferred_nfy_work_handler ) ;
88
104
@@ -460,28 +476,49 @@ static void set_lock_timer_handler(struct k_work *work)
460
476
static void csip_security_changed (struct bt_conn * conn , bt_security_t level ,
461
477
enum bt_security_err err )
462
478
{
479
+ const bt_addr_le_t * peer_addr ;
480
+
463
481
if (err != 0 || conn -> encrypt == 0 ) {
464
482
return ;
465
483
}
466
484
485
+ peer_addr = bt_conn_get_dst (conn );
486
+
467
487
if (!bt_le_bond_exists (conn -> id , & conn -> le .dst )) {
468
488
return ;
469
489
}
470
490
471
491
for (size_t i = 0U ; i < ARRAY_SIZE (svc_insts ); i ++ ) {
472
492
struct bt_csip_set_member_svc_inst * svc_inst = & svc_insts [i ];
493
+ struct csip_client * client ;
494
+ bool found = false;
473
495
496
+ /* Check if client is already in the active list */
474
497
for (size_t j = 0U ; j < ARRAY_SIZE (svc_inst -> clients ); j ++ ) {
475
- struct csip_client * client ;
476
-
477
- client = & svc_inst -> clients [i ];
498
+ client = & svc_inst -> clients [j ];
478
499
479
- if (atomic_test_bit (client -> flags , FLAG_NOTIFY_LOCK ) &&
480
- bt_addr_le_eq (bt_conn_get_dst ( conn ) , & client -> addr )) {
481
- notify_work_reschedule ( K_NO_WAIT ) ;
500
+ if (atomic_test_bit (client -> flags , FLAG_ACTIVE ) &&
501
+ bt_addr_le_eq (peer_addr , & client -> addr )) {
502
+ found = true ;
482
503
break ;
483
504
}
484
505
}
506
+
507
+ /* If not found, add the bonded address to the client list */
508
+ if (!found ) {
509
+ const struct bt_bond_info bond_info = {
510
+ .addr = * peer_addr
511
+ };
512
+
513
+ add_bonded_addr_to_client_list (& bond_info , NULL );
514
+ return ;
515
+ }
516
+
517
+ /* Check if client is set with FLAG_NOTIFY_LOCK */
518
+ if (atomic_test_bit (client -> flags , FLAG_NOTIFY_LOCK )) {
519
+ notify_work_reschedule (K_NO_WAIT );
520
+ break ;
521
+ }
485
522
}
486
523
}
487
524
@@ -736,19 +773,36 @@ static void notify(struct bt_csip_set_member_svc_inst *svc_inst, struct bt_conn
736
773
const struct bt_uuid * uuid , const void * data , uint16_t len )
737
774
{
738
775
int err ;
776
+ const struct bt_gatt_attr * attr ;
777
+
778
+ k_mutex_lock (& svc_inst_lock , K_FOREVER );
739
779
740
- if (svc_inst -> service_p == NULL ) {
780
+ attr = bt_gatt_find_by_uuid (
781
+ svc_inst -> service_p -> attrs ,
782
+ svc_inst -> service_p -> attr_count ,
783
+ uuid );
784
+
785
+ if (!attr ) {
786
+ LOG_WRN ("Attribute for UUID %p not found" , uuid );
787
+ k_mutex_unlock (& svc_inst_lock );
741
788
return ;
742
789
}
743
790
744
- err = bt_gatt_notify_uuid (conn , uuid , svc_inst -> service_p -> attrs , data , len );
791
+ if (!bt_gatt_is_subscribed (conn , attr , BT_GATT_CCC_NOTIFY )) {
792
+ LOG_DBG ("Connection not subscribed to UUID %p" , uuid );
793
+ k_mutex_unlock (& svc_inst_lock );
794
+ return ;
795
+ }
796
+
797
+ err = bt_gatt_notify (conn , attr , data , len );
745
798
if (err ) {
746
799
if (err == - ENOTCONN ) {
747
800
LOG_DBG ("Notification error: ENOTCONN (%d)" , err );
748
801
} else {
749
802
LOG_ERR ("Notification error: %d" , err );
750
803
}
751
804
}
805
+ k_mutex_unlock (& svc_inst_lock );
752
806
}
753
807
754
808
static void notify_cb (struct bt_conn * conn , void * data )
@@ -769,7 +823,22 @@ static void notify_cb(struct bt_conn *conn, void *data)
769
823
770
824
for (size_t i = 0U ; i < ARRAY_SIZE (svc_insts ); i ++ ) {
771
825
struct bt_csip_set_member_svc_inst * svc_inst = & svc_insts [i ];
772
- struct csip_client * client = & svc_inst -> clients [bt_conn_index (conn )];
826
+
827
+ if (svc_inst -> service_p == NULL || svc_inst -> service_p -> attrs == NULL ) {
828
+ return ;
829
+ }
830
+
831
+ struct csip_client * client ;
832
+ /* find the client object for the connection */
833
+ for (size_t j = 0U ; j < ARRAY_SIZE (svc_inst -> clients ); j ++ ) {
834
+
835
+ client = & svc_inst -> clients [j ];
836
+
837
+ if (atomic_test_bit (client -> flags , FLAG_ACTIVE ) &&
838
+ bt_addr_le_eq (bt_conn_get_dst (conn ), & client -> addr )) {
839
+ break ;
840
+ }
841
+ }
773
842
774
843
if (atomic_test_and_clear_bit (client -> flags , FLAG_NOTIFY_LOCK )) {
775
844
notify (svc_inst , conn , BT_UUID_CSIS_SET_LOCK , & svc_inst -> set_lock ,
@@ -801,7 +870,7 @@ static void add_bonded_addr_to_client_list(const struct bt_bond_info *info, void
801
870
for (size_t i = 0U ; i < ARRAY_SIZE (svc_insts ); i ++ ) {
802
871
struct bt_csip_set_member_svc_inst * svc_inst = & svc_insts [i ];
803
872
804
- for (size_t j = 1U ; j < ARRAY_SIZE (svc_inst -> clients ); i ++ ) {
873
+ for (size_t j = 0U ; j < ARRAY_SIZE (svc_inst -> clients ); j ++ ) {
805
874
/* Check if device is registered, it not, add it */
806
875
if (!atomic_test_bit (svc_inst -> clients [j ].flags , FLAG_ACTIVE )) {
807
876
char addr_str [BT_ADDR_LE_STR_LEN ];
@@ -841,17 +910,14 @@ int bt_csip_set_member_register(const struct bt_csip_set_member_register_param *
841
910
return - EINVAL ;
842
911
}
843
912
913
+ k_mutex_init (& svc_inst_lock );
844
914
inst = & svc_insts [instance_cnt ];
845
915
inst -> service_p = & csip_set_member_service_list [instance_cnt ];
846
916
instance_cnt ++ ;
847
917
848
918
if (!first_register ) {
849
919
bt_conn_cb_register (& conn_callbacks );
850
920
bt_conn_auth_info_cb_register (& auth_callbacks );
851
-
852
- /* Restore bonding list */
853
- bt_foreach_bond (BT_ID_DEFAULT , add_bonded_addr_to_client_list , NULL );
854
-
855
921
first_register = true;
856
922
}
857
923
@@ -912,6 +978,8 @@ int bt_csip_set_member_unregister(struct bt_csip_set_member_svc_inst *svc_inst)
912
978
return - EINVAL ;
913
979
}
914
980
981
+ k_mutex_lock (& svc_inst_lock , K_FOREVER );
982
+
915
983
err = bt_gatt_service_unregister (svc_inst -> service_p );
916
984
if (err != 0 ) {
917
985
LOG_DBG ("CSIS service unregister failed: %d" , err );
@@ -921,6 +989,7 @@ int bt_csip_set_member_unregister(struct bt_csip_set_member_svc_inst *svc_inst)
921
989
(void )k_work_cancel_delayable (& svc_inst -> set_lock_timer );
922
990
memset (svc_inst , 0 , sizeof (* svc_inst ));
923
991
992
+ k_mutex_unlock (& svc_inst_lock );
924
993
return 0 ;
925
994
}
926
995
0 commit comments