Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit db779b41 authored by Jakub Pawlowski's avatar Jakub Pawlowski
Browse files

Bluetooth HAL: fix ISO handling for H4 protocol

Bug: 150670922
Test: run H4ProtocolTest.TestReads
Change-Id: Ib051550da1c99a3b682d149cd6c88cce294dbc9c
parent 7bfe3131
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -90,6 +90,7 @@ void H4Protocol::OnDataReady(int fd) {
    hci_packet_type_ = static_cast<HciPacketType>(buffer[0]);
    if (hci_packet_type_ != HCI_PACKET_TYPE_ACL_DATA &&
        hci_packet_type_ != HCI_PACKET_TYPE_SCO_DATA &&
        hci_packet_type_ != HCI_PACKET_TYPE_ISO_DATA &&
        hci_packet_type_ != HCI_PACKET_TYPE_EVENT) {
      LOG_ALWAYS_FATAL("%s: Unimplemented packet type %d", __func__,
                       static_cast<int>(hci_packet_type_));
+4 −0
Original line number Diff line number Diff line
@@ -44,6 +44,10 @@ const size_t HCI_LENGTH_OFFSET_SCO = 2;
const size_t HCI_EVENT_PREAMBLE_SIZE = 2;
const size_t HCI_LENGTH_OFFSET_EVT = 1;

// 2 bytes for handle and flags, 2 byte for data length (Volume 4, Part E, 5.4.5)
const size_t HCI_ISO_PREAMBLE_SIZE = 4;
const size_t HCI_LENGTH_OFFSET_ISO = 2;

const size_t HCI_PREAMBLE_SIZE_MAX = HCI_ACL_PREAMBLE_SIZE;

// Event codes (Volume 2, Part E, 7.7.14)
+18 −8
Original line number Diff line number Diff line
@@ -26,17 +26,27 @@

namespace {

const size_t preamble_size_for_type[] = {
    0, HCI_COMMAND_PREAMBLE_SIZE, HCI_ACL_PREAMBLE_SIZE, HCI_SCO_PREAMBLE_SIZE,
    HCI_EVENT_PREAMBLE_SIZE};
const size_t packet_length_offset_for_type[] = {
    0, HCI_LENGTH_OFFSET_CMD, HCI_LENGTH_OFFSET_ACL, HCI_LENGTH_OFFSET_SCO,
    HCI_LENGTH_OFFSET_EVT};
const size_t preamble_size_for_type[] = {0,
                                         HCI_COMMAND_PREAMBLE_SIZE,
                                         HCI_ACL_PREAMBLE_SIZE,
                                         HCI_SCO_PREAMBLE_SIZE,
                                         HCI_EVENT_PREAMBLE_SIZE,
                                         HCI_ISO_PREAMBLE_SIZE};
const size_t packet_length_offset_for_type[] = {0,
                                                HCI_LENGTH_OFFSET_CMD,
                                                HCI_LENGTH_OFFSET_ACL,
                                                HCI_LENGTH_OFFSET_SCO,
                                                HCI_LENGTH_OFFSET_EVT,
                                                HCI_LENGTH_OFFSET_ISO};

size_t HciGetPacketLengthForType(HciPacketType type, const uint8_t* preamble) {
  size_t offset = packet_length_offset_for_type[type];
  if (type != HCI_PACKET_TYPE_ACL_DATA) return preamble[offset];
  if (type == HCI_PACKET_TYPE_ACL_DATA) {
    return (((preamble[offset + 1]) << 8) | preamble[offset]);
  } else if (type == HCI_PACKET_TYPE_ISO_DATA) {
    return ((((preamble[offset + 1]) & 0x3f) << 8) | preamble[offset]);
  }
  return preamble[offset];
}

}  // namespace
+4 −2
Original line number Diff line number Diff line
@@ -190,8 +190,10 @@ class H4ProtocolTest : public ::testing::Test {

  void WriteAndExpectInboundIsoData(char* payload) {
    // h4 type[1] + handle[2] + size[1]
    char preamble[4] = {HCI_PACKET_TYPE_ISO_DATA, 20, 17, 0};
    preamble[3] = strlen(payload) & 0xFF;
    char preamble[5] = {HCI_PACKET_TYPE_ISO_DATA, 19, 92, 0, 0};
    int length = strlen(payload);
    preamble[3] = length & 0xFF;
    preamble[4] = (length >> 8) & 0x3F;

    ALOGD("%s writing", __func__);
    TEMP_FAILURE_RETRY(write(fake_uart_, preamble, sizeof(preamble)));