1 /******************************************************************************
2 *
3 * Copyright (C) 2014 Google, Inc.
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 ******************************************************************************/
18
19 #define LOG_TAG "bt_controller"
20
21 #include "device/include/controller.h"
22
23 #include <base/logging.h>
24
25 #include "bt_types.h"
26 #include "btcore/include/event_mask.h"
27 #include "btcore/include/module.h"
28 #include "btcore/include/version.h"
29 #include "hcimsgs.h"
30 #include "osi/include/future.h"
31 #include "stack/include/btm_ble_api.h"
32
33 const bt_event_mask_t BLE_EVENT_MASK = {
34 {0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x1E, 0x7f}};
35
36 const bt_event_mask_t CLASSIC_EVENT_MASK = {HCI_DUMO_EVENT_MASK_EXT};
37
38 // TODO(zachoverflow): factor out into common module
39 const uint8_t SCO_HOST_BUFFER_SIZE = 0xff;
40
41 #define HCI_SUPPORTED_COMMANDS_ARRAY_SIZE 64
42 #define MAX_FEATURES_CLASSIC_PAGE_COUNT 3
43 #define BLE_SUPPORTED_STATES_SIZE 8
44 #define BLE_SUPPORTED_FEATURES_SIZE 8
45 #define MAX_LOCAL_SUPPORTED_CODECS_SIZE 8
46
47 static const hci_t* hci;
48 static const hci_packet_factory_t* packet_factory;
49 static const hci_packet_parser_t* packet_parser;
50
51 static bt_bdaddr_t address;
52 static bt_version_t bt_version;
53
54 static uint8_t supported_commands[HCI_SUPPORTED_COMMANDS_ARRAY_SIZE];
55 static bt_device_features_t features_classic[MAX_FEATURES_CLASSIC_PAGE_COUNT];
56 static uint8_t last_features_classic_page_index;
57
58 static uint16_t acl_data_size_classic;
59 static uint16_t acl_data_size_ble;
60 static uint16_t acl_buffer_count_classic;
61 static uint8_t acl_buffer_count_ble;
62
63 static uint8_t ble_white_list_size;
64 static uint8_t ble_resolving_list_max_size;
65 static uint8_t ble_supported_states[BLE_SUPPORTED_STATES_SIZE];
66 static bt_device_features_t features_ble;
67 static uint16_t ble_suggested_default_data_length;
68 static uint16_t ble_maxium_advertising_data_length;
69 static uint8_t ble_number_of_supported_advertising_sets;
70 static uint8_t local_supported_codecs[MAX_LOCAL_SUPPORTED_CODECS_SIZE];
71 static uint8_t number_of_local_supported_codecs = 0;
72
73 static bool readable;
74 static bool ble_supported;
75 static bool simple_pairing_supported;
76 static bool secure_connections_supported;
77
78 #define AWAIT_COMMAND(command) \
79 static_cast<BT_HDR*>(future_await(hci->transmit_command_futured(command)))
80
81 // Module lifecycle functions
82
start_up(void)83 static future_t* start_up(void) {
84 BT_HDR* response;
85
86 // Send the initial reset command
87 response = AWAIT_COMMAND(packet_factory->make_reset());
88 packet_parser->parse_generic_command_complete(response);
89
90 // Request the classic buffer size next
91 response = AWAIT_COMMAND(packet_factory->make_read_buffer_size());
92 packet_parser->parse_read_buffer_size_response(
93 response, &acl_data_size_classic, &acl_buffer_count_classic);
94
95 // Tell the controller about our buffer sizes and buffer counts next
96 // TODO(zachoverflow): factor this out. eww l2cap contamination. And why just
97 // a hardcoded 10?
98 response = AWAIT_COMMAND(packet_factory->make_host_buffer_size(
99 L2CAP_MTU_SIZE, SCO_HOST_BUFFER_SIZE, L2CAP_HOST_FC_ACL_BUFS, 10));
100
101 packet_parser->parse_generic_command_complete(response);
102
103 // Read the local version info off the controller next, including
104 // information such as manufacturer and supported HCI version
105 response = AWAIT_COMMAND(packet_factory->make_read_local_version_info());
106 packet_parser->parse_read_local_version_info_response(response, &bt_version);
107
108 // Read the bluetooth address off the controller next
109 response = AWAIT_COMMAND(packet_factory->make_read_bd_addr());
110 packet_parser->parse_read_bd_addr_response(response, &address);
111
112 // Request the controller's supported commands next
113 response =
114 AWAIT_COMMAND(packet_factory->make_read_local_supported_commands());
115 packet_parser->parse_read_local_supported_commands_response(
116 response, supported_commands, HCI_SUPPORTED_COMMANDS_ARRAY_SIZE);
117
118 // Read page 0 of the controller features next
119 uint8_t page_number = 0;
120 response = AWAIT_COMMAND(
121 packet_factory->make_read_local_extended_features(page_number));
122 packet_parser->parse_read_local_extended_features_response(
123 response, &page_number, &last_features_classic_page_index,
124 features_classic, MAX_FEATURES_CLASSIC_PAGE_COUNT);
125
126 CHECK(page_number == 0);
127 page_number++;
128
129 // Inform the controller what page 0 features we support, based on what
130 // it told us it supports. We need to do this first before we request the
131 // next page, because the controller's response for page 1 may be
132 // dependent on what we configure from page 0
133 simple_pairing_supported =
134 HCI_SIMPLE_PAIRING_SUPPORTED(features_classic[0].as_array);
135 if (simple_pairing_supported) {
136 response = AWAIT_COMMAND(
137 packet_factory->make_write_simple_pairing_mode(HCI_SP_MODE_ENABLED));
138 packet_parser->parse_generic_command_complete(response);
139 }
140
141 if (HCI_LE_SPT_SUPPORTED(features_classic[0].as_array)) {
142 uint8_t simultaneous_le_host =
143 HCI_SIMUL_LE_BREDR_SUPPORTED(features_classic[0].as_array)
144 ? BTM_BLE_SIMULTANEOUS_HOST
145 : 0;
146 response = AWAIT_COMMAND(packet_factory->make_ble_write_host_support(
147 BTM_BLE_HOST_SUPPORT, simultaneous_le_host));
148
149 packet_parser->parse_generic_command_complete(response);
150
151 // If we modified the BT_HOST_SUPPORT, we will need ext. feat. page 1
152 if (last_features_classic_page_index < 1)
153 last_features_classic_page_index = 1;
154 }
155
156 // Done telling the controller about what page 0 features we support
157 // Request the remaining feature pages
158 while (page_number <= last_features_classic_page_index &&
159 page_number < MAX_FEATURES_CLASSIC_PAGE_COUNT) {
160 response = AWAIT_COMMAND(
161 packet_factory->make_read_local_extended_features(page_number));
162 packet_parser->parse_read_local_extended_features_response(
163 response, &page_number, &last_features_classic_page_index,
164 features_classic, MAX_FEATURES_CLASSIC_PAGE_COUNT);
165
166 page_number++;
167 }
168
169 #if (SC_MODE_INCLUDED == TRUE)
170 secure_connections_supported =
171 HCI_SC_CTRLR_SUPPORTED(features_classic[2].as_array);
172 if (secure_connections_supported) {
173 response = AWAIT_COMMAND(
174 packet_factory->make_write_secure_connections_host_support(
175 HCI_SC_MODE_ENABLED));
176 packet_parser->parse_generic_command_complete(response);
177 }
178 #endif
179
180 ble_supported = last_features_classic_page_index >= 1 &&
181 HCI_LE_HOST_SUPPORTED(features_classic[1].as_array);
182 if (ble_supported) {
183 // Request the ble white list size next
184 response = AWAIT_COMMAND(packet_factory->make_ble_read_white_list_size());
185 packet_parser->parse_ble_read_white_list_size_response(
186 response, &ble_white_list_size);
187
188 // Request the ble buffer size next
189 response = AWAIT_COMMAND(packet_factory->make_ble_read_buffer_size());
190 packet_parser->parse_ble_read_buffer_size_response(
191 response, &acl_data_size_ble, &acl_buffer_count_ble);
192
193 // Response of 0 indicates ble has the same buffer size as classic
194 if (acl_data_size_ble == 0) acl_data_size_ble = acl_data_size_classic;
195
196 // Request the ble supported states next
197 response = AWAIT_COMMAND(packet_factory->make_ble_read_supported_states());
198 packet_parser->parse_ble_read_supported_states_response(
199 response, ble_supported_states, sizeof(ble_supported_states));
200
201 // Request the ble supported features next
202 response =
203 AWAIT_COMMAND(packet_factory->make_ble_read_local_supported_features());
204 packet_parser->parse_ble_read_local_supported_features_response(
205 response, &features_ble);
206
207 if (HCI_LE_ENHANCED_PRIVACY_SUPPORTED(features_ble.as_array)) {
208 response =
209 AWAIT_COMMAND(packet_factory->make_ble_read_resolving_list_size());
210 packet_parser->parse_ble_read_resolving_list_size_response(
211 response, &ble_resolving_list_max_size);
212 }
213
214 if (HCI_LE_DATA_LEN_EXT_SUPPORTED(features_ble.as_array)) {
215 response = AWAIT_COMMAND(
216 packet_factory->make_ble_read_suggested_default_data_length());
217 packet_parser->parse_ble_read_suggested_default_data_length_response(
218 response, &ble_suggested_default_data_length);
219 }
220
221 if (HCI_LE_EXTENDED_ADVERTISING_SUPPORTED(features_ble.as_array)) {
222 response = AWAIT_COMMAND(
223 packet_factory->make_ble_read_maximum_advertising_data_length());
224 packet_parser->parse_ble_read_maximum_advertising_data_length(
225 response, &ble_maxium_advertising_data_length);
226
227 response = AWAIT_COMMAND(
228 packet_factory->make_ble_read_number_of_supported_advertising_sets());
229 packet_parser->parse_ble_read_number_of_supported_advertising_sets(
230 response, &ble_number_of_supported_advertising_sets);
231 } else {
232 /* If LE Excended Advertising is not supported, use the default value */
233 ble_maxium_advertising_data_length = 31;
234 }
235
236 // Set the ble event mask next
237 response =
238 AWAIT_COMMAND(packet_factory->make_ble_set_event_mask(&BLE_EVENT_MASK));
239 packet_parser->parse_generic_command_complete(response);
240 }
241
242 if (simple_pairing_supported) {
243 response =
244 AWAIT_COMMAND(packet_factory->make_set_event_mask(&CLASSIC_EVENT_MASK));
245 packet_parser->parse_generic_command_complete(response);
246 }
247
248 // read local supported codecs
249 if (HCI_READ_LOCAL_CODECS_SUPPORTED(supported_commands)) {
250 response =
251 AWAIT_COMMAND(packet_factory->make_read_local_supported_codecs());
252 packet_parser->parse_read_local_supported_codecs_response(
253 response, &number_of_local_supported_codecs, local_supported_codecs);
254 }
255
256 readable = true;
257 return future_new_immediate(FUTURE_SUCCESS);
258 }
259
shut_down(void)260 static future_t* shut_down(void) {
261 readable = false;
262 return future_new_immediate(FUTURE_SUCCESS);
263 }
264
265 EXPORT_SYMBOL extern const module_t controller_module = {
266 .name = CONTROLLER_MODULE,
267 .init = NULL,
268 .start_up = start_up,
269 .shut_down = shut_down,
270 .clean_up = NULL,
271 .dependencies = {HCI_MODULE, NULL}};
272
273 // Interface functions
274
get_is_ready(void)275 static bool get_is_ready(void) { return readable; }
276
get_address(void)277 static const bt_bdaddr_t* get_address(void) {
278 CHECK(readable);
279 return &address;
280 }
281
get_bt_version(void)282 static const bt_version_t* get_bt_version(void) {
283 CHECK(readable);
284 return &bt_version;
285 }
286
287 // TODO(zachoverflow): hide inside, move decoder inside too
get_features_classic(int index)288 static const bt_device_features_t* get_features_classic(int index) {
289 CHECK(readable);
290 CHECK(index < MAX_FEATURES_CLASSIC_PAGE_COUNT);
291 return &features_classic[index];
292 }
293
get_last_features_classic_index(void)294 static uint8_t get_last_features_classic_index(void) {
295 CHECK(readable);
296 return last_features_classic_page_index;
297 }
298
get_local_supported_codecs(uint8_t * number_of_codecs)299 static uint8_t* get_local_supported_codecs(uint8_t* number_of_codecs) {
300 CHECK(readable);
301 if (number_of_local_supported_codecs) {
302 *number_of_codecs = number_of_local_supported_codecs;
303 return local_supported_codecs;
304 }
305 return NULL;
306 }
307
get_features_ble(void)308 static const bt_device_features_t* get_features_ble(void) {
309 CHECK(readable);
310 CHECK(ble_supported);
311 return &features_ble;
312 }
313
get_ble_supported_states(void)314 static const uint8_t* get_ble_supported_states(void) {
315 CHECK(readable);
316 CHECK(ble_supported);
317 return ble_supported_states;
318 }
319
supports_simple_pairing(void)320 static bool supports_simple_pairing(void) {
321 CHECK(readable);
322 return simple_pairing_supported;
323 }
324
supports_secure_connections(void)325 static bool supports_secure_connections(void) {
326 CHECK(readable);
327 return secure_connections_supported;
328 }
329
supports_simultaneous_le_bredr(void)330 static bool supports_simultaneous_le_bredr(void) {
331 CHECK(readable);
332 return HCI_SIMUL_LE_BREDR_SUPPORTED(features_classic[0].as_array);
333 }
334
supports_reading_remote_extended_features(void)335 static bool supports_reading_remote_extended_features(void) {
336 CHECK(readable);
337 return HCI_READ_REMOTE_EXT_FEATURES_SUPPORTED(supported_commands);
338 }
339
supports_interlaced_inquiry_scan(void)340 static bool supports_interlaced_inquiry_scan(void) {
341 CHECK(readable);
342 return HCI_LMP_INTERLACED_INQ_SCAN_SUPPORTED(features_classic[0].as_array);
343 }
344
supports_rssi_with_inquiry_results(void)345 static bool supports_rssi_with_inquiry_results(void) {
346 CHECK(readable);
347 return HCI_LMP_INQ_RSSI_SUPPORTED(features_classic[0].as_array);
348 }
349
supports_extended_inquiry_response(void)350 static bool supports_extended_inquiry_response(void) {
351 CHECK(readable);
352 return HCI_EXT_INQ_RSP_SUPPORTED(features_classic[0].as_array);
353 }
354
supports_master_slave_role_switch(void)355 static bool supports_master_slave_role_switch(void) {
356 CHECK(readable);
357 return HCI_SWITCH_SUPPORTED(features_classic[0].as_array);
358 }
359
supports_enhanced_setup_synchronous_connection(void)360 static bool supports_enhanced_setup_synchronous_connection(void) {
361 assert(readable);
362 return HCI_ENH_SETUP_SYNCH_CONN_SUPPORTED(supported_commands);
363 }
364
supports_enhanced_accept_synchronous_connection(void)365 static bool supports_enhanced_accept_synchronous_connection(void) {
366 assert(readable);
367 return HCI_ENH_ACCEPT_SYNCH_CONN_SUPPORTED(supported_commands);
368 }
369
supports_ble(void)370 static bool supports_ble(void) {
371 CHECK(readable);
372 return ble_supported;
373 }
374
supports_ble_privacy(void)375 static bool supports_ble_privacy(void) {
376 CHECK(readable);
377 CHECK(ble_supported);
378 return HCI_LE_ENHANCED_PRIVACY_SUPPORTED(features_ble.as_array);
379 }
380
supports_ble_packet_extension(void)381 static bool supports_ble_packet_extension(void) {
382 CHECK(readable);
383 CHECK(ble_supported);
384 return HCI_LE_DATA_LEN_EXT_SUPPORTED(features_ble.as_array);
385 }
386
supports_ble_connection_parameters_request(void)387 static bool supports_ble_connection_parameters_request(void) {
388 CHECK(readable);
389 CHECK(ble_supported);
390 return HCI_LE_CONN_PARAM_REQ_SUPPORTED(features_ble.as_array);
391 }
392
supports_ble_2m_phy(void)393 static bool supports_ble_2m_phy(void) {
394 CHECK(readable);
395 CHECK(ble_supported);
396 return HCI_LE_2M_PHY_SUPPORTED(features_ble.as_array);
397 }
398
supports_ble_coded_phy(void)399 static bool supports_ble_coded_phy(void) {
400 CHECK(readable);
401 CHECK(ble_supported);
402 return HCI_LE_CODED_PHY_SUPPORTED(features_ble.as_array);
403 }
404
supports_ble_extended_advertising(void)405 static bool supports_ble_extended_advertising(void) {
406 CHECK(readable);
407 CHECK(ble_supported);
408 return HCI_LE_EXTENDED_ADVERTISING_SUPPORTED(features_ble.as_array);
409 }
410
supports_ble_periodic_advertising(void)411 static bool supports_ble_periodic_advertising(void) {
412 CHECK(readable);
413 CHECK(ble_supported);
414 return HCI_LE_PERIODIC_ADVERTISING_SUPPORTED(features_ble.as_array);
415 }
416
get_acl_data_size_classic(void)417 static uint16_t get_acl_data_size_classic(void) {
418 CHECK(readable);
419 return acl_data_size_classic;
420 }
421
get_acl_data_size_ble(void)422 static uint16_t get_acl_data_size_ble(void) {
423 CHECK(readable);
424 CHECK(ble_supported);
425 return acl_data_size_ble;
426 }
427
get_acl_packet_size_classic(void)428 static uint16_t get_acl_packet_size_classic(void) {
429 CHECK(readable);
430 return acl_data_size_classic + HCI_DATA_PREAMBLE_SIZE;
431 }
432
get_acl_packet_size_ble(void)433 static uint16_t get_acl_packet_size_ble(void) {
434 CHECK(readable);
435 return acl_data_size_ble + HCI_DATA_PREAMBLE_SIZE;
436 }
437
get_ble_suggested_default_data_length(void)438 static uint16_t get_ble_suggested_default_data_length(void) {
439 CHECK(readable);
440 CHECK(ble_supported);
441 return ble_suggested_default_data_length;
442 }
443
get_ble_maxium_advertising_data_length(void)444 static uint16_t get_ble_maxium_advertising_data_length(void) {
445 CHECK(readable);
446 CHECK(ble_supported);
447 return ble_maxium_advertising_data_length;
448 }
449
get_ble_number_of_supported_advertising_sets(void)450 static uint8_t get_ble_number_of_supported_advertising_sets(void) {
451 CHECK(readable);
452 CHECK(ble_supported);
453 return ble_number_of_supported_advertising_sets;
454 }
455
get_acl_buffer_count_classic(void)456 static uint16_t get_acl_buffer_count_classic(void) {
457 CHECK(readable);
458 return acl_buffer_count_classic;
459 }
460
get_acl_buffer_count_ble(void)461 static uint8_t get_acl_buffer_count_ble(void) {
462 CHECK(readable);
463 CHECK(ble_supported);
464 return acl_buffer_count_ble;
465 }
466
get_ble_white_list_size(void)467 static uint8_t get_ble_white_list_size(void) {
468 CHECK(readable);
469 CHECK(ble_supported);
470 return ble_white_list_size;
471 }
472
get_ble_resolving_list_max_size(void)473 static uint8_t get_ble_resolving_list_max_size(void) {
474 CHECK(readable);
475 CHECK(ble_supported);
476 return ble_resolving_list_max_size;
477 }
478
set_ble_resolving_list_max_size(int resolving_list_max_size)479 static void set_ble_resolving_list_max_size(int resolving_list_max_size) {
480 // Setting "resolving_list_max_size" to 0 is done during cleanup,
481 // hence we ignore the "readable" flag already set to false during shutdown.
482 if (resolving_list_max_size != 0) {
483 CHECK(readable);
484 }
485 CHECK(ble_supported);
486 ble_resolving_list_max_size = resolving_list_max_size;
487 }
488
get_le_all_initiating_phys()489 static uint8_t get_le_all_initiating_phys() {
490 uint8_t phy = PHY_LE_1M;
491 // TODO(jpawlowski): uncomment after next FW udpate
492 // if (supports_ble_2m_phy()) phy |= PHY_LE_2M;
493 // if (supports_ble_coded_phy()) phy |= PHY_LE_CODED;
494 return phy;
495 }
496
497 static const controller_t interface = {
498 get_is_ready,
499
500 get_address,
501 get_bt_version,
502
503 get_features_classic,
504 get_last_features_classic_index,
505
506 get_features_ble,
507 get_ble_supported_states,
508
509 supports_simple_pairing,
510 supports_secure_connections,
511 supports_simultaneous_le_bredr,
512 supports_reading_remote_extended_features,
513 supports_interlaced_inquiry_scan,
514 supports_rssi_with_inquiry_results,
515 supports_extended_inquiry_response,
516 supports_master_slave_role_switch,
517 supports_enhanced_setup_synchronous_connection,
518 supports_enhanced_accept_synchronous_connection,
519
520 supports_ble,
521 supports_ble_packet_extension,
522 supports_ble_connection_parameters_request,
523 supports_ble_privacy,
524 supports_ble_2m_phy,
525 supports_ble_coded_phy,
526 supports_ble_extended_advertising,
527 supports_ble_periodic_advertising,
528
529 get_acl_data_size_classic,
530 get_acl_data_size_ble,
531
532 get_acl_packet_size_classic,
533 get_acl_packet_size_ble,
534 get_ble_suggested_default_data_length,
535 get_ble_maxium_advertising_data_length,
536 get_ble_number_of_supported_advertising_sets,
537
538 get_acl_buffer_count_classic,
539 get_acl_buffer_count_ble,
540
541 get_ble_white_list_size,
542
543 get_ble_resolving_list_max_size,
544 set_ble_resolving_list_max_size,
545 get_local_supported_codecs,
546 get_le_all_initiating_phys};
547
controller_get_interface()548 const controller_t* controller_get_interface() {
549 static bool loaded = false;
550 if (!loaded) {
551 loaded = true;
552
553 hci = hci_layer_get_interface();
554 packet_factory = hci_packet_factory_get_interface();
555 packet_parser = hci_packet_parser_get_interface();
556 }
557
558 return &interface;
559 }
560
controller_get_test_interface(const hci_t * hci_interface,const hci_packet_factory_t * packet_factory_interface,const hci_packet_parser_t * packet_parser_interface)561 const controller_t* controller_get_test_interface(
562 const hci_t* hci_interface,
563 const hci_packet_factory_t* packet_factory_interface,
564 const hci_packet_parser_t* packet_parser_interface) {
565 hci = hci_interface;
566 packet_factory = packet_factory_interface;
567 packet_parser = packet_parser_interface;
568 return &interface;
569 }
570