Loading system/gd/hci/acl_manager/round_robin_scheduler.cc +4 −2 Original line number Diff line number Diff line Loading @@ -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( Loading system/gd/packet/base_packet_builder.h +10 −0 Original line number Diff line number Diff line Loading @@ -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 Loading system/main/shim/acl_api.cc +4 −4 Original line number Diff line number Diff line Loading @@ -55,9 +55,9 @@ void bluetooth::shim::ACL_IgnoreLeConnectionFrom( } void bluetooth::shim::ACL_WriteData(uint16_t handle, BT_HDR* p_buf) { 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); 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, IsPacketFlushable(p_buf)); Stack::GetInstance()->GetAcl()->WriteData(handle, std::move(packet)); osi_free(p_buf); } Loading system/main/shim/helpers.h +7 −1 Original line number Diff line number Diff line Loading @@ -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; } Loading Loading @@ -243,6 +244,11 @@ inline hci::DisconnectReason ToDisconnectReasonFromLegacy( return static_cast<hci::DisconnectReason>(reason); } inline bool IsPacketFlushable(const BT_HDR* p_buf) { ASSERT(p_buf != nullptr); return ToPacketData<const HciDataPreamble>(p_buf)->IsFlushable(); } namespace debug { inline void DumpBtHdr(const BT_HDR* p_buf, const char* token) { Loading system/main/shim/l2c_api.cc +11 −7 Original line number Diff line number Diff line Loading @@ -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, IsPacketFlushable(p_data))) * len; osi_free(p_data); return sent_length; Loading Loading @@ -1013,7 +1014,9 @@ 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, IsPacketFlushable(p_buf))); osi_free(p_buf); return sent ? L2CAP_DW_SUCCESS : L2CAP_DW_FAILED; } Loading Loading @@ -1563,8 +1566,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, IsPacketFlushable(p_data))) * len; osi_free(p_data); return sent_length; Loading Loading
system/gd/hci/acl_manager/round_robin_scheduler.cc +4 −2 Original line number Diff line number Diff line Loading @@ -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( Loading
system/gd/packet/base_packet_builder.h +10 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
system/main/shim/acl_api.cc +4 −4 Original line number Diff line number Diff line Loading @@ -55,9 +55,9 @@ void bluetooth::shim::ACL_IgnoreLeConnectionFrom( } void bluetooth::shim::ACL_WriteData(uint16_t handle, BT_HDR* p_buf) { 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); 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, IsPacketFlushable(p_buf)); Stack::GetInstance()->GetAcl()->WriteData(handle, std::move(packet)); osi_free(p_buf); } Loading
system/main/shim/helpers.h +7 −1 Original line number Diff line number Diff line Loading @@ -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; } Loading Loading @@ -243,6 +244,11 @@ inline hci::DisconnectReason ToDisconnectReasonFromLegacy( return static_cast<hci::DisconnectReason>(reason); } inline bool IsPacketFlushable(const BT_HDR* p_buf) { ASSERT(p_buf != nullptr); return ToPacketData<const HciDataPreamble>(p_buf)->IsFlushable(); } namespace debug { inline void DumpBtHdr(const BT_HDR* p_buf, const char* token) { Loading
system/main/shim/l2c_api.cc +11 −7 Original line number Diff line number Diff line Loading @@ -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, IsPacketFlushable(p_data))) * len; osi_free(p_data); return sent_length; Loading Loading @@ -1013,7 +1014,9 @@ 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, IsPacketFlushable(p_buf))); osi_free(p_buf); return sent ? L2CAP_DW_SUCCESS : L2CAP_DW_FAILED; } Loading Loading @@ -1563,8 +1566,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, IsPacketFlushable(p_data))) * len; osi_free(p_data); return sent_length; Loading