diff options
author | Alex Williams <alex.williams@ni.com> | 2019-08-09 11:18:35 -0700 |
---|---|---|
committer | Martin Braun <martin.braun@ettus.com> | 2019-11-26 11:49:38 -0800 |
commit | 01284980b1d7227f1c11496d2be939bb4b23adb1 (patch) | |
tree | 3bf21c2ece1296640a8854ea229960e5c937ebdd | |
parent | af5b2b5e778ead57b0fe9e72561227f1ebbbfc42 (diff) | |
download | uhd-01284980b1d7227f1c11496d2be939bb4b23adb1.tar.gz uhd-01284980b1d7227f1c11496d2be939bb4b23adb1.tar.bz2 uhd-01284980b1d7227f1c11496d2be939bb4b23adb1.zip |
transport: Add modeling of physical adapters
Now link instances must have the ability to report the corresponding
physical adapter that is used for the local side of the link. This
information can be used to help identify when multiple links share
the same adapter.
-rw-r--r-- | host/include/uhd/transport/adapter_id.hpp | 21 | ||||
-rw-r--r-- | host/lib/include/uhdlib/transport/adapter.hpp | 33 | ||||
-rw-r--r-- | host/lib/include/uhdlib/transport/adapter_info.hpp | 30 | ||||
-rw-r--r-- | host/lib/include/uhdlib/transport/link_if.hpp | 11 | ||||
-rw-r--r-- | host/lib/include/uhdlib/transport/udp_boost_asio_link.hpp | 42 | ||||
-rw-r--r-- | host/lib/transport/CMakeLists.txt | 1 | ||||
-rw-r--r-- | host/lib/transport/adapter.cpp | 24 | ||||
-rw-r--r-- | host/lib/transport/udp_boost_asio_link.cpp | 13 | ||||
-rw-r--r-- | host/tests/common/mock_link.hpp | 10 |
9 files changed, 180 insertions, 5 deletions
diff --git a/host/include/uhd/transport/adapter_id.hpp b/host/include/uhd/transport/adapter_id.hpp new file mode 100644 index 000000000..02041bc4c --- /dev/null +++ b/host/include/uhd/transport/adapter_id.hpp @@ -0,0 +1,21 @@ +// +// Copyright 2019 Ettus Research, a National Instruments Brand +// +// SPDX-License-Identifier: GPL-3.0-or-later +// + +#ifndef INCLUDED_UHD_TRANSPORT_ADAPTER_ID_HPP +#define INCLUDED_UHD_TRANSPORT_ADAPTER_ID_HPP + +#include <cstddef> + +namespace uhd { namespace transport { + +//! Host transport adapter ID +using adapter_id_t = size_t; +//! NULL/unassigned host transport adapter ID +static const adapter_id_t NULL_ADAPTER_ID = 0; + +}} // namespace uhd::transport + +#endif /* INCLUDED_UHD_TRANSPORT_ADAPTER_ID_HPP */ diff --git a/host/lib/include/uhdlib/transport/adapter.hpp b/host/lib/include/uhdlib/transport/adapter.hpp new file mode 100644 index 000000000..3d6d49575 --- /dev/null +++ b/host/lib/include/uhdlib/transport/adapter.hpp @@ -0,0 +1,33 @@ +// +// Copyright 2019 Ettus Research, a National Instruments Brand +// +// SPDX-License-Identifier: GPL-3.0-or-later +// + +#ifndef INCLUDED_UHDLIB_TRANSPORT_ADAPTER_HPP +#define INCLUDED_UHDLIB_TRANSPORT_ADAPTER_HPP + +#include <uhdlib/transport/adapter_info.hpp> +#include <uhdlib/transport/udp_boost_asio_link.hpp> + +namespace uhd { namespace transport { + +class adapter_ctx : uhd::noncopyable +{ +public: + UHD_SINGLETON_FCN(adapter_ctx, get); + + ~adapter_ctx() = default; + + adapter_id_t register_adapter(adapter_info& info); + +private: + adapter_ctx() = default; + + std::mutex _mutex; + std::unordered_map<std::string, adapter_id_t> _id_map; +}; + +}} // namespace uhd::transport + +#endif /* INCLUDED_UHDLIB_TRANSPORT_ADAPTER_HPP */ diff --git a/host/lib/include/uhdlib/transport/adapter_info.hpp b/host/lib/include/uhdlib/transport/adapter_info.hpp new file mode 100644 index 000000000..a21551e96 --- /dev/null +++ b/host/lib/include/uhdlib/transport/adapter_info.hpp @@ -0,0 +1,30 @@ +// +// Copyright 2019 Ettus Research, a National Instruments Brand +// +// SPDX-License-Identifier: GPL-3.0-or-later +// + +#ifndef INCLUDED_UHDLIB_TRANSPORT_ADAPTER_INFO_HPP +#define INCLUDED_UHDLIB_TRANSPORT_ADAPTER_INFO_HPP + +#include <uhd/transport/adapter_id.hpp> +#include <uhd/utils/noncopyable.hpp> +#include <uhd/utils/static.hpp> +#include <unordered_map> +#include <memory> +#include <mutex> + +namespace uhd { namespace transport { + +class adapter_info +{ +public: + /*! Returns a unique string identifying the adapter + * String contents are not API. Only uniqueness is guaranteed. + */ + virtual std::string to_string() = 0; +}; + +}} // namespace uhd::transport + +#endif /* INCLUDED_UHDLIB_TRANSPORT_ADAPTER_INFO_HPP */ diff --git a/host/lib/include/uhdlib/transport/link_if.hpp b/host/lib/include/uhdlib/transport/link_if.hpp index 60376e571..6f533603e 100644 --- a/host/lib/include/uhdlib/transport/link_if.hpp +++ b/host/lib/include/uhdlib/transport/link_if.hpp @@ -4,6 +4,7 @@ // SPDX-License-Identifier: GPL-3.0-or-later // +#include <uhd/transport/adapter_id.hpp> #include <uhd/transport/frame_buff.hpp> #include <memory> @@ -51,6 +52,11 @@ public: */ virtual void release_send_buff(frame_buff::uptr buff) = 0; + /*! + * Get the physical adapter id used for this link + */ + virtual adapter_id_t get_send_adapter_id() const = 0; + send_link_if() = default; send_link_if(const send_link_if&) = delete; send_link_if& operator=(const send_link_if&) = delete; @@ -91,6 +97,11 @@ public: */ virtual void release_recv_buff(frame_buff::uptr buff) = 0; + /*! + * Get the physical adapter ID used for this link + */ + virtual adapter_id_t get_recv_adapter_id() const = 0; + recv_link_if() = default; recv_link_if(const recv_link_if&) = delete; recv_link_if& operator=(const recv_link_if&) = delete; diff --git a/host/lib/include/uhdlib/transport/udp_boost_asio_link.hpp b/host/lib/include/uhdlib/transport/udp_boost_asio_link.hpp index 2e6f731c9..88ad6e518 100644 --- a/host/lib/include/uhdlib/transport/udp_boost_asio_link.hpp +++ b/host/lib/include/uhdlib/transport/udp_boost_asio_link.hpp @@ -10,6 +10,7 @@ #include <uhd/config.hpp> #include <uhd/transport/buffer_pool.hpp> #include <uhd/types/device_addr.hpp> +#include <uhdlib/transport/adapter_info.hpp> #include <uhdlib/transport/link_base.hpp> #include <uhdlib/transport/links.hpp> #include <uhdlib/transport/udp_common.hpp> @@ -28,6 +29,29 @@ public: } }; +class udp_boost_asio_adapter_info : public adapter_info +{ +public: + udp_boost_asio_adapter_info(boost::asio::ip::udp::socket& s) + : _src_ip(s.local_endpoint().address()) {} + + ~udp_boost_asio_adapter_info() {} + + std::string to_string() + { + return std::string("Ethernet(kernel):") + _src_ip.to_string(); + } + + bool operator==(const udp_boost_asio_adapter_info& rhs) const + { + return (_src_ip == rhs._src_ip); + } + +private: + // Use source IP addr + boost::asio::ip::address _src_ip; +}; + class udp_boost_asio_link : public recv_link_base<udp_boost_asio_link>, public send_link_base<udp_boost_asio_link> { @@ -62,6 +86,22 @@ public: */ std::string get_local_addr() const; + /*! + * Get the physical adapter ID used for this link + */ + adapter_id_t get_send_adapter_id() const + { + return _adapter_id; + } + + /*! + * Get the physical adapter ID used for this link + */ + adapter_id_t get_recv_adapter_id() const + { + return _adapter_id; + } + private: using recv_link_base_t = recv_link_base<udp_boost_asio_link>; using send_link_base_t = send_link_base<udp_boost_asio_link>; @@ -108,8 +148,10 @@ private: boost::asio::io_service _io_service; std::shared_ptr<boost::asio::ip::udp::socket> _socket; int _sock_fd; + adapter_id_t _adapter_id; }; }} // namespace uhd::transport + #endif /* INCLUDED_UHD_TRANSPORT_UDP_BOOST_ASIO_LINK_HPP */ diff --git a/host/lib/transport/CMakeLists.txt b/host/lib/transport/CMakeLists.txt index 003beeee4..dd83164bf 100644 --- a/host/lib/transport/CMakeLists.txt +++ b/host/lib/transport/CMakeLists.txt @@ -124,6 +124,7 @@ LIBUHD_APPEND_SOURCES( ${CMAKE_CURRENT_SOURCE_DIR}/muxed_zero_copy_if.cpp ${CMAKE_CURRENT_SOURCE_DIR}/zero_copy_flow_ctrl.cpp ${CMAKE_CURRENT_SOURCE_DIR}/inline_io_service.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/adapter.cpp ) if(ENABLE_X300) diff --git a/host/lib/transport/adapter.cpp b/host/lib/transport/adapter.cpp new file mode 100644 index 000000000..247b33868 --- /dev/null +++ b/host/lib/transport/adapter.cpp @@ -0,0 +1,24 @@ +// +// Copyright 2019 Ettus Research, a National Instruments Brand +// +// SPDX-License-Identifier: GPL-3.0-or-later +// + +#include <uhd/exception.hpp> +#include <uhdlib/transport/adapter.hpp> + +using namespace uhd::transport; + +adapter_id_t adapter_ctx::register_adapter(adapter_info& info) +{ + std::lock_guard<std::mutex> lock(_mutex); + auto key = info.to_string(); + if (_id_map.count(key) > 0) { + return _id_map.at(key); + } else { + adapter_id_t id = _id_map.size() + 1; + _id_map.emplace(std::make_pair(key, id)); + return id; + } +} + diff --git a/host/lib/transport/udp_boost_asio_link.cpp b/host/lib/transport/udp_boost_asio_link.cpp index 95d68ba91..2d4a4f640 100644 --- a/host/lib/transport/udp_boost_asio_link.cpp +++ b/host/lib/transport/udp_boost_asio_link.cpp @@ -5,6 +5,7 @@ // #include <uhd/utils/log.hpp> +#include <uhdlib/transport/adapter.hpp> #include <uhdlib/transport/udp_boost_asio_link.hpp> #include <boost/format.hpp> @@ -39,10 +40,13 @@ udp_boost_asio_link::udp_boost_asio_link( _socket = open_udp_socket(addr, port, _io_service); _sock_fd = _socket->native_handle(); - UHD_LOGGER_TRACE("UDP") - << boost::format("Created UDP link to %s:%s") % addr % port; + auto info = udp_boost_asio_adapter_info(*_socket); + auto& ctx = adapter_ctx::get(); + _adapter_id = ctx.register_adapter(info); + + UHD_LOGGER_TRACE("UDP") << boost::format("Created UDP link to %s:%s") % addr % port; UHD_LOGGER_TRACE("UDP") << boost::format("Local UDP socket endpoint: %s:%s") - % get_local_addr() % get_local_port(); + % get_local_addr() % get_local_port(); } uint16_t udp_boost_asio_link::get_local_port() const @@ -91,8 +95,7 @@ udp_boost_asio_link::sptr udp_boost_asio_link::make(const std::string& addr, } #endif - udp_boost_asio_link::sptr link( - new udp_boost_asio_link(addr, port, params)); + udp_boost_asio_link::sptr link(new udp_boost_asio_link(addr, port, params)); // call the helper to resize send and recv buffers diff --git a/host/tests/common/mock_link.hpp b/host/tests/common/mock_link.hpp index 73a65916c..a62aa49c7 100644 --- a/host/tests/common/mock_link.hpp +++ b/host/tests/common/mock_link.hpp @@ -128,6 +128,11 @@ public: _simulate_io_timeout = simulate_io_timeout; } + adapter_id_t get_send_adapter_id() const + { + return NULL_ADAPTER_ID; + } + private: // Friend declaration to allow base class to call private methods friend base_t; @@ -223,6 +228,11 @@ public: _rx_lens.push_back(len); } + adapter_id_t get_recv_adapter_id() const + { + return NULL_ADAPTER_ID; + } + private: // Friend declaration to allow base class to call private methods friend base_t; |