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.3.12
CreateCommandCompleteReadLocalName(uint8_t status,const std::string & local_name)83 std::unique_ptr<EventPacket> EventPacket::CreateCommandCompleteReadLocalName(
84 uint8_t status, const std::string& local_name) {
85 std::unique_ptr<EventPacket> evt_ptr =
86 EventPacket::CreateCommandCompleteOnlyStatusEvent(HCI_READ_LOCAL_NAME,
87 status);
88
89 for (size_t i = 0; i < local_name.length(); i++)
90 CHECK(evt_ptr->AddPayloadOctets1(local_name[i]));
91 CHECK(evt_ptr->AddPayloadOctets1(0)); // Null terminated
92 for (size_t i = 0; i < 248 - local_name.length() - 1; i++)
93 CHECK(evt_ptr->AddPayloadOctets1(0xFF));
94
95 return evt_ptr;
96 }
97
98 // Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.4.1
99 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)100 EventPacket::CreateCommandCompleteReadLocalVersionInformation(
101 uint8_t status, uint8_t hci_version, uint16_t hci_revision,
102 uint8_t lmp_pal_version, uint16_t manufacturer_name,
103 uint16_t lmp_pal_subversion) {
104 std::unique_ptr<EventPacket> evt_ptr =
105 EventPacket::CreateCommandCompleteOnlyStatusEvent(
106 HCI_READ_LOCAL_VERSION_INFO, status);
107
108 CHECK(evt_ptr->AddPayloadOctets1(hci_version));
109 CHECK(evt_ptr->AddPayloadOctets2(hci_revision));
110 CHECK(evt_ptr->AddPayloadOctets1(lmp_pal_version));
111 CHECK(evt_ptr->AddPayloadOctets2(manufacturer_name));
112 CHECK(evt_ptr->AddPayloadOctets2(lmp_pal_subversion));
113
114 return evt_ptr;
115 }
116
117 // Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.4.2
118 std::unique_ptr<EventPacket>
CreateCommandCompleteReadLocalSupportedCommands(uint8_t status,const vector<uint8_t> & supported_commands)119 EventPacket::CreateCommandCompleteReadLocalSupportedCommands(
120 uint8_t status, const vector<uint8_t>& supported_commands) {
121 std::unique_ptr<EventPacket> evt_ptr =
122 EventPacket::CreateCommandCompleteOnlyStatusEvent(
123 HCI_READ_LOCAL_SUPPORTED_CMDS, status);
124
125 CHECK(evt_ptr->AddPayloadOctets(64, supported_commands));
126
127 return evt_ptr;
128 }
129
130 // Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.4.4
131 std::unique_ptr<EventPacket>
CreateCommandCompleteReadLocalExtendedFeatures(uint8_t status,uint8_t page_number,uint8_t maximum_page_number,uint64_t extended_lmp_features)132 EventPacket::CreateCommandCompleteReadLocalExtendedFeatures(
133 uint8_t status, uint8_t page_number, uint8_t maximum_page_number,
134 uint64_t extended_lmp_features) {
135 std::unique_ptr<EventPacket> evt_ptr =
136 EventPacket::CreateCommandCompleteOnlyStatusEvent(
137 HCI_READ_LOCAL_EXT_FEATURES, status);
138
139 CHECK(evt_ptr->AddPayloadOctets1(page_number));
140 CHECK(evt_ptr->AddPayloadOctets1(maximum_page_number));
141 CHECK(evt_ptr->AddPayloadOctets8(extended_lmp_features));
142
143 return evt_ptr;
144 }
145
146 // 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)147 std::unique_ptr<EventPacket> EventPacket::CreateCommandCompleteReadBufferSize(
148 uint8_t status, uint16_t hc_acl_data_packet_length,
149 uint8_t hc_synchronous_data_packet_length,
150 uint16_t hc_total_num_acl_data_packets,
151 uint16_t hc_total_synchronous_data_packets) {
152 std::unique_ptr<EventPacket> evt_ptr =
153 EventPacket::CreateCommandCompleteOnlyStatusEvent(HCI_READ_BUFFER_SIZE,
154 status);
155
156 CHECK(evt_ptr->AddPayloadOctets2(hc_acl_data_packet_length));
157 CHECK(evt_ptr->AddPayloadOctets1(hc_synchronous_data_packet_length));
158 CHECK(evt_ptr->AddPayloadOctets2(hc_total_num_acl_data_packets));
159 CHECK(evt_ptr->AddPayloadOctets2(hc_total_synchronous_data_packets));
160
161 return evt_ptr;
162 }
163
164 // Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.4.6
CreateCommandCompleteReadBdAddr(uint8_t status,const BtAddress & address)165 std::unique_ptr<EventPacket> EventPacket::CreateCommandCompleteReadBdAddr(
166 uint8_t status, const BtAddress& address) {
167 std::unique_ptr<EventPacket> evt_ptr =
168 EventPacket::CreateCommandCompleteOnlyStatusEvent(HCI_READ_BD_ADDR,
169 status);
170
171 CHECK(evt_ptr->AddPayloadBtAddress(address));
172
173 return evt_ptr;
174 }
175
176 // Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.4.8
177 std::unique_ptr<EventPacket>
CreateCommandCompleteReadLocalSupportedCodecs(uint8_t status,const vector<uint8_t> & supported_codecs,const vector<uint32_t> & vendor_specific_codecs)178 EventPacket::CreateCommandCompleteReadLocalSupportedCodecs(
179 uint8_t status, const vector<uint8_t>& supported_codecs,
180 const vector<uint32_t>& vendor_specific_codecs) {
181 std::unique_ptr<EventPacket> evt_ptr =
182 EventPacket::CreateCommandCompleteOnlyStatusEvent(
183 HCI_READ_LOCAL_SUPPORTED_CODECS, status);
184
185 CHECK(evt_ptr->AddPayloadOctets(supported_codecs.size(), supported_codecs));
186 for (size_t i = 0; i < vendor_specific_codecs.size(); i++)
187 CHECK(evt_ptr->AddPayloadOctets4(vendor_specific_codecs[i]));
188
189 return evt_ptr;
190 }
191
CreateInquiryResultEvent(const BtAddress & address,const PageScanRepetitionMode page_scan_repetition_mode,uint32_t class_of_device,uint16_t clock_offset)192 std::unique_ptr<EventPacket> EventPacket::CreateInquiryResultEvent(
193 const BtAddress& address,
194 const PageScanRepetitionMode page_scan_repetition_mode,
195 uint32_t class_of_device, uint16_t clock_offset) {
196 std::unique_ptr<EventPacket> evt_ptr =
197 std::unique_ptr<EventPacket>(new EventPacket(HCI_INQUIRY_RESULT_EVT));
198
199 CHECK(evt_ptr->AddPayloadOctets1(1)); // Start with a single response
200
201 CHECK(evt_ptr->AddPayloadBtAddress(address));
202 CHECK(evt_ptr->AddPayloadOctets1(page_scan_repetition_mode));
203 CHECK(evt_ptr->AddPayloadOctets2(kReservedZero));
204 CHECK(evt_ptr->AddPayloadOctets3(class_of_device));
205 CHECK(!(clock_offset & 0x8000));
206 CHECK(evt_ptr->AddPayloadOctets2(clock_offset));
207
208 return evt_ptr;
209 }
210
AddInquiryResult(const BtAddress & address,const PageScanRepetitionMode page_scan_repetition_mode,uint32_t class_of_device,uint16_t clock_offset)211 void EventPacket::AddInquiryResult(
212 const BtAddress& address,
213 const PageScanRepetitionMode page_scan_repetition_mode,
214 uint32_t class_of_device, uint16_t clock_offset) {
215 CHECK(GetEventCode() == HCI_INQUIRY_RESULT_EVT);
216
217 CHECK(IncrementPayloadCounter(1)); // Increment the number of responses
218
219 CHECK(AddPayloadBtAddress(address));
220 CHECK(AddPayloadOctets1(page_scan_repetition_mode));
221 CHECK(AddPayloadOctets2(kReservedZero));
222 CHECK(AddPayloadOctets3(class_of_device));
223 CHECK(!(clock_offset & 0x8000));
224 CHECK(AddPayloadOctets2(clock_offset));
225 }
226
CreateExtendedInquiryResultEvent(const BtAddress & address,const PageScanRepetitionMode page_scan_repetition_mode,uint32_t class_of_device,uint16_t clock_offset,uint8_t rssi,const vector<uint8_t> & extended_inquiry_response)227 std::unique_ptr<EventPacket> EventPacket::CreateExtendedInquiryResultEvent(
228 const BtAddress& address,
229 const PageScanRepetitionMode page_scan_repetition_mode,
230 uint32_t class_of_device, uint16_t clock_offset, uint8_t rssi,
231 const vector<uint8_t>& extended_inquiry_response) {
232 std::unique_ptr<EventPacket> evt_ptr = std::unique_ptr<EventPacket>(
233 new EventPacket(HCI_EXTENDED_INQUIRY_RESULT_EVT));
234
235 CHECK(evt_ptr->AddPayloadOctets1(1)); // Always contains a single response
236
237 CHECK(evt_ptr->AddPayloadBtAddress(address));
238 CHECK(evt_ptr->AddPayloadOctets1(page_scan_repetition_mode));
239 CHECK(evt_ptr->AddPayloadOctets1(kReservedZero));
240 CHECK(evt_ptr->AddPayloadOctets3(class_of_device));
241 CHECK(!(clock_offset & 0x8000));
242 CHECK(evt_ptr->AddPayloadOctets2(clock_offset));
243 CHECK(evt_ptr->AddPayloadOctets1(rssi));
244 CHECK(evt_ptr->AddPayloadOctets(extended_inquiry_response.size(),
245 extended_inquiry_response));
246 while (evt_ptr->AddPayloadOctets1(0xff))
247 ; // Fill packet
248 return evt_ptr;
249 }
250
251 // 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)252 std::unique_ptr<EventPacket> EventPacket::CreateCommandCompleteLeReadBufferSize(
253 uint8_t status, uint16_t hc_le_data_packet_length,
254 uint8_t hc_total_num_le_data_packets) {
255 std::unique_ptr<EventPacket> evt_ptr =
256 EventPacket::CreateCommandCompleteOnlyStatusEvent(
257 HCI_BLE_READ_BUFFER_SIZE, status);
258
259 CHECK(evt_ptr->AddPayloadOctets2(hc_le_data_packet_length));
260 CHECK(evt_ptr->AddPayloadOctets1(hc_total_num_le_data_packets));
261
262 return evt_ptr;
263 }
264
265 // Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.8.3
266 std::unique_ptr<EventPacket>
CreateCommandCompleteLeReadLocalSupportedFeatures(uint8_t status,uint64_t le_features)267 EventPacket::CreateCommandCompleteLeReadLocalSupportedFeatures(
268 uint8_t status, uint64_t le_features) {
269 std::unique_ptr<EventPacket> evt_ptr =
270 EventPacket::CreateCommandCompleteOnlyStatusEvent(
271 HCI_BLE_READ_LOCAL_SPT_FEAT, status);
272
273 CHECK(evt_ptr->AddPayloadOctets8(le_features));
274
275 return evt_ptr;
276 }
277
278 // Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.8.14
279 std::unique_ptr<EventPacket>
CreateCommandCompleteLeReadWhiteListSize(uint8_t status,uint8_t white_list_size)280 EventPacket::CreateCommandCompleteLeReadWhiteListSize(uint8_t status,
281 uint8_t white_list_size) {
282 std::unique_ptr<EventPacket> evt_ptr =
283 EventPacket::CreateCommandCompleteOnlyStatusEvent(
284 HCI_BLE_READ_WHITE_LIST_SIZE, status);
285
286 CHECK(evt_ptr->AddPayloadOctets8(white_list_size));
287
288 return evt_ptr;
289 }
290
291 // Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.8.23
CreateCommandCompleteLeRand(uint8_t status,uint64_t random_val)292 std::unique_ptr<EventPacket> EventPacket::CreateCommandCompleteLeRand(
293 uint8_t status, uint64_t random_val) {
294 std::unique_ptr<EventPacket> evt_ptr =
295 EventPacket::CreateCommandCompleteOnlyStatusEvent(HCI_BLE_RAND, status);
296
297 CHECK(evt_ptr->AddPayloadOctets8(random_val));
298
299 return evt_ptr;
300 }
301
302 // Bluetooth Core Specification Version 4.2, Volume 2, Part E, Section 7.8.27
303 std::unique_ptr<EventPacket>
CreateCommandCompleteLeReadSupportedStates(uint8_t status,uint64_t le_states)304 EventPacket::CreateCommandCompleteLeReadSupportedStates(uint8_t status,
305 uint64_t le_states) {
306 std::unique_ptr<EventPacket> evt_ptr =
307 EventPacket::CreateCommandCompleteOnlyStatusEvent(
308 HCI_BLE_READ_SUPPORTED_STATES, status);
309
310 CHECK(evt_ptr->AddPayloadOctets8(le_states));
311
312 return evt_ptr;
313 }
314
315 // Vendor-specific commands (see hcidefs.h)
316
CreateCommandCompleteLeVendorCap(uint8_t status,const vector<uint8_t> & vendor_cap)317 std::unique_ptr<EventPacket> EventPacket::CreateCommandCompleteLeVendorCap(
318 uint8_t status, const vector<uint8_t>& vendor_cap) {
319 std::unique_ptr<EventPacket> evt_ptr =
320 EventPacket::CreateCommandCompleteOnlyStatusEvent(HCI_BLE_VENDOR_CAP_OCF,
321 status);
322
323 CHECK(evt_ptr->AddPayloadOctets(vendor_cap.size(), vendor_cap));
324
325 return evt_ptr;
326 }
327
328 } // namespace test_vendor_lib
329