From f0bbc4c7ae15996f0aa349cc6f4490e3ad38c53d Mon Sep 17 00:00:00 2001 From: Paul Szczeanek Date: Thu, 1 Oct 2020 10:45:43 +0100 Subject: [PATCH] use enum for state --- .../FEATURE_BLE/source/generic/GapImpl.cpp | 88 ++++++++++++------- .../FEATURE_BLE/source/generic/GapImpl.h | 13 ++- 2 files changed, 65 insertions(+), 36 deletions(-) diff --git a/connectivity/FEATURE_BLE/source/generic/GapImpl.cpp b/connectivity/FEATURE_BLE/source/generic/GapImpl.cpp index d8cd93accf..45200ef417 100644 --- a/connectivity/FEATURE_BLE/source/generic/GapImpl.cpp +++ b/connectivity/FEATURE_BLE/source/generic/GapImpl.cpp @@ -470,7 +470,7 @@ ble_error_t Gap::stopScan() if ((!_scan_enabled && !_scan_pending) || _scan_pending #if BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION - || _ready_to_connect_to_host_resolved_address + || (_connect_to_host_resolved_address_state != ConnectionToHostResolvedAddressState::idle) #endif // BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION ) { return BLE_STACK_BUSY; @@ -501,6 +501,12 @@ ble_error_t Gap::connect( const ConnectionParameters &connectionParams ) { +#if BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION + if (_connect_to_host_resolved_address_state == ConnectionToHostResolvedAddressState::scan) { + return BLE_ERROR_OPERATION_NOT_PERMITTED; + } +#endif BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION + if (!connectionParams.getNumberOfEnabledPhys()) { return BLE_ERROR_INVALID_PARAM; } @@ -529,15 +535,18 @@ ble_error_t Gap::connect( ble_error_t ret = BLE_ERROR_INTERNAL_STACK_FAILURE; #if BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION - if (_ready_to_connect_to_host_resolved_address) { - _ready_to_connect_to_host_resolved_address = false; - _connect_to_address_type = peer_address_type_t::ANONYMOUS; - } else if (peerAddressType == peer_address_type_t::RANDOM_STATIC_IDENTITY || - peerAddressType == peer_address_type_t::PUBLIC_IDENTITY) { - _connect_to_address_type = peerAddressType; - _connect_to_address = peerAddress; + if (_connect_to_host_resolved_address_state == ConnectionToHostResolvedAddressState::idle) { + if (peerAddressType == peer_address_type_t::RANDOM_STATIC_IDENTITY || + peerAddressType == peer_address_type_t::PUBLIC_IDENTITY) { + _connect_to_host_resolved_address_type = peerAddressType; + _connect_to_host_resolved_address = peerAddress; + _connect_to_host_resolved_address_state = ConnectionToHostResolvedAddressState::scan; + } + } else if (_connect_to_host_resolved_address_state == ConnectionToHostResolvedAddressState::connect) { + _connect_to_host_resolved_address_state = ConnectionToHostResolvedAddressState::idle; } -#endif BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION + +#endif // BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION if (is_extended_advertising_available() == false) { phy_set_t set(connectionParams.getPhySet()); @@ -555,19 +564,20 @@ ble_error_t Gap::connect( stopScan(); } #if BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION - if (_connect_to_address_type != peer_address_type_t::ANONYMOUS) { + if (_connect_to_host_resolved_address_state == ConnectionToHostResolvedAddressState::scan) { ret = startScan( scan_duration_t::forever(), duplicates_filter_t::ENABLE, (scan_period_t)0 ); if (ret == BLE_ERROR_NONE) { - _connection_parameters = new ConnectionParameters(connectionParams); - if (_connection_parameters) { - _ready_to_connect_to_host_resolved_address = true; - } else { + _connect_to_host_resolved_address_parameters = new ConnectionParameters(connectionParams); + if (!_connect_to_host_resolved_address_parameters) { + _connect_to_host_resolved_address_state = ConnectionToHostResolvedAddressState::idle; ret = BLE_ERROR_NO_MEM; } + } else { + _connect_to_host_resolved_address_state = ConnectionToHostResolvedAddressState::idle; } } else #endif // BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION @@ -711,7 +721,7 @@ ble_error_t Gap::rejectConnectionParametersUpdate( ble_error_t Gap::cancelConnect() { #if BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION - if (_ready_to_connect_to_host_resolved_address) { + if (_connect_to_host_resolved_address_state == ConnectionToHostResolvedAddressState::scan) { connecting_to_host_resolved_address_failed(false); stopScan(); return BLE_ERROR_NONE; @@ -1070,7 +1080,12 @@ ble_error_t Gap::reset() #if BLE_FEATURE_PRIVACY _privacy_initialization_pending = false; -#endif +#if BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION + _connect_to_host_resolved_address_state = ConnectionToHostResolvedAddressState::idle; + delete _connect_to_host_resolved_address_parameters; + _connect_to_host_resolved_address_parameters = nullptr; +#endif // BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION +#endif // BLE_FEATURE_PRIVACY #if BLE_ROLE_BROADCASTER _advertising_timeout.detach(); @@ -1210,10 +1225,9 @@ void Gap::connecting_to_host_resolved_address_failed(bool inform_user) ) ); } - _ready_to_connect_to_host_resolved_address = false; - _connect_to_address_type = peer_address_type_t::ANONYMOUS; - delete _connection_parameters; - _connection_parameters = nullptr; + _connect_to_host_resolved_address_state = ConnectionToHostResolvedAddressState::idle; + delete _connect_to_host_resolved_address_parameters; + _connect_to_host_resolved_address_parameters = nullptr; } #endif // BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION @@ -2617,12 +2631,17 @@ void Gap::signal_advertising_report( /* if successful then proceed to call the handler immediately same as for when privacy is disabled */ if (address_resolved) { - if (_ready_to_connect_to_host_resolved_address) { - if (_connect_to_address_type == event.getDirectAddressType() && - _connect_to_address == event.getDirectAddress()) { - connect(_connect_to_address_type, _connect_to_address, *_connection_parameters); - delete _connection_parameters; - _connection_parameters = nullptr; + if (_connect_to_host_resolved_address_state == ConnectionToHostResolvedAddressState::scan) { + if (_connect_to_host_resolved_address_type == event.getDirectAddressType() && + _connect_to_host_resolved_address == event.getDirectAddress()) { + _connect_to_host_resolved_address_state = ConnectionToHostResolvedAddressState::connect; + connect( + _connect_to_host_resolved_address_type, + _connect_to_host_resolved_address, + *_connect_to_host_resolved_address_parameters + ); + delete _connect_to_host_resolved_address_parameters; + _connect_to_host_resolved_address_parameters = nullptr; } } else { _event_handler->onAdvertisingReport( @@ -2685,11 +2704,16 @@ void Gap::conclude_signal_advertising_report_after_address_resolution( peer_address_type_t::RANDOM_STATIC_IDENTITY : peer_address_type_t::PUBLIC_IDENTITY; - if (_ready_to_connect_to_host_resolved_address) { - if (_connect_to_address_type == peer_address_type && _connect_to_address == *identity_address) { - connect(event.getPeerAddressType(), event.getPeerAddress(), *_connection_parameters); - delete _connection_parameters; - _connection_parameters = nullptr; + if (_connect_to_host_resolved_address_state == ConnectionToHostResolvedAddressState::scan) { + if (_connect_to_host_resolved_address_type == peer_address_type && _connect_to_host_resolved_address == *identity_address) { + _connect_to_host_resolved_address_state = ConnectionToHostResolvedAddressState::connect; + connect( + event.getPeerAddressType(), + event.getPeerAddress(), + *_connect_to_host_resolved_address_parameters + ); + delete _connect_to_host_resolved_address_parameters; + _connect_to_host_resolved_address_parameters = nullptr; return; } } @@ -2977,7 +3001,7 @@ ble_error_t Gap::startScan( { if (_scan_pending || _scan_address_refresh #if BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION - || _ready_to_connect_to_host_resolved_address + || (_connect_to_host_resolved_address_state != ConnectionToHostResolvedAddressState::idle) #endif // BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION ) { return BLE_STACK_BUSY; diff --git a/connectivity/FEATURE_BLE/source/generic/GapImpl.h b/connectivity/FEATURE_BLE/source/generic/GapImpl.h index 8fa97f28e6..61d1c7f28e 100644 --- a/connectivity/FEATURE_BLE/source/generic/GapImpl.h +++ b/connectivity/FEATURE_BLE/source/generic/GapImpl.h @@ -852,10 +852,15 @@ private: bool _scan_interruptible = false; bool _scan_address_refresh = false; #if BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION - bool _ready_to_connect_to_host_resolved_address = false; - peer_address_type_t _connect_to_address_type = peer_address_type_t::ANONYMOUS; - ble::address_t _connect_to_address; - ConnectionParameters *_connection_parameters = nullptr; + enum class ConnectionToHostResolvedAddressState : uint8_t { + idle, + scan, + connect + }; + ble::address_t _connect_to_host_resolved_address; + peer_address_type_t _connect_to_host_resolved_address_type = peer_address_type_t::ANONYMOUS; + ConnectionToHostResolvedAddressState _connect_to_host_resolved_address_state = ConnectionToHostResolvedAddressState::idle; + ConnectionParameters *_connect_to_host_resolved_address_parameters = nullptr; #endif // BLE_GAP_HOST_BASED_PRIVATE_ADDRESS_RESOLUTION mbed::LowPowerTimeout _advertising_timeout;