Skip to content

Commit f0bbc4c

Browse files
paul-szczepanek-armpan-
authored andcommitted
use enum for state
1 parent b008691 commit f0bbc4c

File tree

2 files changed

+65
-36
lines changed

2 files changed

+65
-36
lines changed

connectivity/FEATURE_BLE/source/generic/GapImpl.cpp

Lines changed: 56 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -470,7 +470,7 @@ ble_error_t Gap::stopScan()
470470

471471
if ((!_scan_enabled && !_scan_pending) || _scan_pending
472472
#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)
474474
#endif // BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
475475
) {
476476
return BLE_STACK_BUSY;
@@ -501,6 +501,12 @@ ble_error_t Gap::connect(
501501
const ConnectionParameters &connectionParams
502502
)
503503
{
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+
504510
if (!connectionParams.getNumberOfEnabledPhys()) {
505511
return BLE_ERROR_INVALID_PARAM;
506512
}
@@ -529,15 +535,18 @@ ble_error_t Gap::connect(
529535
ble_error_t ret = BLE_ERROR_INTERNAL_STACK_FAILURE;
530536

531537
#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;
539547
}
540-
#endif BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
548+
549+
#endif // BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
541550

542551
if (is_extended_advertising_available() == false) {
543552
phy_set_t set(connectionParams.getPhySet());
@@ -555,19 +564,20 @@ ble_error_t Gap::connect(
555564
stopScan();
556565
}
557566
#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) {
559568
ret = startScan(
560569
scan_duration_t::forever(),
561570
duplicates_filter_t::ENABLE,
562571
(scan_period_t)0
563572
);
564573
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;
569577
ret = BLE_ERROR_NO_MEM;
570578
}
579+
} else {
580+
_connect_to_host_resolved_address_state = ConnectionToHostResolvedAddressState::idle;
571581
}
572582
} else
573583
#endif // BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
@@ -711,7 +721,7 @@ ble_error_t Gap::rejectConnectionParametersUpdate(
711721
ble_error_t Gap::cancelConnect()
712722
{
713723
#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) {
715725
connecting_to_host_resolved_address_failed(false);
716726
stopScan();
717727
return BLE_ERROR_NONE;
@@ -1070,7 +1080,12 @@ ble_error_t Gap::reset()
10701080

10711081
#if BLE_FEATURE_PRIVACY
10721082
_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
10741089

10751090
#if BLE_ROLE_BROADCASTER
10761091
_advertising_timeout.detach();
@@ -1210,10 +1225,9 @@ void Gap::connecting_to_host_resolved_address_failed(bool inform_user)
12101225
)
12111226
);
12121227
}
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;
12171231
}
12181232
#endif // BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
12191233

@@ -2617,12 +2631,17 @@ void Gap::signal_advertising_report(
26172631

26182632
/* if successful then proceed to call the handler immediately same as for when privacy is disabled */
26192633
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;
26262645
}
26272646
} else {
26282647
_event_handler->onAdvertisingReport(
@@ -2685,11 +2704,16 @@ void Gap::conclude_signal_advertising_report_after_address_resolution(
26852704
peer_address_type_t::RANDOM_STATIC_IDENTITY
26862705
: peer_address_type_t::PUBLIC_IDENTITY;
26872706

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;
26932717
return;
26942718
}
26952719
}
@@ -2977,7 +3001,7 @@ ble_error_t Gap::startScan(
29773001
{
29783002
if (_scan_pending || _scan_address_refresh
29793003
#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)
29813005
#endif // BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
29823006
) {
29833007
return BLE_STACK_BUSY;

connectivity/FEATURE_BLE/source/generic/GapImpl.h

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -852,10 +852,15 @@ class Gap :
852852
bool _scan_interruptible = false;
853853
bool _scan_address_refresh = false;
854854
#if BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
855-
bool _ready_to_connect_to_host_resolved_address = false;
856-
peer_address_type_t _connect_to_address_type = peer_address_type_t::ANONYMOUS;
857-
ble::address_t _connect_to_address;
858-
ConnectionParameters *_connection_parameters = nullptr;
855+
enum class ConnectionToHostResolvedAddressState : uint8_t {
856+
idle,
857+
scan,
858+
connect
859+
};
860+
ble::address_t _connect_to_host_resolved_address;
861+
peer_address_type_t _connect_to_host_resolved_address_type = peer_address_type_t::ANONYMOUS;
862+
ConnectionToHostResolvedAddressState _connect_to_host_resolved_address_state = ConnectionToHostResolvedAddressState::idle;
863+
ConnectionParameters *_connect_to_host_resolved_address_parameters = nullptr;
859864
#endif // BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION
860865

861866
mbed::LowPowerTimeout _advertising_timeout;

0 commit comments

Comments
 (0)