Loading system/gd/hci/hci_layer.cc +8 −17 Original line number Diff line number Diff line Loading @@ -15,10 +15,11 @@ */ #include "hci/hci_layer.h" #include "os/alarm.h" #include "common/bind.h" #include "common/callback.h" #include "os/alarm.h" #include "os/queue.h" #include "packet/packet_builder.h" namespace { Loading Loading @@ -115,6 +116,7 @@ struct HciLayer::impl : public hal::HciHalCallbacks { void Stop() { hal_->unregisterIncomingPacketCallback(); acl_queue_.GetDownEnd()->UnregisterDequeue(); incoming_acl_packet_buffer_.Clear(); delete hci_timeout_alarm_; command_queue_.clear(); hal_ = nullptr; Loading Loading @@ -199,22 +201,10 @@ struct HciLayer::impl : public hal::HciHalCallbacks { } void aclDataReceived(hal::HciPacket data_bytes) override { module_.GetHandler()->Post( BindOnce(&HciLayer::impl::acl_data_received_handler, common::Unretained(this), std::move(data_bytes))); } void acl_data_received_handler(hal::HciPacket data_bytes) { auto queue_end = acl_queue_.GetDownEnd(); Handler* hci_handler = module_.GetHandler(); queue_end->RegisterEnqueue(hci_handler, Bind(&impl::acl_down_queue_enqueue, common::Unretained(this), std::move(data_bytes))); } std::unique_ptr<AclPacketView> acl_down_queue_enqueue(hal::HciPacket data_bytes) { auto packet = packet::PacketView<packet::kLittleEndian>(std::make_shared<std::vector<uint8_t>>(data_bytes)); AclPacketView acl2 = AclPacketView::Create(packet); acl_queue_.GetDownEnd()->UnregisterEnqueue(); return std::make_unique<AclPacketView>(acl2); auto packet = packet::PacketView<packet::kLittleEndian>(std::make_shared<std::vector<uint8_t>>(std::move(data_bytes))); AclPacketView acl = AclPacketView::Create(packet); incoming_acl_packet_buffer_.Enqueue(std::move(acl), module_.GetHandler()); } void scoDataReceived(hal::HciPacket data_bytes) override { Loading Loading @@ -313,6 +303,7 @@ struct HciLayer::impl : public hal::HciHalCallbacks { // Acl packets BidiQueue<AclPacketView, AclPacketBuilder> acl_queue_{3 /* TODO: Set queue depth */}; os::EnqueueBuffer<AclPacketView> incoming_acl_packet_buffer_{acl_queue_.GetDownEnd()}; }; HciLayer::HciLayer() : impl_(std::make_unique<impl>(*this)) {} Loading system/gd/hci/hci_layer_test.cc +15 −0 Original line number Diff line number Diff line Loading @@ -448,5 +448,20 @@ TEST_F(HciTest, createConnectionTest) { ASSERT_EQ(handle, sent_itr.extract<uint16_t>()); ASSERT_EQ(bd_addr, sent_itr.extract<Address>()); } TEST_F(HciTest, receiveMultipleAclPacket) { common::Address bd_addr; ASSERT_TRUE(common::Address::FromString("A1:A2:A3:A4:A5:A6", bd_addr)); uint16_t handle = 0x0001; PacketBoundaryFlag packet_boundary_flag = PacketBoundaryFlag::COMPLETE_PDU; BroadcastFlag broadcast_flag = BroadcastFlag::POINT_TO_POINT; for (int i = 0; i < 100; i++) { auto acl_payload = std::make_unique<RawBuilder>(); acl_payload->AddAddress(bd_addr); acl_payload->AddOctets2(handle); hal->callbacks->aclDataReceived( GetPacketBytes(AclPacketBuilder::Create(handle, packet_boundary_flag, broadcast_flag, std::move(acl_payload)))); } } } // namespace hci } // namespace bluetooth Loading
system/gd/hci/hci_layer.cc +8 −17 Original line number Diff line number Diff line Loading @@ -15,10 +15,11 @@ */ #include "hci/hci_layer.h" #include "os/alarm.h" #include "common/bind.h" #include "common/callback.h" #include "os/alarm.h" #include "os/queue.h" #include "packet/packet_builder.h" namespace { Loading Loading @@ -115,6 +116,7 @@ struct HciLayer::impl : public hal::HciHalCallbacks { void Stop() { hal_->unregisterIncomingPacketCallback(); acl_queue_.GetDownEnd()->UnregisterDequeue(); incoming_acl_packet_buffer_.Clear(); delete hci_timeout_alarm_; command_queue_.clear(); hal_ = nullptr; Loading Loading @@ -199,22 +201,10 @@ struct HciLayer::impl : public hal::HciHalCallbacks { } void aclDataReceived(hal::HciPacket data_bytes) override { module_.GetHandler()->Post( BindOnce(&HciLayer::impl::acl_data_received_handler, common::Unretained(this), std::move(data_bytes))); } void acl_data_received_handler(hal::HciPacket data_bytes) { auto queue_end = acl_queue_.GetDownEnd(); Handler* hci_handler = module_.GetHandler(); queue_end->RegisterEnqueue(hci_handler, Bind(&impl::acl_down_queue_enqueue, common::Unretained(this), std::move(data_bytes))); } std::unique_ptr<AclPacketView> acl_down_queue_enqueue(hal::HciPacket data_bytes) { auto packet = packet::PacketView<packet::kLittleEndian>(std::make_shared<std::vector<uint8_t>>(data_bytes)); AclPacketView acl2 = AclPacketView::Create(packet); acl_queue_.GetDownEnd()->UnregisterEnqueue(); return std::make_unique<AclPacketView>(acl2); auto packet = packet::PacketView<packet::kLittleEndian>(std::make_shared<std::vector<uint8_t>>(std::move(data_bytes))); AclPacketView acl = AclPacketView::Create(packet); incoming_acl_packet_buffer_.Enqueue(std::move(acl), module_.GetHandler()); } void scoDataReceived(hal::HciPacket data_bytes) override { Loading Loading @@ -313,6 +303,7 @@ struct HciLayer::impl : public hal::HciHalCallbacks { // Acl packets BidiQueue<AclPacketView, AclPacketBuilder> acl_queue_{3 /* TODO: Set queue depth */}; os::EnqueueBuffer<AclPacketView> incoming_acl_packet_buffer_{acl_queue_.GetDownEnd()}; }; HciLayer::HciLayer() : impl_(std::make_unique<impl>(*this)) {} Loading
system/gd/hci/hci_layer_test.cc +15 −0 Original line number Diff line number Diff line Loading @@ -448,5 +448,20 @@ TEST_F(HciTest, createConnectionTest) { ASSERT_EQ(handle, sent_itr.extract<uint16_t>()); ASSERT_EQ(bd_addr, sent_itr.extract<Address>()); } TEST_F(HciTest, receiveMultipleAclPacket) { common::Address bd_addr; ASSERT_TRUE(common::Address::FromString("A1:A2:A3:A4:A5:A6", bd_addr)); uint16_t handle = 0x0001; PacketBoundaryFlag packet_boundary_flag = PacketBoundaryFlag::COMPLETE_PDU; BroadcastFlag broadcast_flag = BroadcastFlag::POINT_TO_POINT; for (int i = 0; i < 100; i++) { auto acl_payload = std::make_unique<RawBuilder>(); acl_payload->AddAddress(bd_addr); acl_payload->AddOctets2(handle); hal->callbacks->aclDataReceived( GetPacketBytes(AclPacketBuilder::Create(handle, packet_boundary_flag, broadcast_flag, std::move(acl_payload)))); } } } // namespace hci } // namespace bluetooth