diff options
| -rw-r--r-- | host/include/uhd/transport/udp_zero_copy.hpp | 24 | ||||
| -rw-r--r-- | host/lib/transport/udp_zero_copy_asio.cpp | 57 | ||||
| -rw-r--r-- | host/lib/usrp/usrp2/usrp2_impl.cpp | 32 | 
3 files changed, 59 insertions, 54 deletions
| diff --git a/host/include/uhd/transport/udp_zero_copy.hpp b/host/include/uhd/transport/udp_zero_copy.hpp index c74e6d7b7..525606a9f 100644 --- a/host/include/uhd/transport/udp_zero_copy.hpp +++ b/host/include/uhd/transport/udp_zero_copy.hpp @@ -50,23 +50,15 @@ public:       *       * \param addr a string representing the destination address       * \param port a string representing the destination port +     * \param recv_buff_size size in bytes for the recv buffer, 0 for automatic +     * \param send_buff_size size in bytes for the send buffer, 0 for automatic       */ -    static sptr make(const std::string &addr, const std::string &port); - -    /*! -     * Resize the the rx buffer size on the socket. -     * \param num_bytes the new size for the socket buffer -     * \return the actual number of bytes allowed by the OS -     */ -    virtual size_t resize_recv_buff_size(size_t num_bytes) = 0; - -    /*! -     * Resize the the tx buffer size on the socket. -     * \param num_bytes the new size for the socket buffer -     * \return the actual number of bytes allowed by the OS -     */ -    virtual size_t resize_send_buff_size(size_t num_bytes) = 0; - +    static sptr make( +        const std::string &addr, +        const std::string &port, +        size_t recv_buff_size = 0, +        size_t send_buff_size = 0 +    );  };  }} //namespace diff --git a/host/lib/transport/udp_zero_copy_asio.cpp b/host/lib/transport/udp_zero_copy_asio.cpp index 09386a60c..ee44803f4 100644 --- a/host/lib/transport/udp_zero_copy_asio.cpp +++ b/host/lib/transport/udp_zero_copy_asio.cpp @@ -19,6 +19,8 @@  #include <boost/cstdint.hpp>  #include <boost/asio.hpp>  #include <boost/thread.hpp> +#include <boost/format.hpp> +#include <iostream>  using namespace uhd::transport; @@ -103,8 +105,18 @@ public:      managed_send_buffer::sptr get_send_buff(void);      //resize -    size_t resize_recv_buff_size(size_t num_bytes); -    size_t resize_send_buff_size(size_t num_bytes); +    size_t resize_recv_buff(size_t num_bytes){ +        boost::asio::socket_base::receive_buffer_size option(num_bytes); +        _socket->set_option(option); +        _socket->get_option(option); +        return option.value(); +    } +    size_t resize_send_buff(size_t num_bytes){ +        boost::asio::socket_base::send_buffer_size option(num_bytes); +        _socket->set_option(option); +        _socket->get_option(option); +        return option.value(); +    }  private:      boost::asio::ip::udp::socket   *_socket; @@ -157,25 +169,34 @@ managed_send_buffer::sptr udp_zero_copy_impl::get_send_buff(void){      );  } -size_t udp_zero_copy_impl::resize_recv_buff_size(size_t num_bytes){ -    boost::asio::socket_base::receive_buffer_size option(num_bytes); -    _socket->set_option(option); -    _socket->get_option(option); -    return option.value(); -} - -size_t udp_zero_copy_impl::resize_send_buff_size(size_t num_bytes){ -    boost::asio::socket_base::send_buffer_size option(num_bytes); -    _socket->set_option(option); -    _socket->get_option(option); -    return option.value(); -} -  /***********************************************************************   * UDP zero copy make function   **********************************************************************/  udp_zero_copy::sptr udp_zero_copy::make( -    const std::string &addr, const std::string &port +    const std::string &addr, +    const std::string &port, +    size_t recv_buff_size, +    size_t send_buff_size  ){ -    return sptr(new udp_zero_copy_impl(addr, port)); +    boost::shared_ptr<udp_zero_copy_impl> udp_trans(new udp_zero_copy_impl(addr, port)); + +    //resize the recv buffer if size was provided +    if (recv_buff_size > 0){ +        size_t actual_bytes = udp_trans->resize_recv_buff(recv_buff_size); +        if (recv_buff_size != actual_bytes) std::cout << boost::format( +            "Target recv buffer size: %d\n" +            "Actual recv byffer size: %d" +        ) % recv_buff_size % actual_bytes << std::endl; +    } + +    //resize the send buffer if size was provided +    if (send_buff_size > 0){ +        size_t actual_bytes = udp_trans->resize_send_buff(send_buff_size); +        if (send_buff_size != actual_bytes) std::cout << boost::format( +            "Target send buffer size: %d\n" +            "Actual send byffer size: %d" +        ) % send_buff_size % actual_bytes << std::endl; +    } + +    return udp_trans;  } diff --git a/host/lib/usrp/usrp2/usrp2_impl.cpp b/host/lib/usrp/usrp2/usrp2_impl.cpp index 2b974fb9b..1dde8c054 100644 --- a/host/lib/usrp/usrp2/usrp2_impl.cpp +++ b/host/lib/usrp/usrp2/usrp2_impl.cpp @@ -113,31 +113,23 @@ device::sptr usrp2::make(const device_addr_t &device_addr){          device_addr["addr"], num2str(USRP2_UDP_CTRL_PORT)      ); -    //create a data transport -    udp_zero_copy::sptr data_transport = udp_zero_copy::make( -        device_addr["addr"], num2str(USRP2_UDP_DATA_PORT) -    ); - -    //resize the recv data transport buffers +    //extract the receive and send buffer sizes +    size_t recv_buff_size = 0, send_buff_size= 0 ;      if (device_addr.has_key("recv_buff_size")){ -        size_t num_byes = size_t(boost::lexical_cast<double>(device_addr["recv_buff_size"])); -        size_t actual_bytes = data_transport->resize_recv_buff_size(num_byes); -        if (num_byes != actual_bytes) std::cout << boost::format( -            "Target recv buffer size: %d\n" -            "Actual recv byffer size: %d" -        ) % num_byes % actual_bytes << std::endl; +        recv_buff_size = size_t(boost::lexical_cast<double>(device_addr["recv_buff_size"]));      } - -    //resize the send data transport buffers      if (device_addr.has_key("send_buff_size")){ -        size_t num_byes = size_t(boost::lexical_cast<double>(device_addr["send_buff_size"])); -        size_t actual_bytes = data_transport->resize_send_buff_size(num_byes); -        if (num_byes != actual_bytes) std::cout << boost::format( -            "Target send buffer size: %d\n" -            "Actual send byffer size: %d" -        ) % num_byes % actual_bytes << std::endl; +        send_buff_size = size_t(boost::lexical_cast<double>(device_addr["send_buff_size"]));      } +    //create a data transport +    udp_zero_copy::sptr data_transport = udp_zero_copy::make( +        device_addr["addr"], +        num2str(USRP2_UDP_DATA_PORT), +        recv_buff_size, +        send_buff_size +    ); +      //create the usrp2 implementation guts      return device::sptr(          new usrp2_impl(ctrl_transport, data_transport) | 
