aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--host/include/uhd/transport/adapter_id.hpp21
-rw-r--r--host/lib/include/uhdlib/transport/adapter.hpp33
-rw-r--r--host/lib/include/uhdlib/transport/adapter_info.hpp30
-rw-r--r--host/lib/include/uhdlib/transport/link_if.hpp11
-rw-r--r--host/lib/include/uhdlib/transport/udp_boost_asio_link.hpp42
-rw-r--r--host/lib/transport/CMakeLists.txt1
-rw-r--r--host/lib/transport/adapter.cpp24
-rw-r--r--host/lib/transport/udp_boost_asio_link.cpp13
-rw-r--r--host/tests/common/mock_link.hpp10
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;