Skip to content

Commit

Permalink
fix cancel connect to accept peer address
Browse files Browse the repository at this point in the history
  • Loading branch information
paul-szczepanek-arm committed Aug 10, 2020
1 parent 7cbf2bd commit 0a9624d
Show file tree
Hide file tree
Showing 6 changed files with 80 additions and 12 deletions.
20 changes: 20 additions & 0 deletions connectivity/FEATURE_BLE/include/ble/Gap.h
Original file line number Diff line number Diff line change
Expand Up @@ -1002,10 +1002,30 @@ class Gap {
/** 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
Expand Down
11 changes: 10 additions & 1 deletion connectivity/FEATURE_BLE/include/ble/internal/PalGap.h
Original file line number Diff line number Diff line change
Expand Up @@ -1298,13 +1298,22 @@ class PalGap {
/**
* 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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,10 @@ class PalGap : public interface::PalGap {
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();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {

Expand Down Expand Up @@ -320,14 +322,24 @@ ble_error_t PalGap::create_connection(
}


ble_error_t PalGap::cancel_connection_creation()
{
DmConnClose(
DM_CLIENT_ID_APP,
/* connection handle - invalid */ DM_CONN_ID_NONE,
/* reason - invalid (use success) */ 0x00
);
return BLE_ERROR_NONE;
ble_error_t PalGap::cancel_connection_creation(
peer_address_type_t peerAddressType,
const ble::address_t &peerAddress
) {
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;
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,11 @@ class Gap :
const ConnectionParameters &connectionParams
);

ble_error_t cancelConnect(
peer_address_type_t peerAddressType,
const address_t &peerAddress
);

ble_error_t cancelConnect();
#endif // BLE_ROLE_CENTRAL

Expand Down Expand Up @@ -596,6 +601,10 @@ class Gap :
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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -506,6 +506,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);

Expand Down Expand Up @@ -537,6 +540,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(),
Expand Down Expand Up @@ -624,12 +630,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)
{
Expand Down

0 comments on commit 0a9624d

Please sign in to comment.