diff options
Diffstat (limited to 'host/lib')
| -rw-r--r-- | host/lib/rfnoc/ctrl_iface.cpp | 4 | ||||
| -rw-r--r-- | host/lib/usrp/mpmd/mpmd_xport_ctrl_udp.cpp | 24 | ||||
| -rw-r--r-- | host/lib/usrp/x300/x300_impl.cpp | 14 | 
3 files changed, 23 insertions, 19 deletions
| diff --git a/host/lib/rfnoc/ctrl_iface.cpp b/host/lib/rfnoc/ctrl_iface.cpp index e0fc03eab..a441ffbc3 100644 --- a/host/lib/rfnoc/ctrl_iface.cpp +++ b/host/lib/rfnoc/ctrl_iface.cpp @@ -35,9 +35,9 @@ public:          : _xports(xports)          , _name(name)          , _seq_out(0) -        , _max_outstanding_acks( -              uhd::rfnoc::CMD_FIFO_SIZE / uhd::rfnoc::MAX_CMD_PKT_SIZE) +        , _max_outstanding_acks(xports.recv->get_num_recv_frames())      { +          UHD_ASSERT_THROW(bool(_xports.send));          UHD_ASSERT_THROW(bool(_xports.recv));          // Flush the response transport in case we have something over: diff --git a/host/lib/usrp/mpmd/mpmd_xport_ctrl_udp.cpp b/host/lib/usrp/mpmd/mpmd_xport_ctrl_udp.cpp index cc0a610a3..bdb32b8f6 100644 --- a/host/lib/usrp/mpmd/mpmd_xport_ctrl_udp.cpp +++ b/host/lib/usrp/mpmd/mpmd_xport_ctrl_udp.cpp @@ -17,15 +17,6 @@ using namespace uhd::mpmd::xport;  namespace { -#if defined(UHD_PLATFORM_MACOS) || defined(UHD_PLATFORM_BSD) -//! Size of the host-side socket buffer for RX -const size_t MPMD_RX_SW_BUFF_SIZE_ETH = 0x100000; // 1Mib -#elif defined(UHD_PLATFORM_LINUX) || defined(UHD_PLATFORM_WIN32) -//! Size of the host-side socket buffer for RX -// For an ~8k frame size any size >32MiB is just wasted buffer space -const size_t MPMD_RX_SW_BUFF_SIZE_ETH = 0x2000000; // 32 MiB -#endif -  //! Maximum CHDR packet size in bytes  const size_t MPMD_10GE_DATA_FRAME_MAX_SIZE = 4000; @@ -36,7 +27,7 @@ const size_t MPMD_10GE_ASYNCMSG_FRAME_MAX_SIZE = 1472;  const size_t MPMD_ETH_NUM_FRAMES = 32;  //! -const double MPMD_BUFFER_FILL_RATE = 20.0e-3; // s +const double MPMD_BUFFER_DEPTH = 50.0e-3; // s  //! For MTU discovery, the time we wait for a packet before calling it  // oversized (seconds).  const double MPMD_MTU_DISCOVERY_TIMEOUT = 0.02; @@ -176,10 +167,6 @@ uhd::both_xports_t mpmd_xport_ctrl_udp::make_transport(  {      auto xport_args = xport_args_; -    if (xport_type == usrp::device3_impl::RX_DATA -        and not xport_args.has_key("recv_buff_size")) { -        xport_args["recv_buff_size"] = std::to_string(MPMD_RX_SW_BUFF_SIZE_ETH); -    }      size_t link_speed = MAX_RATE_1GIGE;      if (xport_info.count("link_speed") == 0) {          UHD_LOG_WARNING("MPMD", @@ -191,10 +178,15 @@ uhd::both_xports_t mpmd_xport_ctrl_udp::make_transport(      }      transport::zero_copy_xport_params default_buff_args;      // Create actual UDP transport +    default_buff_args.num_send_frames = 1; +    default_buff_args.num_recv_frames = +        xport_type == usrp::device3_impl::CTRL ? +        (uhd::rfnoc::CMD_FIFO_SIZE / uhd::rfnoc::MAX_CMD_PKT_SIZE) : +        1;      default_buff_args.recv_frame_size =          xport_args.cast<size_t>("recv_frame_size", get_mtu(uhd::RX_DIRECTION)); -    default_buff_args.recv_buff_size = link_speed * MPMD_BUFFER_FILL_RATE; -    default_buff_args.send_buff_size = link_speed * MPMD_BUFFER_FILL_RATE; +    default_buff_args.recv_buff_size = link_speed * MPMD_BUFFER_DEPTH; +    default_buff_args.send_buff_size = link_speed * MPMD_BUFFER_DEPTH;      if (xport_type == usrp::device3_impl::ASYNC_MSG) {          default_buff_args.send_frame_size = MPMD_10GE_ASYNCMSG_FRAME_MAX_SIZE;      } else { diff --git a/host/lib/usrp/x300/x300_impl.cpp b/host/lib/usrp/x300/x300_impl.cpp index d912d66c3..24ce7abf4 100644 --- a/host/lib/usrp/x300/x300_impl.cpp +++ b/host/lib/usrp/x300/x300_impl.cpp @@ -1372,12 +1372,24 @@ uhd::both_xports_t x300_impl::make_transport(const uhd::sid_t& address,              std::min(system_max_send_frame_size, x300::ETH_MSG_FRAME_SIZE);          default_buff_args.recv_frame_size =              std::min(system_max_recv_frame_size, x300::ETH_MSG_FRAME_SIZE); +        // Buffering is done in the socket buffers, so size them relative to +        // the link rate          default_buff_args.send_buff_size = conn.link_rate / 50; // 20ms          default_buff_args.recv_buff_size = std::max(conn.link_rate / 50,              x300::ETH_MSG_NUM_FRAMES                  * x300::ETH_MSG_FRAME_SIZE); // enough to hold greater of 20ms or number                                               // of msg frames -        if (xport_type == TX_DATA) { +        // There is no need for more than 1 send and recv frame since the +        // buffering is done in the socket buffers +        default_buff_args.num_send_frames = 1; +        default_buff_args.num_recv_frames = 1; +        if (xport_type == CTRL) { +            // Increasing number of recv frames here because ctrl_iface uses it +            // to determine how many control packets can be in flight before it +            // must wait for an ACK +            default_buff_args.num_recv_frames =  +                uhd::rfnoc::CMD_FIFO_SIZE / uhd::rfnoc::MAX_CMD_PKT_SIZE; +        } else if (xport_type == TX_DATA) {              size_t default_frame_size = conn.link_rate == x300::MAX_RATE_1GIGE                                              ? x300::GE_DATA_FRAME_SEND_SIZE                                              : x300::XGE_DATA_FRAME_SEND_SIZE; | 
