1f3b1820e1676261886a6537e1f6abac6a35ed6d4Dennis Cheng// 2f3b1820e1676261886a6537e1f6abac6a35ed6d4Dennis Cheng// Copyright 2015 The Android Open Source Project 3f3b1820e1676261886a6537e1f6abac6a35ed6d4Dennis Cheng// 4f3b1820e1676261886a6537e1f6abac6a35ed6d4Dennis Cheng// Licensed under the Apache License, Version 2.0 (the "License"); 5f3b1820e1676261886a6537e1f6abac6a35ed6d4Dennis Cheng// you may not use this file except in compliance with the License. 6f3b1820e1676261886a6537e1f6abac6a35ed6d4Dennis Cheng// You may obtain a copy of the License at 7f3b1820e1676261886a6537e1f6abac6a35ed6d4Dennis Cheng// 8f3b1820e1676261886a6537e1f6abac6a35ed6d4Dennis Cheng// http://www.apache.org/licenses/LICENSE-2.0 9f3b1820e1676261886a6537e1f6abac6a35ed6d4Dennis Cheng// 10f3b1820e1676261886a6537e1f6abac6a35ed6d4Dennis Cheng// Unless required by applicable law or agreed to in writing, software 11f3b1820e1676261886a6537e1f6abac6a35ed6d4Dennis Cheng// distributed under the License is distributed on an "AS IS" BASIS, 12f3b1820e1676261886a6537e1f6abac6a35ed6d4Dennis Cheng// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f3b1820e1676261886a6537e1f6abac6a35ed6d4Dennis Cheng// See the License for the specific language governing permissions and 14f3b1820e1676261886a6537e1f6abac6a35ed6d4Dennis Cheng// limitations under the License. 15f3b1820e1676261886a6537e1f6abac6a35ed6d4Dennis Cheng// 16f3b1820e1676261886a6537e1f6abac6a35ed6d4Dennis Cheng 17f3b1820e1676261886a6537e1f6abac6a35ed6d4Dennis Cheng#define LOG_TAG "event_packet" 18f3b1820e1676261886a6537e1f6abac6a35ed6d4Dennis Cheng 19ea3ede2474a8980387b67bc7db2b661e7219b468Jorge E. Moreira#include "event_packet.h" 20f3b1820e1676261886a6537e1f6abac6a35ed6d4Dennis Cheng 21f3b1820e1676261886a6537e1f6abac6a35ed6d4Dennis Cheng#include "osi/include/log.h" 22f3b1820e1676261886a6537e1f6abac6a35ed6d4Dennis Cheng#include "stack/include/hcidefs.h" 23f3b1820e1676261886a6537e1f6abac6a35ed6d4Dennis Cheng 24b7d64b20717e3f597bb4e3881f08cb5d07fa1b02Myles Watsonusing std::vector; 25b7d64b20717e3f597bb4e3881f08cb5d07fa1b02Myles Watson 26f3b1820e1676261886a6537e1f6abac6a35ed6d4Dennis Chengnamespace test_vendor_lib { 27f3b1820e1676261886a6537e1f6abac6a35ed6d4Dennis Cheng 2899195bc17fe1f7c4a7e43590d9bce550b177a931Myles WatsonEventPacket::EventPacket(uint8_t event_code) 2999195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson : Packet(DATA_TYPE_EVENT, {event_code}) {} 30f3b1820e1676261886a6537e1f6abac6a35ed6d4Dennis Cheng 31015834df156be6b7365ce1cf00e31ddf72f2c67bMyles Watsonuint8_t EventPacket::GetEventCode() const { return GetHeader()[0]; } 32f3b1820e1676261886a6537e1f6abac6a35ed6d4Dennis Cheng 3399195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson// Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.7.1 3499195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watsonstd::unique_ptr<EventPacket> EventPacket::CreateInquiryCompleteEvent( 35354a9bf886b2100f484cd0217d00aa4ef008759fMyles Watson uint8_t status) { 3699195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson std::unique_ptr<EventPacket> evt_ptr = 3799195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson std::unique_ptr<EventPacket>(new EventPacket(HCI_INQUIRY_COMP_EVT)); 3899195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets1(status)); 3999195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 4099195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson return evt_ptr; 4199195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson} 4299195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 4399195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson// Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.7.14 44f3b1820e1676261886a6537e1f6abac6a35ed6d4Dennis Chengstd::unique_ptr<EventPacket> EventPacket::CreateCommandCompleteEvent( 45354a9bf886b2100f484cd0217d00aa4ef008759fMyles Watson uint16_t command_opcode, const vector<uint8_t>& event_return_parameters) { 4699195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson std::unique_ptr<EventPacket> evt_ptr = 4799195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson std::unique_ptr<EventPacket>(new EventPacket(HCI_COMMAND_COMPLETE_EVT)); 48f3b1820e1676261886a6537e1f6abac6a35ed6d4Dennis Cheng 4999195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets1(1)); // num_hci_command_packets 5099195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets2(command_opcode)); 5199195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets(event_return_parameters.size(), 5299195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson event_return_parameters)); 53f3b1820e1676261886a6537e1f6abac6a35ed6d4Dennis Cheng 5499195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson return evt_ptr; 55f3b1820e1676261886a6537e1f6abac6a35ed6d4Dennis Cheng} 56f3b1820e1676261886a6537e1f6abac6a35ed6d4Dennis Cheng 5799195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watsonstd::unique_ptr<EventPacket> EventPacket::CreateCommandCompleteOnlyStatusEvent( 58354a9bf886b2100f484cd0217d00aa4ef008759fMyles Watson uint16_t command_opcode, uint8_t status) { 5999195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson std::unique_ptr<EventPacket> evt_ptr = 6099195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson std::unique_ptr<EventPacket>(new EventPacket(HCI_COMMAND_COMPLETE_EVT)); 6199195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 6299195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets1(1)); // num_hci_command_packets 6399195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets2(command_opcode)); 6499195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets1(status)); 6599195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 6699195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson return evt_ptr; 6799195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson} 6899195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 6999195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson// Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.7.15 705f8a46aae144f416d695010ae61c47116562a615Dennis Chengstd::unique_ptr<EventPacket> EventPacket::CreateCommandStatusEvent( 7199195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson uint8_t status, uint16_t command_opcode) { 7299195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson std::unique_ptr<EventPacket> evt_ptr = 7399195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson std::unique_ptr<EventPacket>(new EventPacket(HCI_COMMAND_STATUS_EVT)); 7499195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 7599195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets1(status)); 7699195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets1(1)); // num_hci_command_packets 7799195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets2(command_opcode)); 7899195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 7999195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson return evt_ptr; 8099195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson} 8199195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 8299195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson// Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.3.12 8399195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watsonstd::unique_ptr<EventPacket> EventPacket::CreateCommandCompleteReadLocalName( 84354a9bf886b2100f484cd0217d00aa4ef008759fMyles Watson uint8_t status, const std::string& local_name) { 8599195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson std::unique_ptr<EventPacket> evt_ptr = 8699195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson EventPacket::CreateCommandCompleteOnlyStatusEvent(HCI_READ_LOCAL_NAME, 8799195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson status); 8899195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 8999195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson for (size_t i = 0; i < local_name.length(); i++) 9099195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets1(local_name[i])); 9199195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets1(0)); // Null terminated 9299195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson for (size_t i = 0; i < 248 - local_name.length() - 1; i++) 9399195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets1(0xFF)); 9499195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 9599195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson return evt_ptr; 9699195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson} 9799195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 9899195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson// Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.4.1 9999195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watsonstd::unique_ptr<EventPacket> 10099195bc17fe1f7c4a7e43590d9bce550b177a931Myles WatsonEventPacket::CreateCommandCompleteReadLocalVersionInformation( 101015834df156be6b7365ce1cf00e31ddf72f2c67bMyles Watson uint8_t status, uint8_t hci_version, uint16_t hci_revision, 102015834df156be6b7365ce1cf00e31ddf72f2c67bMyles Watson uint8_t lmp_pal_version, uint16_t manufacturer_name, 103354a9bf886b2100f484cd0217d00aa4ef008759fMyles Watson uint16_t lmp_pal_subversion) { 10499195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson std::unique_ptr<EventPacket> evt_ptr = 10599195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson EventPacket::CreateCommandCompleteOnlyStatusEvent( 10699195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson HCI_READ_LOCAL_VERSION_INFO, status); 10799195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 10899195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets1(hci_version)); 10999195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets2(hci_revision)); 11099195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets1(lmp_pal_version)); 11199195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets2(manufacturer_name)); 11299195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets2(lmp_pal_subversion)); 11399195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 11499195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson return evt_ptr; 11599195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson} 11699195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 11799195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson// Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.4.2 11899195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watsonstd::unique_ptr<EventPacket> 11999195bc17fe1f7c4a7e43590d9bce550b177a931Myles WatsonEventPacket::CreateCommandCompleteReadLocalSupportedCommands( 120354a9bf886b2100f484cd0217d00aa4ef008759fMyles Watson uint8_t status, const vector<uint8_t>& supported_commands) { 12199195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson std::unique_ptr<EventPacket> evt_ptr = 12299195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson EventPacket::CreateCommandCompleteOnlyStatusEvent( 12399195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson HCI_READ_LOCAL_SUPPORTED_CMDS, status); 12499195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 12599195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets(64, supported_commands)); 12699195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 12799195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson return evt_ptr; 12899195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson} 12999195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 13099195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson// Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.4.4 13199195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watsonstd::unique_ptr<EventPacket> 13299195bc17fe1f7c4a7e43590d9bce550b177a931Myles WatsonEventPacket::CreateCommandCompleteReadLocalExtendedFeatures( 133015834df156be6b7365ce1cf00e31ddf72f2c67bMyles Watson uint8_t status, uint8_t page_number, uint8_t maximum_page_number, 134354a9bf886b2100f484cd0217d00aa4ef008759fMyles Watson uint64_t extended_lmp_features) { 13599195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson std::unique_ptr<EventPacket> evt_ptr = 13699195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson EventPacket::CreateCommandCompleteOnlyStatusEvent( 13799195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson HCI_READ_LOCAL_EXT_FEATURES, status); 13899195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 13999195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets1(page_number)); 14099195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets1(maximum_page_number)); 14199195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets8(extended_lmp_features)); 14299195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 14399195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson return evt_ptr; 14499195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson} 14599195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 14699195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson// Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.4.5 14799195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watsonstd::unique_ptr<EventPacket> EventPacket::CreateCommandCompleteReadBufferSize( 148015834df156be6b7365ce1cf00e31ddf72f2c67bMyles Watson uint8_t status, uint16_t hc_acl_data_packet_length, 149354a9bf886b2100f484cd0217d00aa4ef008759fMyles Watson uint8_t hc_synchronous_data_packet_length, 150354a9bf886b2100f484cd0217d00aa4ef008759fMyles Watson uint16_t hc_total_num_acl_data_packets, 151354a9bf886b2100f484cd0217d00aa4ef008759fMyles Watson uint16_t hc_total_synchronous_data_packets) { 15299195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson std::unique_ptr<EventPacket> evt_ptr = 15399195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson EventPacket::CreateCommandCompleteOnlyStatusEvent(HCI_READ_BUFFER_SIZE, 15499195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson status); 15599195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 15699195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets2(hc_acl_data_packet_length)); 15799195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets1(hc_synchronous_data_packet_length)); 15899195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets2(hc_total_num_acl_data_packets)); 15999195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets2(hc_total_synchronous_data_packets)); 16099195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 16199195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson return evt_ptr; 16299195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson} 16399195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 16499195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson// Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.4.6 16599195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watsonstd::unique_ptr<EventPacket> EventPacket::CreateCommandCompleteReadBdAddr( 166354a9bf886b2100f484cd0217d00aa4ef008759fMyles Watson uint8_t status, const BtAddress& address) { 16799195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson std::unique_ptr<EventPacket> evt_ptr = 16899195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson EventPacket::CreateCommandCompleteOnlyStatusEvent(HCI_READ_BD_ADDR, 16999195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson status); 17099195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 1713be0c20a70a0891d495916e6b733f7805300db25Myles Watson CHECK(evt_ptr->AddPayloadBtAddress(address)); 17299195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 17399195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson return evt_ptr; 17499195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson} 17599195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 17699195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson// Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.4.8 17799195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watsonstd::unique_ptr<EventPacket> 17899195bc17fe1f7c4a7e43590d9bce550b177a931Myles WatsonEventPacket::CreateCommandCompleteReadLocalSupportedCodecs( 179015834df156be6b7365ce1cf00e31ddf72f2c67bMyles Watson uint8_t status, const vector<uint8_t>& supported_codecs, 18099195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson const vector<uint32_t>& vendor_specific_codecs) { 18199195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson std::unique_ptr<EventPacket> evt_ptr = 18299195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson EventPacket::CreateCommandCompleteOnlyStatusEvent( 18399195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson HCI_READ_LOCAL_SUPPORTED_CODECS, status); 1845f8a46aae144f416d695010ae61c47116562a615Dennis Cheng 18599195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets(supported_codecs.size(), supported_codecs)); 18699195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson for (size_t i = 0; i < vendor_specific_codecs.size(); i++) 18799195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets4(vendor_specific_codecs[i])); 1885f8a46aae144f416d695010ae61c47116562a615Dennis Cheng 18999195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson return evt_ptr; 1905f8a46aae144f416d695010ae61c47116562a615Dennis Cheng} 1915f8a46aae144f416d695010ae61c47116562a615Dennis Cheng 1925f8a46aae144f416d695010ae61c47116562a615Dennis Chengstd::unique_ptr<EventPacket> EventPacket::CreateInquiryResultEvent( 1933be0c20a70a0891d495916e6b733f7805300db25Myles Watson const BtAddress& address, 19499195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson const PageScanRepetitionMode page_scan_repetition_mode, 195015834df156be6b7365ce1cf00e31ddf72f2c67bMyles Watson uint32_t class_of_device, uint16_t clock_offset) { 19699195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson std::unique_ptr<EventPacket> evt_ptr = 19799195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson std::unique_ptr<EventPacket>(new EventPacket(HCI_INQUIRY_RESULT_EVT)); 19899195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 19999195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets1(1)); // Start with a single response 20099195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 2013be0c20a70a0891d495916e6b733f7805300db25Myles Watson CHECK(evt_ptr->AddPayloadBtAddress(address)); 20299195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets1(page_scan_repetition_mode)); 20399195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets2(kReservedZero)); 20499195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets3(class_of_device)); 20599195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(!(clock_offset & 0x8000)); 20699195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets2(clock_offset)); 20799195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 20899195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson return evt_ptr; 20999195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson} 21099195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 21199195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watsonvoid EventPacket::AddInquiryResult( 2123be0c20a70a0891d495916e6b733f7805300db25Myles Watson const BtAddress& address, 21399195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson const PageScanRepetitionMode page_scan_repetition_mode, 214015834df156be6b7365ce1cf00e31ddf72f2c67bMyles Watson uint32_t class_of_device, uint16_t clock_offset) { 21599195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(GetEventCode() == HCI_INQUIRY_RESULT_EVT); 21699195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 21799195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(IncrementPayloadCounter(1)); // Increment the number of responses 21899195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 2193be0c20a70a0891d495916e6b733f7805300db25Myles Watson CHECK(AddPayloadBtAddress(address)); 22099195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(AddPayloadOctets1(page_scan_repetition_mode)); 22199195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(AddPayloadOctets2(kReservedZero)); 22299195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(AddPayloadOctets3(class_of_device)); 22399195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(!(clock_offset & 0x8000)); 22499195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(AddPayloadOctets2(clock_offset)); 22599195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson} 22699195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 2275f8a46aae144f416d695010ae61c47116562a615Dennis Chengstd::unique_ptr<EventPacket> EventPacket::CreateExtendedInquiryResultEvent( 2283be0c20a70a0891d495916e6b733f7805300db25Myles Watson const BtAddress& address, 22999195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson const PageScanRepetitionMode page_scan_repetition_mode, 230015834df156be6b7365ce1cf00e31ddf72f2c67bMyles Watson uint32_t class_of_device, uint16_t clock_offset, uint8_t rssi, 23199195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson const vector<uint8_t>& extended_inquiry_response) { 23299195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson std::unique_ptr<EventPacket> evt_ptr = std::unique_ptr<EventPacket>( 23399195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson new EventPacket(HCI_EXTENDED_INQUIRY_RESULT_EVT)); 23499195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 23599195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets1(1)); // Always contains a single response 23699195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 2373be0c20a70a0891d495916e6b733f7805300db25Myles Watson CHECK(evt_ptr->AddPayloadBtAddress(address)); 23899195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets1(page_scan_repetition_mode)); 23999195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets1(kReservedZero)); 24099195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets3(class_of_device)); 24199195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(!(clock_offset & 0x8000)); 24299195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets2(clock_offset)); 24399195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets1(rssi)); 24499195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets(extended_inquiry_response.size(), 24599195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson extended_inquiry_response)); 24699195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson while (evt_ptr->AddPayloadOctets1(0xff)) 24799195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson ; // Fill packet 24899195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson return evt_ptr; 24999195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson} 25099195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 25199195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson// Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.8.2 25299195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watsonstd::unique_ptr<EventPacket> EventPacket::CreateCommandCompleteLeReadBufferSize( 253015834df156be6b7365ce1cf00e31ddf72f2c67bMyles Watson uint8_t status, uint16_t hc_le_data_packet_length, 254354a9bf886b2100f484cd0217d00aa4ef008759fMyles Watson uint8_t hc_total_num_le_data_packets) { 25599195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson std::unique_ptr<EventPacket> evt_ptr = 25699195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson EventPacket::CreateCommandCompleteOnlyStatusEvent( 25799195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson HCI_BLE_READ_BUFFER_SIZE, status); 25899195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 25999195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets2(hc_le_data_packet_length)); 26099195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets1(hc_total_num_le_data_packets)); 26199195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 26299195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson return evt_ptr; 26399195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson} 26499195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 26599195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson// Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.8.3 26699195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watsonstd::unique_ptr<EventPacket> 26799195bc17fe1f7c4a7e43590d9bce550b177a931Myles WatsonEventPacket::CreateCommandCompleteLeReadLocalSupportedFeatures( 268354a9bf886b2100f484cd0217d00aa4ef008759fMyles Watson uint8_t status, uint64_t le_features) { 26999195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson std::unique_ptr<EventPacket> evt_ptr = 27099195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson EventPacket::CreateCommandCompleteOnlyStatusEvent( 27199195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson HCI_BLE_READ_LOCAL_SPT_FEAT, status); 27299195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 27399195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets8(le_features)); 27499195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 27599195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson return evt_ptr; 27699195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson} 27799195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 27899195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson// Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.8.14 27999195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watsonstd::unique_ptr<EventPacket> 280354a9bf886b2100f484cd0217d00aa4ef008759fMyles WatsonEventPacket::CreateCommandCompleteLeReadWhiteListSize(uint8_t status, 281354a9bf886b2100f484cd0217d00aa4ef008759fMyles Watson uint8_t white_list_size) { 28299195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson std::unique_ptr<EventPacket> evt_ptr = 28399195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson EventPacket::CreateCommandCompleteOnlyStatusEvent( 28499195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson HCI_BLE_READ_WHITE_LIST_SIZE, status); 28599195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 28699195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets8(white_list_size)); 28799195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 28899195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson return evt_ptr; 28999195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson} 29099195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 29199195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson// Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.8.23 29299195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watsonstd::unique_ptr<EventPacket> EventPacket::CreateCommandCompleteLeRand( 293354a9bf886b2100f484cd0217d00aa4ef008759fMyles Watson uint8_t status, uint64_t random_val) { 29499195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson std::unique_ptr<EventPacket> evt_ptr = 29599195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson EventPacket::CreateCommandCompleteOnlyStatusEvent(HCI_BLE_RAND, status); 29699195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 29799195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets8(random_val)); 29899195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 29999195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson return evt_ptr; 30099195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson} 30199195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 30299195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson// Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.8.27 30399195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watsonstd::unique_ptr<EventPacket> 304354a9bf886b2100f484cd0217d00aa4ef008759fMyles WatsonEventPacket::CreateCommandCompleteLeReadSupportedStates(uint8_t status, 305354a9bf886b2100f484cd0217d00aa4ef008759fMyles Watson uint64_t le_states) { 30699195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson std::unique_ptr<EventPacket> evt_ptr = 30799195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson EventPacket::CreateCommandCompleteOnlyStatusEvent( 30899195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson HCI_BLE_READ_SUPPORTED_STATES, status); 30999195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 31099195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets8(le_states)); 31199195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 31299195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson return evt_ptr; 31399195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson} 31499195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 31599195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson// Vendor-specific commands (see hcidefs.h) 31699195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 31799195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watsonstd::unique_ptr<EventPacket> EventPacket::CreateCommandCompleteLeVendorCap( 318354a9bf886b2100f484cd0217d00aa4ef008759fMyles Watson uint8_t status, const vector<uint8_t>& vendor_cap) { 31999195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson std::unique_ptr<EventPacket> evt_ptr = 32099195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson EventPacket::CreateCommandCompleteOnlyStatusEvent(HCI_BLE_VENDOR_CAP_OCF, 32199195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson status); 32299195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 32399195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson CHECK(evt_ptr->AddPayloadOctets(vendor_cap.size(), vendor_cap)); 32499195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson 32599195bc17fe1f7c4a7e43590d9bce550b177a931Myles Watson return evt_ptr; 3265f8a46aae144f416d695010ae61c47116562a615Dennis Cheng} 3275f8a46aae144f416d695010ae61c47116562a615Dennis Cheng 328f3b1820e1676261886a6537e1f6abac6a35ed6d4Dennis Cheng} // namespace test_vendor_lib 329