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

Commit 389e9aa7 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "Bluetooth HAL: fix ISO handling for H4 protocol"

parents 6be52d5b db779b41
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -90,6 +90,7 @@ void H4Protocol::OnDataReady(int fd) {
    hci_packet_type_ = static_cast<HciPacketType>(buffer[0]);
    hci_packet_type_ = static_cast<HciPacketType>(buffer[0]);
    if (hci_packet_type_ != HCI_PACKET_TYPE_ACL_DATA &&
    if (hci_packet_type_ != HCI_PACKET_TYPE_ACL_DATA &&
        hci_packet_type_ != HCI_PACKET_TYPE_SCO_DATA &&
        hci_packet_type_ != HCI_PACKET_TYPE_SCO_DATA &&
        hci_packet_type_ != HCI_PACKET_TYPE_ISO_DATA &&
        hci_packet_type_ != HCI_PACKET_TYPE_EVENT) {
        hci_packet_type_ != HCI_PACKET_TYPE_EVENT) {
      LOG_ALWAYS_FATAL("%s: Unimplemented packet type %d", __func__,
      LOG_ALWAYS_FATAL("%s: Unimplemented packet type %d", __func__,
                       static_cast<int>(hci_packet_type_));
                       static_cast<int>(hci_packet_type_));
+4 −0
Original line number Original line 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_EVENT_PREAMBLE_SIZE = 2;
const size_t HCI_LENGTH_OFFSET_EVT = 1;
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;
const size_t HCI_PREAMBLE_SIZE_MAX = HCI_ACL_PREAMBLE_SIZE;


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


namespace {
namespace {


const size_t preamble_size_for_type[] = {
const size_t preamble_size_for_type[] = {0,
    0, HCI_COMMAND_PREAMBLE_SIZE, HCI_ACL_PREAMBLE_SIZE, HCI_SCO_PREAMBLE_SIZE,
                                         HCI_COMMAND_PREAMBLE_SIZE,
    HCI_EVENT_PREAMBLE_SIZE};
                                         HCI_ACL_PREAMBLE_SIZE,
const size_t packet_length_offset_for_type[] = {
                                         HCI_SCO_PREAMBLE_SIZE,
    0, HCI_LENGTH_OFFSET_CMD, HCI_LENGTH_OFFSET_ACL, HCI_LENGTH_OFFSET_SCO,
                                         HCI_EVENT_PREAMBLE_SIZE,
    HCI_LENGTH_OFFSET_EVT};
                                         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 HciGetPacketLengthForType(HciPacketType type, const uint8_t* preamble) {
  size_t offset = packet_length_offset_for_type[type];
  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]);
    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
}  // namespace
+4 −2
Original line number Original line Diff line number Diff line
@@ -190,8 +190,10 @@ class H4ProtocolTest : public ::testing::Test {


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


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