aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/include
diff options
context:
space:
mode:
Diffstat (limited to 'host/lib/include')
-rw-r--r--host/lib/include/uhdlib/rfnoc/rfnoc_rx_streamer.hpp10
-rw-r--r--host/lib/include/uhdlib/transport/rx_streamer_impl.hpp31
-rw-r--r--host/lib/include/uhdlib/transport/tx_streamer_impl.hpp15
3 files changed, 44 insertions, 12 deletions
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<size_t>& connected_inputs,
const std::vector<size_t>& 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<property_t<double>> _samp_rate_in;
std::vector<property_t<double>> _tick_rate_in;
std::vector<property_t<std::string>> _type_in;
+ std::vector<property_t<size_t>> _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<size_t>("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<std::size_t>::max();
+
// Maximum number of samples per packet
size_t _spp = std::numeric_limits<std::size_t>::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<size_t>("spp", _spp);
+
+ if (stream_args.args.has_key("spp")) {
+ _spp = stream_args.args.cast<size_t>("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<std::size_t>::max();
// Maximum number of samples per packet