blob: d74b8431f6a7f1cff7c784122b8ce6c8d8db6268 [file] [log] [blame]
// Copyright 2024 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 LIB_DRIVER_NODE_CPP_ADD_CHILD_H_
#define LIB_DRIVER_NODE_CPP_ADD_CHILD_H_
#include <fidl/fuchsia.driver.framework/cpp/markers.h>
#include <lib/driver/logging/cpp/logger.h>
#include <lib/stdcompat/span.h>
// The following functions can be used to add various types of child nodes to a parent node.
// There are two main types of nodes, owned and un-owned.
//
// Owned: An owned node belongs to the driver creating it, so the driver framework will not try to
// match it up to another driver. Therefore when you create an owned node, you must maintain the
// connection to the node by holding on to the client end.
//
// Un-owned: These are nodes that are not owned by the creating driver. The driver framework will
// go through the driver matching process to find a matching driver, and start the matched driver
// and bind it to the node. The node can provide resources to the bound driver through its offers.
//
// Once the type of node being created is chosen, the next step is to choose whether the node
// should export itself into devfs. The driver framework team is currently in the process of
// deprecating devfs in favor of service capabilities, but until that solution is available, devfs
// is how non-driver components can connect to driver provided protocols. If your node needs to
// provide devfs support, that is available through the variants that support the DevfsAddArgs.
namespace fdf {
// Contains the client ends for an owned child node that was created using the helper functions.
// This must be handled since the driver must ensure not to drop the node client.
struct [[nodiscard]] OwnedChildNode {
// This is a client to the node controller. This is safe to drop if not needed.
fidl::ClientEnd<fuchsia_driver_framework::NodeController> node_controller_;
// The client MUST keep this, as dropping it will result in the added node to be removed by the
// driver framework.
fidl::ClientEnd<fuchsia_driver_framework::Node> node_;
};
// Adds an owned child node under the given |parent|. The driver framework will NOT try to match
// and bind a driver to this child as it is already owned by the current driver.
//
// This is a synchronous call and requires that the dispatcher allow sync calls.
zx::result<OwnedChildNode> AddOwnedChild(
fidl::UnownedClientEnd<fuchsia_driver_framework::Node> parent, fdf::Logger& logger,
std::string_view node_name);
// Adds an un-owned child node under the given |parent|. The driver framework will try to match
// and bind a driver to this child.
//
// This is a synchronous call and requires that the dispatcher allow sync calls.
zx::result<fidl::ClientEnd<fuchsia_driver_framework::NodeController>> AddChild(
fidl::UnownedClientEnd<fuchsia_driver_framework::Node> parent, fdf::Logger& logger,
std::string_view node_name,
cpp20::span<const fuchsia_driver_framework::NodeProperty> properties,
cpp20::span<const fuchsia_driver_framework::Offer> offers);
// Creates an owned child node with devfs support under the given |parent|. The driver framework
// will NOT try to match and bind a driver to this child as it is already owned by the current
// driver.
//
// This is a synchronous call and requires that the dispatcher allow sync calls.
zx::result<OwnedChildNode> AddOwnedChild(
fidl::UnownedClientEnd<fuchsia_driver_framework::Node> parent, fdf::Logger& logger,
std::string_view node_name, fuchsia_driver_framework::DevfsAddArgs& devfs_args);
// Creates an un-owned child node with devfs support under the given |parent|. The driver framework
// will try to match and bind a driver to this child.
//
// This is a synchronous call and requires that the dispatcher allow sync calls.
zx::result<fidl::ClientEnd<fuchsia_driver_framework::NodeController>> AddChild(
fidl::UnownedClientEnd<fuchsia_driver_framework::Node> parent, fdf::Logger& logger,
std::string_view node_name, fuchsia_driver_framework::DevfsAddArgs& devfs_args,
cpp20::span<const fuchsia_driver_framework::NodeProperty> properties,
cpp20::span<const fuchsia_driver_framework::Offer> offers);
// Adds an un-owned child node under the given |parent|. The driver framework will try to match
// and bind a driver to this child.
//
// This is a synchronous call and requires that the dispatcher allow sync calls.
zx::result<fidl::ClientEnd<fuchsia_driver_framework::NodeController>> AddChild(
fidl::UnownedClientEnd<fuchsia_driver_framework::Node> parent, fdf::Logger& logger,
std::string_view node_name,
cpp20::span<const fuchsia_driver_framework::NodeProperty2> properties,
cpp20::span<const fuchsia_driver_framework::Offer> offers);
// Adds an un-owned child node under the given |parent|. The driver framework will try to match
// and bind a driver to this child.
//
// This is a synchronous call and requires that the dispatcher allow sync calls.
zx::result<fidl::ClientEnd<fuchsia_driver_framework::NodeController>> AddChild(
fidl::UnownedClientEnd<fuchsia_driver_framework::Node> parent, fdf::Logger& logger,
std::string_view node_name, fuchsia_driver_framework::DevfsAddArgs& devfs_args,
cpp20::span<const fuchsia_driver_framework::NodeProperty2> properties,
cpp20::span<const fuchsia_driver_framework::Offer> offers);
} // namespace fdf
#endif // LIB_DRIVER_NODE_CPP_ADD_CHILD_H_