Add tracing to BLE GAP (#14117)

* Add traces to GapImpl.cpp

* Add helpers and param logs

* Update GapImpl.cpp

* Move helpers to ble_trace_helpers.h

* Add traces to whitelist setter & getter functions

* Prepend parent dir. to ble_trace_helpers.h include line

* Resolve portability issue by using PRI* macro in place of %lu

* Add traces to PalGapImpl.cpp

* Complete PAL GAP traces

* Remove stray include

* Make 'echo' traces in PAL configurable

Some of the tr_info traces at the beginning of PAL functions  are duplicates ('echoes') of those in GAP functions. This commit enables including/excluding of these traces in mbed_app.json by writing 1/0, respectively to the MBED_CONF_CORDIO_TRACE_PAL_ECHOES config macro. The default is to exclude 'echo' traces.

* Add missing spaces in tr_info traces

* Clean-up param log for set_extended_advertising_parameters

* Remove "Failed: " from every tr_error trace

* Apply changes from PalGapImpl.cpp review

* Apply changes from GapImpl.cpp review

* Use binary for channel map trace

B0: ADVERTISING_CHANNEL_37
B1: ADVERTISING_CHANNEL_38
B2: ADVERTISING_CHANNEL_39

We're assuming that the user understands the above. This could be documented somewhere.

* Replace more %lu w/PRIu32

* Add tr_info to terminateSync for user call

* Make trace group for PAL traces BLDM

* Remove [PAL] prefix from every PAL trace

* Add trace to setPeripheralPrivacyConfiguration

* Make set scan params tr_info dependent on selected PHY

* Add trace to GAP events

* Other GAP events required traces
pull/14198/head
Abbas Bracken Ziad 2021-01-25 10:58:41 +00:00 committed by Paul Szczepanek
parent 91d4b48989
commit f4febdcb9d
4 changed files with 1465 additions and 8 deletions

View File

@ -21,6 +21,7 @@
#include "ble/SecurityManager.h" #include "ble/SecurityManager.h"
#include "mbed-trace/mbed_trace.h" #include "mbed-trace/mbed_trace.h"
#include "pal/GapTypes.h" #include "pal/GapTypes.h"
#include "pal/GapEvents.h"
#include "ble-host/include/dm_api.h" #include "ble-host/include/dm_api.h"
#include "common/UUID.h" #include "common/UUID.h"
@ -226,6 +227,471 @@ static inline const char *to_string(privacy_mode_t mode)
} }
} }
static inline const char* to_string(ble::advertising_type_t advType)
{
switch (advType.value()) {
case ble::advertising_type_t::CONNECTABLE_UNDIRECTED:
return "CONNECTABLE_UNDIRECTED";
case ble::advertising_type_t::CONNECTABLE_DIRECTED:
return "CONNECTABLE_DIRECTED";
case ble::advertising_type_t::SCANNABLE_UNDIRECTED:
return "SCANNABLE_UNDIRECTED";
case ble::advertising_type_t::NON_CONNECTABLE_UNDIRECTED:
return "NON_CONNECTABLE_UNDIRECTED";
case ble::advertising_type_t::CONNECTABLE_DIRECTED_LOW_DUTY:
return "CONNECTABLE_DIRECTED_LOW_DUTY";
case ble::advertising_type_t::CONNECTABLE_NON_SCANNABLE_UNDIRECTED:
return "CONNECTABLE_NON_SCANNABLE_UNDIRECTED";
default:
return "unknown";
}
}
static inline const char* to_string(ble::own_address_type_t addressType)
{
switch (addressType.value()) {
case ble::own_address_type_t::PUBLIC:
return "PUBLIC";
case ble::own_address_type_t::RANDOM:
return "RANDOM";
case ble::own_address_type_t::RESOLVABLE_PRIVATE_ADDRESS_PUBLIC_FALLBACK:
return "RESOLVABLE_PRIVATE_ADDRESS_PUBLIC_FALLBACK";
case ble::own_address_type_t::RESOLVABLE_PRIVATE_ADDRESS_RANDOM_FALLBACK:
return "RESOLVABLE_PRIVATE_ADDRESS_RANDOM_FALLBACK";
default:
return "unknown";
}
}
static inline const char* to_string(ble::advertising_filter_policy_t policy)
{
switch (policy.value()) {
case ble::advertising_filter_policy_t::NO_FILTER:
return "NO_FILTER";
case ble::advertising_filter_policy_t::FILTER_SCAN_REQUESTS:
return "FILTER_SCAN_REQUESTS";
case ble::advertising_filter_policy_t::FILTER_CONNECTION_REQUEST:
return "FILTER_CONNECTION_REQUEST";
case ble::advertising_filter_policy_t::FILTER_SCAN_AND_CONNECTION_REQUESTS:
return "FILTER_SCAN_AND_CONNECTION_REQUESTS";
default:
return "unknown";
}
}
static inline const char* to_string(ble::phy_t phy)
{
switch (phy.value()) {
case ble::phy_t::NONE:
return "NONE";
case ble::phy_t::LE_1M:
return "LE_1M";
case ble::phy_t::LE_2M:
return "LE_2M";
case ble::phy_t::LE_CODED:
return "LE_CODED";
default:
return "unknown";
}
}
static inline const char* to_string(ble::scanning_filter_policy_t policy)
{
switch (policy.value()) {
case ble::scanning_filter_policy_t::NO_FILTER:
return "NO_FILTER";
case ble::scanning_filter_policy_t::FILTER_ADVERTISING:
return "FILTER_ADVERTISING";
case ble::scanning_filter_policy_t::NO_FILTER_INCLUDE_UNRESOLVABLE_DIRECTED:
return "NO_FILTER_INCLUDE_UNRESOLVABLE_DIRECTED";
case ble::scanning_filter_policy_t::FILTER_ADVERTISING_INCLUDE_UNRESOLVABLE_DIRECTED:
return "FILTER_ADVERTISING_INCLUDE_UNRESOLVABLE_DIRECTED";
default:
return "unknown";
}
}
static inline const char* to_string(ble::duplicates_filter_t filtering)
{
switch (filtering.value()) {
case ble::duplicates_filter_t::ENABLE:
return "ENABLE";
case ble::duplicates_filter_t::DISABLE:
return "DISABLE";
case ble::duplicates_filter_t::PERIODIC_RESET:
return "PERIODIC_RESET";
default:
return "unknown";
}
}
static inline const char* to_string(ble::peer_address_type_t addressType)
{
switch (addressType.value()) {
case ble::peer_address_type_t::PUBLIC:
return "PUBLIC";
case ble::peer_address_type_t::RANDOM:
return "RANDOM";
case ble::peer_address_type_t::PUBLIC_IDENTITY:
return "PUBLIC_IDENTITY";
case ble::peer_address_type_t::RANDOM_STATIC_IDENTITY:
return "RANDOM_STATIC_IDENTITY";
case ble::peer_address_type_t::ANONYMOUS:
return "ANONYMOUS";
default:
return "unknown";
}
}
static inline const char* to_string(ble::initiator_filter_policy_t policy)
{
switch(policy.value()) {
case ble::initiator_filter_policy_t::NO_FILTER:
return "NO_FILTER";
case ble::initiator_filter_policy_t::USE_WHITE_LIST:
return "USE_WHITE_LIST";
default:
return "unknown";
}
}
static inline const char* to_string(ble::coded_symbol_per_bit_t sym)
{
switch (sym.value()) {
case ble::coded_symbol_per_bit_t::UNDEFINED:
return "UNDEFINED";
case ble::coded_symbol_per_bit_t::S2:
return "S2";
case ble::coded_symbol_per_bit_t::S8:
return "S8";
default:
return "unknown";
}
}
static inline const char* to_string(ble::local_disconnection_reason_t reason)
{
switch (reason.value()) {
case ble::local_disconnection_reason_t::AUTHENTICATION_FAILURE:
return "AUTHENTICATION_FAILURE";
case ble::local_disconnection_reason_t::USER_TERMINATION:
return "USER_TERMINATION";
case ble::local_disconnection_reason_t::LOW_RESOURCES:
return "LOW_RESOURCES";
case ble::local_disconnection_reason_t::POWER_OFF:
return "POWER OFF";
case ble::local_disconnection_reason_t::UNSUPPORTED_REMOTE_FEATURE:
return "UNSUPPORTED_REMOTE_FEATURE";
case ble::local_disconnection_reason_t::PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED:
return "PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED";
case ble::local_disconnection_reason_t::UNACCEPTABLE_CONNECTION_PARAMETERS:
return "UNACCEPTABLE_CONNECTION_PARAMETERS";
default:
return "unknown";
}
}
static inline const char* to_string(ble::advertising_channel_map_t map)
{
switch (map.value()) {
case ble::advertising_channel_map_t::ADVERTISING_CHANNEL_37:
return "[001]";
case ble::advertising_channel_map_t::ADVERTISING_CHANNEL_38:
return "[010]";
case ble::advertising_channel_map_t::ADVERTISING_CHANNEL_37_AND_38:
return "[011]";
case ble::advertising_channel_map_t::ADVERTISING_CHANNEL_39:
return "[100]";
case ble::advertising_channel_map_t::ADVERTISING_CHANNEL_37_AND_39:
return "[101]";
case ble::advertising_channel_map_t::ADVERTISING_CHANNEL_38_AND_39:
return "[110]";
case ble::advertising_channel_map_t::ALL_ADVERTISING_CHANNELS:
return "[111]";
default:
return "unknown";
}
}
static inline const char* to_string(ble::connection_peer_address_type_t connection_peer_address_type)
{
switch (connection_peer_address_type.value()) {
case ble::connection_peer_address_type_t::PUBLIC_ADDRESS:
return "PUBLIC_ADDRESS";
case ble::connection_peer_address_type_t::RANDOM_ADDRESS:
return "RANDOM_ADDRESS";
case ble::connection_peer_address_type_t::PUBLIC_IDENTITY_ADDRESS:
return "PUBLIC_IDENTITY_ADDRESS";
case ble::connection_peer_address_type_t::RANDOM_IDENTITY_ADDRESS:
return "RANDOM_IDENTITY_ADDRESS";
default:
return "unknown";
}
}
static inline const char* to_string(ble::whitelist_address_type_t whitelist_address_type)
{
if (whitelist_address_type.value() == ble::whitelist_address_type_t::PUBLIC_DEVICE_ADDRESS) {
return "PUBLIC_DEVICE_ADDRESS";
} else {
return "RANDOM_DEVICE_ADDRESS";
}
}
static inline const char* to_string(ble::hci_error_code_t error)
{
switch (error.value()) {
case ble::hci_error_code_t::SUCCESS:
return "SUCCESS";
case ble::hci_error_code_t::UNKNOWN_HCI_COMMAND:
return "UNKNOWN_HCI_COMMAND";
case ble::hci_error_code_t::UNKNOWN_CONNECTION_IDENTIFIER:
return "UNKNOWN_CONNECTION_IDENTIFIER";
case ble::hci_error_code_t::HARDWARE_FAILLURE:
return "HARDWARE_FAILLURE";
case ble::hci_error_code_t::PAGE_TIMEOUT:
return "PAGE_TIMEOUT";
case ble::hci_error_code_t::AUTHENTICATION_FAILLURE:
return "AUTHENTICATION_FAILLURE";
case ble::hci_error_code_t::PIN_OR_KEY_MISSING:
return "PIN_OR_KEY_MISSING";
case ble::hci_error_code_t::MEMORY_CAPACITY_EXCEEDED:
return "MEMORY_CAPACITY_EXCEEDED";
case ble::hci_error_code_t::CONNECTION_TIMEOUT:
return "CONNECTION_TIMEOUT";
case ble::hci_error_code_t::CONNECTION_LIMIT_EXCEEDED:
return "CONNECTION_LIMIT_EXCEEDED";
case ble::hci_error_code_t::SYNCHRONOUS_CONNECTION_LIMIT_TO_A_DEVICE_EXCEEDED:
return "SYNCHRONOUS_CONNECTION_LIMIT_TO_A_DEVICE_EXCEEDED";
case ble::hci_error_code_t::CONNECTION_ALREADY_EXIST:
return "CONNECTION_ALREADY_EXIST";
case ble::hci_error_code_t::COMMAND_DISALLOWED:
return "COMMAND_DISALLOWED";
case ble::hci_error_code_t::CONNECTION_REJECTED_DUE_TO_LIMITED_RESOURCES:
return "CONNECTION_REJECTED_DUE_TO_LIMITED_RESOURCES";
case ble::hci_error_code_t::CONNECTION_REJECTED_DUE_TO_SECURITY_REASONS:
return "CONNECTION_REJECTED_DUE_TO_SECURITY_REASONS";
case ble::hci_error_code_t::CONNECTION_REJECTED_DUE_TO_UNACCEPTABLE_BD_ADDR:
return "CONNECTION_REJECTED_DUE_TO_UNACCEPTABLE_BD_ADDR";
case ble::hci_error_code_t::CONNECTION_ACCEPT_TIMEOUT_EXCEEDED:
return "CONNECTION_ACCEPT_TIMEOUT_EXCEEDED";
case ble::hci_error_code_t::UNSUPPORTED_FEATURE_OR_PARAMETER_VALUE:
return "UNSUPPORTED_FEATURE_OR_PARAMETER_VALUE";
case ble::hci_error_code_t::INVALID_HCI_COMMAND_PARAMETERS:
return "INVALID_HCI_COMMAND_PARAMETERS";
case ble::hci_error_code_t::REMOTE_USER_TERMINATED_CONNECTION:
return "REMOTE_USER_TERMINATED_CONNECTION";
case ble::hci_error_code_t::REMOTE_DEVICE_TERMINATED_CONNECTION_DUE_TO_LOW_RESOURCES:
return "REMOTE_DEVICE_TERMINATED_CONNECTION_DUE_TO_LOW_RESOURCES";
case ble::hci_error_code_t::REMOTE_DEVICE_TERMINATED_CONNECTION_DUE_TO_POWER_OFF:
return "REMOTE_DEVICE_TERMINATED_CONNECTION_DUE_TO_POWER_OFF";
case ble::hci_error_code_t::CONNECTION_TERMINATED_BY_LOCAL_HOST:
return "CONNECTION_TERMINATED_BY_LOCAL_HOST";
case ble::hci_error_code_t::REPEATED_ATTEMPTS:
return "REPEATED_ATTEMPTS";
case ble::hci_error_code_t::PAIRING_NOT_ALLOWED:
return "PAIRING_NOT_ALLOWED";
case ble::hci_error_code_t::UNKNOWN_LMP_PDU:
return "UNKNOWN_LMP_PDU";
case ble::hci_error_code_t::UNSUPPORTED_REMOTE_FEATURE | ble::hci_error_code_t::UNSUPPORTED_LMP_FEATURE:
return "UNSUPPORTED_REMOTE_FEATURE/UNSUPPORTED_LMP_FEATURE";
case ble::hci_error_code_t::SCO_OFFSET_REJECTED:
return "SCO_OFFSET_REJECTED";
case ble::hci_error_code_t::SCO_INTERVAL_REJECTED:
return "SCO_INTERVAL_REJECTED";
case ble::hci_error_code_t::SCO_AIR_MODE_REJECTED:
return "SCO_AIR_MODE_REJECTED";
case ble::hci_error_code_t::INVALID_LMP_PARAMETERS | ble::hci_error_code_t::INVALID_LL_PARAMETERS:
return "INVALID_LMP_PARAMETERS/INVALID_LL_PARAMETERS";
case ble::hci_error_code_t::UNSPECIFIED_ERROR:
return "UNSPECIFIED_ERROR";
case ble::hci_error_code_t::UNSUPPORTED_LMP_PARAMETER_VALUE | ble::hci_error_code_t::UNSUPPORTED_LL_PARAMETER_VALUE:
return "UNSUPPORTED_LMP_PARAMETER_VALUE/UNSUPPORTED_LL_PARAMETER_VALUE";
case ble::hci_error_code_t::ROLE_CHANGE_NOT_ALLOWED:
return "ROLE_CHANGE_NOT_ALLOWED";
case ble::hci_error_code_t::LMP_RESPONSE_TIMEOUT | ble::hci_error_code_t::LL_RESPONSE_TIMEOUT:
return "LMP_RESPONSE_TIMEOUT/LL_RESPONSE_TIMEOUT";
case ble::hci_error_code_t::LMP_ERROR_TRANSACTION_COLLISION | ble::hci_error_code_t::LL_PROCEDURE_COLLISION:
return "LMP_ERROR_TRANSACTION_COLLISION/LL_PROCEDURE_COLLISION";
case ble::hci_error_code_t::LMP_PDU_NOT_ALLOWED:
return "LMP_PDU_NOT_ALLOWED";
case ble::hci_error_code_t::ENCRYPTION_MODE_NOT_ACCEPTABLE:
return "ENCRYPTION_MODE_NOT_ACCEPTABLE";
case ble::hci_error_code_t::LINK_KEY_CANNOT_BE_CHANGED:
return "LINK_KEY_CANNOT_BE_CHANGED";
case ble::hci_error_code_t::REQUESTED_QOS_NOT_SUPPORTED:
return "REQUESTED_QOS_NOT_SUPPORTED";
case ble::hci_error_code_t::INSTANT_PASSED:
return "INSTANT_PASSED";
case ble::hci_error_code_t::PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED:
return "PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED";
case ble::hci_error_code_t::DIFFERENT_TRANSACTION_COLLISION:
return "DIFFERENT_TRANSACTION_COLLISION";
case ble::hci_error_code_t::RESERVED_FOR_FUTURE_USE:
return "RESERVED_FOR_FUTURE_USE";
case ble::hci_error_code_t::QOS_UNACCEPTABLE_PARAMETER:
return "QOS_UNACCEPTABLE_PARAMETER";
case ble::hci_error_code_t::QOS_REJECTED:
return "QOS_REJECTED";
case ble::hci_error_code_t::CHANNEL_CLASSIFICATION_NOT_SUPPORTED:
return "CHANNEL_CLASSIFICATION_NOT_SUPPORTED";
case ble::hci_error_code_t::INSUFFICIENT_SECURITY:
return "INSUFFICIENT_SECURITY";
case ble::hci_error_code_t::PARAMETER_OUT_OF_MANDATORY_RANGE:
return "PARAMETER_OUT_OF_MANDATORY_RANGE";
case ble::hci_error_code_t::ROLE_SWITCH_PENDING:
return "ROLE_SWITCH_PENDING";
case ble::hci_error_code_t::RESERVED_SLOT_VIOLATION:
return "RESERVED_SLOT_VIOLATION";
case ble::hci_error_code_t::ROLE_SWITCH_FAILED:
return "ROLE_SWITCH_FAILED";
case ble::hci_error_code_t::EXTENDED_INQUIRY_RESPONSE_TOO_LARGE:
return "EXTENDED_INQUIRY_RESPONSE_TOO_LARGE";
case ble::hci_error_code_t::SECURE_SIMPLE_PAIRING_NOT_SUPPORTED_BY_HOST:
return "SECURE_SIMPLE_PAIRING_NOT_SUPPORTED_BY_HOST";
case ble::hci_error_code_t::HOST_BUSY_PAIRING:
return "HOST_BUSY_PAIRING";
case ble::hci_error_code_t::CONNECTION_REJECTED_DUE_TO_NO_SUITABLE_CHANNEL_FOUND:
return "CONNECTION_REJECTED_DUE_TO_NO_SUITABLE_CHANNEL_FOUND";
case ble::hci_error_code_t::CONTROLLER_BUSY:
return "CONTROLLER_BUSY";
case ble::hci_error_code_t::UNACCEPTABLE_CONNECTION_PARAMETERS:
return "UNACCEPTABLE_CONNECTION_PARAMETERS";
case ble::hci_error_code_t::ADVERTISING_TIMEOUT:
return "ADVERTISING_TIMEOUT";
case ble::hci_error_code_t::CONNECTION_TERMINATED_DUE_TO_MIC_FAILURE:
return "CONNECTION_TERMINATED_DUE_TO_MIC_FAILURE";
case ble::hci_error_code_t::CONNECTION_FAILED_TO_BE_ESTABLISHED:
return "CONNECTION_FAILED_TO_BE_ESTABLISHED";
case ble::hci_error_code_t::MAC_CONNECTION_FAILED:
return "MAC_CONNECTION_FAILED";
case ble::hci_error_code_t::COARSE_CLOCK_ADJUSTMENT_REJECTED_BUT_WILL_TRY_TO_ADJUST_USING_CLOCK_DRAGGING:
return "COARSE_CLOCK_ADJUSTMENT_REJECTED_BUT_WILL_TRY_TO_ADJUST_USING_CLOCK_DRAGGING";
case ble::hci_error_code_t::TYPE0_SUBMAP_NOT_DEFINED:
return "TYPE0_SUBMAP_NOT_DEFINED";
case ble::hci_error_code_t::UNKNOWN_ADVERTISING_IDENTIFIER:
return "UNKNOWN_ADVERTISING_IDENTIFIER";
case ble::hci_error_code_t::LIMIT_REACHED:
return "LIMIT_REACHED";
case ble::hci_error_code_t::OPERATION_CANCELLED_BY_HOST:
return "OPERATION_CANCELLED_BY_HOST";
default:
return "unknown";
}
}
static inline const char* to_string(ble::advertising_fragment_description_t fragment_description)
{
switch (fragment_description.value()) {
case ble::advertising_fragment_description_t::INTERMEDIATE_FRAGMENT:
return "INTERMEDIATE_FRAGMENT";
case ble::advertising_fragment_description_t::FIRST_FRAGMENT:
return "FIRST_FRAGMENT";
case ble::advertising_fragment_description_t::LAST_FRAGMENT:
return "LAST_FRAGMENT";
case ble::advertising_fragment_description_t::COMPLETE_FRAGMENT:
return "COMPLETE_FRAGMENT";
case ble::advertising_fragment_description_t::UNCHANGED_DATA:
return "UNCHANGED_DATA";
default:
return "unknown";
}
}
static inline const char* to_string(ble::peripheral_privacy_configuration_t::resolution_strategy_t resolution_strategy)
{
switch (resolution_strategy) {
case ble::peripheral_privacy_configuration_t::resolution_strategy_t::DO_NOT_RESOLVE:
return "DO_NOT_RESOLVE";
case ble::peripheral_privacy_configuration_t::resolution_strategy_t::REJECT_NON_RESOLVED_ADDRESS:
return "REJECT_NON_RESOLVED_ADDRESS";
case ble::peripheral_privacy_configuration_t::resolution_strategy_t::PERFORM_PAIRING_PROCEDURE:
return "PERFORM_PAIRING_PROCEDURE";
case ble::peripheral_privacy_configuration_t::resolution_strategy_t::PERFORM_AUTHENTICATION_PROCEDURE:
return "PERFORM_AUTHENTICATION_PROCEDURE";
default:
return "unknown";
}
}
static inline const char* to_string(ble::GapEventType event_type)
{
switch (event_type.value()) {
case ble::GapEventType::type::UNEXPECTED_ERROR:
return "UNEXPECTED_ERROR";
case ble::GapEventType::type::CONNECTION_COMPLETE:
return "CONNECTION_COMPLETE";
case ble::GapEventType::type::ADVERTISING_REPORT:
return "ADVERTISING_REPORT";
case ble::GapEventType::type::CONNECTION_UPDATE:
return "CONNECTION_UPDATE";
case ble::GapEventType::type::REMOTE_CONNECTION_PARAMETER_REQUEST:
return "REMOTE_CONNECTION_PARAMETER_REQUEST";
case ble::GapEventType::type::DISCONNECTION_COMPLETE:
return "DISCONNECTION_COMPLETE";
default:
return "unknown";
}
}
static inline const char* to_string(ble::received_advertising_type_t type)
{
switch (type.value()) {
case ble::received_advertising_type_t::ADV_IND:
return "ADV_IND";
case ble::received_advertising_type_t::ADV_DIRECT_IND:
return "ADV_DIRECT_IND";
case ble::received_advertising_type_t::ADV_SCAN_IND:
return "ADV_SCAN_IND";
case ble::received_advertising_type_t::ADV_NONCONN_IND:
return "ADV_NONCONN_IND";
case ble::received_advertising_type_t::SCAN_RESPONSE:
return "SCAN_RESPONSE";
default:
return "unknown";
}
}
static inline const char* to_string(ble::connection_role_t role)
{
if (role.value() == ble::connection_role_t::CENTRAL) {
return "CENTRAL";
} else {
return "PERIPHERAL";
}
}
static inline const char* to_string(ble::direct_address_type_t direct_address_type)
{
switch (direct_address_type.value()) {
case ble::direct_address_type_t::PUBLIC_ADDRESS:
return "PUBLIC_ADDRESS";
case ble::direct_address_type_t::RANDOM_ADDRESS:
return "RANDOM_ADDRESS";
case ble::direct_address_type_t::PUBLIC_IDENTITY_ADDRESS:
return "PUBLIC_IDENTITY_ADDRESS";
case ble::direct_address_type_t::RANDOM_IDENTITY_ADDRESS:
return "RANDOM_IDENTITY_ADDRESS";
case ble::direct_address_type_t::RANDOM_DEVICE_ADDRESS:
return "RANDOM_DEVICE_ADDRESS";
default:
return "unknown";
}
}
static inline const char* to_string(ble::advertising_data_status_t data_status)
{
switch (data_status.value()) {
case ble::advertising_data_status_t::COMPLETE:
return "COMPLETE";
case ble::advertising_data_status_t::INCOMPLETE_MORE_DATA:
return "INCOMPLETE_MORE_DATA";
case ble::advertising_data_status_t::INCOMPLETE_DATA_TRUNCATED:
return "INCOMPLETE_DATA_TRUNCATED";
default:
return "unknown";
}
}
} // namespace ble } // namespace ble

View File

@ -82,6 +82,10 @@
"value": null, "value": null,
"macro_name": "CORDIO_RPA_SWAP_WORKAROUND" "macro_name": "CORDIO_RPA_SWAP_WORKAROUND"
}, },
"trace-pal-echoes": {
"help": "Include 'echo' traces in PAL, i.e. function signature and argument prints",
"value": 0
},
"trace-hci-packets": { "trace-hci-packets": {
"help": "If tracing is enabled at level DEBUG traces will include HCI packet traces.", "help": "If tracing is enabled at level DEBUG traces will include HCI packet traces.",
"value": false "value": false

View File

@ -22,10 +22,16 @@
#include "dm_main.h" #include "dm_main.h"
#include "dm_conn.h" #include "dm_conn.h"
#include "mbed-trace/mbed_trace.h"
#include "common/ble_trace_helpers.h"
#define TRACE_GROUP "BLDM"
namespace ble { namespace ble {
namespace impl { namespace impl {
namespace { namespace {
bool dummy_gap_event_handler(const wsfMsgHdr_t *msg) bool dummy_gap_event_handler(const wsfMsgHdr_t *msg)
{ {
return false; return false;
@ -102,6 +108,10 @@ address_t PalGap::get_random_address()
ble_error_t PalGap::set_random_address(const address_t &address) ble_error_t PalGap::set_random_address(const address_t &address)
{ {
tr_info("Set random address - "
"address=%s",
to_string(address));
device_random_address = address; device_random_address = address;
DmDevSetRandAddr(const_cast<uint8_t *>(address.data())); DmDevSetRandAddr(const_cast<uint8_t *>(address.data()));
return BLE_ERROR_NONE; return BLE_ERROR_NONE;
@ -119,6 +129,26 @@ ble_error_t PalGap::set_advertising_parameters(
advertising_filter_policy_t advertising_filter_policy advertising_filter_policy_t advertising_filter_policy
) )
{ {
#if MBED_CONF_CORDIO_TRACE_PAL_ECHOES
tr_info("Set advertising parameters - "
"advertising_interval_min=%d, "
"advertising_interval_max=%d, "
"advertising_type=%s, "
"own_address_type=%s, "
"peer_address_type=%s, "
"peer_address=%s, "
"advertising_channel_map=%s, "
"advertising_filter_policy_t=%s",
advertising_interval_min,
advertising_interval_max,
to_string(advertising_type),
to_string(own_address_type),
to_string(peer_address_type),
to_string(peer_address),
to_string(advertising_channel_map),
to_string(advertising_filter_policy));
#endif
DmAdvSetInterval( DmAdvSetInterval(
DM_ADV_HANDLE_DEFAULT, DM_ADV_HANDLE_DEFAULT,
advertising_interval_min, advertising_interval_min,
@ -160,6 +190,14 @@ ble_error_t PalGap::set_advertising_data(
const advertising_data_t &advertising_data const advertising_data_t &advertising_data
) )
{ {
#if MBED_CONF_CORDIO_TRACE_PAL_ECHOES
tr_info("Set advertising data - "
"advertising_data_length=%d, "
"advertising_data=%s",
advertising_data_length,
mbed_trace_array(advertising_data.data(), advertising_data_length));
#endif
DmAdvSetData( DmAdvSetData(
DM_ADV_HANDLE_DEFAULT, DM_ADV_HANDLE_DEFAULT,
HCI_ADV_DATA_OP_COMP_FRAG, HCI_ADV_DATA_OP_COMP_FRAG,
@ -170,12 +208,19 @@ ble_error_t PalGap::set_advertising_data(
return BLE_ERROR_NONE; return BLE_ERROR_NONE;
} }
ble_error_t PalGap::set_scan_response_data( ble_error_t PalGap::set_scan_response_data(
uint8_t scan_response_data_length, uint8_t scan_response_data_length,
const advertising_data_t &scan_response_data const advertising_data_t &scan_response_data
) )
{ {
#if MBED_CONF_CORDIO_TRACE_PAL_ECHOES
tr_info("Set scan response data - "
"scan_response_data_length=%d, "
"scan_response_data=%s",
scan_response_data_length,
mbed_trace_array(scan_response_data.data(), scan_response_data_length));
#endif
DmAdvSetData( DmAdvSetData(
DM_ADV_HANDLE_DEFAULT, DM_ADV_HANDLE_DEFAULT,
HCI_ADV_DATA_OP_COMP_FRAG, HCI_ADV_DATA_OP_COMP_FRAG,
@ -189,6 +234,10 @@ ble_error_t PalGap::set_scan_response_data(
ble_error_t PalGap::advertising_enable(bool enable) ble_error_t PalGap::advertising_enable(bool enable)
{ {
tr_info("Advertising enable - "
"enable=%s",
to_string(enable));
if (enable) { if (enable) {
// The Cordio stack requires to start direct advertising with // The Cordio stack requires to start direct advertising with
// the function DmConnAccept instead of the function DmAdvStart. // the function DmConnAccept instead of the function DmAdvStart.
@ -206,6 +255,7 @@ ble_error_t PalGap::advertising_enable(bool enable)
direct_adv_cb->peer_address.data() direct_adv_cb->peer_address.data()
); );
if (direct_adv_cb->connection_handle == DM_CONN_ID_NONE) { if (direct_adv_cb->connection_handle == DM_CONN_ID_NONE) {
tr_error("unknown ID for pending callback");
return BLE_ERROR_INTERNAL_STACK_FAILURE; return BLE_ERROR_INTERNAL_STACK_FAILURE;
} else { } else {
direct_adv_cb->state = direct_adv_cb_t::running; direct_adv_cb->state = direct_adv_cb_t::running;
@ -247,6 +297,20 @@ ble_error_t PalGap::set_scan_parameters(
scanning_filter_policy_t filter_policy scanning_filter_policy_t filter_policy
) )
{ {
#if MBED_CONF_CORDIO_TRACE_PAL_ECHOES
tr_info("Set scan parameters - "
"active_scanning=%s, "
"scan_interval=%d, "
"scan_window=%d, "
"own_address_type=%s, "
"filter_policy=%s",
to_string(active_scanning),
scan_interval,
scan_window,
to_string(own_address_type),
to_string(filter_policy));
#endif
use_active_scanning = active_scanning; use_active_scanning = active_scanning;
DmScanSetInterval(HCI_INIT_PHY_LE_1M_BIT, &scan_interval, &scan_window); DmScanSetInterval(HCI_INIT_PHY_LE_1M_BIT, &scan_interval, &scan_window);
DmScanSetAddrType(own_address_type.value()); DmScanSetAddrType(own_address_type.value());
@ -265,6 +329,12 @@ ble_error_t PalGap::scan_enable(
bool filter_duplicates bool filter_duplicates
) )
{ {
tr_info("Scan enable - "
"enable=%s, "
"filter_duplicates=%s",
to_string(enable),
to_string(filter_duplicates));
if (enable) { if (enable) {
uint8_t scanType = use_active_scanning ? DM_SCAN_TYPE_ACTIVE : DM_SCAN_TYPE_PASSIVE; uint8_t scanType = use_active_scanning ? DM_SCAN_TYPE_ACTIVE : DM_SCAN_TYPE_PASSIVE;
DmScanStart( DmScanStart(
@ -298,6 +368,34 @@ ble_error_t PalGap::create_connection(
uint16_t maximum_connection_event_length uint16_t maximum_connection_event_length
) )
{ {
#if MBED_CONF_CORDIO_TRACE_PAL_ECHOES
tr_info("Create Connection - "
"scan_interval=%d, "
"scan_window=%d, "
"initiator_policy=%s, "
"peer_address_type=%s, "
"peer_address=%s, "
"own_address_type=%s, "
"connection_interval_min=%d, "
"connection_interval_max=%d, "
"connection_latency=%d, "
"supervision_timout=%d, "
"minimum_connection_event_length=%d, "
"maximum_connection_event_length=%d",
scan_interval,
scan_window,
to_string(initiator_policy),
to_string(peer_address_type),
to_string(peer_address),
to_string(own_address_type),
connection_interval_min,
connection_interval_max,
connection_latency,
supervision_timeout,
minimum_connection_event_length,
maximum_connection_event_length);
#endif
DmConnSetScanInterval(scan_interval, scan_window); DmConnSetScanInterval(scan_interval, scan_window);
#if BLE_FEATURE_WHITELIST #if BLE_FEATURE_WHITELIST
DmDevSetFilterPolicy(DM_FILT_POLICY_MODE_INIT, initiator_policy.value()); DmDevSetFilterPolicy(DM_FILT_POLICY_MODE_INIT, initiator_policy.value());
@ -322,6 +420,7 @@ ble_error_t PalGap::create_connection(
); );
if (connection_id == DM_CONN_ID_NONE) { if (connection_id == DM_CONN_ID_NONE) {
tr_error("unknown ID for open connection");
return BLE_ERROR_INTERNAL_STACK_FAILURE; return BLE_ERROR_INTERNAL_STACK_FAILURE;
} }
@ -368,6 +467,12 @@ ble_error_t PalGap::add_device_to_whitelist(
address_t address address_t address
) )
{ {
tr_info("Add device to whitelist - "
"address_type=%s,"
"address=%s",
to_string(address_type),
to_string(address));
DmDevWhiteListAdd( DmDevWhiteListAdd(
address_type.value(), address_type.value(),
const_cast<uint8_t *>(address.data()) const_cast<uint8_t *>(address.data())
@ -381,6 +486,12 @@ ble_error_t PalGap::remove_device_from_whitelist(
address_t address address_t address
) )
{ {
tr_info("Remove device from whitelist - "
"address_type=%s, "
"address=%s",
to_string(address_type),
to_string(address));
DmDevWhiteListRemove( DmDevWhiteListRemove(
address_type.value(), address_type.value(),
const_cast<uint8_t *>(address.data()) const_cast<uint8_t *>(address.data())
@ -400,7 +511,25 @@ ble_error_t PalGap::connection_parameters_update(
uint16_t maximum_connection_event_length uint16_t maximum_connection_event_length
) )
{ {
#if MBED_CONF_CORDIO_TRACE_PAL_ECHOES
tr_info("Connection %d: connection parameters update - "
"connection_interval_min=%d, "
"connection_interval_max=%d, "
"connection_latency=%d, "
"supervision_timeout=%d, "
"minimum_connection_event_length=%d, "
"maximum_connection_event_length=%d",
connection,
connection_interval_min,
connection_interval_max,
connection_latency,
supervision_timeout,
minimum_connection_event_length,
maximum_connection_event_length);
#endif
if (DmConnCheckIdle(connection) != 0) { if (DmConnCheckIdle(connection) != 0) {
tr_error("connection busy");
return BLE_ERROR_INVALID_STATE; return BLE_ERROR_INVALID_STATE;
} }
@ -431,6 +560,21 @@ ble_error_t PalGap::accept_connection_parameter_request(
uint16_t maximum_connection_event_length uint16_t maximum_connection_event_length
) )
{ {
tr_info("Connection %d: accept connection parameter request - "
"interval_min=%d, "
"interval_max=%d, "
"latency=%d, "
"supervision_timeout=%d, "
"minimum_connection_event_length=%d, "
"maximum_connection_event_length=%d",
connection_handle,
interval_min,
interval_max,
latency,
supervision_timeout,
minimum_connection_event_length,
maximum_connection_event_length);
hciConnSpec_t connection_spec = { hciConnSpec_t connection_spec = {
interval_min, interval_min,
interval_max, interval_max,
@ -449,6 +593,11 @@ ble_error_t PalGap::reject_connection_parameter_request(
hci_error_code_t rejection_reason hci_error_code_t rejection_reason
) )
{ {
tr_info("Connection %d: reject_connection_parameter_request - "
"rejection_reason=%s",
connection_handle,
to_string(rejection_reason));
DmRemoteConnParamReqNegReply( DmRemoteConnParamReqNegReply(
connection_handle, connection_handle,
rejection_reason.value() rejection_reason.value()
@ -462,6 +611,13 @@ ble_error_t PalGap::disconnect(
local_disconnection_reason_t disconnection_reason local_disconnection_reason_t disconnection_reason
) )
{ {
#if MBED_CONF_CORDIO_TRACE_PAL_ECHOES
tr_info("Connection %d: disconnect - "
"disconnection_reason=%s",
connection,
to_string(disconnection_reason));
#endif
DmConnClose( DmConnClose(
DM_CLIENT_ID_APP, DM_CLIENT_ID_APP,
connection, connection,
@ -475,11 +631,13 @@ ble_error_t PalGap::disconnect(
#if BLE_FEATURE_PHY_MANAGEMENT #if BLE_FEATURE_PHY_MANAGEMENT
ble_error_t PalGap::read_phy(connection_handle_t connection) ble_error_t PalGap::read_phy(connection_handle_t connection)
{ {
tr_info("Connection %d: read phy", connection);
if (is_feature_supported(controller_supported_features_t::LE_2M_PHY) if (is_feature_supported(controller_supported_features_t::LE_2M_PHY)
|| is_feature_supported(controller_supported_features_t::LE_CODED_PHY)) { || is_feature_supported(controller_supported_features_t::LE_CODED_PHY)) {
DmReadPhy(connection); DmReadPhy(connection);
return BLE_ERROR_NONE; return BLE_ERROR_NONE;
} }
tr_error("Only 1M PHY supported");
return BLE_ERROR_NOT_IMPLEMENTED; return BLE_ERROR_NOT_IMPLEMENTED;
} }
@ -488,6 +646,14 @@ ble_error_t PalGap::set_preferred_phys(
const phy_set_t &rx_phys const phy_set_t &rx_phys
) )
{ {
#if MBED_CONF_CORDIO_TRACE_PAL_ECHOES
tr_info("Set preferred phys -"
"tx_phys=%s, "
"rx_phys=%s",
to_string(tx_phys),
to_string(rx_phys));
#endif
DmSetDefaultPhy( DmSetDefaultPhy(
create_all_phys_value(tx_phys, rx_phys), create_all_phys_value(tx_phys, rx_phys),
tx_phys.value(), tx_phys.value(),
@ -505,6 +671,17 @@ ble_error_t PalGap::set_phy(
coded_symbol_per_bit_t coded_symbol coded_symbol_per_bit_t coded_symbol
) )
{ {
#if MBED_CONF_CORDIO_TRACE_PAL_ECHOES
tr_info("Connection %d: set phy - "
"tx_phys=%s, "
"rx_phys=%s, "
"coded_symbol=%s",
connection,
to_string(tx_phys),
to_string(rx_phys),
to_string(coded_symbol));
#endif
/* if phy set is empty set corresponding all_phys bit to 1 */ /* if phy set is empty set corresponding all_phys bit to 1 */
uint8_t all_phys = 0; uint8_t all_phys = 0;
if (tx_phys.value() == 0) { if (tx_phys.value() == 0) {
@ -869,6 +1046,11 @@ ble_error_t PalGap::set_advertising_set_random_address(
const address_t &address const address_t &address
) )
{ {
tr_info("Advertising set %d: set random address - "
"address=%s",
advertising_handle,
to_string(address));
DmAdvSetRandAddr(advertising_handle, address.data()); DmAdvSetRandAddr(advertising_handle, address.data());
return BLE_ERROR_NONE; return BLE_ERROR_NONE;
} }
@ -891,15 +1073,57 @@ ble_error_t PalGap::set_extended_advertising_parameters(
bool scan_request_notification bool scan_request_notification
) )
{ {
#if MBED_CONF_CORDIO_TRACE_PAL_ECHOES
tr_info("Advertising set %d: set extended advertising parameters - "
"event_properties:[%s%s%s%s%s%s%s ], "
"primary_advertising_interval_min=%" PRIu32 ", "
"primary_advertising_interval_max=%" PRIu32 ", "
"primary_advertising_channel_map=%s, "
"own_address_type=%s, "
"peer_address_type=%s, "
"peer_address=%s, "
"advertising_filter_policy=%s, "
"advertising_power=%d, "
"primary_advertising_phy=%s, "
"secondary_advertising_max_skip=%d, "
"secondary_phy=%s, "
"advertising_sid=%d, "
"scan_request_notification=%s",
advertising_handle,
event_properties.connectable ? " connectable" : "",
event_properties.scannable ? " scannable" : "",
event_properties.directed ? " directed" : "",
event_properties.high_duty_cycle ? " high_duty_cycle" : "",
event_properties.use_legacy_pdu ? " use_legacy_pdu" : "",
event_properties.omit_advertiser_address ? " omit_advertiser_address," : "",
event_properties.include_tx_power ? " nclude_tx_power" : "",
primary_advertising_interval_min,
primary_advertising_interval_max,
to_string(primary_advertising_channel_map),
to_string(own_address_type),
to_string(peer_address_type),
to_string(peer_address),
to_string(advertising_filter_policy),
advertising_power,
to_string(primary_advertising_phy),
secondary_advertising_max_skip,
to_string(secondary_phy),
advertising_sid,
to_string(scan_request_notification));
#endif
uint8_t adv_type; uint8_t adv_type;
if (event_properties.use_legacy_pdu) { if (event_properties.use_legacy_pdu) {
if (event_properties.directed == false) { if (event_properties.directed == false) {
tr_info("Legacy PDU w/undirected advertising event");
if (event_properties.high_duty_cycle) { if (event_properties.high_duty_cycle) {
tr_error("cannot use high duty cycle");
return BLE_ERROR_INVALID_PARAM; return BLE_ERROR_INVALID_PARAM;
} }
if (event_properties.connectable && event_properties.scannable == false) { if (event_properties.connectable && event_properties.scannable == false) {
tr_error("must be scannable if connectable");
return BLE_ERROR_INVALID_PARAM; return BLE_ERROR_INVALID_PARAM;
} }
@ -911,11 +1135,14 @@ ble_error_t PalGap::set_extended_advertising_parameters(
adv_type = DM_ADV_NONCONN_UNDIRECT; adv_type = DM_ADV_NONCONN_UNDIRECT;
} }
} else { } else {
tr_info("Legacy PDU w/directed advertising event");
if (event_properties.scannable) { if (event_properties.scannable) {
tr_error("cannot be scannable");
return BLE_ERROR_INVALID_PARAM; return BLE_ERROR_INVALID_PARAM;
} }
if (event_properties.connectable == false) { if (event_properties.connectable == false) {
tr_error("must be connectable");
return BLE_ERROR_INVALID_PARAM; return BLE_ERROR_INVALID_PARAM;
} }
@ -927,7 +1154,9 @@ ble_error_t PalGap::set_extended_advertising_parameters(
} }
} else { } else {
if (event_properties.directed == false) { if (event_properties.directed == false) {
tr_info("Extended PDU w/undirected advertising event");
if (event_properties.high_duty_cycle) { if (event_properties.high_duty_cycle) {
tr_error("cannot use high duty cycle");
return BLE_ERROR_INVALID_PARAM; return BLE_ERROR_INVALID_PARAM;
} }
@ -946,6 +1175,7 @@ ble_error_t PalGap::set_extended_advertising_parameters(
// standpoint // standpoint
if (event_properties.connectable && event_properties.scannable) { if (event_properties.connectable && event_properties.scannable) {
tr_error("cannot be scannable if connectable");
return BLE_ERROR_INVALID_PARAM; return BLE_ERROR_INVALID_PARAM;
} else if (event_properties.connectable) { } else if (event_properties.connectable) {
if (event_properties.high_duty_cycle) { if (event_properties.high_duty_cycle) {
@ -1022,6 +1252,17 @@ ble_error_t PalGap::set_periodic_advertising_parameters(
bool advertise_power bool advertise_power
) )
{ {
#if MBED_CONF_CORDIO_TRACE_PAL_ECHOES
tr_info("Advertising set %d: set periodic advertising parameters - "
"periodic_advertising_min=%s, "
"periodic_advertising_max=%s, "
"advertise_power=%s",
advertising_handle,
to_string(periodic_advertising_min),
to_string(periodic_advertising_max),
to_string(advertise_power));
#endif
DmPerAdvIncTxPwr(advertising_handle, advertise_power); DmPerAdvIncTxPwr(advertising_handle, advertise_power);
DmPerAdvSetInterval( DmPerAdvSetInterval(
advertising_handle, advertising_handle,
@ -1043,6 +1284,19 @@ ble_error_t PalGap::set_extended_advertising_data(
const uint8_t *advertising_data const uint8_t *advertising_data
) )
{ {
#if MBED_CONF_CORDIO_TRACE_PAL_ECHOES
tr_info("Advertising set %d: set extended advertising data - "
"operation=%s, "
"minimize_fragmentation=%s, "
"advertising_data_size=%d, "
"advertising_data=%s",
advertising_handle,
to_string(operation),
to_string(minimize_fragmentation),
advertising_data_size,
mbed_trace_array(advertising_data, advertising_data_size));
#endif
uint8_t frag_pref = minimize_fragmentation ? uint8_t frag_pref = minimize_fragmentation ?
HCI_ADV_DATA_FRAG_PREF_NO_FRAG : HCI_ADV_DATA_FRAG_PREF_NO_FRAG :
HCI_ADV_DATA_FRAG_PREF_FRAG; HCI_ADV_DATA_FRAG_PREF_FRAG;
@ -1068,6 +1322,17 @@ ble_error_t PalGap::set_periodic_advertising_data(
const uint8_t *advertising_data const uint8_t *advertising_data
) )
{ {
#if MBED_CONF_CORDIO_TRACE_PAL_ECHOES
tr_info("Advertising set %d: set periodic advertising data - "
"fragment_description=%s, "
"advertising_data_size=%d, "
"advertising_data=%s",
advertising_handle,
to_string(fragment_description),
advertising_data_size,
mbed_trace_array(advertising_data, advertising_data_size));
#endif
DmPerAdvSetData( DmPerAdvSetData(
advertising_handle, advertising_handle,
fragment_description.value(), fragment_description.value(),
@ -1087,6 +1352,19 @@ ble_error_t PalGap::set_extended_scan_response_data(
const uint8_t *scan_response_data const uint8_t *scan_response_data
) )
{ {
#if MBED_CONF_CORDIO_TRACE_PAL_ECHOES
tr_info("Advertising data %d: set extended scan response data - "
"operation=%s, "
"minimize_fragmentation=%s, "
"scan_response_data_size=%d, "
"scan_response_data=%s",
advertising_handle,
to_string(operation),
to_string(minimize_fragmentation),
scan_response_data_size,
mbed_trace_array(scan_response_data, scan_response_data_size));
#endif
uint8_t frag_pref = minimize_fragmentation ? uint8_t frag_pref = minimize_fragmentation ?
HCI_ADV_DATA_FRAG_PREF_NO_FRAG : HCI_ADV_DATA_FRAG_PREF_NO_FRAG :
HCI_ADV_DATA_FRAG_PREF_FRAG; HCI_ADV_DATA_FRAG_PREF_FRAG;
@ -1112,7 +1390,14 @@ ble_error_t PalGap::extended_advertising_enable(
const uint8_t *in_max_extended_advertising_events const uint8_t *in_max_extended_advertising_events
) )
{ {
tr_info("Extended advertising enable - "
"enable=%s, "
"number_of_sets=%d",
to_string(enable),
number_of_sets);
if (number_of_sets > DM_NUM_ADV_SETS) { if (number_of_sets > DM_NUM_ADV_SETS) {
tr_error("number of sets cannot be greater than %d", DM_NUM_ADV_SETS);
return BLE_ERROR_INVALID_PARAM; return BLE_ERROR_INVALID_PARAM;
} }
@ -1143,6 +1428,7 @@ ble_error_t PalGap::extended_advertising_enable(
direct_adv_cb->peer_address.data() direct_adv_cb->peer_address.data()
); );
if (direct_adv_cb->connection_handle == DM_CONN_ID_NONE) { if (direct_adv_cb->connection_handle == DM_CONN_ID_NONE) {
tr_error("unknown connection ID %d", direct_adv_cb->connection_handle);
return BLE_ERROR_INTERNAL_STACK_FAILURE; return BLE_ERROR_INTERNAL_STACK_FAILURE;
} else { } else {
direct_adv_cb->state = direct_adv_cb_t::running; direct_adv_cb->state = direct_adv_cb_t::running;
@ -1201,6 +1487,11 @@ ble_error_t PalGap::periodic_advertising_enable(
advertising_handle_t advertising_handle advertising_handle_t advertising_handle
) )
{ {
tr_info("Advertising set %d: periodic advertsing enable - "
"enable=%s",
advertising_handle,
to_string(enable));
if (enable) { if (enable) {
DmPerAdvStart(advertising_handle); DmPerAdvStart(advertising_handle);
} else { } else {
@ -1265,6 +1556,16 @@ ble_error_t PalGap::set_extended_scan_parameters(
const uint16_t *scan_window const uint16_t *scan_window
) )
{ {
#if MBED_CONF_CORDIO_TRACE_PAL_ECHOES
tr_info("Set extended scan parameters - "
"own_address_type=%s, "
"filter_policy=%s, "
"scanning_phys=%s",
to_string(own_address_type),
to_string(filter_policy),
to_string(scanning_phys));
#endif
DmScanSetAddrType(own_address_type.value()); DmScanSetAddrType(own_address_type.value());
for (size_t i = 0, count = scanning_phys.count(); i < count; ++i) { for (size_t i = 0, count = scanning_phys.count(); i < count; ++i) {
@ -1299,6 +1600,16 @@ ble_error_t PalGap::extended_scan_enable(
uint16_t period uint16_t period
) )
{ {
tr_info("Extended scan enable - "
"enable=%s, "
"filter_duplicates=%s, "
"duration=%d, "
"period=%d",
to_string(enable),
to_string(filter_duplicates),
duration,
period);
if (enable) { if (enable) {
uint32_t duration_ms = duration * 10; uint32_t duration_ms = duration * 10;
@ -1330,6 +1641,20 @@ ble_error_t PalGap::periodic_advertising_create_sync(
uint16_t sync_timeout uint16_t sync_timeout
) )
{ {
tr_info("Periodic advertising create sync - "
"use_periodic_advertiser_list=%s, "
"advertising_sid=%d, "
"peer_address_type=%s, "
"peer_address=%s, "
"allowed_skip=%d, "
"sync_timeout=%d",
to_string(use_periodic_advertiser_list),
advertising_sid,
to_string(peer_address_type),
to_string(peer_address),
allowed_skip,
sync_timeout);
DmDevSetExtFilterPolicy( DmDevSetExtFilterPolicy(
DM_ADV_HANDLE_DEFAULT, DM_ADV_HANDLE_DEFAULT,
DM_FILT_POLICY_MODE_SYNC, DM_FILT_POLICY_MODE_SYNC,
@ -1345,6 +1670,7 @@ ble_error_t PalGap::periodic_advertising_create_sync(
); );
if (sync_id == DM_SYNC_ID_NONE) { if (sync_id == DM_SYNC_ID_NONE) {
tr_error("unknown sync ID %d", sync_id);
return BLE_ERROR_INTERNAL_STACK_FAILURE; return BLE_ERROR_INTERNAL_STACK_FAILURE;
} else { } else {
/* this is not the real handle, this is CORDIO internal handle but the user doesn't need to know that */ /* this is not the real handle, this is CORDIO internal handle but the user doesn't need to know that */
@ -1375,6 +1701,16 @@ ble_error_t PalGap::add_device_to_periodic_advertiser_list(
uint8_t advertising_sid uint8_t advertising_sid
) )
{ {
#if MBED_CONF_CORDIO_TRACE_PAL_ECHOES
tr_info("Add device to periodic advertiser list - "
"advertiser_address_type=%s, "
"advertiser_address=%s, "
"advertiser_sid=%d",
to_string(advertiser_address_type),
to_string(advertiser_address),
advertising_sid);
#endif
DmAddDeviceToPerAdvList( DmAddDeviceToPerAdvList(
advertiser_address_type.value(), advertiser_address_type.value(),
const_cast<uint8_t *>(advertiser_address.data()), const_cast<uint8_t *>(advertiser_address.data()),
@ -1390,6 +1726,16 @@ ble_error_t PalGap::remove_device_from_periodic_advertiser_list(
uint8_t advertising_sid uint8_t advertising_sid
) )
{ {
#if MBED_CONF_CORDIO_TRACE_PAL_ECHOES
tr_info("Remove device from periodic advertiser list - "
"advertiser_address_type=%s, "
"advertiser_address=%s, "
"advertiser_sid=%d",
to_string(advertiser_address_type),
to_string(advertiser_address),
advertising_sid);
#endif
DmRemoveDeviceFromPerAdvList( DmRemoveDeviceFromPerAdvList(
advertiser_address_type.value(), advertiser_address_type.value(),
const_cast<uint8_t *>(advertiser_address.data()), const_cast<uint8_t *>(advertiser_address.data()),
@ -1430,6 +1776,20 @@ ble_error_t PalGap::extended_create_connection(
const uint16_t *maximum_connection_event_lengths const uint16_t *maximum_connection_event_lengths
) )
{ {
#if MBED_CONF_CORDIO_TRACE_PAL_ECHOES
tr_info("Extended create connection - "
"initiator_policy=%s, "
"own_address_type=%s, "
"peer_address_type=%s, "
"peer_address=%s, "
"initiating_phys=%s",
to_string(initiator_policy),
to_string(own_address_type),
to_string(peer_address_type),
to_string(peer_address),
to_string(initiating_phys));
#endif
DmExtConnSetScanInterval( DmExtConnSetScanInterval(
initiating_phys.value(), initiating_phys.value(),
const_cast<uint16_t *>(scan_intervals), const_cast<uint16_t *>(scan_intervals),
@ -1476,10 +1836,20 @@ ble_error_t PalGap::update_direct_advertising_parameters(
advertising_peer_address_type_t peer_address_type advertising_peer_address_type_t peer_address_type
) )
{ {
tr_info("Advertising set %d: update direct advertising parameters - "
"advertising_type=%d, "
"peer_address=%s, "
"peer_address_type=%s",
advertising_handle,
advertising_type,
to_string(peer_address),
to_string(peer_address_type));
// The case where a direct advertising is running and parameters are updated // The case where a direct advertising is running and parameters are updated
// is considered to be a programming error. User should stop advertising first. // is considered to be a programming error. User should stop advertising first.
direct_adv_cb_t *running = get_running_direct_adv_cb(advertising_handle); direct_adv_cb_t *running = get_running_direct_adv_cb(advertising_handle);
if (running) { if (running) {
tr_error("trying to update parameters but direct advertising is running");
return BLE_ERROR_INVALID_STATE; return BLE_ERROR_INVALID_STATE;
} }
@ -1506,6 +1876,7 @@ ble_error_t PalGap::update_direct_advertising_parameters(
advertising_type == DM_ADV_CONN_DIRECT_LO_DUTY) { advertising_type == DM_ADV_CONN_DIRECT_LO_DUTY) {
direct_adv_cb_t *adv_cb = get_free_direct_adv_cb(); direct_adv_cb_t *adv_cb = get_free_direct_adv_cb();
if (!adv_cb) { if (!adv_cb) {
tr_error("failed to acquire a cb");
return BLE_ERROR_INTERNAL_STACK_FAILURE; return BLE_ERROR_INTERNAL_STACK_FAILURE;
} }
adv_cb->state = direct_adv_cb_t::pending; adv_cb->state = direct_adv_cb_t::pending;

File diff suppressed because it is too large Load Diff