aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosh Blum <josh@joshknows.com>2011-03-14 16:30:17 -0700
committerJosh Blum <josh@joshknows.com>2011-03-14 16:31:35 -0700
commitb3d6f86d38f8e7d9d06f8c057614fd034b78ef86 (patch)
tree97d1d2c009049389c5fa9891ee78d2c075703eb1
parentb0fefbe47c6f1ee8d396fc4530a9e879120062cc (diff)
downloaduhd-b3d6f86d38f8e7d9d06f8c057614fd034b78ef86.tar.gz
uhd-b3d6f86d38f8e7d9d06f8c057614fd034b78ef86.tar.bz2
uhd-b3d6f86d38f8e7d9d06f8c057614fd034b78ef86.zip
usrp2: fixed mtu discovery bug, was using the last failed value
-rw-r--r--host/lib/usrp/usrp2/usrp2_impl.cpp26
1 files changed, 11 insertions, 15 deletions
diff --git a/host/lib/usrp/usrp2/usrp2_impl.cpp b/host/lib/usrp/usrp2/usrp2_impl.cpp
index 0d0d582fa..96552929a 100644
--- a/host/lib/usrp/usrp2/usrp2_impl.cpp
+++ b/host/lib/usrp/usrp2/usrp2_impl.cpp
@@ -164,7 +164,6 @@ static mtu_result_t determine_mtu(const std::string &addr){
addr, BOOST_STRINGIZE(USRP2_UDP_CTRL_PORT)
);
- mtu_result_t mtu;
//The FPGA offers 4K buffers, and the user may manually request this.
//However, multiple simultaneous receives (2DSP slave + 2DSP master),
//require that buffering to be used internally, and this is a safe setting.
@@ -177,44 +176,41 @@ static mtu_result_t determine_mtu(const std::string &addr){
while (min_recv_mtu < max_recv_mtu){
- mtu.recv_mtu = (max_recv_mtu/2 + min_recv_mtu/2 + 3) & ~3;
+ size_t test_mtu = (max_recv_mtu/2 + min_recv_mtu/2 + 3) & ~3;
//std::cout << "recv_mtu " << mtu.recv_mtu << std::endl;
ctrl_data->id = htonl(USRP2_CTRL_ID_HOLLER_AT_ME_BRO);
ctrl_data->proto_ver = htonl(USRP2_FW_COMPAT_NUM);
- ctrl_data->data.echo_args.len = htonl(mtu.recv_mtu);
+ ctrl_data->data.echo_args.len = htonl(test_mtu);
udp_sock->send(boost::asio::buffer(buffer, sizeof(usrp2_ctrl_data_t)));
size_t len = udp_sock->recv(boost::asio::buffer(buffer), echo_timeout);
- if (len >= mtu.recv_mtu) min_recv_mtu = mtu.recv_mtu;
- else max_recv_mtu = mtu.recv_mtu - 4;
+ if (len >= test_mtu) min_recv_mtu = test_mtu;
+ else max_recv_mtu = test_mtu - 4;
}
while (min_send_mtu < max_send_mtu){
- mtu.send_mtu = (max_send_mtu/2 + min_send_mtu/2 + 3) & ~3;
+ size_t test_mtu = (max_send_mtu/2 + min_send_mtu/2 + 3) & ~3;
//std::cout << "send_mtu " << mtu.send_mtu << std::endl;
ctrl_data->id = htonl(USRP2_CTRL_ID_HOLLER_AT_ME_BRO);
ctrl_data->proto_ver = htonl(USRP2_FW_COMPAT_NUM);
ctrl_data->data.echo_args.len = htonl(sizeof(usrp2_ctrl_data_t));
- udp_sock->send(boost::asio::buffer(buffer, mtu.send_mtu));
+ udp_sock->send(boost::asio::buffer(buffer, test_mtu));
size_t len = udp_sock->recv(boost::asio::buffer(buffer), echo_timeout);
if (len >= sizeof(usrp2_ctrl_data_t)) len = ntohl(ctrl_data->data.echo_args.len);
- if (len >= mtu.send_mtu) min_send_mtu = mtu.send_mtu;
- else max_send_mtu = mtu.send_mtu - 4;
+ if (len >= test_mtu) min_send_mtu = test_mtu;
+ else max_send_mtu = test_mtu - 4;
}
- //don't trust the discovery if it lands slightly above default MTU
- if (mtu.recv_mtu > udp_simple::mtu and mtu.recv_mtu <= udp_simple::mtu + 16)
- mtu.recv_mtu = udp_simple::mtu;
- if (mtu.send_mtu > udp_simple::mtu and mtu.send_mtu <= udp_simple::mtu + 16)
- mtu.send_mtu = udp_simple::mtu;
-
+ mtu_result_t mtu;
+ mtu.recv_mtu = min_recv_mtu;
+ mtu.send_mtu = min_send_mtu;
return mtu;
}