• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #define LOG_TAG "event_packet"
18 
19 #include "event_packet.h"
20 
21 #include "osi/include/log.h"
22 #include "stack/include/hcidefs.h"
23 
24 using std::vector;
25 
26 namespace test_vendor_lib {
27 
EventPacket(uint8_t event_code)28 EventPacket::EventPacket(uint8_t event_code)
29     : Packet(DATA_TYPE_EVENT, {event_code}) {}
30 
GetEventCode() const31 uint8_t EventPacket::GetEventCode() const { return GetHeader()[0]; }
32 
33 // Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.7.1
CreateInquiryCompleteEvent(uint8_t status)34 std::unique_ptr<EventPacket> EventPacket::CreateInquiryCompleteEvent(
35     uint8_t status) {
36   std::unique_ptr<EventPacket> evt_ptr =
37       std::unique_ptr<EventPacket>(new EventPacket(HCI_INQUIRY_COMP_EVT));
38   CHECK(evt_ptr->AddPayloadOctets1(status));
39 
40   return evt_ptr;
41 }
42 
43 // Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.7.14
CreateCommandCompleteEvent(uint16_t command_opcode,const vector<uint8_t> & event_return_parameters)44 std::unique_ptr<EventPacket> EventPacket::CreateCommandCompleteEvent(
45     uint16_t command_opcode, const vector<uint8_t>& event_return_parameters) {
46   std::unique_ptr<EventPacket> evt_ptr =
47       std::unique_ptr<EventPacket>(new EventPacket(HCI_COMMAND_COMPLETE_EVT));
48 
49   CHECK(evt_ptr->AddPayloadOctets1(1));  // num_hci_command_packets
50   CHECK(evt_ptr->AddPayloadOctets2(command_opcode));
51   CHECK(evt_ptr->AddPayloadOctets(event_return_parameters.size(),
52                                   event_return_parameters));
53 
54   return evt_ptr;
55 }
56 
CreateCommandCompleteOnlyStatusEvent(uint16_t command_opcode,uint8_t status)57 std::unique_ptr<EventPacket> EventPacket::CreateCommandCompleteOnlyStatusEvent(
58     uint16_t command_opcode, uint8_t status) {
59   std::unique_ptr<EventPacket> evt_ptr =
60       std::unique_ptr<EventPacket>(new EventPacket(HCI_COMMAND_COMPLETE_EVT));
61 
62   CHECK(evt_ptr->AddPayloadOctets1(1));  // num_hci_command_packets
63   CHECK(evt_ptr->AddPayloadOctets2(command_opcode));
64   CHECK(evt_ptr->AddPayloadOctets1(status));
65 
66   return evt_ptr;
67 }
68 
69 // Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.7.15
CreateCommandStatusEvent(uint8_t status,uint16_t command_opcode)70 std::unique_ptr<EventPacket> EventPacket::CreateCommandStatusEvent(
71     uint8_t status, uint16_t command_opcode) {
72   std::unique_ptr<EventPacket> evt_ptr =
73       std::unique_ptr<EventPacket>(new EventPacket(HCI_COMMAND_STATUS_EVT));
74 
75   CHECK(evt_ptr->AddPayloadOctets1(status));
76   CHECK(evt_ptr->AddPayloadOctets1(1));  // num_hci_command_packets
77   CHECK(evt_ptr->AddPayloadOctets2(command_opcode));
78 
79   return evt_ptr;
80 }
81 
82 // Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.7.19
CreateNumberOfCompletedPacketsEvent(uint16_t handle,uint16_t num_completed_packets)83 std::unique_ptr<EventPacket> EventPacket::CreateNumberOfCompletedPacketsEvent(
84     uint16_t handle, uint16_t num_completed_packets) {
85   std::unique_ptr<EventPacket> evt_ptr = std::unique_ptr<EventPacket>(
86       new EventPacket(HCI_NUM_COMPL_DATA_PKTS_EVT));
87 
88   CHECK(evt_ptr->AddPayloadOctets1(0));  // Number of handles.
89   evt_ptr->AddCompletedPackets(handle, num_completed_packets);
90 
91   return evt_ptr;
92 }
93 
AddCompletedPackets(uint16_t handle,uint16_t num_completed_packets)94 void EventPacket::AddCompletedPackets(uint16_t handle,
95                                       uint16_t num_completed_packets) {
96   CHECK(AddPayloadOctets2(handle));
97   CHECK(AddPayloadOctets2(num_completed_packets));
98   CHECK(IncrementPayloadCounter(1));  // Increment the number of handles.
99 }
100 
101 // Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.3.10
102 std::unique_ptr<EventPacket>
CreateCommandCompleteDeleteStoredLinkKey(uint8_t status,uint16_t num_keys_deleted)103 EventPacket::CreateCommandCompleteDeleteStoredLinkKey(
104     uint8_t status, uint16_t num_keys_deleted) {
105   std::unique_ptr<EventPacket> evt_ptr =
106       EventPacket::CreateCommandCompleteOnlyStatusEvent(
107           HCI_DELETE_STORED_LINK_KEY, status);
108 
109   CHECK(evt_ptr->AddPayloadOctets2(num_keys_deleted));
110 
111   return evt_ptr;
112 }
113 
114 // Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.3.12
CreateCommandCompleteReadLocalName(uint8_t status,const std::string & local_name)115 std::unique_ptr<EventPacket> EventPacket::CreateCommandCompleteReadLocalName(
116     uint8_t status, const std::string& local_name) {
117   std::unique_ptr<EventPacket> evt_ptr =
118       EventPacket::CreateCommandCompleteOnlyStatusEvent(HCI_READ_LOCAL_NAME,
119                                                         status);
120 
121   for (size_t i = 0; i < local_name.length(); i++)
122     CHECK(evt_ptr->AddPayloadOctets1(local_name[i]));
123   CHECK(evt_ptr->AddPayloadOctets1(0));  // Null terminated
124   for (size_t i = 0; i < 248 - local_name.length() - 1; i++)
125     CHECK(evt_ptr->AddPayloadOctets1(0xFF));
126 
127   return evt_ptr;
128 }
129 
130 // Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.4.1
131 std::unique_ptr<EventPacket>
CreateCommandCompleteReadLocalVersionInformation(uint8_t status,uint8_t hci_version,uint16_t hci_revision,uint8_t lmp_pal_version,uint16_t manufacturer_name,uint16_t lmp_pal_subversion)132 EventPacket::CreateCommandCompleteReadLocalVersionInformation(
133     uint8_t status, uint8_t hci_version, uint16_t hci_revision,
134     uint8_t lmp_pal_version, uint16_t manufacturer_name,
135     uint16_t lmp_pal_subversion) {
136   std::unique_ptr<EventPacket> evt_ptr =
137       EventPacket::CreateCommandCompleteOnlyStatusEvent(
138           HCI_READ_LOCAL_VERSION_INFO, status);
139 
140   CHECK(evt_ptr->AddPayloadOctets1(hci_version));
141   CHECK(evt_ptr->AddPayloadOctets2(hci_revision));
142   CHECK(evt_ptr->AddPayloadOctets1(lmp_pal_version));
143   CHECK(evt_ptr->AddPayloadOctets2(manufacturer_name));
144   CHECK(evt_ptr->AddPayloadOctets2(lmp_pal_subversion));
145 
146   return evt_ptr;
147 }
148 
149 // Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.4.2
150 std::unique_ptr<EventPacket>
CreateCommandCompleteReadLocalSupportedCommands(uint8_t status,const vector<uint8_t> & supported_commands)151 EventPacket::CreateCommandCompleteReadLocalSupportedCommands(
152     uint8_t status, const vector<uint8_t>& supported_commands) {
153   std::unique_ptr<EventPacket> evt_ptr =
154       EventPacket::CreateCommandCompleteOnlyStatusEvent(
155           HCI_READ_LOCAL_SUPPORTED_CMDS, status);
156 
157   CHECK(evt_ptr->AddPayloadOctets(64, supported_commands));
158 
159   return evt_ptr;
160 }
161 
162 // Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.4.4
163 std::unique_ptr<EventPacket>
CreateCommandCompleteReadLocalExtendedFeatures(uint8_t status,uint8_t page_number,uint8_t maximum_page_number,uint64_t extended_lmp_features)164 EventPacket::CreateCommandCompleteReadLocalExtendedFeatures(
165     uint8_t status, uint8_t page_number, uint8_t maximum_page_number,
166     uint64_t extended_lmp_features) {
167   std::unique_ptr<EventPacket> evt_ptr =
168       EventPacket::CreateCommandCompleteOnlyStatusEvent(
169           HCI_READ_LOCAL_EXT_FEATURES, status);
170 
171   CHECK(evt_ptr->AddPayloadOctets1(page_number));
172   CHECK(evt_ptr->AddPayloadOctets1(maximum_page_number));
173   CHECK(evt_ptr->AddPayloadOctets8(extended_lmp_features));
174 
175   return evt_ptr;
176 }
177 
178 // Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.4.5
CreateCommandCompleteReadBufferSize(uint8_t status,uint16_t hc_acl_data_packet_length,uint8_t hc_synchronous_data_packet_length,uint16_t hc_total_num_acl_data_packets,uint16_t hc_total_synchronous_data_packets)179 std::unique_ptr<EventPacket> EventPacket::CreateCommandCompleteReadBufferSize(
180     uint8_t status, uint16_t hc_acl_data_packet_length,
181     uint8_t hc_synchronous_data_packet_length,
182     uint16_t hc_total_num_acl_data_packets,
183     uint16_t hc_total_synchronous_data_packets) {
184   std::unique_ptr<EventPacket> evt_ptr =
185       EventPacket::CreateCommandCompleteOnlyStatusEvent(HCI_READ_BUFFER_SIZE,
186                                                         status);
187 
188   CHECK(evt_ptr->AddPayloadOctets2(hc_acl_data_packet_length));
189   CHECK(evt_ptr->AddPayloadOctets1(hc_synchronous_data_packet_length));
190   CHECK(evt_ptr->AddPayloadOctets2(hc_total_num_acl_data_packets));
191   CHECK(evt_ptr->AddPayloadOctets2(hc_total_synchronous_data_packets));
192 
193   return evt_ptr;
194 }
195 
196 // Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.4.6
CreateCommandCompleteReadBdAddr(uint8_t status,const BtAddress & address)197 std::unique_ptr<EventPacket> EventPacket::CreateCommandCompleteReadBdAddr(
198     uint8_t status, const BtAddress& address) {
199   std::unique_ptr<EventPacket> evt_ptr =
200       EventPacket::CreateCommandCompleteOnlyStatusEvent(HCI_READ_BD_ADDR,
201                                                         status);
202 
203   CHECK(evt_ptr->AddPayloadBtAddress(address));
204 
205   return evt_ptr;
206 }
207 
208 // Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.4.8
209 std::unique_ptr<EventPacket>
CreateCommandCompleteReadLocalSupportedCodecs(uint8_t status,const vector<uint8_t> & supported_codecs,const vector<uint32_t> & vendor_specific_codecs)210 EventPacket::CreateCommandCompleteReadLocalSupportedCodecs(
211     uint8_t status, const vector<uint8_t>& supported_codecs,
212     const vector<uint32_t>& vendor_specific_codecs) {
213   std::unique_ptr<EventPacket> evt_ptr =
214       EventPacket::CreateCommandCompleteOnlyStatusEvent(
215           HCI_READ_LOCAL_SUPPORTED_CODECS, status);
216 
217   CHECK(evt_ptr->AddPayloadOctets(supported_codecs.size(), supported_codecs));
218   for (size_t i = 0; i < vendor_specific_codecs.size(); i++)
219     CHECK(evt_ptr->AddPayloadOctets4(vendor_specific_codecs[i]));
220 
221   return evt_ptr;
222 }
223 
224 // Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.6.1
CreateCommandCompleteReadLoopbackMode(uint8_t status,uint8_t mode)225 std::unique_ptr<EventPacket> EventPacket::CreateCommandCompleteReadLoopbackMode(
226     uint8_t status, uint8_t mode) {
227   std::unique_ptr<EventPacket> evt_ptr =
228       EventPacket::CreateCommandCompleteOnlyStatusEvent(HCI_READ_LOOPBACK_MODE,
229                                                         status);
230   CHECK(evt_ptr->AddPayloadOctets1(mode));
231 
232   return evt_ptr;
233 }
234 
235 // Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.7.2
CreateInquiryResultEvent()236 std::unique_ptr<EventPacket> EventPacket::CreateInquiryResultEvent() {
237   std::unique_ptr<EventPacket> evt_ptr =
238       std::unique_ptr<EventPacket>(new EventPacket(HCI_INQUIRY_RESULT_EVT));
239 
240   CHECK(evt_ptr->AddPayloadOctets1(0));  // Start with no responses
241   return evt_ptr;
242 }
243 
AddInquiryResult(const BtAddress & address,uint8_t page_scan_repetition_mode,uint32_t class_of_device,uint16_t clock_offset)244 bool EventPacket::AddInquiryResult(const BtAddress& address,
245                                    uint8_t page_scan_repetition_mode,
246                                    uint32_t class_of_device,
247                                    uint16_t clock_offset) {
248   CHECK(GetEventCode() == HCI_INQUIRY_RESULT_EVT);
249 
250   if (!CanAddPayloadOctets(14)) return false;
251 
252   CHECK(IncrementPayloadCounter(1));  // Increment the number of responses
253 
254   CHECK(AddPayloadBtAddress(address));
255   CHECK(AddPayloadOctets1(page_scan_repetition_mode));
256   CHECK(AddPayloadOctets2(kReservedZero));
257   CHECK(AddPayloadOctets3(class_of_device));
258   CHECK(!(clock_offset & 0x8000));
259   CHECK(AddPayloadOctets2(clock_offset));
260   return true;
261 }
262 
263 // Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.7.3
CreateConnectionCompleteEvent(uint8_t status,uint16_t handle,const BtAddress & address,uint8_t link_type,bool encryption_enabled)264 std::unique_ptr<EventPacket> EventPacket::CreateConnectionCompleteEvent(
265     uint8_t status, uint16_t handle, const BtAddress& address,
266     uint8_t link_type, bool encryption_enabled) {
267   std::unique_ptr<EventPacket> evt_ptr =
268       std::unique_ptr<EventPacket>(new EventPacket(HCI_CONNECTION_COMP_EVT));
269 
270   CHECK(evt_ptr->AddPayloadOctets1(status));
271   CHECK((handle & 0xf000) == 0);  // Handles are 12-bit values.
272   CHECK(evt_ptr->AddPayloadOctets2(handle));
273   CHECK(evt_ptr->AddPayloadBtAddress(address));
274   CHECK(evt_ptr->AddPayloadOctets1(link_type));
275   CHECK(evt_ptr->AddPayloadOctets1(encryption_enabled ? 1 : 0));
276 
277   return evt_ptr;
278 }
279 
280 // Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.7.25
CreateLoopbackCommandEvent(uint16_t opcode,const vector<uint8_t> & payload)281 std::unique_ptr<EventPacket> EventPacket::CreateLoopbackCommandEvent(
282     uint16_t opcode, const vector<uint8_t>& payload) {
283   std::unique_ptr<EventPacket> evt_ptr =
284       std::unique_ptr<EventPacket>(new EventPacket(HCI_LOOPBACK_COMMAND_EVT));
285   CHECK(evt_ptr->AddPayloadOctets2(opcode));
286   for (const auto& payload_byte : payload)  // Fill the packet.
287     evt_ptr->AddPayloadOctets1(payload_byte);
288   return evt_ptr;
289 }
290 
291 // Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.7.38
CreateExtendedInquiryResultEvent(const BtAddress & address,uint8_t page_scan_repetition_mode,uint32_t class_of_device,uint16_t clock_offset,uint8_t rssi,const vector<uint8_t> & extended_inquiry_response)292 std::unique_ptr<EventPacket> EventPacket::CreateExtendedInquiryResultEvent(
293     const BtAddress& address, uint8_t page_scan_repetition_mode,
294     uint32_t class_of_device, uint16_t clock_offset, uint8_t rssi,
295     const vector<uint8_t>& extended_inquiry_response) {
296   std::unique_ptr<EventPacket> evt_ptr = std::unique_ptr<EventPacket>(
297       new EventPacket(HCI_EXTENDED_INQUIRY_RESULT_EVT));
298 
299   CHECK(evt_ptr->AddPayloadOctets1(1));  // Always contains a single response
300 
301   CHECK(evt_ptr->AddPayloadBtAddress(address));
302   CHECK(evt_ptr->AddPayloadOctets1(page_scan_repetition_mode));
303   CHECK(evt_ptr->AddPayloadOctets1(kReservedZero));
304   CHECK(evt_ptr->AddPayloadOctets3(class_of_device));
305   CHECK(!(clock_offset & 0x8000));
306   CHECK(evt_ptr->AddPayloadOctets2(clock_offset));
307   CHECK(evt_ptr->AddPayloadOctets1(rssi));
308   CHECK(evt_ptr->AddPayloadOctets(extended_inquiry_response.size(),
309                                   extended_inquiry_response));
310   while (evt_ptr->AddPayloadOctets1(0xff))
311     ;  // Fill packet
312   return evt_ptr;
313 }
314 
315 // Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.7.65.1
CreateLeConnectionCompleteEvent(uint8_t status,uint16_t handle,uint8_t role,uint8_t peer_address_type,const BtAddress & peer,uint16_t interval,uint16_t latency,uint16_t supervision_timeout)316 std::unique_ptr<EventPacket> EventPacket::CreateLeConnectionCompleteEvent(
317     uint8_t status, uint16_t handle, uint8_t role, uint8_t peer_address_type,
318     const BtAddress& peer, uint16_t interval, uint16_t latency,
319     uint16_t supervision_timeout) {
320   std::unique_ptr<EventPacket> evt_ptr =
321       std::unique_ptr<EventPacket>(new EventPacket(HCI_BLE_EVENT));
322 
323   CHECK(evt_ptr->AddPayloadOctets1(HCI_BLE_CONN_COMPLETE_EVT));
324   CHECK(evt_ptr->AddPayloadOctets1(status));
325   CHECK(evt_ptr->AddPayloadOctets2(handle));
326   CHECK(evt_ptr->AddPayloadOctets1(role));
327   CHECK(evt_ptr->AddPayloadOctets1(peer_address_type));
328   CHECK(evt_ptr->AddPayloadBtAddress(peer));
329   CHECK(evt_ptr->AddPayloadOctets2(interval));
330   CHECK(evt_ptr->AddPayloadOctets2(latency));
331   CHECK(evt_ptr->AddPayloadOctets2(supervision_timeout));
332   CHECK(evt_ptr->AddPayloadOctets1(
333       0x00));  // Master Clock Accuracy (unused for master)
334 
335   return evt_ptr;
336 }
337 
338 // Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.7.65.2
CreateLeAdvertisingReportEvent()339 std::unique_ptr<EventPacket> EventPacket::CreateLeAdvertisingReportEvent() {
340   std::unique_ptr<EventPacket> evt_ptr =
341       std::unique_ptr<EventPacket>(new EventPacket(HCI_BLE_EVENT));
342 
343   CHECK(evt_ptr->AddPayloadOctets1(HCI_BLE_ADV_PKT_RPT_EVT));
344 
345   CHECK(evt_ptr->AddPayloadOctets1(0));  // Start with an empty report
346 
347   return evt_ptr;
348 }
349 
AddLeAdvertisingReport(uint8_t event_type,uint8_t addr_type,const BtAddress & addr,const vector<uint8_t> & data,uint8_t rssi)350 bool EventPacket::AddLeAdvertisingReport(uint8_t event_type, uint8_t addr_type,
351                                          const BtAddress& addr,
352                                          const vector<uint8_t>& data,
353                                          uint8_t rssi) {
354   if (!CanAddPayloadOctets(10 + data.size())) return false;
355 
356   CHECK(GetEventCode() == HCI_BLE_EVENT);
357 
358   CHECK(IncrementPayloadCounter(2));  // Increment the number of responses
359 
360   CHECK(AddPayloadOctets1(event_type));
361   CHECK(AddPayloadOctets1(addr_type));
362   CHECK(AddPayloadBtAddress(addr));
363   CHECK(AddPayloadOctets1(data.size()));
364   CHECK(AddPayloadOctets(data.size(), data));
365   CHECK(AddPayloadOctets1(rssi));
366   return true;
367 }
368 
369 // Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.7.65.4
CreateLeRemoteUsedFeaturesEvent(uint8_t status,uint16_t handle,uint64_t features)370 std::unique_ptr<EventPacket> EventPacket::CreateLeRemoteUsedFeaturesEvent(
371     uint8_t status, uint16_t handle, uint64_t features) {
372   std::unique_ptr<EventPacket> evt_ptr =
373       std::unique_ptr<EventPacket>(new EventPacket(HCI_BLE_EVENT));
374 
375   CHECK(evt_ptr->AddPayloadOctets1(HCI_BLE_READ_REMOTE_FEAT_CMPL_EVT));
376 
377   CHECK(evt_ptr->AddPayloadOctets1(status));
378   CHECK(evt_ptr->AddPayloadOctets2(handle));
379   CHECK(evt_ptr->AddPayloadOctets8(features));
380 
381   return evt_ptr;
382 }
383 
384 // Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.8.2
CreateCommandCompleteLeReadBufferSize(uint8_t status,uint16_t hc_le_data_packet_length,uint8_t hc_total_num_le_data_packets)385 std::unique_ptr<EventPacket> EventPacket::CreateCommandCompleteLeReadBufferSize(
386     uint8_t status, uint16_t hc_le_data_packet_length,
387     uint8_t hc_total_num_le_data_packets) {
388   std::unique_ptr<EventPacket> evt_ptr =
389       EventPacket::CreateCommandCompleteOnlyStatusEvent(
390           HCI_BLE_READ_BUFFER_SIZE, status);
391 
392   CHECK(evt_ptr->AddPayloadOctets2(hc_le_data_packet_length));
393   CHECK(evt_ptr->AddPayloadOctets1(hc_total_num_le_data_packets));
394 
395   return evt_ptr;
396 }
397 
398 // Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.8.3
399 std::unique_ptr<EventPacket>
CreateCommandCompleteLeReadLocalSupportedFeatures(uint8_t status,uint64_t le_features)400 EventPacket::CreateCommandCompleteLeReadLocalSupportedFeatures(
401     uint8_t status, uint64_t le_features) {
402   std::unique_ptr<EventPacket> evt_ptr =
403       EventPacket::CreateCommandCompleteOnlyStatusEvent(
404           HCI_BLE_READ_LOCAL_SPT_FEAT, status);
405 
406   CHECK(evt_ptr->AddPayloadOctets8(le_features));
407 
408   return evt_ptr;
409 }
410 
411 // Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.8.14
412 std::unique_ptr<EventPacket>
CreateCommandCompleteLeReadWhiteListSize(uint8_t status,uint8_t white_list_size)413 EventPacket::CreateCommandCompleteLeReadWhiteListSize(uint8_t status,
414                                                       uint8_t white_list_size) {
415   std::unique_ptr<EventPacket> evt_ptr =
416       EventPacket::CreateCommandCompleteOnlyStatusEvent(
417           HCI_BLE_READ_WHITE_LIST_SIZE, status);
418 
419   CHECK(evt_ptr->AddPayloadOctets8(white_list_size));
420 
421   return evt_ptr;
422 }
423 
424 // Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.8.23
CreateCommandCompleteLeRand(uint8_t status,uint64_t random_val)425 std::unique_ptr<EventPacket> EventPacket::CreateCommandCompleteLeRand(
426     uint8_t status, uint64_t random_val) {
427   std::unique_ptr<EventPacket> evt_ptr =
428       EventPacket::CreateCommandCompleteOnlyStatusEvent(HCI_BLE_RAND, status);
429 
430   CHECK(evt_ptr->AddPayloadOctets8(random_val));
431 
432   return evt_ptr;
433 }
434 
435 // Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.8.27
436 std::unique_ptr<EventPacket>
CreateCommandCompleteLeReadSupportedStates(uint8_t status,uint64_t le_states)437 EventPacket::CreateCommandCompleteLeReadSupportedStates(uint8_t status,
438                                                         uint64_t le_states) {
439   std::unique_ptr<EventPacket> evt_ptr =
440       EventPacket::CreateCommandCompleteOnlyStatusEvent(
441           HCI_BLE_READ_SUPPORTED_STATES, status);
442 
443   CHECK(evt_ptr->AddPayloadOctets8(le_states));
444 
445   return evt_ptr;
446 }
447 
448 // Vendor-specific commands (see hcidefs.h)
449 
CreateCommandCompleteLeVendorCap(uint8_t status,const vector<uint8_t> & vendor_cap)450 std::unique_ptr<EventPacket> EventPacket::CreateCommandCompleteLeVendorCap(
451     uint8_t status, const vector<uint8_t>& vendor_cap) {
452   std::unique_ptr<EventPacket> evt_ptr =
453       EventPacket::CreateCommandCompleteOnlyStatusEvent(HCI_BLE_VENDOR_CAP_OCF,
454                                                         status);
455 
456   CHECK(evt_ptr->AddPayloadOctets(vendor_cap.size(), vendor_cap));
457 
458   return evt_ptr;
459 }
460 
461 }  // namespace test_vendor_lib
462