aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosh Blum <josh@joshknows.com>2010-04-27 15:20:53 -0700
committerJosh Blum <josh@joshknows.com>2010-04-27 15:20:53 -0700
commit04dae4bf6b11b5aad383f95be6a77863a7c2f6ec (patch)
tree5d6bc7d4c22623a8917481da77630688e8ad67bb
parentb920557788fc5435915584bec6ab16a97d7c6090 (diff)
downloaduhd-04dae4bf6b11b5aad383f95be6a77863a7c2f6ec.tar.gz
uhd-04dae4bf6b11b5aad383f95be6a77863a7c2f6ec.tar.bz2
uhd-04dae4bf6b11b5aad383f95be6a77863a7c2f6ec.zip
setting size of buffers from device args
-rw-r--r--host/docs/usrp2.rst35
-rw-r--r--host/include/uhd/transport/udp_zero_copy.hpp8
-rw-r--r--host/lib/device.cpp11
-rw-r--r--host/lib/transport/udp_zero_copy_asio.cpp10
-rw-r--r--host/lib/usrp/usrp2/usrp2_impl.cpp14
-rw-r--r--host/utils/uhd_find_devices.cpp2
6 files changed, 57 insertions, 23 deletions
diff --git a/host/docs/usrp2.rst b/host/docs/usrp2.rst
index 092332442..f4c36fb27 100644
--- a/host/docs/usrp2.rst
+++ b/host/docs/usrp2.rst
@@ -126,3 +126,38 @@ MAC addresses, control packets, and fast-path settings.
**Monitor the host network traffic:**
Use wireshark to monitor packets sent to and received from the USRP2.
+
+------------------------------------------------------------------------
+Resize the send and receive buffers
+------------------------------------------------------------------------
+It may be useful increase the size of the socket buffers to
+move the burden of buffering samples into the kernel, or to
+buffer incoming samples faster than they can be processed.
+However, if you application cannot process samples fast enough,
+no amount of buffering can save you.
+
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+Device address params
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+To set the size of the buffers,
+the usrp2 will accept two optional parameters in the device address.
+Each parameter will accept a numeric value for the number of bytes.
+
+* recv_buff_size
+* send_buff_size
+
+Example, set the args string to the following:
+::
+
+ addr=192.168.10.2, recv_buff_size=100e6
+
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+OS specific notes
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+On linux, the maximum buffer sizes are capped by the sysctl values
+**net.core.rmem_max** and **net.core.wmem_max**.
+To change the maximum values, run the following commands:
+::
+
+ sudo sysctl -w net.core.rmem_max=<new value>
+ sudo sysctl -w net.core.wmem_max=<new value>
diff --git a/host/include/uhd/transport/udp_zero_copy.hpp b/host/include/uhd/transport/udp_zero_copy.hpp
index 117f24b2f..c74e6d7b7 100644
--- a/host/include/uhd/transport/udp_zero_copy.hpp
+++ b/host/include/uhd/transport/udp_zero_copy.hpp
@@ -54,18 +54,18 @@ public:
static sptr make(const std::string &addr, const std::string &port);
/*!
- * The the rx buffer size on the socket.
+ * 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 set_recv_buff_size(size_t num_bytes) = 0;
+ virtual size_t resize_recv_buff_size(size_t num_bytes) = 0;
/*!
- * The the tx buffer size on the socket.
+ * 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 set_send_buff_size(size_t num_bytes) = 0;
+ virtual size_t resize_send_buff_size(size_t num_bytes) = 0;
};
diff --git a/host/lib/device.cpp b/host/lib/device.cpp
index 706f64951..88bd2cff4 100644
--- a/host/lib/device.cpp
+++ b/host/lib/device.cpp
@@ -97,11 +97,6 @@ device::sptr device::make(const device_addr_t &hint, size_t which){
BOOST_FOREACH(const dev_fcn_reg_t &fcn, get_dev_fcn_regs()){
BOOST_FOREACH(device_addr_t dev_addr, fcn.get<0>()(hint)){
- //copy keys that were in hint but not in dev_addr
- //this way, we can pass additional transport arguments
- BOOST_FOREACH(const std::string &key, hint.keys()){
- if (not dev_addr.has_key(key)) dev_addr[key] = hint[key];
- }
//append the discovered address and its factory function
dev_addr_makers.push_back(dev_addr_make_t(dev_addr, fcn.get<1>()));
}
@@ -127,6 +122,12 @@ device::sptr device::make(const device_addr_t &hint, size_t which){
size_t dev_hash = hash_device_addr(dev_addr);
//std::cout << boost::format("Hash: %u") % dev_hash << std::endl;
+ //copy keys that were in hint but not in dev_addr
+ //this way, we can pass additional transport arguments
+ BOOST_FOREACH(const std::string &key, hint.keys()){
+ if (not dev_addr.has_key(key)) dev_addr[key] = hint[key];
+ }
+
//map device address hash to created devices
static uhd::dict<size_t, boost::weak_ptr<device> > hash_to_device;
diff --git a/host/lib/transport/udp_zero_copy_asio.cpp b/host/lib/transport/udp_zero_copy_asio.cpp
index 315ae49d2..09386a60c 100644
--- a/host/lib/transport/udp_zero_copy_asio.cpp
+++ b/host/lib/transport/udp_zero_copy_asio.cpp
@@ -103,8 +103,8 @@ public:
managed_send_buffer::sptr get_send_buff(void);
//resize
- size_t set_recv_buff_size(size_t num_bytes);
- size_t set_send_buff_size(size_t num_bytes);
+ size_t resize_recv_buff_size(size_t num_bytes);
+ size_t resize_send_buff_size(size_t num_bytes);
private:
boost::asio::ip::udp::socket *_socket;
@@ -157,16 +157,14 @@ managed_send_buffer::sptr udp_zero_copy_impl::get_send_buff(void){
);
}
-//sysctl -w net.core.rmem_max=VALUE
-size_t udp_zero_copy_impl::set_recv_buff_size(size_t num_bytes){
+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();
}
-//sysctl -w net.core.wmem_max=VALUE
-size_t udp_zero_copy_impl::set_send_buff_size(size_t num_bytes){
+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);
diff --git a/host/lib/usrp/usrp2/usrp2_impl.cpp b/host/lib/usrp/usrp2/usrp2_impl.cpp
index ffcdbb43d..2b974fb9b 100644
--- a/host/lib/usrp/usrp2/usrp2_impl.cpp
+++ b/host/lib/usrp/usrp2/usrp2_impl.cpp
@@ -51,7 +51,7 @@ uhd::device_addrs_t usrp2::find(const device_addr_t &hint){
if (if_addrs.inet == asio::ip::address_v4::loopback().to_string()) continue;
//create a new hint with this broadcast address
- device_addr_t new_hint = hint;
+ device_addr_t new_hint;
new_hint["addr"] = if_addrs.bcast;
//call discover with the new hint and append results
@@ -121,9 +121,9 @@ device::sptr usrp2::make(const device_addr_t &device_addr){
//resize the recv data transport buffers
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->set_recv_buff_size(num_byes);
- std::cout << boost::format(
- "Target recv buffer size: %d"
+ 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;
}
@@ -131,9 +131,9 @@ device::sptr usrp2::make(const device_addr_t &device_addr){
//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->set_send_buff_size(num_byes);
- std::cout << boost::format(
- "Target send buffer size: %d"
+ 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;
}
diff --git a/host/utils/uhd_find_devices.cpp b/host/utils/uhd_find_devices.cpp
index 8222dc1f4..69e550fd4 100644
--- a/host/utils/uhd_find_devices.cpp
+++ b/host/utils/uhd_find_devices.cpp
@@ -53,7 +53,7 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
std::cout << "-- UHD Device " << i << std::endl;
std::cout << "--------------------------------------------------" << std::endl;
std::cout << device_addrs[i].to_string() << std::endl << std::endl;
- uhd::device::make(device_addrs[i]); //test make
+ //uhd::device::make(device_addrs[i]); //test make
}
return 0;