Home | History | Annotate | Download | only in src
      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 <assert.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 = { "\x00\x00\x00\x00\x00\x00\x06\x7f" };
     34 
     35 #if (BLE_INCLUDED)
     36 const bt_event_mask_t CLASSIC_EVENT_MASK = { HCI_DUMO_EVENT_MASK_EXT };
     37 #else
     38 const bt_event_mask_t CLASSIC_EVENT_MASK = { HCI_LISBON_EVENT_MASK_EXT };
     39 #endif
     40 
     41 // TODO(zachoverflow): factor out into common module
     42 const uint8_t SCO_HOST_BUFFER_SIZE = 0xff;
     43 
     44 #define HCI_SUPPORTED_COMMANDS_ARRAY_SIZE 64
     45 #define MAX_FEATURES_CLASSIC_PAGE_COUNT 3
     46 #define BLE_SUPPORTED_STATES_SIZE         8
     47 #define BLE_SUPPORTED_FEATURES_SIZE       8
     48 #define MAX_LOCAL_SUPPORTED_CODECS_SIZE   8
     49 
     50 static const hci_t *hci;
     51 static const hci_packet_factory_t *packet_factory;
     52 static const hci_packet_parser_t *packet_parser;
     53 
     54 static bt_bdaddr_t address;
     55 static bt_version_t bt_version;
     56 
     57 static uint8_t supported_commands[HCI_SUPPORTED_COMMANDS_ARRAY_SIZE];
     58 static bt_device_features_t features_classic[MAX_FEATURES_CLASSIC_PAGE_COUNT];
     59 static uint8_t last_features_classic_page_index;
     60 
     61 static uint16_t acl_data_size_classic;
     62 static uint16_t acl_data_size_ble;
     63 static uint16_t acl_buffer_count_classic;
     64 static uint8_t acl_buffer_count_ble;
     65 
     66 static uint8_t ble_white_list_size;
     67 static uint8_t ble_resolving_list_max_size;
     68 static uint8_t ble_supported_states[BLE_SUPPORTED_STATES_SIZE];
     69 static bt_device_features_t features_ble;
     70 static uint16_t ble_suggested_default_data_length;
     71 static uint8_t local_supported_codecs[MAX_LOCAL_SUPPORTED_CODECS_SIZE];
     72 static uint8_t number_of_local_supported_codecs = 0;
     73 
     74 static bool readable;
     75 static bool ble_supported;
     76 static bool simple_pairing_supported;
     77 static bool secure_connections_supported;
     78 
     79 #define AWAIT_COMMAND(command) future_await(hci->transmit_command_futured(command))
     80 
     81 // Module lifecycle functions
     82 
     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 a hardcoded 10?
     97   response = AWAIT_COMMAND(
     98     packet_factory->make_host_buffer_size(
     99       L2CAP_MTU_SIZE,
    100       SCO_HOST_BUFFER_SIZE,
    101       L2CAP_HOST_FC_ACL_BUFS,
    102       10
    103     )
    104   );
    105 
    106   packet_parser->parse_generic_command_complete(response);
    107 
    108   // Read the local version info off the controller next, including
    109   // information such as manufacturer and supported HCI version
    110   response = AWAIT_COMMAND(packet_factory->make_read_local_version_info());
    111   packet_parser->parse_read_local_version_info_response(response, &bt_version);
    112 
    113   // Read the bluetooth address off the controller next
    114   response = AWAIT_COMMAND(packet_factory->make_read_bd_addr());
    115   packet_parser->parse_read_bd_addr_response(response, &address);
    116 
    117   // Request the controller's supported commands next
    118   response = AWAIT_COMMAND(packet_factory->make_read_local_supported_commands());
    119   packet_parser->parse_read_local_supported_commands_response(
    120     response,
    121     supported_commands,
    122     HCI_SUPPORTED_COMMANDS_ARRAY_SIZE
    123   );
    124 
    125   // Read page 0 of the controller features next
    126   uint8_t page_number = 0;
    127   response = AWAIT_COMMAND(packet_factory->make_read_local_extended_features(page_number));
    128   packet_parser->parse_read_local_extended_features_response(
    129     response,
    130     &page_number,
    131     &last_features_classic_page_index,
    132     features_classic,
    133     MAX_FEATURES_CLASSIC_PAGE_COUNT
    134   );
    135 
    136   assert(page_number == 0);
    137   page_number++;
    138 
    139   // Inform the controller what page 0 features we support, based on what
    140   // it told us it supports. We need to do this first before we request the
    141   // next page, because the controller's response for page 1 may be
    142   // dependent on what we configure from page 0
    143   simple_pairing_supported = HCI_SIMPLE_PAIRING_SUPPORTED(features_classic[0].as_array);
    144   if (simple_pairing_supported) {
    145     response = AWAIT_COMMAND(packet_factory->make_write_simple_pairing_mode(HCI_SP_MODE_ENABLED));
    146     packet_parser->parse_generic_command_complete(response);
    147   }
    148 
    149 #if (BLE_INCLUDED == TRUE)
    150   if (HCI_LE_SPT_SUPPORTED(features_classic[0].as_array)) {
    151     uint8_t simultaneous_le_host = HCI_SIMUL_LE_BREDR_SUPPORTED(features_classic[0].as_array) ? BTM_BLE_SIMULTANEOUS_HOST : 0;
    152     response = AWAIT_COMMAND(
    153       packet_factory->make_ble_write_host_support(BTM_BLE_HOST_SUPPORT, simultaneous_le_host)
    154     );
    155 
    156     packet_parser->parse_generic_command_complete(response);
    157 
    158     // If we modified the BT_HOST_SUPPORT, we will need ext. feat. page 1
    159     if (last_features_classic_page_index < 1)
    160       last_features_classic_page_index = 1;
    161   }
    162 #endif
    163 
    164   // Done telling the controller about what page 0 features we support
    165   // Request the remaining feature pages
    166   while (page_number <= last_features_classic_page_index &&
    167          page_number < MAX_FEATURES_CLASSIC_PAGE_COUNT) {
    168     response = AWAIT_COMMAND(packet_factory->make_read_local_extended_features(page_number));
    169     packet_parser->parse_read_local_extended_features_response(
    170       response,
    171       &page_number,
    172       &last_features_classic_page_index,
    173       features_classic,
    174       MAX_FEATURES_CLASSIC_PAGE_COUNT
    175     );
    176 
    177     page_number++;
    178   }
    179 
    180 #if (SC_MODE_INCLUDED == TRUE)
    181   secure_connections_supported = HCI_SC_CTRLR_SUPPORTED(features_classic[2].as_array);
    182   if (secure_connections_supported) {
    183     response = AWAIT_COMMAND(packet_factory->make_write_secure_connections_host_support(HCI_SC_MODE_ENABLED));
    184     packet_parser->parse_generic_command_complete(response);
    185   }
    186 #endif
    187 
    188 #if (BLE_INCLUDED == TRUE)
    189   ble_supported = last_features_classic_page_index >= 1 && HCI_LE_HOST_SUPPORTED(features_classic[1].as_array);
    190   if (ble_supported) {
    191     // Request the ble white list size next
    192     response = AWAIT_COMMAND(packet_factory->make_ble_read_white_list_size());
    193     packet_parser->parse_ble_read_white_list_size_response(response, &ble_white_list_size);
    194 
    195     // Request the ble buffer size next
    196     response = AWAIT_COMMAND(packet_factory->make_ble_read_buffer_size());
    197     packet_parser->parse_ble_read_buffer_size_response(
    198       response,
    199       &acl_data_size_ble,
    200       &acl_buffer_count_ble
    201     );
    202 
    203     // Response of 0 indicates ble has the same buffer size as classic
    204     if (acl_data_size_ble == 0)
    205       acl_data_size_ble = acl_data_size_classic;
    206 
    207     // Request the ble supported states next
    208     response = AWAIT_COMMAND(packet_factory->make_ble_read_supported_states());
    209     packet_parser->parse_ble_read_supported_states_response(
    210       response,
    211       ble_supported_states,
    212       sizeof(ble_supported_states)
    213     );
    214 
    215     // Request the ble supported features next
    216     response = AWAIT_COMMAND(packet_factory->make_ble_read_local_supported_features());
    217     packet_parser->parse_ble_read_local_supported_features_response(
    218       response,
    219       &features_ble
    220     );
    221 
    222     if (HCI_LE_ENHANCED_PRIVACY_SUPPORTED(features_ble.as_array)) {
    223         response = AWAIT_COMMAND(packet_factory->make_ble_read_resolving_list_size());
    224         packet_parser->parse_ble_read_resolving_list_size_response(
    225             response,
    226             &ble_resolving_list_max_size);
    227     }
    228 
    229     if (HCI_LE_DATA_LEN_EXT_SUPPORTED(features_ble.as_array)) {
    230         response = AWAIT_COMMAND(packet_factory->make_ble_read_suggested_default_data_length());
    231         packet_parser->parse_ble_read_suggested_default_data_length_response(
    232             response,
    233             &ble_suggested_default_data_length);
    234     }
    235 
    236     // Set the ble event mask next
    237     response = AWAIT_COMMAND(packet_factory->make_ble_set_event_mask(&BLE_EVENT_MASK));
    238     packet_parser->parse_generic_command_complete(response);
    239   }
    240 #endif
    241 
    242   if (simple_pairing_supported) {
    243     response = AWAIT_COMMAND(packet_factory->make_set_event_mask(&CLASSIC_EVENT_MASK));
    244     packet_parser->parse_generic_command_complete(response);
    245   }
    246 
    247   // read local supported codecs
    248   if(HCI_READ_LOCAL_CODECS_SUPPORTED(supported_commands)) {
    249     response = AWAIT_COMMAND(packet_factory->make_read_local_supported_codecs());
    250     packet_parser->parse_read_local_supported_codecs_response(
    251         response,
    252         &number_of_local_supported_codecs, local_supported_codecs);
    253   }
    254 
    255   readable = true;
    256   return future_new_immediate(FUTURE_SUCCESS);
    257 }
    258 
    259 static future_t *shut_down(void) {
    260   readable = false;
    261   return future_new_immediate(FUTURE_SUCCESS);
    262 }
    263 
    264 EXPORT_SYMBOL const module_t controller_module = {
    265   .name = CONTROLLER_MODULE,
    266   .init = NULL,
    267   .start_up = start_up,
    268   .shut_down = shut_down,
    269   .clean_up = NULL,
    270   .dependencies = {
    271     HCI_MODULE,
    272     NULL
    273   }
    274 };
    275 
    276 // Interface functions
    277 
    278 static bool get_is_ready(void) {
    279   return readable;
    280 }
    281 
    282 static const bt_bdaddr_t *get_address(void) {
    283   assert(readable);
    284   return &address;
    285 }
    286 
    287 static const bt_version_t *get_bt_version(void) {
    288   assert(readable);
    289   return &bt_version;
    290 }
    291 
    292 // TODO(zachoverflow): hide inside, move decoder inside too
    293 static const bt_device_features_t *get_features_classic(int index) {
    294   assert(readable);
    295   assert(index < MAX_FEATURES_CLASSIC_PAGE_COUNT);
    296   return &features_classic[index];
    297 }
    298 
    299 static uint8_t get_last_features_classic_index(void) {
    300   assert(readable);
    301   return last_features_classic_page_index;
    302 }
    303 
    304 static uint8_t *get_local_supported_codecs(uint8_t *number_of_codecs) {
    305   assert(readable);
    306   if(number_of_local_supported_codecs) {
    307     *number_of_codecs = number_of_local_supported_codecs;
    308     return local_supported_codecs;
    309   }
    310   return NULL;
    311 }
    312 
    313 static const bt_device_features_t *get_features_ble(void) {
    314   assert(readable);
    315   assert(ble_supported);
    316   return &features_ble;
    317 }
    318 
    319 static const uint8_t *get_ble_supported_states(void) {
    320   assert(readable);
    321   assert(ble_supported);
    322   return ble_supported_states;
    323 }
    324 
    325 static bool supports_simple_pairing(void) {
    326   assert(readable);
    327   return simple_pairing_supported;
    328 }
    329 
    330 static bool supports_secure_connections(void) {
    331   assert(readable);
    332   return secure_connections_supported;
    333 }
    334 
    335 static bool supports_simultaneous_le_bredr(void) {
    336   assert(readable);
    337   return HCI_SIMUL_LE_BREDR_SUPPORTED(features_classic[0].as_array);
    338 }
    339 
    340 static bool supports_reading_remote_extended_features(void) {
    341   assert(readable);
    342   return HCI_READ_REMOTE_EXT_FEATURES_SUPPORTED(supported_commands);
    343 }
    344 
    345 static bool supports_interlaced_inquiry_scan(void) {
    346   assert(readable);
    347   return HCI_LMP_INTERLACED_INQ_SCAN_SUPPORTED(features_classic[0].as_array);
    348 }
    349 
    350 static bool supports_rssi_with_inquiry_results(void) {
    351   assert(readable);
    352   return HCI_LMP_INQ_RSSI_SUPPORTED(features_classic[0].as_array);
    353 }
    354 
    355 static bool supports_extended_inquiry_response(void) {
    356   assert(readable);
    357   return HCI_EXT_INQ_RSP_SUPPORTED(features_classic[0].as_array);
    358 }
    359 
    360 static bool supports_master_slave_role_switch(void) {
    361   assert(readable);
    362   return HCI_SWITCH_SUPPORTED(features_classic[0].as_array);
    363 }
    364 
    365 static bool supports_ble(void) {
    366   assert(readable);
    367   return ble_supported;
    368 }
    369 
    370 static bool supports_ble_privacy(void) {
    371   assert(readable);
    372   assert(ble_supported);
    373   return HCI_LE_ENHANCED_PRIVACY_SUPPORTED(features_ble.as_array);
    374 }
    375 
    376 static bool supports_ble_packet_extension(void) {
    377   assert(readable);
    378   assert(ble_supported);
    379   return HCI_LE_DATA_LEN_EXT_SUPPORTED(features_ble.as_array);
    380 }
    381 
    382 static bool supports_ble_connection_parameters_request(void) {
    383   assert(readable);
    384   assert(ble_supported);
    385   return HCI_LE_CONN_PARAM_REQ_SUPPORTED(features_ble.as_array);
    386 }
    387 
    388 static uint16_t get_acl_data_size_classic(void) {
    389   assert(readable);
    390   return acl_data_size_classic;
    391 }
    392 
    393 static uint16_t get_acl_data_size_ble(void) {
    394   assert(readable);
    395   assert(ble_supported);
    396   return acl_data_size_ble;
    397 }
    398 
    399 static uint16_t get_acl_packet_size_classic(void) {
    400   assert(readable);
    401   return acl_data_size_classic + HCI_DATA_PREAMBLE_SIZE;
    402 }
    403 
    404 static uint16_t get_acl_packet_size_ble(void) {
    405   assert(readable);
    406   return acl_data_size_ble + HCI_DATA_PREAMBLE_SIZE;
    407 }
    408 
    409 static uint16_t get_ble_suggested_default_data_length(void) {
    410   assert(readable);
    411   assert(ble_supported);
    412   return ble_suggested_default_data_length;
    413 }
    414 
    415 static uint16_t get_acl_buffer_count_classic(void) {
    416   assert(readable);
    417   return acl_buffer_count_classic;
    418 }
    419 
    420 static uint8_t get_acl_buffer_count_ble(void) {
    421   assert(readable);
    422   assert(ble_supported);
    423   return acl_buffer_count_ble;
    424 }
    425 
    426 static uint8_t get_ble_white_list_size(void) {
    427   assert(readable);
    428   assert(ble_supported);
    429   return ble_white_list_size;
    430 }
    431 
    432 static uint8_t get_ble_resolving_list_max_size(void) {
    433   assert(readable);
    434   assert(ble_supported);
    435   return ble_resolving_list_max_size;
    436 }
    437 
    438 static void set_ble_resolving_list_max_size(int resolving_list_max_size) {
    439   // Setting "resolving_list_max_size" to 0 is done during cleanup,
    440   // hence we ignore the "readable" flag already set to false during shutdown.
    441   if (resolving_list_max_size != 0) {
    442     assert(readable);
    443   }
    444   assert(ble_supported);
    445   ble_resolving_list_max_size = resolving_list_max_size;
    446 }
    447 
    448 static const controller_t interface = {
    449   get_is_ready,
    450 
    451   get_address,
    452   get_bt_version,
    453 
    454   get_features_classic,
    455   get_last_features_classic_index,
    456 
    457   get_features_ble,
    458   get_ble_supported_states,
    459 
    460   supports_simple_pairing,
    461   supports_secure_connections,
    462   supports_simultaneous_le_bredr,
    463   supports_reading_remote_extended_features,
    464   supports_interlaced_inquiry_scan,
    465   supports_rssi_with_inquiry_results,
    466   supports_extended_inquiry_response,
    467   supports_master_slave_role_switch,
    468 
    469   supports_ble,
    470   supports_ble_packet_extension,
    471   supports_ble_connection_parameters_request,
    472   supports_ble_privacy,
    473 
    474   get_acl_data_size_classic,
    475   get_acl_data_size_ble,
    476 
    477   get_acl_packet_size_classic,
    478   get_acl_packet_size_ble,
    479   get_ble_suggested_default_data_length,
    480 
    481   get_acl_buffer_count_classic,
    482   get_acl_buffer_count_ble,
    483 
    484   get_ble_white_list_size,
    485 
    486   get_ble_resolving_list_max_size,
    487   set_ble_resolving_list_max_size,
    488   get_local_supported_codecs
    489 };
    490 
    491 const controller_t *controller_get_interface() {
    492   static bool loaded = false;
    493   if (!loaded) {
    494     loaded = true;
    495 
    496     hci = hci_layer_get_interface();
    497     packet_factory = hci_packet_factory_get_interface();
    498     packet_parser = hci_packet_parser_get_interface();
    499   }
    500 
    501   return &interface;
    502 }
    503 
    504 const controller_t *controller_get_test_interface(
    505     const hci_t *hci_interface,
    506     const hci_packet_factory_t *packet_factory_interface,
    507     const hci_packet_parser_t *packet_parser_interface) {
    508 
    509   hci = hci_interface;
    510   packet_factory = packet_factory_interface;
    511   packet_parser = packet_parser_interface;
    512   return &interface;
    513 }
    514