From 7d7a7e4069ce78a946762967530c121142db112b Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Thu, 8 Sep 2011 08:04:39 -0700 Subject: udp: added check_registry_for_fast_send_threshold to non-wsa transport --- host/lib/transport/udp_zero_copy.cpp | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'host/lib') diff --git a/host/lib/transport/udp_zero_copy.cpp b/host/lib/transport/udp_zero_copy.cpp index bc73b96a8..e43a96dd0 100644 --- a/host/lib/transport/udp_zero_copy.cpp +++ b/host/lib/transport/udp_zero_copy.cpp @@ -32,6 +32,32 @@ namespace asio = boost::asio; //A reasonable number of frames for send/recv and async/sync static const size_t DEFAULT_NUM_FRAMES = 32; +/*********************************************************************** + * Check registry for correct fast-path setting (windows only) + **********************************************************************/ +#ifdef UHD_PLATFORM_WIN32 +#include //CRegKey +static void check_registry_for_fast_send_threshold(const size_t mtu){ + static bool warned = false; + if (warned) return; //only allow one printed warning per process + + CRegKey reg_key; + DWORD threshold = 1024; //system default when threshold is not specified + if ( + reg_key.Open(HKEY_LOCAL_MACHINE, "System\\CurrentControlSet\\Services\\AFD\\Parameters", KEY_READ) != ERROR_SUCCESS or + reg_key.QueryDWORDValue("FastSendDatagramThreshold", threshold) != ERROR_SUCCESS or threshold < mtu + ){ + UHD_MSG(warning) << boost::format( + "The MTU (%d) is larger than the FastSendDatagramThreshold (%d)!\n" + "This will negatively affect the transmit performance.\n" + "See the transport application notes for more detail.\n" + ) % mtu % threshold << std::endl; + warned = true; + } + reg_key.Close(); +} +#endif /*UHD_PLATFORM_WIN32*/ + /*********************************************************************** * Reusable managed receiver buffer: * - Initialize with memory and a release callback. @@ -123,6 +149,10 @@ public: { UHD_LOG << boost::format("Creating udp transport for %s %s") % addr % port << std::endl; + #ifdef UHD_PLATFORM_WIN32 + check_registry_for_fast_send_threshold(this->get_send_frame_size()); + #endif /*UHD_PLATFORM_WIN32*/ + //resolve the address asio::ip::udp::resolver resolver(_io_service); asio::ip::udp::resolver::query query(asio::ip::udp::v4(), addr, port); -- cgit v1.2.3