Skip to content

Commit

Permalink
Add BT_HCI_UNKNOWN_MESSAGE_TYPE log event
Browse files Browse the repository at this point in the history
If the received HCI type is unknown, then log an event and abort.
The most likely reason for that to happen is if the UART stream
is corrupted. We cannot recover from that, and there is not much
else we can do.

Also, fixed a bug in an HCI-related unit test that was exposed
by the above change.

Bug: 31432127
Change-Id: Ia888c485f177af4962268bf8f593b27fd7a4b080
  • Loading branch information
Pavlin Radoslavov committed Sep 15, 2016
1 parent b818e38 commit 6760eb8
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 12 deletions.
1 change: 1 addition & 0 deletions EventLogTags.logtags
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,4 @@

1010000 bt_hci_timeout (opcode|1)
1010001 bt_config_source (opcode|1)
1010002 bt_hci_unknown_type (hci_type|1)
7 changes: 6 additions & 1 deletion system/hci/src/hci_hal_h4.c
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@
// when streaming time sensitive data (A2DP).
#define HCI_THREAD_PRIORITY (-19)

#define BT_HCI_UNKNOWN_MESSAGE_TYPE_NUM 1010002

// Our interface and modules we import
static const hci_hal_t interface;
static const hci_hal_callbacks_t *callbacks;
Expand Down Expand Up @@ -235,7 +237,10 @@ static void event_uart_has_bytes(eager_reader_t *reader, UNUSED_ATTR void *conte
return;

if (type_byte < DATA_TYPE_ACL || type_byte > DATA_TYPE_EVENT) {
LOG_ERROR(LOG_TAG, "%s Unknown HCI message type. Dropping this byte 0x%x, min %x, max %x", __func__, type_byte, DATA_TYPE_ACL, DATA_TYPE_EVENT);
LOG_ERROR(LOG_TAG, "%s Unknown HCI message type 0x%x (min=0x%x max=0x%x). Aborting...",
__func__, type_byte, DATA_TYPE_ACL, DATA_TYPE_EVENT);
LOG_EVENT_INT(BT_HCI_UNKNOWN_MESSAGE_TYPE_NUM, type_byte);
assert(false && "Unknown HCI message type");
return;
}

Expand Down
25 changes: 14 additions & 11 deletions system/hci/test/hci_hal_h4_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -192,17 +192,18 @@ static void expect_socket_data(int fd, char first_byte, char *data) {
}
}

static void write_packet(int fd, char first_byte, char *data) {
static void write_packet(int fd, char first_byte, const void *data,
size_t datalen) {
write(fd, &first_byte, 1);
write(fd, data, strlen(data));
write(fd, data, datalen);
}

static void write_packet_reentry(int fd, char first_byte, char *data) {
static void write_packet_reentry(int fd, char first_byte, const void *data,
size_t datalen) {
write(fd, &first_byte, 1);

int length = strlen(data);
for (int i = 0; i < length; i++) {
write(fd, &data[i], 1);
for (size_t i = 0; i < datalen; i++) {
write(fd, static_cast<const uint8_t *>(data) + i, 1);
semaphore_wait(reentry_semaphore);
}
}
Expand All @@ -226,10 +227,11 @@ TEST_F(HciHalH4Test, test_transmit) {
TEST_F(HciHalH4Test, test_read_synchronous) {
reset_for(read_synchronous);

write_packet(sockfd[1], DATA_TYPE_ACL, acl_data);
write_packet(sockfd[1], HCI_BLE_EVENT, corrupted_data);
write_packet(sockfd[1], DATA_TYPE_SCO, sco_data);
write_packet(sockfd[1], DATA_TYPE_EVENT, event_data);
write_packet(sockfd[1], DATA_TYPE_ACL, acl_data, strlen(acl_data));
write_packet(sockfd[1], HCI_BLE_EVENT, corrupted_data,
sizeof(corrupted_data));
write_packet(sockfd[1], DATA_TYPE_SCO, sco_data, strlen(sco_data));
write_packet(sockfd[1], DATA_TYPE_EVENT, event_data, strlen(event_data));

// Wait for all data to be received before calling the test good
semaphore_wait(done);
Expand All @@ -242,7 +244,8 @@ TEST_F(HciHalH4Test, test_read_async_reentry) {
reentry_semaphore = semaphore_new(0);
reentry_i = 0;

write_packet_reentry(sockfd[1], DATA_TYPE_ACL, sample_data3);
write_packet_reentry(sockfd[1], DATA_TYPE_ACL, sample_data3,
strlen(sample_data3));

// write_packet_reentry ensures the data has been received
semaphore_free(reentry_semaphore);
Expand Down

0 comments on commit 6760eb8

Please sign in to comment.