import time
+ASYNC_OP_TIME_SECONDS = 1 # TODO: Use events to synchronize events instead
+
class SimpleL2capTest(GdBaseTestClass):
def setup_test(self):
self.device_under_test = self.gd_devices[0]
dut_connection_stream.unsubscribe()
self.cert_device.l2cap.SendConnectionRequest(l2cap_cert_pb2.ConnectionRequest(scid=0x101, psm=1))
- time.sleep(1)
-
+ time.sleep(ASYNC_OP_TIME_SECONDS)
open_channels = self.cert_device.l2cap.FetchOpenedChannels(l2cap_cert_pb2.FetchOpenedChannelsRequest())
cid = open_channels.dcid[0]
+ self.cert_device.l2cap.SendConfigurationRequest(l2cap_cert_pb2.ConfigurationRequest(scid=cid))
+ time.sleep(ASYNC_OP_TIME_SECONDS)
dut_packet_stream.subscribe()
cert_packet_stream.subscribe()
- self.cert_device.l2cap.SendConfigurationRequest(l2cap_cert_pb2.ConfigurationRequest(scid=cid))
self.cert_device.l2cap.SendL2capPacket(l2cap_facade_pb2.L2capPacket(channel=2, payload=b"abc"))
dut_packet_stream.assert_event_occurs(
)
self.cert_device.l2cap.SendDisconnectionRequest(l2cap_cert_pb2.DisconnectionRequest(dcid=0x40, scid=101))
- time.sleep(1)
+ time.sleep(ASYNC_OP_TIME_SECONDS)
dut_packet_stream.unsubscribe()
cert_packet_stream.unsubscribe()
lambda device: device.remote == self.dut_address
)
cert_connection_stream.unsubscribe()
- time.sleep(1)
+ time.sleep(ASYNC_OP_TIME_SECONDS)
open_channels = self.cert_device.l2cap.FetchOpenedChannels(l2cap_cert_pb2.FetchOpenedChannelsRequest())
assert len(open_channels.dcid) == 2
return psm_;
}
+ enum class ConfigurationStatus { NOT_CONFIGURED, CONFIGURED };
+
+ virtual void SetOutgoingConfigurationStatus(ConfigurationStatus status);
+ virtual void SetIncomingConfigurationStatus(ConfigurationStatus status);
+
+ virtual ConfigurationStatus GetOutgoingConfigurationStatus() const {
+ return outgoing_configuration_status_;
+ }
+
+ virtual ConfigurationStatus GetIncomingConfigurationStatus() const {
+ return incoming_configuration_status_;
+ }
+
private:
const Psm psm_;
const Cid cid_;
static constexpr size_t kChannelQueueSize = 10;
common::BidiQueue<packet::PacketView<packet::kLittleEndian>, packet::BasePacketBuilder> channel_queue_{
kChannelQueueSize};
+ ConfigurationStatus outgoing_configuration_status_ = ConfigurationStatus::NOT_CONFIGURED;
+ ConfigurationStatus incoming_configuration_status_ = ConfigurationStatus::NOT_CONFIGURED;
DISALLOW_COPY_AND_ASSIGN(DynamicChannelImpl);
};
}
send_connection_response(signal_id, remote_cid, new_channel->GetCid(), ConnectionResponseResult::SUCCESS,
ConnectionResponseStatus::NO_FURTHER_INFORMATION_AVAILABLE);
- std::unique_ptr<DynamicChannel> channel = std::make_unique<DynamicChannel>(new_channel, handler_);
SendConfigurationRequest(remote_cid, {});
- dynamic_service_manager_->GetService(psm)->NotifyChannelCreation(std::move(channel));
}
void ClassicSignallingManager::OnConnectionResponse(SignalId signal_id, Cid remote_cid, Cid cid,
handle_send_next_command();
return;
}
- std::unique_ptr<DynamicChannel> channel = std::make_unique<DynamicChannel>(new_channel, handler_);
- dynamic_service_manager_->GetService(pending_psm)->NotifyChannelCreation(std::move(channel));
SendConfigurationRequest(remote_cid, {});
alarm_.Cancel();
handle_send_next_command();
ConfigurationResponseResult::SUCCESS, {});
enqueue_buffer_->Enqueue(std::move(response), handler_);
handle_send_next_command();
+ channel->SetIncomingConfigurationStatus(DynamicChannelImpl::ConfigurationStatus::CONFIGURED);
+ if (channel->GetOutgoingConfigurationStatus() == DynamicChannelImpl::ConfigurationStatus::CONFIGURED) {
+ LOG_INFO();
+ std::unique_ptr<DynamicChannel> user_channel = std::make_unique<DynamicChannel>(channel, handler_);
+ dynamic_service_manager_->GetService(channel->GetPsm())->NotifyChannelCreation(std::move(user_channel));
+ }
}
void ClassicSignallingManager::OnConfigurationResponse(SignalId signal_id, Cid cid, Continuation is_continuation,
// TODO(cmanton) verify configuration parameters are satisfied
// TODO(cmanton) Indicate channel is open if config params are agreed upon
handle_send_next_command();
+ channel->SetOutgoingConfigurationStatus(DynamicChannelImpl::ConfigurationStatus::CONFIGURED);
+ if (channel->GetIncomingConfigurationStatus() == DynamicChannelImpl::ConfigurationStatus::CONFIGURED) {
+ std::unique_ptr<DynamicChannel> user_channel = std::make_unique<DynamicChannel>(channel, handler_);
+ dynamic_service_manager_->GetService(channel->GetPsm())->NotifyChannelCreation(std::move(user_channel));
+ }
+ alarm_.Cancel();
}
void ClassicSignallingManager::OnDisconnectionRequest(SignalId signal_id, Cid cid, Cid remote_cid) {
channel->OnClosed(hci::ErrorCode::SUCCESS);
link_->FreeDynamicChannel(cid);
handle_send_next_command();
+ alarm_.Cancel();
}
void ClassicSignallingManager::OnEchoRequest(SignalId signal_id, const PacketView<kLittleEndian>& packet) {
}
LOG_INFO("Echo response received");
handle_send_next_command();
+ alarm_.Cancel();
}
void ClassicSignallingManager::OnInformationRequest(SignalId signal_id, InformationRequestInfoType type) {
}
// TODO (hsz): Store the information response
handle_send_next_command();
+ alarm_.Cancel();
}
void ClassicSignallingManager::on_incoming_packet() {