Merge pull request #13390 from paul-szczepanek-arm/fix-cancel-connect

Fix cancel connect
pull/13419/head
Martin Kojtal 2020-08-11 14:54:44 +01:00 committed by GitHub
commit 3b25d2ded0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 80 additions and 11 deletions

View File

@ -1002,10 +1002,30 @@ public:
/** 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

View File

@ -1298,13 +1298,22 @@ public:
/**
* 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

View File

@ -97,7 +97,10 @@ public:
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();

View File

@ -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::create_connection(
}
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;
}

View File

@ -209,6 +209,11 @@ public:
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 @@ private:
BitArray<BLE_GAP_MAX_ADVERTISING_SETS> _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

View File

@ -507,6 +507,9 @@ ble_error_t Gap::connect(
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 @@ ble_error_t Gap::connect(
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::rejectConnectionParametersUpdate(
);
}
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)
{