Commit 27ec0c78 authored by Pavlin Radoslavov's avatar Pavlin Radoslavov
Browse files

Add BT_HCI_UNKNOWN_MESSAGE_TYPE log event

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
parent c8bd6de5
......@@ -35,3 +35,4 @@
1010000 bt_hci_timeout (opcode|1)
1010001 bt_config_source (opcode|1)
1010002 bt_hci_unknown_type (hci_type|1)
......@@ -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;
......@@ -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;
}
......
......@@ -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);
}
}
......@@ -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);
......@@ -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);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment