From 77a5358dd03669366a162d67f9ea11b2056c78b6 Mon Sep 17 00:00:00 2001 From: Ciro Nishiguchi Date: Tue, 13 Aug 2019 16:50:47 -0500 Subject: rfnoc: Add MTU property to RX streamer --- .../lib/include/uhdlib/rfnoc/rfnoc_rx_streamer.hpp | 10 +++++++ .../include/uhdlib/transport/rx_streamer_impl.hpp | 31 ++++++++++++++++++---- .../include/uhdlib/transport/tx_streamer_impl.hpp | 15 ++++++----- 3 files changed, 44 insertions(+), 12 deletions(-) (limited to 'host/lib/include') diff --git a/host/lib/include/uhdlib/rfnoc/rfnoc_rx_streamer.hpp b/host/lib/include/uhdlib/rfnoc/rfnoc_rx_streamer.hpp index d39d88f43..1afe5db80 100644 --- a/host/lib/include/uhdlib/rfnoc/rfnoc_rx_streamer.hpp +++ b/host/lib/include/uhdlib/rfnoc/rfnoc_rx_streamer.hpp @@ -76,6 +76,15 @@ public: bool check_topology(const std::vector& connected_inputs, const std::vector& connected_outputs); + /*! Connects a channel to the streamer port + * + * Overrides method in rx_streamer_impl. + * + * \param channel The streamer channel to which to connect + * \param xport The transport for the specified channel + */ + void connect_channel(const size_t channel, chdr_rx_data_xport::uptr xport); + private: void _register_props(const size_t chan, const std::string& otw_format); @@ -91,6 +100,7 @@ private: std::vector> _samp_rate_in; std::vector> _tick_rate_in; std::vector> _type_in; + std::vector> _mtu_in; // Streamer unique ID const std::string _unique_id; diff --git a/host/lib/include/uhdlib/transport/rx_streamer_impl.hpp b/host/lib/include/uhdlib/transport/rx_streamer_impl.hpp index cc989e8f2..b52358e55 100644 --- a/host/lib/include/uhdlib/transport/rx_streamer_impl.hpp +++ b/host/lib/include/uhdlib/transport/rx_streamer_impl.hpp @@ -87,18 +87,23 @@ public: _setup_converters(num_ports, stream_args); _zero_copy_streamer.set_samp_rate(_samp_rate); _zero_copy_streamer.set_bytes_per_item(_convert_info.bytes_per_otw_item); + + if (stream_args.args.has_key("spp")) { + _spp = stream_args.args.cast("spp", _spp); + _mtu = _spp * _convert_info.bytes_per_otw_item; + } } //! Connect a new channel to the streamer // FIXME: Needs some way to handle virtual channels, since xport could be shared among them - void connect_channel(const size_t channel, typename transport_t::uptr xport) + virtual void connect_channel(const size_t channel, typename transport_t::uptr xport) { - const size_t max_pyld_size = xport->get_max_payload_size(); + const size_t mtu = xport->get_max_payload_size(); _zero_copy_streamer.connect_channel(channel, std::move(xport)); - // Set spp based on the transport frame size - const size_t xport_spp = max_pyld_size / _convert_info.bytes_per_otw_item; - _spp = std::min(_spp, xport_spp); + if (mtu < _mtu) { + set_mtu(mtu); + } } //! Implementation of rx_streamer API method @@ -183,6 +188,19 @@ protected: _converters[chan]->set_scalar(scale_factor); } + //! Returns the maximum payload size + size_t get_mtu() const + { + return _mtu; + } + + //! Sets the MTU and calculates spp + void set_mtu(const size_t mtu) + { + _mtu = mtu; + _spp = _mtu / _convert_info.bytes_per_otw_item; + } + //! Configures sample rate for conversion of timestamp void set_samp_rate(const double rate) { @@ -336,6 +354,9 @@ private: // Sample rate used to calculate metadata time_spec_t double _samp_rate = 1.0; + // MTU, determined when xport is connected and modifiable by subclass + size_t _mtu = std::numeric_limits::max(); + // Maximum number of samples per packet size_t _spp = std::numeric_limits::max(); diff --git a/host/lib/include/uhdlib/transport/tx_streamer_impl.hpp b/host/lib/include/uhdlib/transport/tx_streamer_impl.hpp index 35a724fa9..fa84026fe 100644 --- a/host/lib/include/uhdlib/transport/tx_streamer_impl.hpp +++ b/host/lib/include/uhdlib/transport/tx_streamer_impl.hpp @@ -76,7 +76,11 @@ public: { _setup_converters(num_chans, stream_args); _zero_copy_streamer.set_bytes_per_item(_convert_info.bytes_per_otw_item); - _spp = stream_args.args.cast("spp", _spp); + + if (stream_args.args.has_key("spp")) { + _spp = stream_args.args.cast("spp", _spp); + _mtu = _spp * _convert_info.bytes_per_otw_item; + } } virtual void connect_channel(const size_t channel, typename transport_t::uptr xport) @@ -184,7 +188,7 @@ protected: return _zero_copy_streamer.get_tick_rate(); } - //! Returns the size in bytes of a sample in a packet + //! Returns the maximum payload size size_t get_mtu() const { return _mtu; @@ -194,10 +198,7 @@ protected: void set_mtu(const size_t mtu) { _mtu = mtu; - - // Check if spp needs to be lowered. SPP may already be lower than the - // value allowed by mtu if the user specified it using stream_args. - _spp = std::min(_spp, _mtu / _convert_info.bytes_per_otw_item); + _spp = _mtu / _convert_info.bytes_per_otw_item; } //! Configures scaling factor for conversion @@ -308,7 +309,7 @@ private: // Sample rate used to calculate metadata time_spec_t double _samp_rate = 1.0; - // Maximum payload size + // MTU, determined when xport is connected and modifiable by subclass size_t _mtu = std::numeric_limits::max(); // Maximum number of samples per packet -- cgit v1.2.3