diff --git a/connectivity/FEATURE_BLE/include/ble/Gap.h b/connectivity/FEATURE_BLE/include/ble/Gap.h index 2ef43eb..32688fc 100644 --- a/connectivity/FEATURE_BLE/include/ble/Gap.h +++ b/connectivity/FEATURE_BLE/include/ble/Gap.h @@ -1002,10 +1002,30 @@ /** Cancel the connection attempt. This is not guaranteed to succeed. As a result * onConnectionComplete in the event handler will be called. Check the success parameter * to see if the connection was created. + * @depreacted This version has a defective API. You must provide the address of the peer. + * Please use the cancelConnect that takes peer address as parameters. + * This call will attempt to cancel the most recently requested connection. * * @return BLE_ERROR_NONE if the connection attempt has been requested to be cancelled. + * Returns BLE_ERROR_OPERATION_NOT_PERMITTED if no ongoing connection for last used address found. */ + MBED_DEPRECATED_SINCE("mbed-os-6.3.0", "Defective API. Please use the cancelConnect that takes peer address as parameters.") ble_error_t cancelConnect(); + + /** Cancel the connection attempt. This is not guaranteed to succeed. As a result + * onConnectionComplete in the event handler will be called. Check the success parameter + * to see if the connection was created. + * + * @param peerAddressType Address type you want to cancel connection process for. + * @param peerAddress Address you want to cancel connection process for. + * + * @return BLE_ERROR_NONE if the connection attempt has been requested to be cancelled. + * Returns BLE_ERROR_OPERATION_NOT_PERMITTED if no ongoing connection for address found. + */ + ble_error_t cancelConnect( + peer_address_type_t peerAddressType, + const address_t &peerAddress + ); #endif // BLE_ROLE_CENTRAL #if BLE_FEATURE_CONNECTABLE diff --git a/connectivity/FEATURE_BLE/include/ble/internal/PalGap.h b/connectivity/FEATURE_BLE/include/ble/internal/PalGap.h index c602bb8..de98fa8 100644 --- a/connectivity/FEATURE_BLE/include/ble/internal/PalGap.h +++ b/connectivity/FEATURE_BLE/include/ble/internal/PalGap.h @@ -1298,13 +1298,22 @@ /** * Cancel the ongoing connection creation process. * + * @param peer_address_type Type of address used by the advertiser. Not used + * if initiator_policy use the whitelist. + * + * @param Address used by the advertiser in its advertising packets. Not + * used if initiator_policy use the whitelist. + * * @return BLE_ERROR_NONE if the request has been successfully sent or the * appropriate error otherwise. * * @note: See Bluetooth 5 Vol 2 PartE: 7.8.13 LE create connection cancel * command. */ - virtual ble_error_t cancel_connection_creation() = 0; + virtual ble_error_t cancel_connection_creation( + peer_address_type_t peerAddressType, + const ble::address_t &peerAddress + ) = 0; /** * Return the number of total whitelist entries that can be stored in the diff --git a/connectivity/FEATURE_BLE/libraries/TARGET_CORDIO/include/ble/internal/PalGapImpl.h b/connectivity/FEATURE_BLE/libraries/TARGET_CORDIO/include/ble/internal/PalGapImpl.h index f5bf251..e90dfe2 100644 --- a/connectivity/FEATURE_BLE/libraries/TARGET_CORDIO/include/ble/internal/PalGapImpl.h +++ b/connectivity/FEATURE_BLE/libraries/TARGET_CORDIO/include/ble/internal/PalGapImpl.h @@ -97,7 +97,10 @@ uint16_t maximum_connection_event_length ); - ble_error_t cancel_connection_creation(); + ble_error_t cancel_connection_creation( + peer_address_type_t peerAddressType, + const ble::address_t &peerAddress + ); uint8_t read_white_list_capacity(); diff --git a/connectivity/FEATURE_BLE/libraries/TARGET_CORDIO/source/PalGapImpl.cpp b/connectivity/FEATURE_BLE/libraries/TARGET_CORDIO/source/PalGapImpl.cpp index 37b4ca0..239334b 100644 --- a/connectivity/FEATURE_BLE/libraries/TARGET_CORDIO/source/PalGapImpl.cpp +++ b/connectivity/FEATURE_BLE/libraries/TARGET_CORDIO/source/PalGapImpl.cpp @@ -18,6 +18,8 @@ #include "PalGap.h" #include "hci_api.h" #include "dm_api.h" +#include "dm_main.h" +#include "dm_conn.h" namespace ble { @@ -320,14 +322,25 @@ } -ble_error_t PalGap::cancel_connection_creation() +ble_error_t PalGap::cancel_connection_creation( + peer_address_type_t peerAddressType, + const ble::address_t &peerAddress +) { - DmConnClose( - DM_CLIENT_ID_APP, - /* connection handle - invalid */ DM_CONN_ID_NONE, - /* reason - invalid (use success) */ 0x00 - ); - return BLE_ERROR_NONE; + for (uint8_t connection_id = 0; connection_id < DM_CONN_MAX; connection_id++) { + if (dmConnCb.ccb[connection_id].inUse && + dmConnCb.ccb[connection_id].state == DM_CONN_SM_ST_CONNECTING && + BdaCmp(dmConnCb.ccb[connection_id].peerAddr, peerAddress.data())) { + DmConnClose( + DM_CLIENT_ID_APP, + /* connection handle */ connection_id + 1 /* connection IDs start at 1 */, + /* reason - invalid (use success) */ 0x00 + ); + return BLE_ERROR_NONE; + } + } + + return BLE_ERROR_OPERATION_NOT_PERMITTED; } diff --git a/connectivity/FEATURE_BLE/libraries/ble-api-implementation/include/ble/internal/GapImpl.h b/connectivity/FEATURE_BLE/libraries/ble-api-implementation/include/ble/internal/GapImpl.h index a89c8ba..75a9a52 100644 --- a/connectivity/FEATURE_BLE/libraries/ble-api-implementation/include/ble/internal/GapImpl.h +++ b/connectivity/FEATURE_BLE/libraries/ble-api-implementation/include/ble/internal/GapImpl.h @@ -209,6 +209,11 @@ const ConnectionParameters &connectionParams ); + ble_error_t cancelConnect( + peer_address_type_t peerAddressType, + const address_t &peerAddress + ); + ble_error_t cancelConnect(); #endif // BLE_ROLE_CENTRAL @@ -596,6 +601,10 @@ BitArray _set_is_connectable; bool _user_manage_connection_parameter_requests : 1; + + /* these need be removed when the deprecated cancelConnect() is removed */ + peer_address_type_t _last_used_peer_address_type = peer_address_type_t::ANONYMOUS; + ble::address_t _last_used_peer_address; }; } // namespace ble diff --git a/connectivity/FEATURE_BLE/libraries/ble-api-implementation/source/GapImpl.cpp b/connectivity/FEATURE_BLE/libraries/ble-api-implementation/source/GapImpl.cpp index a1ca5b5..214a675 100644 --- a/connectivity/FEATURE_BLE/libraries/ble-api-implementation/source/GapImpl.cpp +++ b/connectivity/FEATURE_BLE/libraries/ble-api-implementation/source/GapImpl.cpp @@ -507,6 +507,9 @@ return BLE_ERROR_INVALID_PARAM; } + _last_used_peer_address_type = peerAddressType; + _last_used_peer_address = peerAddress; + // ensure scan is stopped. _pal_gap.scan_enable(false, false); @@ -538,6 +541,9 @@ adjusted_address_type = peer_address_type_t::RANDOM; } + _last_used_peer_address_type = adjusted_address_type; + _last_used_peer_address = peerAddress; + return _pal_gap.extended_create_connection( connectionParams.getFilter(), connectionParams.getOwnAddressType(), @@ -625,12 +631,21 @@ ); } - ble_error_t Gap::cancelConnect() { - return _pal_gap.cancel_connection_creation(); + if (_last_used_peer_address_type != peer_address_type_t::ANONYMOUS) { + return cancelConnect(_last_used_peer_address_type, _last_used_peer_address); + } + return BLE_ERROR_OPERATION_NOT_PERMITTED; } +ble_error_t Gap::cancelConnect( + peer_address_type_t peerAddressType, + const ble::address_t &peerAddress +) +{ + return _pal_gap.cancel_connection_creation(peerAddressType, peerAddress); +} ble_error_t Gap::readPhy(ble::connection_handle_t connection) {