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