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

Commit 05390f6a authored by Chris Manton's avatar Chris Manton
Browse files

gd: Add flushable attribute to packets

Bug: 178752129
Test: gd/cert/run
Tag: #refactor
BYPASS_LONG_LINES_REASON: Bluetooth likes 120 lines

Change-Id: I63dcc91f1ddbca9a0a3fadc38807f2a58b8ab2a8
parent f564ce4e
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -138,8 +138,10 @@ void RoundRobinScheduler::buffer_packet(std::map<uint16_t, acl_queue_handler>::i

  ConnectionType connection_type = acl_queue_handler->second.connection_type_;
  size_t mtu = connection_type == ConnectionType::CLASSIC ? hci_mtu_ : le_hci_mtu_;
  // TODO(b/178752129): Make A2DP and Hearing Aid audio packets flushable
  PacketBoundaryFlag packet_boundary_flag = PacketBoundaryFlag::FIRST_NON_AUTOMATICALLY_FLUSHABLE;
  PacketBoundaryFlag packet_boundary_flag = (packet->IsFlushable())
                                                ? PacketBoundaryFlag::FIRST_AUTOMATICALLY_FLUSHABLE
                                                : PacketBoundaryFlag::FIRST_NON_AUTOMATICALLY_FLUSHABLE;

  int acl_priority = acl_queue_handler->second.high_priority_ ? 1 : 0;
  if (packet->size() <= mtu) {
    fragments_to_send_.push(
+10 −0
Original line number Diff line number Diff line
@@ -38,8 +38,18 @@ class BasePacketBuilder {
  // Write to the vector with the given iterator.
  virtual void Serialize(BitInserter& it) const = 0;

  void SetFlushable(bool is_flushable) {
    is_flushable_ = is_flushable;
  }
  bool IsFlushable() const {
    return is_flushable_;
  }

 protected:
  BasePacketBuilder() = default;

 private:
  bool is_flushable_{false};
};

}  // namespace packet
+3 −2
Original line number Diff line number Diff line
@@ -55,9 +55,10 @@ void bluetooth::shim::ACL_IgnoreLeConnectionFrom(
}

void bluetooth::shim::ACL_WriteData(uint16_t handle, BT_HDR* p_buf) {
  bool is_flushable = false;
  std::unique_ptr<bluetooth::packet::RawBuilder> packet =
      MakeUniquePacket(p_buf->data + p_buf->offset + HCI_DATA_PREAMBLE_SIZE,
                       p_buf->len - HCI_DATA_PREAMBLE_SIZE);
                       p_buf->len - HCI_DATA_PREAMBLE_SIZE, is_flushable);
  Stack::GetInstance()->GetAcl()->WriteData(handle, std::move(packet));
  osi_free(p_buf);
}
+2 −1
Original line number Diff line number Diff line
@@ -104,11 +104,12 @@ inline tBLE_BD_ADDR ToLegacyAddressWithType(
}

inline std::unique_ptr<bluetooth::packet::RawBuilder> MakeUniquePacket(
    const uint8_t* data, size_t len) {
    const uint8_t* data, size_t len, bool is_flushable) {
  bluetooth::packet::RawBuilder builder;
  std::vector<uint8_t> bytes(data, data + len);
  auto payload = std::make_unique<bluetooth::packet::RawBuilder>();
  payload->AddOctets(bytes);
  payload->SetFlushable(is_flushable);
  return payload;
}

+10 −7
Original line number Diff line number Diff line
@@ -776,8 +776,9 @@ uint8_t L2CA_DataWrite(uint16_t cid, BT_HDR* p_data) {
  }
  auto len = p_data->len;
  auto* data = p_data->data + p_data->offset;
  uint8_t sent_length = classic_dynamic_channel_helper_map_[psm]->send(
                            cid, MakeUniquePacket(data, len)) *
  uint8_t sent_length =
      classic_dynamic_channel_helper_map_[psm]->send(
          cid, MakeUniquePacket(data, len, false /* flushable */)) *
      len;
  osi_free(p_data);
  return sent_length;
@@ -1013,7 +1014,8 @@ uint16_t L2CA_SendFixedChnlData(uint16_t cid, const RawAddress& rem_bda,
  auto* helper = &le_fixed_channel_helper_.find(cid)->second;
  auto len = p_buf->len;
  auto* data = p_buf->data + p_buf->offset;
  bool sent = helper->send(ToGdAddress(rem_bda), MakeUniquePacket(data, len));
  bool sent = helper->send(ToGdAddress(rem_bda),
                           MakeUniquePacket(data, len, false /* flushable */));
  osi_free(p_buf);
  return sent ? L2CAP_DW_SUCCESS : L2CAP_DW_FAILED;
}
@@ -1563,8 +1565,9 @@ uint8_t L2CA_LECocDataWrite(uint16_t cid, BT_HDR* p_data) {
  }
  auto len = p_data->len;
  auto* data = p_data->data + p_data->offset;
  uint8_t sent_length = le_dynamic_channel_helper_map_[psm]->send(
                            cid, MakeUniquePacket(data, len)) *
  uint8_t sent_length =
      le_dynamic_channel_helper_map_[psm]->send(
          cid, MakeUniquePacket(data, len, false /* flushable */)) *
      len;
  osi_free(p_data);
  return sent_length;