aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/include/uhdlib/rfnoc/mgmt_portal.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'host/lib/include/uhdlib/rfnoc/mgmt_portal.hpp')
-rw-r--r--host/lib/include/uhdlib/rfnoc/mgmt_portal.hpp191
1 files changed, 191 insertions, 0 deletions
diff --git a/host/lib/include/uhdlib/rfnoc/mgmt_portal.hpp b/host/lib/include/uhdlib/rfnoc/mgmt_portal.hpp
new file mode 100644
index 000000000..305f8fb85
--- /dev/null
+++ b/host/lib/include/uhdlib/rfnoc/mgmt_portal.hpp
@@ -0,0 +1,191 @@
+//
+// Copyright 2019 Ettus Research, a National Instruments Brand
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+//
+
+#ifndef INCLUDED_LIBUHD_MGMT_PORTAL_HPP
+#define INCLUDED_LIBUHD_MGMT_PORTAL_HPP
+
+#include <uhdlib/rfnoc/chdr/chdr_types.hpp>
+#include <uhdlib/rfnoc/xports.hpp>
+#include <memory>
+
+namespace uhd { namespace rfnoc { namespace mgmt {
+
+//! A portal to perform low-level management operations from an endpoint
+//
+// This object provides an interface to send management commands from a software stream
+// endpoint. There must one instance of this object per software stream endpoint.
+// The management portal is capable of discovering all endpoints reachable from the
+// transport associated with it. It can then setup routes and configure stream endpoints
+// downstream.
+class mgmt_portal
+{
+public:
+ using uptr = std::unique_ptr<mgmt_portal>;
+ using xport_cfg_fn_t = std::function<void(
+ device_id_t devid, uint16_t inst, uint8_t subtype, chdr::mgmt_hop_t& hop)>;
+
+ //! Flow control buffer configuration parameters
+ struct buff_params_t
+ {
+ uint64_t bytes;
+ uint32_t packets;
+ };
+
+ //! Information about a stream endpoint
+ struct sep_info_t
+ {
+ //! Does the endpoint support control traffic?
+ bool has_ctrl;
+ //! Does the endpoint support data traffic?
+ bool has_data;
+ //! Number of input data ports
+ size_t num_input_ports;
+ //! Number of output data ports
+ size_t num_output_ports;
+ //! Does the endpoint send a stream status packet in case of errors
+ bool reports_strm_errs;
+ //! Address of the endpoint
+ sep_addr_t addr;
+ };
+
+ //! The data type of the buffer used to capture/generate data
+ enum sw_buff_t { BUFF_U64 = 0, BUFF_U32 = 1, BUFF_U16 = 2, BUFF_U8 = 3 };
+
+ virtual ~mgmt_portal() = 0;
+
+ //! Get addresses for all stream endpoints reachable from this SW mgmt portal
+ // Note that the endpoints that are not physically connected/reachable from
+ // the underlying transport will not be discovered.
+ //
+ virtual const std::vector<sep_addr_t>& get_reachable_endpoints() const = 0;
+
+ //! Initialize a stream endpoint and assign an endpoint ID to it
+ //
+ // \param addr The physical address of the stream endpoint
+ // \param epid The endpoint ID to assign to this endpoint
+ //
+ virtual void initialize_endpoint(const sep_addr_t& addr, const sep_id_t& epid) = 0;
+
+ //! Get information about a discovered (reachable) stream endpoint
+ //
+ // \param epid The endpoint ID of the endpoint to lookup
+ //
+ virtual bool is_endpoint_initialized(const sep_id_t& epid) const = 0;
+
+ //! Get information about a discovered (reachable) stream endpoint
+ //
+ // \param epid The endpoint ID of the endpoint to lookup
+ //
+ virtual sep_info_t get_endpoint_info(const sep_id_t& epid) const = 0;
+
+ //! Setup a route from this SW mgmt portal to the specified destination endpoint
+ //
+ // After a route is established, it should be possible to send packets to the
+ // destination simply by setting the DstEPID in the CHDR header to the specified
+ // dst_epid
+ //
+ // \param dst_epid The endpoint ID of the destination
+ //
+ virtual void setup_local_route(const sep_id_t& dst_epid) = 0;
+
+ //! Setup a route from between the source and destination endpoints
+ //
+ // After a route is established, it should be possible for the source to send packets
+ // to the destination simply by setting the DstEPID in the CHDR header to the
+ // specified dst_epid
+ //
+ // \param dst_epid The endpoint ID of the destination
+ // \param src_epid The endpoint ID of the source
+ //
+ virtual void setup_remote_route(
+ const sep_id_t& dst_epid, const sep_id_t& src_epid) = 0;
+
+ //! Start configuring a flow controlled receive data stream from the endpoint with the
+ // specified ID to this SW mgmt portal.
+ //
+ // RX stream setup is a two-step process. After this function is called, the flow
+ // control handler needs to acknoweledge the setup transaction then call the commit
+ // function below.
+ //
+ // \param epid The endpoint ID of the data source
+ // \param lossy_xport Is the transport lossy? (e.g. UDP, not liberio)
+ // \param pyld_buff_fmt Datatype of SW buffer that holds the data payload
+ // \param mdata_buff_fmt Datatype of SW buffer that holds the data metadata
+ // \param fc_freq Flow control response frequency parameters
+ // \param fc_freq Flow control headroom parameters
+ // \param reset Reset ingress stream endpoint state
+ //
+ virtual void config_local_rx_stream_start(const sep_id_t& epid,
+ const bool lossy_xport,
+ const sw_buff_t pyld_buff_fmt,
+ const sw_buff_t mdata_buff_fmt,
+ const buff_params_t& fc_freq,
+ const buff_params_t& fc_headroom,
+ const bool reset = false) = 0;
+
+ //! Finish configuring a flow controlled receive data stream from the endpoint with
+ // the specified ID to this SW mgmt portal.
+ //
+ // \param epid The endpoint ID of the data source
+ //
+ virtual buff_params_t config_local_rx_stream_commit(
+ const sep_id_t& epid, const double timeout = 0.2) = 0;
+
+ //! Configure a flow controlled transmit data stream from this SW mgmt portal to the
+ // endpoint with the specified ID.
+ //
+ // \param pyld_buff_fmt Datatype of SW buffer that holds the data payload
+ // \param mdata_buff_fmt Datatype of SW buffer that holds the data metadata
+ // \param reset Reset ingress stream endpoint state
+ //
+ virtual void config_local_tx_stream(const sep_id_t& epid,
+ const sw_buff_t pyld_buff_fmt,
+ const sw_buff_t mdata_buff_fmt,
+ const bool reset = false) = 0;
+
+ //! Configure a flow controlled data stream from the endpoint with ID src_epid to the
+ // endpoint with ID dst_epid
+ //
+ // \param dst_epid The endpoint ID of the destination
+ // \param src_epid The endpoint ID of the source
+ // \param lossy_xport Is the transport lossy?
+ // \param pyld_buff_fmt Datatype of SW buffer that holds the data payload
+ // \param mdata_buff_fmt Datatype of SW buffer that holds the data metadata
+ // \param fc_freq Flow control response frequency parameters
+ // \param fc_freq Flow control headroom parameters
+ //
+ virtual buff_params_t config_remote_stream(const sep_id_t& dst_epid,
+ const sep_id_t& src_epid,
+ const bool lossy_xport,
+ const buff_params_t& fc_freq,
+ const buff_params_t& fc_headroom,
+ const bool reset = false,
+ const double timeout = 0.2) = 0;
+
+ //! Define custom configuration functions for custom transports
+ //
+ // \param xport_type The type of the custom transport
+ // \param init_hop_cfg_fn The function to call when initializing the custom xport
+ // \param rtcfg_hop_cfg_fn The function to call when configuring routing for the
+ // custom xport
+ //
+ virtual void register_xport_hop_cfg_fns(uint8_t xport_subtype,
+ xport_cfg_fn_t init_hop_cfg_fn,
+ xport_cfg_fn_t rtcfg_hop_cfg_fn) = 0;
+
+ //! Create an endpoint manager object
+ //
+ static uptr make(const both_xports_t& xports,
+ const chdr::chdr_packet_factory& pkt_factory,
+ uint16_t protover,
+ chdr_w_t chdr_w,
+ sep_id_t epid,
+ device_id_t device_id);
+};
+
+}}} // namespace uhd::rfnoc::mgmt
+
+#endif /* INCLUDED_LIBUHD_MGMT_PORTAL_HPP */