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_hci"
     20 
     21 #include "hci_layer.h"
     22 
     23 #include <assert.h>
     24 #include <pthread.h>
     25 #include <signal.h>
     26 #include <string.h>
     27 #include <sys/types.h>
     28 #include <unistd.h>
     29 
     30 #include "btcore/include/module.h"
     31 #include "btsnoop.h"
     32 #include "buffer_allocator.h"
     33 #include "hci_hal.h"
     34 #include "hci_inject.h"
     35 #include "hci_internals.h"
     36 #include "hcidefs.h"
     37 #include "hcimsgs.h"
     38 #include "low_power_manager.h"
     39 #include "osi/include/alarm.h"
     40 #include "osi/include/list.h"
     41 #include "osi/include/log.h"
     42 #include "osi/include/properties.h"
     43 #include "osi/include/reactor.h"
     44 #include "packet_fragmenter.h"
     45 #include "vendor.h"
     46 
     47 // TODO(zachoverflow): remove this hack extern
     48 #include <hardware/bluetooth.h>
     49 bt_bdaddr_t btif_local_bd_addr;
     50 
     51 #define INBOUND_PACKET_TYPE_COUNT 3
     52 #define PACKET_TYPE_TO_INBOUND_INDEX(type) ((type) - 2)
     53 #define PACKET_TYPE_TO_INDEX(type) ((type) - 1)
     54 
     55 #define PREAMBLE_BUFFER_SIZE 4 // max preamble size, ACL
     56 #define RETRIEVE_ACL_LENGTH(preamble) ((((preamble)[3]) << 8) | (preamble)[2])
     57 
     58 #define BT_HCI_TIMEOUT_TAG_NUM 1010000
     59 
     60 static const uint8_t preamble_sizes[] = {
     61   HCI_COMMAND_PREAMBLE_SIZE,
     62   HCI_ACL_PREAMBLE_SIZE,
     63   HCI_SCO_PREAMBLE_SIZE,
     64   HCI_EVENT_PREAMBLE_SIZE
     65 };
     66 
     67 static const uint16_t outbound_event_types[] =
     68 {
     69   MSG_HC_TO_STACK_HCI_ERR,
     70   MSG_HC_TO_STACK_HCI_ACL,
     71   MSG_HC_TO_STACK_HCI_SCO,
     72   MSG_HC_TO_STACK_HCI_EVT
     73 };
     74 
     75 typedef enum {
     76   BRAND_NEW,
     77   PREAMBLE,
     78   BODY,
     79   IGNORE,
     80   FINISHED
     81 } receive_state_t;
     82 
     83 typedef struct {
     84   receive_state_t state;
     85   uint16_t bytes_remaining;
     86   uint8_t preamble[PREAMBLE_BUFFER_SIZE];
     87   uint16_t index;
     88   BT_HDR *buffer;
     89 } packet_receive_data_t;
     90 
     91 typedef struct {
     92   uint16_t opcode;
     93   future_t *complete_future;
     94   command_complete_cb complete_callback;
     95   command_status_cb status_callback;
     96   void *context;
     97   BT_HDR *command;
     98 } waiting_command_t;
     99 
    100 // Using a define here, because it can be stringified for the property lookup
    101 #define DEFAULT_STARTUP_TIMEOUT_MS 8000
    102 #define STRING_VALUE_OF(x) #x
    103 
    104 static const uint32_t EPILOG_TIMEOUT_MS = 3000;
    105 static const uint32_t COMMAND_PENDING_TIMEOUT_MS = 8000;
    106 
    107 // Our interface
    108 static bool interface_created;
    109 static hci_t interface;
    110 
    111 // Modules we import and callbacks we export
    112 static const allocator_t *buffer_allocator;
    113 static const btsnoop_t *btsnoop;
    114 static const hci_hal_t *hal;
    115 static const hci_hal_callbacks_t hal_callbacks;
    116 static const hci_inject_t *hci_inject;
    117 static const low_power_manager_t *low_power_manager;
    118 static const packet_fragmenter_t *packet_fragmenter;
    119 static const packet_fragmenter_callbacks_t packet_fragmenter_callbacks;
    120 static const vendor_t *vendor;
    121 
    122 static future_t *startup_future;
    123 static thread_t *thread; // We own this
    124 
    125 static volatile bool firmware_is_configured = false;
    126 static alarm_t *epilog_timer;
    127 static alarm_t *startup_timer;
    128 
    129 // Outbound-related
    130 static int command_credits = 1;
    131 static fixed_queue_t *command_queue;
    132 static fixed_queue_t *packet_queue;
    133 
    134 // Inbound-related
    135 static alarm_t *command_response_timer;
    136 static list_t *commands_pending_response;
    137 static pthread_mutex_t commands_pending_response_lock;
    138 static packet_receive_data_t incoming_packets[INBOUND_PACKET_TYPE_COUNT];
    139 
    140 // The hand-off point for data going to a higher layer, set by the higher layer
    141 static fixed_queue_t *upwards_data_queue;
    142 
    143 static future_t *shut_down();
    144 
    145 static void event_finish_startup(void *context);
    146 static void firmware_config_callback(bool success);
    147 static void startup_timer_expired(void *context);
    148 
    149 static void event_postload(void *context);
    150 static void sco_config_callback(bool success);
    151 
    152 static void event_epilog(void *context);
    153 static void epilog_finished_callback(bool success);
    154 static void epilog_timer_expired(void *context);
    155 
    156 static void event_command_ready(fixed_queue_t *queue, void *context);
    157 static void event_packet_ready(fixed_queue_t *queue, void *context);
    158 static void command_timed_out(void *context);
    159 
    160 static void hal_says_data_ready(serial_data_type_t type);
    161 static bool filter_incoming_event(BT_HDR *packet);
    162 
    163 static serial_data_type_t event_to_data_type(uint16_t event);
    164 static waiting_command_t *get_waiting_command(command_opcode_t opcode);
    165 static void update_command_response_timer(void);
    166 
    167 // Module lifecycle functions
    168 
    169 static future_t *start_up(void) {
    170   LOG_INFO(LOG_TAG, "%s", __func__);
    171 
    172   // The host is only allowed to send at most one command initially,
    173   // as per the Bluetooth spec, Volume 2, Part E, 4.4 (Command Flow Control)
    174   // This value can change when you get a command complete or command status event.
    175   command_credits = 1;
    176   firmware_is_configured = false;
    177 
    178   pthread_mutex_init(&commands_pending_response_lock, NULL);
    179 
    180   // TODO(armansito): cutils/properties.h is only being used to pull-in runtime
    181   // settings on Android. Remove this conditional include once we have a generic
    182   // way to obtain system properties. For now, always use the default timeout on
    183   // non-Android builds.
    184   period_ms_t startup_timeout_ms = DEFAULT_STARTUP_TIMEOUT_MS;
    185 
    186   // Grab the override startup timeout ms, if present.
    187   char timeout_prop[PROPERTY_VALUE_MAX];
    188   if (!osi_property_get("bluetooth.enable_timeout_ms", timeout_prop, STRING_VALUE_OF(DEFAULT_STARTUP_TIMEOUT_MS))
    189       || (startup_timeout_ms = atoi(timeout_prop)) < 100)
    190     startup_timeout_ms = DEFAULT_STARTUP_TIMEOUT_MS;
    191 
    192   startup_timer = alarm_new("hci.startup_timer");
    193   if (!startup_timer) {
    194     LOG_ERROR(LOG_TAG, "%s unable to create startup timer.", __func__);
    195     goto error;
    196   }
    197 
    198   epilog_timer = alarm_new("hci.epilog_timer");
    199   if (!epilog_timer) {
    200     LOG_ERROR(LOG_TAG, "%s unable to create epilog timer.", __func__);
    201     goto error;
    202   }
    203 
    204   command_response_timer = alarm_new("hci.command_response_timer");
    205   if (!command_response_timer) {
    206     LOG_ERROR(LOG_TAG, "%s unable to create command response timer.", __func__);
    207     goto error;
    208   }
    209 
    210   command_queue = fixed_queue_new(SIZE_MAX);
    211   if (!command_queue) {
    212     LOG_ERROR(LOG_TAG, "%s unable to create pending command queue.", __func__);
    213     goto error;
    214   }
    215 
    216   packet_queue = fixed_queue_new(SIZE_MAX);
    217   if (!packet_queue) {
    218     LOG_ERROR(LOG_TAG, "%s unable to create pending packet queue.", __func__);
    219     goto error;
    220   }
    221 
    222   thread = thread_new("hci_thread");
    223   if (!thread) {
    224     LOG_ERROR(LOG_TAG, "%s unable to create thread.", __func__);
    225     goto error;
    226   }
    227 
    228   commands_pending_response = list_new(NULL);
    229   if (!commands_pending_response) {
    230     LOG_ERROR(LOG_TAG, "%s unable to create list for commands pending response.", __func__);
    231     goto error;
    232   }
    233 
    234   memset(incoming_packets, 0, sizeof(incoming_packets));
    235 
    236   // Make sure we run in a bounded amount of time
    237   future_t *local_startup_future = future_new();
    238   startup_future = local_startup_future;
    239   alarm_set(startup_timer, startup_timeout_ms, startup_timer_expired, NULL);
    240 
    241   packet_fragmenter->init(&packet_fragmenter_callbacks);
    242 
    243   fixed_queue_register_dequeue(command_queue, thread_get_reactor(thread), event_command_ready, NULL);
    244   fixed_queue_register_dequeue(packet_queue, thread_get_reactor(thread), event_packet_ready, NULL);
    245 
    246   vendor->open(btif_local_bd_addr.address, &interface);
    247   hal->init(&hal_callbacks, thread);
    248   low_power_manager->init(thread);
    249 
    250   vendor->set_callback(VENDOR_CONFIGURE_FIRMWARE, firmware_config_callback);
    251   vendor->set_callback(VENDOR_CONFIGURE_SCO, sco_config_callback);
    252   vendor->set_callback(VENDOR_DO_EPILOG, epilog_finished_callback);
    253 
    254   if (!hci_inject->open(&interface)) {
    255     // TODO(sharvil): gracefully propagate failures from this layer.
    256   }
    257 
    258   int power_state = BT_VND_PWR_OFF;
    259 #if (defined (BT_CLEAN_TURN_ON_DISABLED) && BT_CLEAN_TURN_ON_DISABLED == TRUE)
    260   LOG_WARN(LOG_TAG, "%s not turning off the chip before turning on.", __func__);
    261   // So apparently this hack was needed in the past because a Wingray kernel driver
    262   // didn't handle power off commands in a powered off state correctly.
    263 
    264   // The comment in the old code said the workaround should be removed when the
    265   // problem was fixed. Sadly, I have no idea if said bug was fixed or if said
    266   // kernel is still in use, so we must leave this here for posterity. #sadpanda
    267 #else
    268   // cycle power on the chip to ensure it has been reset
    269   vendor->send_command(VENDOR_CHIP_POWER_CONTROL, &power_state);
    270 #endif
    271   power_state = BT_VND_PWR_ON;
    272   vendor->send_command(VENDOR_CHIP_POWER_CONTROL, &power_state);
    273 
    274   LOG_DEBUG(LOG_TAG, "%s starting async portion", __func__);
    275   thread_post(thread, event_finish_startup, NULL);
    276   return local_startup_future;
    277 
    278 error:
    279   shut_down(); // returns NULL so no need to wait for it
    280   return future_new_immediate(FUTURE_FAIL);
    281 }
    282 
    283 static future_t *shut_down() {
    284   LOG_INFO(LOG_TAG, "%s", __func__);
    285 
    286   hci_inject->close();
    287 
    288   if (thread) {
    289     if (firmware_is_configured) {
    290       alarm_set(epilog_timer, EPILOG_TIMEOUT_MS, epilog_timer_expired, NULL);
    291       thread_post(thread, event_epilog, NULL);
    292     } else {
    293       thread_stop(thread);
    294     }
    295 
    296     thread_join(thread);
    297   }
    298 
    299   fixed_queue_free(command_queue, osi_free);
    300   command_queue = NULL;
    301   fixed_queue_free(packet_queue, buffer_allocator->free);
    302   packet_queue = NULL;
    303   list_free(commands_pending_response);
    304   commands_pending_response = NULL;
    305 
    306   pthread_mutex_destroy(&commands_pending_response_lock);
    307 
    308   packet_fragmenter->cleanup();
    309 
    310   // Free the timers
    311   alarm_free(epilog_timer);
    312   epilog_timer = NULL;
    313   alarm_free(command_response_timer);
    314   command_response_timer = NULL;
    315   alarm_free(startup_timer);
    316   startup_timer = NULL;
    317 
    318   low_power_manager->cleanup();
    319   hal->close();
    320 
    321   // Turn off the chip
    322   int power_state = BT_VND_PWR_OFF;
    323   vendor->send_command(VENDOR_CHIP_POWER_CONTROL, &power_state);
    324   vendor->close();
    325 
    326   thread_free(thread);
    327   thread = NULL;
    328   firmware_is_configured = false;
    329 
    330   return NULL;
    331 }
    332 
    333 EXPORT_SYMBOL const module_t hci_module = {
    334   .name = HCI_MODULE,
    335   .init = NULL,
    336   .start_up = start_up,
    337   .shut_down = shut_down,
    338   .clean_up = NULL,
    339   .dependencies = {
    340     BTSNOOP_MODULE,
    341     NULL
    342   }
    343 };
    344 
    345 // Interface functions
    346 
    347 static void do_postload() {
    348   LOG_DEBUG(LOG_TAG, "%s posting postload work item", __func__);
    349   thread_post(thread, event_postload, NULL);
    350 }
    351 
    352 static void set_data_queue(fixed_queue_t *queue) {
    353   upwards_data_queue = queue;
    354 }
    355 
    356 static void transmit_command(
    357     BT_HDR *command,
    358     command_complete_cb complete_callback,
    359     command_status_cb status_callback,
    360     void *context) {
    361   waiting_command_t *wait_entry = osi_calloc(sizeof(waiting_command_t));
    362 
    363   uint8_t *stream = command->data + command->offset;
    364   STREAM_TO_UINT16(wait_entry->opcode, stream);
    365   wait_entry->complete_callback = complete_callback;
    366   wait_entry->status_callback = status_callback;
    367   wait_entry->command = command;
    368   wait_entry->context = context;
    369 
    370   // Store the command message type in the event field
    371   // in case the upper layer didn't already
    372   command->event = MSG_STACK_TO_HC_HCI_CMD;
    373 
    374   fixed_queue_enqueue(command_queue, wait_entry);
    375 }
    376 
    377 static future_t *transmit_command_futured(BT_HDR *command) {
    378   waiting_command_t *wait_entry = osi_calloc(sizeof(waiting_command_t));
    379   future_t *future = future_new();
    380 
    381   uint8_t *stream = command->data + command->offset;
    382   STREAM_TO_UINT16(wait_entry->opcode, stream);
    383   wait_entry->complete_future = future;
    384   wait_entry->command = command;
    385 
    386   // Store the command message type in the event field
    387   // in case the upper layer didn't already
    388   command->event = MSG_STACK_TO_HC_HCI_CMD;
    389 
    390   fixed_queue_enqueue(command_queue, wait_entry);
    391   return future;
    392 }
    393 
    394 static void transmit_downward(data_dispatcher_type_t type, void *data) {
    395   if (type == MSG_STACK_TO_HC_HCI_CMD) {
    396     // TODO(zachoverflow): eliminate this call
    397     transmit_command((BT_HDR *)data, NULL, NULL, NULL);
    398     LOG_WARN(LOG_TAG, "%s legacy transmit of command. Use transmit_command instead.", __func__);
    399   } else {
    400     fixed_queue_enqueue(packet_queue, data);
    401   }
    402 }
    403 
    404 // Start up functions
    405 
    406 static void event_finish_startup(UNUSED_ATTR void *context) {
    407   LOG_INFO(LOG_TAG, "%s", __func__);
    408   hal->open();
    409   vendor->send_async_command(VENDOR_CONFIGURE_FIRMWARE, NULL);
    410 }
    411 
    412 static void firmware_config_callback(UNUSED_ATTR bool success) {
    413   LOG_INFO(LOG_TAG, "%s", __func__);
    414 
    415   alarm_cancel(startup_timer);
    416 
    417   pthread_mutex_lock(&commands_pending_response_lock);
    418 
    419   if (startup_future == NULL) {
    420     // The firmware configuration took too long - ignore the callback
    421     pthread_mutex_unlock(&commands_pending_response_lock);
    422     return;
    423   }
    424 
    425   firmware_is_configured = true;
    426   future_ready(startup_future, FUTURE_SUCCESS);
    427   startup_future = NULL;
    428 
    429   pthread_mutex_unlock(&commands_pending_response_lock);
    430 }
    431 
    432 static void startup_timer_expired(UNUSED_ATTR void *context) {
    433   LOG_ERROR(LOG_TAG, "%s", __func__);
    434 
    435   pthread_mutex_lock(&commands_pending_response_lock);
    436   future_ready(startup_future, FUTURE_FAIL);
    437   startup_future = NULL;
    438   pthread_mutex_unlock(&commands_pending_response_lock);
    439 }
    440 
    441 // Postload functions
    442 
    443 static void event_postload(UNUSED_ATTR void *context) {
    444   LOG_INFO(LOG_TAG, "%s", __func__);
    445   if(vendor->send_async_command(VENDOR_CONFIGURE_SCO, NULL) == -1) {
    446     // If couldn't configure sco, we won't get the sco configuration callback
    447     // so go pretend to do it now
    448     sco_config_callback(false);
    449 
    450   }
    451 }
    452 
    453 static void sco_config_callback(UNUSED_ATTR bool success) {
    454   LOG_INFO(LOG_TAG, "%s postload finished.", __func__);
    455 }
    456 
    457 // Epilog functions
    458 
    459 static void event_epilog(UNUSED_ATTR void *context) {
    460   vendor->send_async_command(VENDOR_DO_EPILOG, NULL);
    461 }
    462 
    463 static void epilog_finished_callback(UNUSED_ATTR bool success) {
    464   LOG_INFO(LOG_TAG, "%s", __func__);
    465   alarm_cancel(epilog_timer);
    466   thread_stop(thread);
    467 }
    468 
    469 static void epilog_timer_expired(UNUSED_ATTR void *context) {
    470   LOG_INFO(LOG_TAG, "%s", __func__);
    471   thread_stop(thread);
    472 }
    473 
    474 // Command/packet transmitting functions
    475 
    476 static void event_command_ready(fixed_queue_t *queue, UNUSED_ATTR void *context) {
    477   if (command_credits > 0) {
    478     waiting_command_t *wait_entry = fixed_queue_dequeue(queue);
    479     command_credits--;
    480 
    481     // Move it to the list of commands awaiting response
    482     pthread_mutex_lock(&commands_pending_response_lock);
    483     list_append(commands_pending_response, wait_entry);
    484     pthread_mutex_unlock(&commands_pending_response_lock);
    485 
    486     // Send it off
    487     low_power_manager->wake_assert();
    488     packet_fragmenter->fragment_and_dispatch(wait_entry->command);
    489     low_power_manager->transmit_done();
    490 
    491     update_command_response_timer();
    492   }
    493 }
    494 
    495 static void event_packet_ready(fixed_queue_t *queue, UNUSED_ATTR void *context) {
    496   // The queue may be the command queue or the packet queue, we don't care
    497   BT_HDR *packet = (BT_HDR *)fixed_queue_dequeue(queue);
    498 
    499   low_power_manager->wake_assert();
    500   packet_fragmenter->fragment_and_dispatch(packet);
    501   low_power_manager->transmit_done();
    502 }
    503 
    504 // Callback for the fragmenter to send a fragment
    505 static void transmit_fragment(BT_HDR *packet, bool send_transmit_finished) {
    506   uint16_t event = packet->event & MSG_EVT_MASK;
    507   serial_data_type_t type = event_to_data_type(event);
    508 
    509   btsnoop->capture(packet, false);
    510   hal->transmit_data(type, packet->data + packet->offset, packet->len);
    511 
    512   if (event != MSG_STACK_TO_HC_HCI_CMD && send_transmit_finished)
    513     buffer_allocator->free(packet);
    514 }
    515 
    516 static void fragmenter_transmit_finished(BT_HDR *packet, bool all_fragments_sent) {
    517   if (all_fragments_sent) {
    518     buffer_allocator->free(packet);
    519   } else {
    520     // This is kind of a weird case, since we're dispatching a partially sent packet
    521     // up to a higher layer.
    522     // TODO(zachoverflow): rework upper layer so this isn't necessary.
    523     data_dispatcher_dispatch(interface.event_dispatcher, packet->event & MSG_EVT_MASK, packet);
    524   }
    525 }
    526 
    527 static void command_timed_out(UNUSED_ATTR void *context) {
    528   pthread_mutex_lock(&commands_pending_response_lock);
    529 
    530   if (list_is_empty(commands_pending_response)) {
    531     LOG_ERROR(LOG_TAG, "%s with no commands pending response", __func__);
    532   } else {
    533     waiting_command_t *wait_entry = list_front(commands_pending_response);
    534     pthread_mutex_unlock(&commands_pending_response_lock);
    535 
    536     // We shouldn't try to recover the stack from this command timeout.
    537     // If it's caused by a software bug, fix it. If it's a hardware bug, fix it.
    538     LOG_ERROR(LOG_TAG, "%s hci layer timeout waiting for response to a command. opcode: 0x%x", __func__, wait_entry->opcode);
    539     LOG_EVENT_INT(BT_HCI_TIMEOUT_TAG_NUM, wait_entry->opcode);
    540   }
    541 
    542   LOG_ERROR(LOG_TAG, "%s restarting the bluetooth process.", __func__);
    543   usleep(10000);
    544   kill(getpid(), SIGKILL);
    545 }
    546 
    547 // Event/packet receiving functions
    548 
    549 // This function is not required to read all of a packet in one go, so
    550 // be wary of reentry. But this function must return after finishing a packet.
    551 static void hal_says_data_ready(serial_data_type_t type) {
    552   packet_receive_data_t *incoming = &incoming_packets[PACKET_TYPE_TO_INBOUND_INDEX(type)];
    553 
    554   uint8_t byte;
    555   while (hal->read_data(type, &byte, 1) != 0) {
    556     switch (incoming->state) {
    557       case BRAND_NEW:
    558         // Initialize and prepare to jump to the preamble reading state
    559         incoming->bytes_remaining = preamble_sizes[PACKET_TYPE_TO_INDEX(type)];
    560         memset(incoming->preamble, 0, PREAMBLE_BUFFER_SIZE);
    561         incoming->index = 0;
    562         incoming->state = PREAMBLE;
    563         // INTENTIONAL FALLTHROUGH
    564       case PREAMBLE:
    565         incoming->preamble[incoming->index] = byte;
    566         incoming->index++;
    567         incoming->bytes_remaining--;
    568 
    569         if (incoming->bytes_remaining == 0) {
    570           // For event and sco preambles, the last byte we read is the length
    571           incoming->bytes_remaining = (type == DATA_TYPE_ACL) ? RETRIEVE_ACL_LENGTH(incoming->preamble) : byte;
    572 
    573           size_t buffer_size = BT_HDR_SIZE + incoming->index + incoming->bytes_remaining;
    574           incoming->buffer = (BT_HDR *)buffer_allocator->alloc(buffer_size);
    575 
    576           if (!incoming->buffer) {
    577             LOG_ERROR(LOG_TAG, "%s error getting buffer for incoming packet of type %d and size %zd", __func__, type, buffer_size);
    578             // Can't read any more of this current packet, so jump out
    579             incoming->state = incoming->bytes_remaining == 0 ? BRAND_NEW : IGNORE;
    580             break;
    581           }
    582 
    583           // Initialize the buffer
    584           incoming->buffer->offset = 0;
    585           incoming->buffer->layer_specific = 0;
    586           incoming->buffer->event = outbound_event_types[PACKET_TYPE_TO_INDEX(type)];
    587           memcpy(incoming->buffer->data, incoming->preamble, incoming->index);
    588 
    589           incoming->state = incoming->bytes_remaining > 0 ? BODY : FINISHED;
    590         }
    591 
    592         break;
    593       case BODY:
    594         incoming->buffer->data[incoming->index] = byte;
    595         incoming->index++;
    596         incoming->bytes_remaining--;
    597 
    598         size_t bytes_read = hal->read_data(type, (incoming->buffer->data + incoming->index), incoming->bytes_remaining);
    599         incoming->index += bytes_read;
    600         incoming->bytes_remaining -= bytes_read;
    601 
    602         incoming->state = incoming->bytes_remaining == 0 ? FINISHED : incoming->state;
    603         break;
    604       case IGNORE:
    605         incoming->bytes_remaining--;
    606         if (incoming->bytes_remaining == 0) {
    607           incoming->state = BRAND_NEW;
    608           // Don't forget to let the hal know we finished the packet we were ignoring.
    609           // Otherwise we'll get out of sync with hals that embed extra information
    610           // in the uart stream (like H4). #badnewsbears
    611           hal->packet_finished(type);
    612           return;
    613         }
    614 
    615         break;
    616       case FINISHED:
    617         LOG_ERROR(LOG_TAG, "%s the state machine should not have been left in the finished state.", __func__);
    618         break;
    619     }
    620 
    621     if (incoming->state == FINISHED) {
    622       incoming->buffer->len = incoming->index;
    623       btsnoop->capture(incoming->buffer, true);
    624 
    625       if (type != DATA_TYPE_EVENT) {
    626         packet_fragmenter->reassemble_and_dispatch(incoming->buffer);
    627       } else if (!filter_incoming_event(incoming->buffer)) {
    628         // Dispatch the event by event code
    629         uint8_t *stream = incoming->buffer->data;
    630         uint8_t event_code;
    631         STREAM_TO_UINT8(event_code, stream);
    632 
    633         data_dispatcher_dispatch(
    634           interface.event_dispatcher,
    635           event_code,
    636           incoming->buffer
    637         );
    638       }
    639 
    640       // We don't control the buffer anymore
    641       incoming->buffer = NULL;
    642       incoming->state = BRAND_NEW;
    643       hal->packet_finished(type);
    644 
    645       // We return after a packet is finished for two reasons:
    646       // 1. The type of the next packet could be different.
    647       // 2. We don't want to hog cpu time.
    648       return;
    649     }
    650   }
    651 }
    652 
    653 // Returns true if the event was intercepted and should not proceed to
    654 // higher layers. Also inspects an incoming event for interesting
    655 // information, like how many commands are now able to be sent.
    656 static bool filter_incoming_event(BT_HDR *packet) {
    657   waiting_command_t *wait_entry = NULL;
    658   uint8_t *stream = packet->data;
    659   uint8_t event_code;
    660   command_opcode_t opcode;
    661 
    662   STREAM_TO_UINT8(event_code, stream);
    663   STREAM_SKIP_UINT8(stream); // Skip the parameter total length field
    664 
    665   if (event_code == HCI_COMMAND_COMPLETE_EVT) {
    666     STREAM_TO_UINT8(command_credits, stream);
    667     STREAM_TO_UINT16(opcode, stream);
    668 
    669     wait_entry = get_waiting_command(opcode);
    670     if (!wait_entry) {
    671       // TODO: Currently command_credits aren't parsed at all; here or in higher layers...
    672       if (opcode != HCI_COMMAND_NONE) {
    673         LOG_WARN(LOG_TAG, "%s command complete event with no matching command (opcode: 0x%04x).",
    674             __func__, opcode);
    675       }
    676     } else if (wait_entry->complete_callback) {
    677       wait_entry->complete_callback(packet, wait_entry->context);
    678     } else if (wait_entry->complete_future) {
    679       future_ready(wait_entry->complete_future, packet);
    680     }
    681 
    682     goto intercepted;
    683   } else if (event_code == HCI_COMMAND_STATUS_EVT) {
    684     uint8_t status;
    685     STREAM_TO_UINT8(status, stream);
    686     STREAM_TO_UINT8(command_credits, stream);
    687     STREAM_TO_UINT16(opcode, stream);
    688 
    689     // If a command generates a command status event, it won't be getting a command complete event
    690 
    691     wait_entry = get_waiting_command(opcode);
    692     if (!wait_entry)
    693       LOG_WARN(LOG_TAG, "%s command status event with no matching command. opcode: 0x%x", __func__, opcode);
    694     else if (wait_entry->status_callback)
    695       wait_entry->status_callback(status, wait_entry->command, wait_entry->context);
    696 
    697     goto intercepted;
    698   }
    699 
    700   return false;
    701 
    702 intercepted:
    703   update_command_response_timer();
    704 
    705   if (wait_entry) {
    706     // If it has a callback, it's responsible for freeing the packet
    707     if (event_code == HCI_COMMAND_STATUS_EVT || (!wait_entry->complete_callback && !wait_entry->complete_future))
    708       buffer_allocator->free(packet);
    709 
    710     // If it has a callback, it's responsible for freeing the command
    711     if (event_code == HCI_COMMAND_COMPLETE_EVT || !wait_entry->status_callback)
    712       buffer_allocator->free(wait_entry->command);
    713 
    714     osi_free(wait_entry);
    715   } else {
    716     buffer_allocator->free(packet);
    717   }
    718 
    719   return true;
    720 }
    721 
    722 // Callback for the fragmenter to dispatch up a completely reassembled packet
    723 static void dispatch_reassembled(BT_HDR *packet) {
    724   // Events should already have been dispatched before this point
    725   assert((packet->event & MSG_EVT_MASK) != MSG_HC_TO_STACK_HCI_EVT);
    726   assert(upwards_data_queue != NULL);
    727 
    728   if (upwards_data_queue) {
    729     fixed_queue_enqueue(upwards_data_queue, packet);
    730   } else {
    731     LOG_ERROR(LOG_TAG, "%s had no queue to place upwards data packet in. Dropping it on the floor.", __func__);
    732     buffer_allocator->free(packet);
    733   }
    734 }
    735 
    736 // Misc internal functions
    737 
    738 // TODO(zachoverflow): we seem to do this a couple places, like the HCI inject module. #centralize
    739 static serial_data_type_t event_to_data_type(uint16_t event) {
    740   if (event == MSG_STACK_TO_HC_HCI_ACL)
    741     return DATA_TYPE_ACL;
    742   else if (event == MSG_STACK_TO_HC_HCI_SCO)
    743     return DATA_TYPE_SCO;
    744   else if (event == MSG_STACK_TO_HC_HCI_CMD)
    745     return DATA_TYPE_COMMAND;
    746   else
    747     LOG_ERROR(LOG_TAG, "%s invalid event type, could not translate 0x%x", __func__, event);
    748 
    749   return 0;
    750 }
    751 
    752 static waiting_command_t *get_waiting_command(command_opcode_t opcode) {
    753   pthread_mutex_lock(&commands_pending_response_lock);
    754 
    755   for (const list_node_t *node = list_begin(commands_pending_response);
    756       node != list_end(commands_pending_response);
    757       node = list_next(node)) {
    758     waiting_command_t *wait_entry = list_node(node);
    759 
    760     if (!wait_entry || wait_entry->opcode != opcode)
    761       continue;
    762 
    763     list_remove(commands_pending_response, wait_entry);
    764 
    765     pthread_mutex_unlock(&commands_pending_response_lock);
    766     return wait_entry;
    767   }
    768 
    769   pthread_mutex_unlock(&commands_pending_response_lock);
    770   return NULL;
    771 }
    772 
    773 static void update_command_response_timer(void) {
    774   if (list_is_empty(commands_pending_response)) {
    775     alarm_cancel(command_response_timer);
    776   } else {
    777     alarm_set(command_response_timer, COMMAND_PENDING_TIMEOUT_MS,
    778               command_timed_out, NULL);
    779   }
    780 }
    781 
    782 static void init_layer_interface() {
    783   if (!interface_created) {
    784     interface.send_low_power_command = low_power_manager->post_command;
    785     interface.do_postload = do_postload;
    786 
    787     // It's probably ok for this to live forever. It's small and
    788     // there's only one instance of the hci interface.
    789     interface.event_dispatcher = data_dispatcher_new("hci_layer");
    790     if (!interface.event_dispatcher) {
    791       LOG_ERROR(LOG_TAG, "%s could not create upward dispatcher.", __func__);
    792       return;
    793     }
    794 
    795     interface.set_data_queue = set_data_queue;
    796     interface.transmit_command = transmit_command;
    797     interface.transmit_command_futured = transmit_command_futured;
    798     interface.transmit_downward = transmit_downward;
    799     interface_created = true;
    800   }
    801 }
    802 
    803 void hci_layer_cleanup_interface() {
    804   if (interface_created) {
    805     interface.send_low_power_command = NULL;
    806     interface.do_postload = NULL;
    807 
    808     data_dispatcher_free(interface.event_dispatcher);
    809     interface.event_dispatcher = NULL;
    810 
    811     interface.set_data_queue = NULL;
    812     interface.transmit_command = NULL;
    813     interface.transmit_command_futured = NULL;
    814     interface.transmit_downward = NULL;
    815     interface_created = false;
    816   }
    817 }
    818 
    819 static const hci_hal_callbacks_t hal_callbacks = {
    820   hal_says_data_ready
    821 };
    822 
    823 static const packet_fragmenter_callbacks_t packet_fragmenter_callbacks = {
    824   transmit_fragment,
    825   dispatch_reassembled,
    826   fragmenter_transmit_finished
    827 };
    828 
    829 const hci_t *hci_layer_get_interface() {
    830   buffer_allocator = buffer_allocator_get_interface();
    831   hal = hci_hal_get_interface();
    832   btsnoop = btsnoop_get_interface();
    833   hci_inject = hci_inject_get_interface();
    834   packet_fragmenter = packet_fragmenter_get_interface();
    835   vendor = vendor_get_interface();
    836   low_power_manager = low_power_manager_get_interface();
    837 
    838   init_layer_interface();
    839   return &interface;
    840 }
    841 
    842 const hci_t *hci_layer_get_test_interface(
    843     const allocator_t *buffer_allocator_interface,
    844     const hci_hal_t *hal_interface,
    845     const btsnoop_t *btsnoop_interface,
    846     const hci_inject_t *hci_inject_interface,
    847     const packet_fragmenter_t *packet_fragmenter_interface,
    848     const vendor_t *vendor_interface,
    849     const low_power_manager_t *low_power_manager_interface) {
    850 
    851   buffer_allocator = buffer_allocator_interface;
    852   hal = hal_interface;
    853   btsnoop = btsnoop_interface;
    854   hci_inject = hci_inject_interface;
    855   packet_fragmenter = packet_fragmenter_interface;
    856   vendor = vendor_interface;
    857   low_power_manager = low_power_manager_interface;
    858 
    859   init_layer_interface();
    860   return &interface;
    861 }
    862