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