blob: d5c0012b5011ded3b7332f2868087239766383bf [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SRC_DEVICES_BIN_DRIVER_HOST_DEVICE_CONTROLLER_CONNECTION_H_
#define SRC_DEVICES_BIN_DRIVER_HOST_DEVICE_CONTROLLER_CONNECTION_H_
#include <fuchsia/device/manager/llcpp/fidl.h>
#include <fuchsia/io/c/fidl.h>
#include <fuchsia/io/llcpp/fidl.h>
#include <lib/zx/channel.h>
#include <fbl/ref_ptr.h>
#include "async_loop_owned_rpc_handler.h"
class DriverHostContext;
struct zx_device;
class DeviceControllerConnection
: public AsyncLoopOwnedRpcHandler<DeviceControllerConnection>,
public llcpp::fuchsia::device::manager::DeviceController::Interface,
public llcpp::fuchsia::io::Directory::Interface {
public:
// |ctx| must outlive this connection
DeviceControllerConnection(
DriverHostContext* ctx, fbl::RefPtr<zx_device> dev, zx::channel rpc,
fidl::Client<llcpp::fuchsia::device::manager::Coordinator> coordinator_client);
// |ctx| must outlive this connection
static zx_status_t Create(
DriverHostContext* ctx, fbl::RefPtr<zx_device> dev, zx::channel rpc,
fidl::Client<llcpp::fuchsia::device::manager::Coordinator> coordinator_client,
std::unique_ptr<DeviceControllerConnection>* conn);
~DeviceControllerConnection();
static void HandleRpc(std::unique_ptr<DeviceControllerConnection> conn,
async_dispatcher_t* dispatcher, async::WaitBase* wait, zx_status_t status,
const zx_packet_signal_t* signal);
zx_status_t HandleRead();
const fbl::RefPtr<zx_device>& dev() const { return dev_; }
protected:
DriverHostContext* const driver_host_context_;
const fbl::RefPtr<zx_device> dev_;
private:
fidl::Client<llcpp::fuchsia::device::manager::Coordinator> coordinator_client_;
// Fidl methods
void BindDriver(::fidl::StringView driver_path, ::zx::vmo driver,
BindDriverCompleter::Sync& _completer) override;
void ConnectProxy(::zx::channel shadow, ConnectProxyCompleter::Sync& _completer) override;
void Init(InitCompleter::Sync& _completer) override;
void Suspend(uint32_t flags, SuspendCompleter::Sync& _completer) override;
void Resume(uint32_t target_system_state, ResumeCompleter::Sync& _completer) override;
void Unbind(UnbindCompleter::Sync& _completer) override;
void CompleteRemoval(CompleteRemovalCompleter::Sync& _completer) override;
void CompleteCompatibilityTests(llcpp::fuchsia::device::manager::CompatibilityTestStatus status,
CompleteCompatibilityTestsCompleter::Sync& _completer) override;
// Io.fidl methods
void Open(uint32_t flags, uint32_t mode, ::fidl::StringView path, ::zx::channel object,
OpenCompleter::Sync& _completer) override;
// All methods below are intentionally unimplemented.
void Clone(uint32_t flags, ::zx::channel object, CloneCompleter::Sync& _completer) override {}
void Close(CloseCompleter::Sync& _completer) override {}
void Describe(DescribeCompleter::Sync& _completer) override {}
void GetToken(GetTokenCompleter::Sync& _completer) override {}
void Rewind(RewindCompleter::Sync& _completer) override {}
void ReadDirents(uint64_t max_bytes, ReadDirentsCompleter::Sync& _completer) override {}
void Unlink(::fidl::StringView path, UnlinkCompleter::Sync& _completer) override {}
void SetAttr(uint32_t flags, llcpp::fuchsia::io::NodeAttributes attributes,
SetAttrCompleter::Sync& _completer) override {}
void Sync(SyncCompleter::Sync& _completer) override {}
void GetAttr(GetAttrCompleter::Sync& _completer) override {}
void Rename(::fidl::StringView src, ::zx::handle dst_parent_token, ::fidl::StringView dst,
RenameCompleter::Sync& _completer) override {}
void Link(::fidl::StringView src, ::zx::handle dst_parent_token, ::fidl::StringView dst,
LinkCompleter::Sync& _completer) override {}
void Watch(uint32_t mask, uint32_t options, ::zx::channel watcher,
WatchCompleter::Sync& _completer) override {}
};
struct DevhostRpcReadContext {
const char* path;
DeviceControllerConnection* conn;
};
#endif // SRC_DEVICES_BIN_DRIVER_HOST_DEVICE_CONTROLLER_CONNECTION_H_