blob: a8b6151e61254a3c0fd26be1acbe1dc8d76a54db [file] [log] [blame]
/*
* Copyright 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "btaa/cmd_evt_classification.h"
namespace bluetooth {
namespace activity_attribution {
CmdEvtActivityClassification lookup_cmd(hci::OpCode opcode) {
CmdEvtActivityClassification classification = {};
switch (opcode) {
case hci::OpCode::INQUIRY:
case hci::OpCode::INQUIRY_CANCEL:
case hci::OpCode::PERIODIC_INQUIRY_MODE:
case hci::OpCode::EXIT_PERIODIC_INQUIRY_MODE:
classification = {.activity = Activity::SCAN, .connection_handle_pos = 0, .address_pos = 0};
break;
case hci::OpCode::CREATE_CONNECTION:
case hci::OpCode::CREATE_CONNECTION_CANCEL:
case hci::OpCode::ACCEPT_CONNECTION_REQUEST:
case hci::OpCode::LINK_KEY_REQUEST_REPLY:
case hci::OpCode::LINK_KEY_REQUEST_NEGATIVE_REPLY:
case hci::OpCode::PIN_CODE_REQUEST_REPLY:
case hci::OpCode::PIN_CODE_REQUEST_NEGATIVE_REPLY:
case hci::OpCode::REJECT_CONNECTION_REQUEST:
case hci::OpCode::REMOTE_NAME_REQUEST:
case hci::OpCode::REMOTE_NAME_REQUEST_CANCEL:
case hci::OpCode::ACCEPT_SYNCHRONOUS_CONNECTION:
case hci::OpCode::REJECT_SYNCHRONOUS_CONNECTION:
case hci::OpCode::IO_CAPABILITY_REQUEST_REPLY:
case hci::OpCode::USER_CONFIRMATION_REQUEST_REPLY:
case hci::OpCode::USER_CONFIRMATION_REQUEST_NEGATIVE_REPLY:
case hci::OpCode::USER_PASSKEY_REQUEST_REPLY:
case hci::OpCode::USER_PASSKEY_REQUEST_NEGATIVE_REPLY:
case hci::OpCode::REMOTE_OOB_DATA_REQUEST_REPLY:
case hci::OpCode::REMOTE_OOB_DATA_REQUEST_NEGATIVE_REPLY:
case hci::OpCode::IO_CAPABILITY_REQUEST_NEGATIVE_REPLY:
case hci::OpCode::ENHANCED_ACCEPT_SYNCHRONOUS_CONNECTION:
case hci::OpCode::REMOTE_OOB_EXTENDED_DATA_REQUEST_REPLY:
case hci::OpCode::SWITCH_ROLE:
case hci::OpCode::READ_STORED_LINK_KEY:
classification = {.activity = Activity::CONNECT, .connection_handle_pos = 0, .address_pos = 3};
break;
case hci::OpCode::CENTRAL_LINK_KEY:
case hci::OpCode::READ_DEFAULT_LINK_POLICY_SETTINGS:
case hci::OpCode::WRITE_DEFAULT_LINK_POLICY_SETTINGS:
case hci::OpCode::WRITE_SCAN_ENABLE:
case hci::OpCode::READ_PAGE_SCAN_ACTIVITY:
case hci::OpCode::WRITE_PAGE_SCAN_ACTIVITY:
case hci::OpCode::READ_PAGE_SCAN_TYPE:
case hci::OpCode::WRITE_PAGE_SCAN_TYPE:
case hci::OpCode::READ_SIMPLE_PAIRING_MODE:
case hci::OpCode::WRITE_SIMPLE_PAIRING_MODE:
case hci::OpCode::READ_SCAN_ENABLE:
case hci::OpCode::LE_CREATE_CONNECTION_CANCEL:
case hci::OpCode::LE_READ_CONNECT_LIST_SIZE:
case hci::OpCode::LE_CLEAR_CONNECT_LIST:
case hci::OpCode::SEND_KEYPRESS_NOTIFICATION:
case hci::OpCode::LE_CLEAR_RESOLVING_LIST:
case hci::OpCode::LE_READ_RESOLVING_LIST_SIZE:
case hci::OpCode::LE_SET_HOST_CHANNEL_CLASSIFICATION:
classification = {.activity = Activity::CONNECT, .connection_handle_pos = 0, .address_pos = 0};
break;
case hci::OpCode::DISCONNECT:
case hci::OpCode::CHANGE_CONNECTION_PACKET_TYPE:
case hci::OpCode::AUTHENTICATION_REQUESTED:
case hci::OpCode::SET_CONNECTION_ENCRYPTION:
case hci::OpCode::CHANGE_CONNECTION_LINK_KEY:
case hci::OpCode::READ_REMOTE_SUPPORTED_FEATURES:
case hci::OpCode::READ_REMOTE_EXTENDED_FEATURES:
case hci::OpCode::READ_REMOTE_VERSION_INFORMATION:
case hci::OpCode::READ_CLOCK_OFFSET:
case hci::OpCode::READ_LMP_HANDLE:
case hci::OpCode::SETUP_SYNCHRONOUS_CONNECTION:
case hci::OpCode::ENHANCED_SETUP_SYNCHRONOUS_CONNECTION:
case hci::OpCode::HOLD_MODE:
case hci::OpCode::SNIFF_MODE:
case hci::OpCode::EXIT_SNIFF_MODE:
case hci::OpCode::QOS_SETUP:
case hci::OpCode::ROLE_DISCOVERY:
case hci::OpCode::READ_LINK_POLICY_SETTINGS:
case hci::OpCode::WRITE_LINK_POLICY_SETTINGS:
case hci::OpCode::FLOW_SPECIFICATION:
case hci::OpCode::SNIFF_SUBRATING:
case hci::OpCode::FLUSH:
case hci::OpCode::READ_AUTOMATIC_FLUSH_TIMEOUT:
case hci::OpCode::WRITE_AUTOMATIC_FLUSH_TIMEOUT:
case hci::OpCode::READ_LINK_SUPERVISION_TIMEOUT:
case hci::OpCode::WRITE_LINK_SUPERVISION_TIMEOUT:
case hci::OpCode::REFRESH_ENCRYPTION_KEY:
case hci::OpCode::READ_FAILED_CONTACT_COUNTER:
case hci::OpCode::RESET_FAILED_CONTACT_COUNTER:
case hci::OpCode::READ_LINK_QUALITY:
case hci::OpCode::READ_RSSI:
case hci::OpCode::READ_AFH_CHANNEL_MAP:
case hci::OpCode::READ_CLOCK:
case hci::OpCode::READ_ENCRYPTION_KEY_SIZE:
// READ_LOOPBACK_MODE = 0x1801,
// WRITE_LOOPBACK_MODE = 0x1802,
// ENABLE_DEVICE_UNDER_TEST_MODE = 0x1803,
// WRITE_SIMPLE_PAIRING_DEBUG_MODE = 0x1804,
// WRITE_SECURE_CONNECTIONS_TEST_MODE = 0x180a,
case hci::OpCode::ENHANCED_FLUSH:
case hci::OpCode::LE_CONNECTION_UPDATE:
case hci::OpCode::LE_START_ENCRYPTION:
case hci::OpCode::LE_LONG_TERM_KEY_REQUEST_REPLY:
case hci::OpCode::LE_LONG_TERM_KEY_REQUEST_NEGATIVE_REPLY:
case hci::OpCode::LE_READ_PHY:
case hci::OpCode::LE_SET_PHY:
case hci::OpCode::LE_READ_REMOTE_FEATURES:
case hci::OpCode::LE_REMOTE_CONNECTION_PARAMETER_REQUEST_REPLY:
case hci::OpCode::LE_REMOTE_CONNECTION_PARAMETER_REQUEST_NEGATIVE_REPLY:
case hci::OpCode::LE_SET_DATA_LENGTH:
classification = {.activity = Activity::CONNECT, .connection_handle_pos = 3, .address_pos = 0};
break;
case hci::OpCode::SET_EVENT_MASK:
case hci::OpCode::RESET:
case hci::OpCode::SET_EVENT_FILTER:
case hci::OpCode::READ_PIN_TYPE:
case hci::OpCode::WRITE_PIN_TYPE:
case hci::OpCode::WRITE_LOCAL_NAME:
case hci::OpCode::READ_LOCAL_NAME:
case hci::OpCode::READ_CONNECTION_ACCEPT_TIMEOUT:
case hci::OpCode::WRITE_CONNECTION_ACCEPT_TIMEOUT:
case hci::OpCode::READ_PAGE_TIMEOUT:
case hci::OpCode::WRITE_PAGE_TIMEOUT:
case hci::OpCode::READ_AUTHENTICATION_ENABLE:
case hci::OpCode::WRITE_AUTHENTICATION_ENABLE:
case hci::OpCode::READ_CLASS_OF_DEVICE:
case hci::OpCode::WRITE_CLASS_OF_DEVICE:
case hci::OpCode::READ_VOICE_SETTING:
case hci::OpCode::WRITE_VOICE_SETTING:
case hci::OpCode::READ_NUM_BROADCAST_RETRANSMITS:
case hci::OpCode::WRITE_NUM_BROADCAST_RETRANSMITS:
case hci::OpCode::READ_HOLD_MODE_ACTIVITY:
case hci::OpCode::WRITE_HOLD_MODE_ACTIVITY:
case hci::OpCode::READ_SYNCHRONOUS_FLOW_CONTROL_ENABLE:
case hci::OpCode::WRITE_SYNCHRONOUS_FLOW_CONTROL_ENABLE:
case hci::OpCode::SET_CONTROLLER_TO_HOST_FLOW_CONTROL:
case hci::OpCode::HOST_BUFFER_SIZE:
case hci::OpCode::HOST_NUM_COMPLETED_PACKETS:
case hci::OpCode::READ_NUMBER_OF_SUPPORTED_IAC:
case hci::OpCode::READ_CURRENT_IAC_LAP:
case hci::OpCode::WRITE_CURRENT_IAC_LAP:
case hci::OpCode::SET_AFH_HOST_CHANNEL_CLASSIFICATION:
case hci::OpCode::READ_AFH_CHANNEL_ASSESSMENT_MODE:
case hci::OpCode::WRITE_AFH_CHANNEL_ASSESSMENT_MODE:
case hci::OpCode::READ_LE_HOST_SUPPORT:
case hci::OpCode::WRITE_LE_HOST_SUPPORT:
case hci::OpCode::READ_SECURE_CONNECTIONS_HOST_SUPPORT:
case hci::OpCode::WRITE_SECURE_CONNECTIONS_HOST_SUPPORT:
case hci::OpCode::READ_LOCAL_OOB_EXTENDED_DATA:
case hci::OpCode::SET_ECOSYSTEM_BASE_INTERVAL:
case hci::OpCode::CONFIGURE_DATA_PATH:
case hci::OpCode::READ_LOCAL_VERSION_INFORMATION:
case hci::OpCode::READ_LOCAL_SUPPORTED_COMMANDS:
case hci::OpCode::READ_LOCAL_SUPPORTED_FEATURES:
case hci::OpCode::READ_LOCAL_EXTENDED_FEATURES:
case hci::OpCode::READ_BUFFER_SIZE:
case hci::OpCode::READ_BD_ADDR:
case hci::OpCode::READ_DATA_BLOCK_SIZE:
case hci::OpCode::READ_LOCAL_SUPPORTED_CODECS_V1:
case hci::OpCode::READ_LOCAL_SUPPORTED_CODECS_V2:
case hci::OpCode::READ_LOCAL_SUPPORTED_CODEC_CAPABILITIES:
case hci::OpCode::READ_LOCAL_SUPPORTED_CONTROLLER_DELAY:
case hci::OpCode::READ_LOCAL_OOB_DATA:
case hci::OpCode::LE_GENERATE_DHKEY_COMMAND:
case hci::OpCode::LE_MODIFY_SLEEP_CLOCK_ACCURACY:
case hci::OpCode::LE_READ_BUFFER_SIZE_V2:
case hci::OpCode::LE_READ_SUGGESTED_DEFAULT_DATA_LENGTH:
case hci::OpCode::LE_WRITE_SUGGESTED_DEFAULT_DATA_LENGTH:
case hci::OpCode::LE_READ_LOCAL_P_256_PUBLIC_KEY_COMMAND:
case hci::OpCode::LE_GENERATE_DHKEY_COMMAND_V1:
case hci::OpCode::LE_SET_EVENT_MASK:
case hci::OpCode::LE_READ_BUFFER_SIZE_V1:
case hci::OpCode::LE_READ_LOCAL_SUPPORTED_FEATURES:
case hci::OpCode::LE_SET_RANDOM_ADDRESS:
case hci::OpCode::LE_READ_TRANSMIT_POWER:
case hci::OpCode::LE_READ_RF_PATH_COMPENSATION_POWER:
case hci::OpCode::LE_WRITE_RF_PATH_COMPENSATION_POWER:
case hci::OpCode::LE_SET_DEFAULT_PHY:
case hci::OpCode::LE_ENCRYPT:
case hci::OpCode::LE_RAND:
case hci::OpCode::LE_SET_ADDRESS_RESOLUTION_ENABLE:
case hci::OpCode::LE_SET_RESOLVABLE_PRIVATE_ADDRESS_TIMEOUT:
case hci::OpCode::LE_READ_MAXIMUM_DATA_LENGTH:
case hci::OpCode::LE_READ_SUPPORTED_STATES:
classification = {.activity = Activity::CONTROL, .connection_handle_pos = 0, .address_pos = 0};
break;
case hci::OpCode::DELETE_STORED_LINK_KEY:
classification = {.activity = Activity::CONTROL, .connection_handle_pos = 0, .address_pos = 3};
break;
case hci::OpCode::READ_TRANSMIT_POWER_LEVEL:
classification = {.activity = Activity::CONTROL, .connection_handle_pos = 3, .address_pos = 0};
break;
case hci::OpCode::READ_INQUIRY_SCAN_ACTIVITY:
case hci::OpCode::WRITE_INQUIRY_SCAN_ACTIVITY:
case hci::OpCode::READ_INQUIRY_SCAN_TYPE:
case hci::OpCode::WRITE_INQUIRY_SCAN_TYPE:
case hci::OpCode::READ_INQUIRY_MODE:
case hci::OpCode::WRITE_INQUIRY_MODE:
case hci::OpCode::READ_EXTENDED_INQUIRY_RESPONSE:
case hci::OpCode::WRITE_EXTENDED_INQUIRY_RESPONSE:
case hci::OpCode::LE_SET_CIG_PARAMETERS:
case hci::OpCode::LE_CREATE_CIS:
case hci::OpCode::LE_REMOVE_CIG:
case hci::OpCode::LE_ACCEPT_CIS_REQUEST:
case hci::OpCode::LE_REJECT_CIS_REQUEST:
case hci::OpCode::LE_CREATE_BIG:
case hci::OpCode::LE_TERMINATE_BIG:
case hci::OpCode::LE_BIG_CREATE_SYNC:
case hci::OpCode::LE_BIG_TERMINATE_SYNC:
case hci::OpCode::LE_REQUEST_PEER_SCA:
case hci::OpCode::LE_SETUP_ISO_DATA_PATH:
case hci::OpCode::LE_REMOVE_ISO_DATA_PATH:
case hci::OpCode::LE_SET_HOST_FEATURE:
case hci::OpCode::LE_READ_ISO_LINK_QUALITY:
case hci::OpCode::LE_ENHANCED_READ_TRANSMIT_POWER_LEVEL:
case hci::OpCode::LE_READ_REMOTE_TRANSMIT_POWER_LEVEL:
case hci::OpCode::LE_SET_PATH_LOSS_REPORTING_PARAMETERS:
case hci::OpCode::LE_SET_PATH_LOSS_REPORTING_ENABLE:
case hci::OpCode::LE_SET_TRANSMIT_POWER_REPORTING_ENABLE:
case hci::OpCode::LE_GET_VENDOR_CAPABILITIES:
case hci::OpCode::LE_MULTI_ADVT:
case hci::OpCode::LE_BATCH_SCAN:
case hci::OpCode::LE_ADV_FILTER:
case hci::OpCode::LE_ENERGY_INFO:
case hci::OpCode::LE_EXTENDED_SCAN_PARAMS:
case hci::OpCode::CONTROLLER_DEBUG_INFO:
case hci::OpCode::CONTROLLER_A2DP_OPCODE:
case hci::OpCode::CONTROLLER_BQR:
case hci::OpCode::READ_INQUIRY_RESPONSE_TRANSMIT_POWER_LEVEL:
case hci::OpCode::WRITE_INQUIRY_TRANSMIT_POWER_LEVEL:
case hci::OpCode::LE_SET_EXTENDED_SCAN_PARAMETERS:
case hci::OpCode::LE_SET_EXTENDED_SCAN_ENABLE:
case hci::OpCode::LE_PERIODIC_ADVERTISING_CREATE_SYNC_CANCEL:
case hci::OpCode::LE_SET_SCAN_PARAMETERS:
case hci::OpCode::LE_SET_SCAN_ENABLE:
case hci::OpCode::LE_SET_DEFAULT_PERIODIC_ADVERTISING_SYNC_TRANSFER_PARAMETERS:
case hci::OpCode::LE_SET_PERIODIC_ADVERTISING_RECEIVE_ENABLE:
case hci::OpCode::LE_CLEAR_PERIODIC_ADVERTISING_LIST:
case hci::OpCode::LE_READ_PERIODIC_ADVERTISING_LIST_SIZE:
case hci::OpCode::LE_PERIODIC_ADVERTISING_TERMINATE_SYNC:
classification = {.activity = Activity::SCAN, .connection_handle_pos = 0, .address_pos = 0};
break;
case hci::OpCode::LE_READ_ADVERTISING_PHYSICAL_CHANNEL_TX_POWER:
case hci::OpCode::LE_SET_ADVERTISING_DATA:
case hci::OpCode::LE_SET_SCAN_RESPONSE_DATA:
case hci::OpCode::LE_SET_ADVERTISING_ENABLE:
case hci::OpCode::LE_SET_EXTENDED_ADVERTISING_DATA:
case hci::OpCode::LE_SET_EXTENDED_ADVERTISING_SCAN_RESPONSE:
case hci::OpCode::LE_SET_EXTENDED_ADVERTISING_ENABLE:
case hci::OpCode::LE_READ_MAXIMUM_ADVERTISING_DATA_LENGTH:
case hci::OpCode::LE_READ_NUMBER_OF_SUPPORTED_ADVERTISING_SETS:
case hci::OpCode::LE_REMOVE_ADVERTISING_SET:
case hci::OpCode::LE_CLEAR_ADVERTISING_SETS:
case hci::OpCode::LE_SET_PERIODIC_ADVERTISING_PARAM:
case hci::OpCode::LE_SET_PERIODIC_ADVERTISING_DATA:
case hci::OpCode::LE_SET_PERIODIC_ADVERTISING_ENABLE:
case hci::OpCode::LE_SET_EXTENDED_ADVERTISING_RANDOM_ADDRESS:
classification = {.activity = Activity::ADVERTISE, .connection_handle_pos = 0, .address_pos = 0};
break;
case hci::OpCode::LE_SET_ADVERTISING_PARAMETERS:
classification = {.activity = Activity::SCAN, .connection_handle_pos = 0, .address_pos = 10};
break;
case hci::OpCode::LE_CREATE_CONNECTION:
classification = {.activity = Activity::CONNECT, .connection_handle_pos = 0, .address_pos = 9};
break;
case hci::OpCode::LE_ADD_DEVICE_TO_CONNECT_LIST:
case hci::OpCode::LE_READ_CHANNEL_MAP:
classification = {.activity = Activity::CONNECT, .connection_handle_pos = 4, .address_pos = 0};
break;
case hci::OpCode::LE_REMOVE_DEVICE_FROM_CONNECT_LIST:
case hci::OpCode::LE_ADD_DEVICE_TO_RESOLVING_LIST:
case hci::OpCode::LE_REMOVE_DEVICE_FROM_RESOLVING_LIST:
case hci::OpCode::LE_READ_PEER_RESOLVABLE_ADDRESS:
case hci::OpCode::LE_READ_LOCAL_RESOLVABLE_ADDRESS:
case hci::OpCode::LE_SET_PRIVACY_MODE:
classification = {.activity = Activity::CONNECT, .connection_handle_pos = 0, .address_pos = 4};
break;
case hci::OpCode::LE_SET_EXTENDED_ADVERTISING_PARAMETERS:
classification = {.activity = Activity::ADVERTISE, .connection_handle_pos = 0, .address_pos = 15};
break;
case hci::OpCode::LE_EXTENDED_CREATE_CONNECTION:
classification = {.activity = Activity::CONNECT, .connection_handle_pos = 0, .address_pos = 6};
break;
case hci::OpCode::LE_PERIODIC_ADVERTISING_CREATE_SYNC:
classification = {.activity = Activity::SCAN, .connection_handle_pos = 0, .address_pos = 6};
break;
case hci::OpCode::LE_ADD_DEVICE_TO_PERIODIC_ADVERTISING_LIST:
case hci::OpCode::LE_REMOVE_DEVICE_FROM_PERIODIC_ADVERTISING_LIST:
classification = {.activity = Activity::SCAN, .connection_handle_pos = 0, .address_pos = 4};
break;
case hci::OpCode::LE_PERIODIC_ADVERTISING_SYNC_TRANSFER:
case hci::OpCode::LE_PERIODIC_ADVERTISING_SET_INFO_TRANSFER:
case hci::OpCode::LE_SET_PERIODIC_ADVERTISING_SYNC_TRANSFER_PARAMETERS:
classification = {.activity = Activity::SCAN, .connection_handle_pos = 3, .address_pos = 0};
break;
default:
classification = {.activity = Activity::UNKNOWN, .connection_handle_pos = 0, .address_pos = 0};
break;
}
return classification;
}
CmdEvtActivityClassification lookup_event(hci::EventCode event_code) {
CmdEvtActivityClassification classification = {};
switch (event_code) {
case hci::EventCode::INQUIRY_COMPLETE:
classification = {.activity = Activity::SCAN, .connection_handle_pos = 0, .address_pos = 0};
break;
case hci::EventCode::CONNECTION_COMPLETE:
case hci::EventCode::SYNCHRONOUS_CONNECTION_COMPLETE:
classification = {.activity = Activity::CONNECT, .connection_handle_pos = 3, .address_pos = 5};
break;
case hci::EventCode::CONNECTION_REQUEST:
case hci::EventCode::PIN_CODE_REQUEST:
case hci::EventCode::LINK_KEY_REQUEST:
case hci::EventCode::LINK_KEY_NOTIFICATION:
case hci::EventCode::USER_PASSKEY_NOTIFICATION:
case hci::EventCode::KEYPRESS_NOTIFICATION:
case hci::EventCode::REMOTE_HOST_SUPPORTED_FEATURES_NOTIFICATION:
case hci::EventCode::IO_CAPABILITY_REQUEST:
case hci::EventCode::IO_CAPABILITY_RESPONSE:
case hci::EventCode::USER_CONFIRMATION_REQUEST:
case hci::EventCode::USER_PASSKEY_REQUEST:
case hci::EventCode::REMOTE_OOB_DATA_REQUEST:
classification = {.activity = Activity::CONNECT, .connection_handle_pos = 0, .address_pos = 2};
break;
case hci::EventCode::DISCONNECTION_COMPLETE:
case hci::EventCode::AUTHENTICATION_COMPLETE:
case hci::EventCode::ENCRYPTION_CHANGE:
case hci::EventCode::ENCRYPTION_KEY_REFRESH_COMPLETE:
case hci::EventCode::LINK_SUPERVISION_TIMEOUT_CHANGED:
case hci::EventCode::CHANGE_CONNECTION_LINK_KEY_COMPLETE:
case hci::EventCode::CENTRAL_LINK_KEY_COMPLETE:
case hci::EventCode::READ_REMOTE_SUPPORTED_FEATURES_COMPLETE:
case hci::EventCode::READ_REMOTE_VERSION_INFORMATION_COMPLETE:
case hci::EventCode::QOS_SETUP_COMPLETE:
case hci::EventCode::MODE_CHANGE:
case hci::EventCode::READ_CLOCK_OFFSET_COMPLETE:
case hci::EventCode::CONNECTION_PACKET_TYPE_CHANGED:
case hci::EventCode::FLOW_SPECIFICATION_COMPLETE:
case hci::EventCode::READ_REMOTE_EXTENDED_FEATURES_COMPLETE:
case hci::EventCode::SYNCHRONOUS_CONNECTION_CHANGED:
case hci::EventCode::SNIFF_SUBRATING:
classification = {.activity = Activity::CONNECT, .connection_handle_pos = 3, .address_pos = 0};
break;
case hci::EventCode::REMOTE_NAME_REQUEST_COMPLETE:
case hci::EventCode::EXTENDED_INQUIRY_RESULT:
classification = {.activity = Activity::SCAN, .connection_handle_pos = 0, .address_pos = 3};
break;
case hci::EventCode::FLUSH_OCCURRED:
case hci::EventCode::MAX_SLOTS_CHANGE:
case hci::EventCode::QOS_VIOLATION:
case hci::EventCode::ENHANCED_FLUSH_COMPLETE:
classification = {.activity = Activity::CONNECT, .connection_handle_pos = 2, .address_pos = 0};
break;
case hci::EventCode::ROLE_CHANGE:
case hci::EventCode::SIMPLE_PAIRING_COMPLETE:
classification = {.activity = Activity::CONNECT, .connection_handle_pos = 0, .address_pos = 3};
break;
case hci::EventCode::PAGE_SCAN_REPETITION_MODE_CHANGE:
classification = {.activity = Activity::SCAN, .connection_handle_pos = 0, .address_pos = 2};
break;
default:
classification = {.activity = Activity::UNKNOWN, .connection_handle_pos = 0, .address_pos = 0};
}
return classification;
}
CmdEvtActivityClassification lookup_le_event(hci::SubeventCode subevent_code) {
CmdEvtActivityClassification classification = {};
switch (subevent_code) {
case hci::SubeventCode::CONNECTION_COMPLETE:
case hci::SubeventCode::ENHANCED_CONNECTION_COMPLETE:
classification = {.activity = Activity::CONNECT, .connection_handle_pos = 4, .address_pos = 7};
break;
case hci::SubeventCode::CONNECTION_UPDATE_COMPLETE:
case hci::SubeventCode::READ_REMOTE_FEATURES_COMPLETE:
case hci::SubeventCode::PHY_UPDATE_COMPLETE:
case hci::SubeventCode::CTE_REQUEST_FAILED:
case hci::SubeventCode::TRANSMIT_POWER_REPORTING:
classification = {.activity = Activity::CONNECT, .connection_handle_pos = 4, .address_pos = 0};
break;
case hci::SubeventCode::LONG_TERM_KEY_REQUEST:
case hci::SubeventCode::REMOTE_CONNECTION_PARAMETER_REQUEST:
case hci::SubeventCode::DATA_LENGTH_CHANGE:
case hci::SubeventCode::CHANNEL_SELECTION_ALGORITHM:
case hci::SubeventCode::CONNECTION_IQ_REPORT:
case hci::SubeventCode::PATH_LOSS_THRESHOLD:
classification = {.activity = Activity::CONNECT, .connection_handle_pos = 3, .address_pos = 0};
break;
case hci::SubeventCode::READ_LOCAL_P256_PUBLIC_KEY_COMPLETE:
case hci::SubeventCode::GENERATE_DHKEY_COMPLETE:
classification = {.activity = Activity::CONTROL, .connection_handle_pos = 0, .address_pos = 0};
break;
case hci::SubeventCode::PERIODIC_ADVERTISING_SYNC_ESTABLISHED:
case hci::SubeventCode::PERIODIC_ADVERTISING_REPORT:
case hci::SubeventCode::PERIODIC_ADVERTISING_SYNC_LOST:
case hci::SubeventCode::ADVERTISING_SET_TERMINATED:
classification = {.activity = Activity::ADVERTISE, .connection_handle_pos = 0, .address_pos = 0};
break;
case hci::SubeventCode::SCAN_TIMEOUT:
case hci::SubeventCode::BIG_INFO_ADVERTISING_REPORT:
case hci::SubeventCode::CONNECTIONLESS_IQ_REPORT:
case hci::SubeventCode::CREATE_BIG_COMPLETE:
case hci::SubeventCode::TERMINATE_BIG_COMPLETE:
case hci::SubeventCode::BIG_SYNC_ESTABLISHED:
case hci::SubeventCode::BIG_SYNC_LOST:
case hci::SubeventCode::REQUEST_PEER_SCA_COMPLETE:
classification = {.activity = Activity::SCAN, .connection_handle_pos = 0, .address_pos = 0};
break;
case hci::SubeventCode::SCAN_REQUEST_RECEIVED:
classification = {.activity = Activity::ADVERTISE, .connection_handle_pos = 0, .address_pos = 5};
break;
case hci::SubeventCode::PERIODIC_ADVERTISING_SYNC_TRANSFER_RECEIVED:
case hci::SubeventCode::CIS_ESTABLISHED:
case hci::SubeventCode::CIS_REQUEST:
classification = {.activity = Activity::SCAN, .connection_handle_pos = 4, .address_pos = 0};
break;
default:
classification = {.activity = Activity::UNKNOWN, .connection_handle_pos = 0, .address_pos = 0};
}
return classification;
}
} // namespace activity_attribution
} // namespace bluetooth