diff options
author | Alex Williams <alex.williams@ni.com> | 2019-08-05 21:08:44 -0700 |
---|---|---|
committer | Martin Braun <martin.braun@ettus.com> | 2019-11-26 11:49:36 -0800 |
commit | 0fc57b99b9163d919cc4a470b3065ab4cf1c947d (patch) | |
tree | c82d635e9d8f7d65aae3b5211392aa0029231583 /host/lib/include/uhdlib/rfnoc | |
parent | 88aac58651ed8f632137e39964b5dd580be6016a (diff) | |
download | uhd-0fc57b99b9163d919cc4a470b3065ab4cf1c947d.tar.gz uhd-0fc57b99b9163d919cc4a470b3065ab4cf1c947d.tar.bz2 uhd-0fc57b99b9163d919cc4a470b3065ab4cf1c947d.zip |
rfnoc: Use link_stream_manager's mgmt_portal for all mgmt packets
Change data transports to use the mgmt_portal from the
link_stream_manager. The initialization state of a device's EPIDs
needs to be shared amongst all the SEP users. Otherwise, an RX
transport may attempt to do a full reset of the SEP while TX is
streaming (for example).
TODO: The code contained here is not sufficient to handle multiple
links that can access the same SEPs, as those would have different
link_stream_managers, and thus, different mgmt_portal instances and
views of the SEP state.
Diffstat (limited to 'host/lib/include/uhdlib/rfnoc')
-rw-r--r-- | host/lib/include/uhdlib/rfnoc/chdr_ctrl_xport.hpp | 11 | ||||
-rw-r--r-- | host/lib/include/uhdlib/rfnoc/chdr_rx_data_xport.hpp | 22 | ||||
-rw-r--r-- | host/lib/include/uhdlib/rfnoc/chdr_tx_data_xport.hpp | 49 | ||||
-rw-r--r-- | host/lib/include/uhdlib/rfnoc/mb_iface.hpp | 8 | ||||
-rw-r--r-- | host/lib/include/uhdlib/rfnoc/mgmt_portal.hpp | 3 |
5 files changed, 36 insertions, 57 deletions
diff --git a/host/lib/include/uhdlib/rfnoc/chdr_ctrl_xport.hpp b/host/lib/include/uhdlib/rfnoc/chdr_ctrl_xport.hpp index 3365dcb23..9cf2f305f 100644 --- a/host/lib/include/uhdlib/rfnoc/chdr_ctrl_xport.hpp +++ b/host/lib/include/uhdlib/rfnoc/chdr_ctrl_xport.hpp @@ -45,8 +45,8 @@ public: size_t num_send_frames, size_t num_recv_frames) { - return std::make_shared<chdr_ctrl_xport>(io_srv, send_link, recv_link, my_epid, - num_send_frames, num_recv_frames); + return std::make_shared<chdr_ctrl_xport>( + io_srv, send_link, recv_link, my_epid, num_send_frames, num_recv_frames); } /*! @@ -111,6 +111,13 @@ public: */ void release_recv_buff(frame_buff::uptr buff); + /*! + * Get this xport's EPID + * + * \return the source EPID for this transport + */ + sep_id_t get_epid() const; + private: chdr_ctrl_xport(const chdr_ctrl_xport&) = delete; diff --git a/host/lib/include/uhdlib/rfnoc/chdr_rx_data_xport.hpp b/host/lib/include/uhdlib/rfnoc/chdr_rx_data_xport.hpp index 69dceebe1..41af766b4 100644 --- a/host/lib/include/uhdlib/rfnoc/chdr_rx_data_xport.hpp +++ b/host/lib/include/uhdlib/rfnoc/chdr_rx_data_xport.hpp @@ -125,7 +125,6 @@ public: * \param recv_link The recv link, already attached to the I/O service * \param send_link The send link, already attached to the I/O service * \param pkt_factory Factory to create packets with the desired chdr_w and endianness - * \param addrs Source and destination addresses * \param epids Source and destination endpoint IDs * \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 @@ -138,8 +137,8 @@ public: chdr_rx_data_xport(uhd::transport::io_service::sptr io_srv, uhd::transport::recv_link_if::sptr recv_link, uhd::transport::send_link_if::sptr send_link, + uhd::rfnoc::mgmt::mgmt_portal& mgmt_portal, const chdr::chdr_packet_factory& pkt_factory, - const uhd::rfnoc::sep_addr_pair_t& addrs, const uhd::rfnoc::sep_id_pair_t& epids, const uhd::rfnoc::sw_buff_t pyld_buff_fmt, const uhd::rfnoc::sw_buff_t mdata_buff_fmt, @@ -150,8 +149,6 @@ public: const bool lossy_xport) : _fc_state(epids), _fc_sender(pkt_factory, epids), _epid(epids.second) { - const sep_addr_t remote_sep_addr = addrs.first; - const sep_addr_t local_sep_addr = addrs.second; const sep_id_t remote_epid = epids.first; const sep_id_t local_epid = epids.second; @@ -198,22 +195,14 @@ public: 0, // num_send_frames 0); // num_recv_frames - // Create new temporary management portal with the transports used for this stream - // TODO: This is a bit excessive. Maybe we can pare down the functionality of the - // portal just for route setup purposes. Whatever we do, we *must* use xport in it - // though otherwise the transport will not behave correctly. - auto data_mgmt_portal = uhd::rfnoc::mgmt::mgmt_portal::make( - *ctrl_xport, pkt_factory, local_sep_addr, local_epid); - // Setup a route to the EPID // Note that this may be gratuitous--The endpoint may already have been set up - data_mgmt_portal->initialize_endpoint(*ctrl_xport, remote_sep_addr, remote_epid); - data_mgmt_portal->setup_local_route(*ctrl_xport, remote_epid); + mgmt_portal.setup_local_route(*ctrl_xport, remote_epid); // Initialize flow control - management portal sends a stream command // containing its requested flow control frequency, the rx transport // responds with a stream status containing its buffer capacity. - data_mgmt_portal->config_local_rx_stream_start(*ctrl_xport, + mgmt_portal.config_local_rx_stream_start(*ctrl_xport, remote_epid, lossy_xport, pyld_buff_fmt, @@ -221,7 +210,7 @@ public: fc_freq, fc_headroom); - data_mgmt_portal->config_local_rx_stream_commit(*ctrl_xport, remote_epid); + mgmt_portal.config_local_rx_stream_commit(*ctrl_xport, remote_epid); UHD_LOG_TRACE("XPORT::RX_DATA_XPORT", "Stream endpoint was configured with:" @@ -233,9 +222,8 @@ public: << "fc frequency bytes=" << fc_freq.bytes << ", packets=" << fc_freq.packets); - // We no longer need the control xport and mgmt_portal, release them so + // We no longer need the control xport, release it so // the control xport is no longer connected to the I/O service. - data_mgmt_portal.reset(); ctrl_xport.reset(); } diff --git a/host/lib/include/uhdlib/rfnoc/chdr_tx_data_xport.hpp b/host/lib/include/uhdlib/rfnoc/chdr_tx_data_xport.hpp index 62b811bf5..0fb0ab5d1 100644 --- a/host/lib/include/uhdlib/rfnoc/chdr_tx_data_xport.hpp +++ b/host/lib/include/uhdlib/rfnoc/chdr_tx_data_xport.hpp @@ -121,7 +121,6 @@ public: * \param recv_link The recv link, already attached to the I/O service * \param send_link The send link, already attached to the I/O service * \param pkt_factory Factory to create packets with the desired chdr_w and endianness - * \param addrs Source and destination addresses * \param epids Source and destination endpoint IDs * \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 @@ -132,8 +131,8 @@ public: chdr_tx_data_xport(uhd::transport::io_service::sptr io_srv, uhd::transport::recv_link_if::sptr recv_link, uhd::transport::send_link_if::sptr send_link, + uhd::rfnoc::mgmt::mgmt_portal& mgmt_portal, const chdr::chdr_packet_factory& pkt_factory, - const uhd::rfnoc::sep_addr_pair_t& addrs, const uhd::rfnoc::sep_id_pair_t& epids, const uhd::rfnoc::sw_buff_t pyld_buff_fmt, const uhd::rfnoc::sw_buff_t mdata_buff_fmt, @@ -142,8 +141,6 @@ public: const double fc_headroom_ratio) : _fc_sender(pkt_factory, epids), _epid(epids.first) { - const sep_addr_t remote_sep_addr = addrs.second; - const sep_addr_t local_sep_addr = addrs.first; const sep_id_t remote_epid = epids.second; const sep_id_t local_epid = epids.first; @@ -163,10 +160,8 @@ public: _configure_sep(io_srv, recv_link, send_link, - pkt_factory, - local_sep_addr, + mgmt_portal, local_epid, - remote_sep_addr, remote_epid, pyld_buff_fmt, mdata_buff_fmt); @@ -236,8 +231,8 @@ public: * \param info Information to include in the header * \return A pointer to the payload data area and the packet size in bytes */ - std::pair<void*, size_t> write_packet_header(buff_t::uptr& buff, - const packet_info_t& info) + std::pair<void*, size_t> write_packet_header( + buff_t::uptr& buff, const packet_info_t& info) { uint64_t tsf = 0; @@ -254,8 +249,7 @@ public: _send_packet->refresh(buff->data(), _send_header, tsf); _send_packet->update_payload_size(info.payload_bytes); - return std::make_pair( - _send_packet->get_payload_ptr(), + return std::make_pair(_send_packet->get_payload_ptr(), _send_packet->get_chdr_header().get_length()); } @@ -289,8 +283,8 @@ private: _recv_packet->get_payload_size() / sizeof(uint64_t), _recv_packet->conv_to_host<uint64_t>()); - _fc_state.update_dest_recv_count({strs.xfer_count_bytes, - static_cast<uint32_t>(strs.xfer_count_pkts)}); + _fc_state.update_dest_recv_count( + {strs.xfer_count_bytes, static_cast<uint32_t>(strs.xfer_count_pkts)}); // TODO: check strs status here and push into async msg queue @@ -339,10 +333,8 @@ private: void _configure_sep(uhd::transport::io_service::sptr io_srv, uhd::transport::recv_link_if::sptr recv_link, uhd::transport::send_link_if::sptr send_link, - const chdr::chdr_packet_factory& pkt_factory, - const uhd::rfnoc::sep_addr_t& local_sep_addr, + uhd::rfnoc::mgmt::mgmt_portal& mgmt_portal, const uhd::rfnoc::sep_id_t& local_epid, - const uhd::rfnoc::sep_addr_t& remote_sep_addr, const uhd::rfnoc::sep_id_t& remote_epid, const uhd::rfnoc::sw_buff_t pyld_buff_fmt, const uhd::rfnoc::sw_buff_t mdata_buff_fmt) @@ -356,23 +348,14 @@ private: 1, // num_send_frames 1); // num_recv_frames - // Create new temporary management portal with the transports used for this stream - // TODO: This is a bit excessive. Maybe we can pare down the functionality of the - // portal just for route setup purposes. Whatever we do, we *must* use xport in it - // though otherwise the transport will not behave correctly. - auto data_mgmt_portal = uhd::rfnoc::mgmt::mgmt_portal::make( - *ctrl_xport, pkt_factory, local_sep_addr, local_epid); - // Setup a route to the EPID - data_mgmt_portal->initialize_endpoint(*ctrl_xport, remote_sep_addr, remote_epid); - data_mgmt_portal->setup_local_route(*ctrl_xport, remote_epid); + mgmt_portal.setup_local_route(*ctrl_xport, remote_epid); - data_mgmt_portal->config_local_tx_stream( + mgmt_portal.config_local_tx_stream( *ctrl_xport, remote_epid, pyld_buff_fmt, mdata_buff_fmt); - // We no longer need the control xport and mgmt_portal, release them so + // We no longer need the control xport, release it so // the control xport is no longer connected to the I/O service. - data_mgmt_portal.reset(); ctrl_xport.reset(); } @@ -481,8 +464,7 @@ private: recv_io->release_recv_buff(std::move(buff)); - return {strs.capacity_bytes, - static_cast<uint32_t>(strs.capacity_pkts)}; + return {strs.capacity_bytes, static_cast<uint32_t>(strs.capacity_pkts)}; }; // Send a strc init to get the buffer size @@ -491,14 +473,13 @@ private: _fc_state.set_dest_capacity(capacity); UHD_LOG_TRACE("XPORT::TX_DATA_XPORT", - "Received strs initializing buffer capacity to " - << capacity.bytes << " bytes"); + "Received strs initializing buffer capacity to " << capacity.bytes + << " bytes"); // Calculate the requested fc_freq parameters uhd::rfnoc::stream_buff_params_t fc_freq = { static_cast<uint64_t>(std::ceil(double(capacity.bytes) * fc_freq_ratio)), - static_cast<uint32_t>( - std::ceil(double(capacity.packets) * fc_freq_ratio))}; + static_cast<uint32_t>(std::ceil(double(capacity.packets) * fc_freq_ratio))}; const size_t headroom_bytes = static_cast<uint64_t>(std::ceil(double(capacity.bytes) * fc_headroom_ratio)); diff --git a/host/lib/include/uhdlib/rfnoc/mb_iface.hpp b/host/lib/include/uhdlib/rfnoc/mb_iface.hpp index 840fcf709..1a06d44e2 100644 --- a/host/lib/include/uhdlib/rfnoc/mb_iface.hpp +++ b/host/lib/include/uhdlib/rfnoc/mb_iface.hpp @@ -99,7 +99,9 @@ public: * \param xport_args Transport configuration args * \return A CHDR RX data transport */ - virtual chdr_rx_data_xport::uptr make_rx_data_transport(const sep_addr_pair_t& addrs, + virtual chdr_rx_data_xport::uptr make_rx_data_transport( + mgmt::mgmt_portal& mgmt_portal, + const sep_addr_pair_t& addrs, const sep_id_pair_t& epids, const sw_buff_t pyld_buff_fmt, const sw_buff_t mdata_buff_fmt, @@ -116,7 +118,9 @@ public: * \param xport_args Transport configuration args * \return A CHDR TX data transport */ - virtual chdr_tx_data_xport::uptr make_tx_data_transport(const sep_addr_pair_t& addrs, + virtual chdr_tx_data_xport::uptr make_tx_data_transport( + mgmt::mgmt_portal& mgmt_portal, + const sep_addr_pair_t& addrs, const sep_id_pair_t& epids, const uhd::rfnoc::sw_buff_t pyld_buff_fmt, const uhd::rfnoc::sw_buff_t mdata_buff_fmt, diff --git a/host/lib/include/uhdlib/rfnoc/mgmt_portal.hpp b/host/lib/include/uhdlib/rfnoc/mgmt_portal.hpp index ac72931bf..850cee460 100644 --- a/host/lib/include/uhdlib/rfnoc/mgmt_portal.hpp +++ b/host/lib/include/uhdlib/rfnoc/mgmt_portal.hpp @@ -190,8 +190,7 @@ public: // static uptr make(chdr_ctrl_xport& xport, const chdr::chdr_packet_factory& pkt_factory, - sep_addr_t my_sep_addr, - sep_id_t my_epid); + sep_addr_t my_sep_addr); }; }}} // namespace uhd::rfnoc::mgmt |