@@ -470,7 +470,7 @@ ble_error_t Gap::stopScan()
470
470
471
471
if ((!_scan_enabled && !_scan_pending) || _scan_pending
472
472
#if BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
473
- || _ready_to_connect_to_host_resolved_address
473
+ || (_connect_to_host_resolved_address_state != ConnectionToHostResolvedAddressState::idle)
474
474
#endif // BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
475
475
) {
476
476
return BLE_STACK_BUSY;
@@ -501,6 +501,12 @@ ble_error_t Gap::connect(
501
501
const ConnectionParameters &connectionParams
502
502
)
503
503
{
504
+ #if BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
505
+ if (_connect_to_host_resolved_address_state == ConnectionToHostResolvedAddressState::scan) {
506
+ return BLE_ERROR_OPERATION_NOT_PERMITTED;
507
+ }
508
+ #endif BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
509
+
504
510
if (!connectionParams.getNumberOfEnabledPhys ()) {
505
511
return BLE_ERROR_INVALID_PARAM;
506
512
}
@@ -529,15 +535,18 @@ ble_error_t Gap::connect(
529
535
ble_error_t ret = BLE_ERROR_INTERNAL_STACK_FAILURE;
530
536
531
537
#if BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
532
- if (_ready_to_connect_to_host_resolved_address) {
533
- _ready_to_connect_to_host_resolved_address = false ;
534
- _connect_to_address_type = peer_address_type_t ::ANONYMOUS;
535
- } else if (peerAddressType == peer_address_type_t ::RANDOM_STATIC_IDENTITY ||
536
- peerAddressType == peer_address_type_t ::PUBLIC_IDENTITY) {
537
- _connect_to_address_type = peerAddressType;
538
- _connect_to_address = peerAddress;
538
+ if (_connect_to_host_resolved_address_state == ConnectionToHostResolvedAddressState::idle) {
539
+ if (peerAddressType == peer_address_type_t ::RANDOM_STATIC_IDENTITY ||
540
+ peerAddressType == peer_address_type_t ::PUBLIC_IDENTITY) {
541
+ _connect_to_host_resolved_address_type = peerAddressType;
542
+ _connect_to_host_resolved_address = peerAddress;
543
+ _connect_to_host_resolved_address_state = ConnectionToHostResolvedAddressState::scan;
544
+ }
545
+ } else if (_connect_to_host_resolved_address_state == ConnectionToHostResolvedAddressState::connect) {
546
+ _connect_to_host_resolved_address_state = ConnectionToHostResolvedAddressState::idle;
539
547
}
540
- #endif BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
548
+
549
+ #endif // BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
541
550
542
551
if (is_extended_advertising_available () == false ) {
543
552
phy_set_t set (connectionParams.getPhySet ());
@@ -555,19 +564,20 @@ ble_error_t Gap::connect(
555
564
stopScan ();
556
565
}
557
566
#if BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
558
- if (_connect_to_address_type != peer_address_type_t ::ANONYMOUS ) {
567
+ if (_connect_to_host_resolved_address_state == ConnectionToHostResolvedAddressState::scan ) {
559
568
ret = startScan (
560
569
scan_duration_t::forever (),
561
570
duplicates_filter_t ::ENABLE,
562
571
(scan_period_t )0
563
572
);
564
573
if (ret == BLE_ERROR_NONE) {
565
- _connection_parameters = new ConnectionParameters (connectionParams);
566
- if (_connection_parameters) {
567
- _ready_to_connect_to_host_resolved_address = true ;
568
- } else {
574
+ _connect_to_host_resolved_address_parameters = new ConnectionParameters (connectionParams);
575
+ if (!_connect_to_host_resolved_address_parameters) {
576
+ _connect_to_host_resolved_address_state = ConnectionToHostResolvedAddressState::idle;
569
577
ret = BLE_ERROR_NO_MEM;
570
578
}
579
+ } else {
580
+ _connect_to_host_resolved_address_state = ConnectionToHostResolvedAddressState::idle;
571
581
}
572
582
} else
573
583
#endif // BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
@@ -711,7 +721,7 @@ ble_error_t Gap::rejectConnectionParametersUpdate(
711
721
ble_error_t Gap::cancelConnect ()
712
722
{
713
723
#if BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
714
- if (_ready_to_connect_to_host_resolved_address ) {
724
+ if (_connect_to_host_resolved_address_state == ConnectionToHostResolvedAddressState::scan ) {
715
725
connecting_to_host_resolved_address_failed (false );
716
726
stopScan ();
717
727
return BLE_ERROR_NONE;
@@ -1070,7 +1080,12 @@ ble_error_t Gap::reset()
1070
1080
1071
1081
#if BLE_FEATURE_PRIVACY
1072
1082
_privacy_initialization_pending = false ;
1073
- #endif
1083
+ #if BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
1084
+ _connect_to_host_resolved_address_state = ConnectionToHostResolvedAddressState::idle;
1085
+ delete _connect_to_host_resolved_address_parameters;
1086
+ _connect_to_host_resolved_address_parameters = nullptr ;
1087
+ #endif // BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
1088
+ #endif // BLE_FEATURE_PRIVACY
1074
1089
1075
1090
#if BLE_ROLE_BROADCASTER
1076
1091
_advertising_timeout.detach ();
@@ -1210,10 +1225,9 @@ void Gap::connecting_to_host_resolved_address_failed(bool inform_user)
1210
1225
)
1211
1226
);
1212
1227
}
1213
- _ready_to_connect_to_host_resolved_address = false ;
1214
- _connect_to_address_type = peer_address_type_t ::ANONYMOUS;
1215
- delete _connection_parameters;
1216
- _connection_parameters = nullptr ;
1228
+ _connect_to_host_resolved_address_state = ConnectionToHostResolvedAddressState::idle;
1229
+ delete _connect_to_host_resolved_address_parameters;
1230
+ _connect_to_host_resolved_address_parameters = nullptr ;
1217
1231
}
1218
1232
#endif // BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
1219
1233
@@ -2617,12 +2631,17 @@ void Gap::signal_advertising_report(
2617
2631
2618
2632
/* if successful then proceed to call the handler immediately same as for when privacy is disabled */
2619
2633
if (address_resolved) {
2620
- if (_ready_to_connect_to_host_resolved_address) {
2621
- if (_connect_to_address_type == event.getDirectAddressType () &&
2622
- _connect_to_address == event.getDirectAddress ()) {
2623
- connect (_connect_to_address_type, _connect_to_address, *_connection_parameters);
2624
- delete _connection_parameters;
2625
- _connection_parameters = nullptr ;
2634
+ if (_connect_to_host_resolved_address_state == ConnectionToHostResolvedAddressState::scan) {
2635
+ if (_connect_to_host_resolved_address_type == event.getDirectAddressType () &&
2636
+ _connect_to_host_resolved_address == event.getDirectAddress ()) {
2637
+ _connect_to_host_resolved_address_state = ConnectionToHostResolvedAddressState::connect;
2638
+ connect (
2639
+ _connect_to_host_resolved_address_type,
2640
+ _connect_to_host_resolved_address,
2641
+ *_connect_to_host_resolved_address_parameters
2642
+ );
2643
+ delete _connect_to_host_resolved_address_parameters;
2644
+ _connect_to_host_resolved_address_parameters = nullptr ;
2626
2645
}
2627
2646
} else {
2628
2647
_event_handler->onAdvertisingReport (
@@ -2685,11 +2704,16 @@ void Gap::conclude_signal_advertising_report_after_address_resolution(
2685
2704
peer_address_type_t ::RANDOM_STATIC_IDENTITY
2686
2705
: peer_address_type_t ::PUBLIC_IDENTITY;
2687
2706
2688
- if (_ready_to_connect_to_host_resolved_address) {
2689
- if (_connect_to_address_type == peer_address_type && _connect_to_address == *identity_address) {
2690
- connect (event.getPeerAddressType (), event.getPeerAddress (), *_connection_parameters);
2691
- delete _connection_parameters;
2692
- _connection_parameters = nullptr ;
2707
+ if (_connect_to_host_resolved_address_state == ConnectionToHostResolvedAddressState::scan) {
2708
+ if (_connect_to_host_resolved_address_type == peer_address_type && _connect_to_host_resolved_address == *identity_address) {
2709
+ _connect_to_host_resolved_address_state = ConnectionToHostResolvedAddressState::connect;
2710
+ connect (
2711
+ event.getPeerAddressType (),
2712
+ event.getPeerAddress (),
2713
+ *_connect_to_host_resolved_address_parameters
2714
+ );
2715
+ delete _connect_to_host_resolved_address_parameters;
2716
+ _connect_to_host_resolved_address_parameters = nullptr ;
2693
2717
return ;
2694
2718
}
2695
2719
}
@@ -2977,7 +3001,7 @@ ble_error_t Gap::startScan(
2977
3001
{
2978
3002
if (_scan_pending || _scan_address_refresh
2979
3003
#if BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
2980
- || _ready_to_connect_to_host_resolved_address
3004
+ || (_connect_to_host_resolved_address_state != ConnectionToHostResolvedAddressState::idle)
2981
3005
#endif // BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
2982
3006
) {
2983
3007
return BLE_STACK_BUSY;
0 commit comments