blob: 807dffa33500256aaf04aea70e266975dc59f5a6 [file]
// Copyright 2021 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_FIDL_PROXY_DEVICE_H_
#define SRC_DEVICES_BIN_DRIVER_HOST_FIDL_PROXY_DEVICE_H_
#include <fidl/fuchsia.io/cpp/wire.h>
#include <lib/ddk/driver.h>
#include <lib/fidl/cpp/wire/channel.h>
#include "src/devices/bin/driver_host/zx_device.h"
// Modifies |device| to have the appropriate ctx and ops table for a FIDL proxy device.
void InitializeFidlProxyDevice(const fbl::RefPtr<zx_device>& device,
fidl::ClientEnd<fuchsia_io::Directory> incoming_dir);
// Returns a zx_driver instance for FIDL proxy devices.
fbl::RefPtr<zx_driver> GetFidlProxyDriver(DriverHostContext* ctx);
// |FidlProxyDevice| proxies the outgoing directory of a driver in a different driver host so that
// the driver's children can still access its FIDL protocols despite being in a different host. The
// FIDL proxy devices created in the driver manager correspond to |zx_device| objects with
// references to instances of this class.
class FidlProxyDevice : public fbl::RefCounted<FidlProxyDevice> {
public:
FidlProxyDevice(fidl::ClientEnd<fuchsia_io::Directory> incoming_dir)
: incoming_dir_(std::move(incoming_dir)) {}
~FidlProxyDevice() = default;
zx::result<> ConnectToProtocol(const char* protocol, zx::channel request);
zx::result<> ConnectToProtocol(const char* service, const char* protocol, zx::channel request);
private:
fidl::ClientEnd<fuchsia_io::Directory> incoming_dir_;
};
#endif // SRC_DEVICES_BIN_DRIVER_HOST_FIDL_PROXY_DEVICE_H_