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

Commit 6153f329 authored by Myles Watson's avatar Myles Watson
Browse files

RootCanal: Add ISO to H4 packetizer

Tag: #feature
Test: cert/run --host
Bug: 163818400
Change-Id: Ib818aa7cc17346b68d6d5ec895cd260e3b6537da
parent 3fe30d25
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ enum class PacketType : uint8_t {
  ACL = 2,
  SCO = 3,
  EVENT = 4,
  ISO = 5,
};

}  // namespace hci
+16 −9
Original line number Diff line number Diff line
@@ -29,12 +29,14 @@ namespace test_vendor_lib {
namespace hci {
size_t HciGetPacketLengthForType(hci::PacketType type,
                                 const uint8_t* preamble) {
  static const size_t packet_length_offset[static_cast<size_t>(hci::PacketType::EVENT) + 1] = {
  static const size_t
      packet_length_offset[static_cast<size_t>(hci::PacketType::ISO) + 1] = {
          0,
          H4Packetizer::COMMAND_LENGTH_OFFSET,
          H4Packetizer::ACL_LENGTH_OFFSET,
          H4Packetizer::SCO_LENGTH_OFFSET,
          H4Packetizer::EVENT_LENGTH_OFFSET,
          H4Packetizer::ISO_LENGTH_OFFSET,
      };

  size_t offset = packet_length_offset[static_cast<size_t>(type)];
@@ -42,6 +44,9 @@ size_t HciGetPacketLengthForType(hci::PacketType type,
  if (type == hci::PacketType::ACL) {
    size |= ((size_t)preamble[offset + 1]) << 8u;
  }
  if (type == hci::PacketType::ISO) {
    size |= ((size_t)preamble[offset + 1] & 0x0fu) << 8u;
  }
  return size;
}

@@ -100,12 +105,13 @@ void H4Packetizer::OnDataReady(int fd) {
  uint8_t* buffer_pointer = nullptr;

  static const size_t
      preamble_size[static_cast<size_t>(hci::PacketType::EVENT) + 1] = {
      preamble_size[static_cast<size_t>(hci::PacketType::ISO) + 1] = {
          0,
          H4Packetizer::COMMAND_PREAMBLE_SIZE,
          H4Packetizer::ACL_PREAMBLE_SIZE,
          H4Packetizer::SCO_PREAMBLE_SIZE,
          H4Packetizer::EVENT_PREAMBLE_SIZE,
          H4Packetizer::ISO_PREAMBLE_SIZE,
      };
  switch (state_) {
    case HCI_TYPE:
@@ -155,7 +161,8 @@ void H4Packetizer::OnDataReady(int fd) {
      if (hci_packet_type_ != hci::PacketType::ACL &&
          hci_packet_type_ != hci::PacketType::SCO &&
          hci_packet_type_ != hci::PacketType::COMMAND &&
          hci_packet_type_ != hci::PacketType::EVENT) {
          hci_packet_type_ != hci::PacketType::EVENT &&
          hci_packet_type_ != hci::PacketType::ISO) {
        LOG_ALWAYS_FATAL("Unimplemented packet type %hhd", packet_type_);
      }
      state_ = HCI_PREAMBLE;
+4 −0
Original line number Diff line number Diff line
@@ -56,6 +56,10 @@ class H4Packetizer : public HciProtocol {
  static constexpr size_t EVENT_PREAMBLE_SIZE = 2;
  static constexpr size_t EVENT_LENGTH_OFFSET = 1;

  // 2 bytes for handle and flags, 12 bits for length (Volume 2, Part E, 5.4.5)
  static constexpr size_t ISO_PREAMBLE_SIZE = 4;
  static constexpr size_t ISO_LENGTH_OFFSET = 2;

 private:
  int uart_fd_;