diff options
Diffstat (limited to 'host/lib/transport/dpdk_zero_copy.cpp')
-rw-r--r-- | host/lib/transport/dpdk_zero_copy.cpp | 286 |
1 files changed, 143 insertions, 143 deletions
diff --git a/host/lib/transport/dpdk_zero_copy.cpp b/host/lib/transport/dpdk_zero_copy.cpp index 2e95efd81..51c9b9dba 100644 --- a/host/lib/transport/dpdk_zero_copy.cpp +++ b/host/lib/transport/dpdk_zero_copy.cpp @@ -6,106 +6,104 @@ #include "dpdk_zero_copy.hpp" #include <uhd/config.hpp> -#include <uhd/utils/static.hpp> #include <uhd/utils/log.hpp> +#include <uhd/utils/static.hpp> #include <uhdlib/transport/uhd-dpdk.h> -#include <boost/make_shared.hpp> +#include <arpa/inet.h> #include <sys/syslog.h> +#include <boost/make_shared.hpp> #include <stack> -#include <arpa/inet.h> namespace uhd { namespace transport { namespace { - static constexpr uint64_t USEC = 1000000; - // FIXME: Make configurable and have uhd-dpdk library track buffer sizes - static constexpr size_t DEFAULT_FRAME_SIZE = 8000; +static constexpr uint64_t USEC = 1000000; +// FIXME: Make configurable and have uhd-dpdk library track buffer sizes +static constexpr size_t DEFAULT_FRAME_SIZE = 8000; - inline char * eal_add_opt(std::vector<const char*>& argv, size_t n, - char *dst, const char *opt, const char *arg) - { - char *ptr = dst; - strncpy(ptr, opt, n); - argv.push_back(ptr); - ptr += strlen(opt) + 1; - n -= ptr - dst; - strncpy(ptr, arg, n); - argv.push_back(ptr); - ptr += strlen(arg) + 1; - return ptr; - } +inline char* eal_add_opt( + std::vector<const char*>& argv, size_t n, char* dst, const char* opt, const char* arg) +{ + char* ptr = dst; + strncpy(ptr, opt, n); + argv.push_back(ptr); + ptr += strlen(opt) + 1; + n -= ptr - dst; + strncpy(ptr, arg, n); + argv.push_back(ptr); + ptr += strlen(arg) + 1; + return ptr; } +} // namespace uhd_dpdk_ctx::uhd_dpdk_ctx(void) : _init_done(false) {} uhd_dpdk_ctx::~uhd_dpdk_ctx(void) {} /* Initialize uhd-dpdk (and do only once) */ -void uhd_dpdk_ctx::init(const dict<std::string, std::string> &eal_args, - unsigned int num_ports, int *port_thread_mapping, - int num_mbufs, int mbuf_cache_size, size_t mtu) +void uhd_dpdk_ctx::init(const dict<std::string, std::string>& eal_args, + unsigned int num_ports, + int* port_thread_mapping, + int num_mbufs, + int mbuf_cache_size, + size_t mtu) { std::lock_guard<std::mutex> lock(_init_mutex); if (!_init_done) { _mtu = mtu; /* Build up argc and argv */ - std::vector<const char *> argv; + std::vector<const char*> argv; argv.push_back("uhd-dpdk"); - char *args = new char[4096]; - char *opt = args; - char *end = args + sizeof(args); - for (std::string &key : eal_args.keys()) { + char* args = new char[4096]; + char* opt = args; + char* end = args + sizeof(args); + for (std::string& key : eal_args.keys()) { std::string val = eal_args[key]; if (key == "coremask") { - opt = eal_add_opt(argv, end - opt, opt, "-c", - val.c_str()); + opt = eal_add_opt(argv, end - opt, opt, "-c", val.c_str()); } else if (key == "corelist") { /* NOTE: This arg may have commas, so limited to config file */ - opt = eal_add_opt(argv, end - opt, opt, "-l", - val.c_str()); + opt = eal_add_opt(argv, end - opt, opt, "-l", val.c_str()); } else if (key == "coremap") { - opt = eal_add_opt(argv, end - opt, opt, "--lcores", - val.c_str()); + opt = eal_add_opt(argv, end - opt, opt, "--lcores", val.c_str()); } else if (key == "master-lcore") { - opt = eal_add_opt(argv, end - opt, opt, "--master-lcore", - val.c_str()); + opt = eal_add_opt(argv, end - opt, opt, "--master-lcore", val.c_str()); } else if (key == "pci-blacklist") { - opt = eal_add_opt(argv, end - opt, opt, "-b", - val.c_str()); + opt = eal_add_opt(argv, end - opt, opt, "-b", val.c_str()); } else if (key == "pci-whitelist") { - opt = eal_add_opt(argv, end - opt, opt, "-w", - val.c_str()); + opt = eal_add_opt(argv, end - opt, opt, "-w", val.c_str()); } else if (key == "log-level") { - opt = eal_add_opt(argv, end - opt, opt, "--log-level", - val.c_str()); + opt = eal_add_opt(argv, end - opt, opt, "--log-level", val.c_str()); } else if (key == "huge-dir") { - opt = eal_add_opt(argv, end - opt, opt, "--huge-dir", - val.c_str()); + opt = eal_add_opt(argv, end - opt, opt, "--huge-dir", val.c_str()); } else if (key == "file-prefix") { - opt = eal_add_opt(argv, end - opt, opt, "--file-prefix", - val.c_str()); + opt = eal_add_opt(argv, end - opt, opt, "--file-prefix", val.c_str()); } } - uhd_dpdk_init(argv.size(), argv.data(), num_ports, port_thread_mapping, num_mbufs, - mbuf_cache_size, _mtu); + uhd_dpdk_init(argv.size(), + argv.data(), + num_ports, + port_thread_mapping, + num_mbufs, + mbuf_cache_size, + _mtu); delete args; _init_done = true; } } -int uhd_dpdk_ctx::get_port_id(std::array<uint8_t, 6> mac_addr, - unsigned int &port_id) +int uhd_dpdk_ctx::get_port_id(std::array<uint8_t, 6> mac_addr, unsigned int& port_id) { UHD_ASSERT_THROW(is_init_done()); int num_ports = uhd_dpdk_port_count(); for (int i = 0; i < num_ports; i++) { - struct eth_addr port_mac_addr = uhd_dpdk_get_eth_addr((unsigned int) i); + struct eth_addr port_mac_addr = uhd_dpdk_get_eth_addr((unsigned int)i); for (int j = 0; j < 6; j++) { if (mac_addr[j] != port_mac_addr.addr[j]) { break; } if (j == 5) { - port_id = (unsigned int) i; + port_id = (unsigned int)i; return 0; } } @@ -113,23 +111,23 @@ int uhd_dpdk_ctx::get_port_id(std::array<uint8_t, 6> mac_addr, return -1; } -int uhd_dpdk_ctx::get_route(const std::string &addr) const +int uhd_dpdk_ctx::get_route(const std::string& addr) const { - const uint32_t dst_ipv4 = (uint32_t) inet_addr(addr.c_str()); + const uint32_t dst_ipv4 = (uint32_t)inet_addr(addr.c_str()); const unsigned int num_ports = uhd_dpdk_port_count(); for (unsigned int port = 0; port < num_ports; port++) { uint32_t src_ipv4; uint32_t netmask; uhd_dpdk_get_ipv4_addr(port, &src_ipv4, &netmask); if ((src_ipv4 & netmask) == (dst_ipv4 & netmask)) { - return (int) port; - } + return (int)port; + } } return -ENODEV; } -int uhd_dpdk_ctx::set_ipv4_addr(unsigned int port_id, uint32_t ipv4_addr, - uint32_t netmask) +int uhd_dpdk_ctx::set_ipv4_addr( + unsigned int port_id, uint32_t ipv4_addr, uint32_t netmask) { return uhd_dpdk_set_ipv4_addr(port_id, ipv4_addr, netmask); } @@ -140,23 +138,25 @@ bool uhd_dpdk_ctx::is_init_done(void) } -class dpdk_zero_copy_msb : public managed_send_buffer { +class dpdk_zero_copy_msb : public managed_send_buffer +{ public: - dpdk_zero_copy_msb(struct uhd_dpdk_socket *sock, - std::stack<dpdk_zero_copy_msb *, std::vector<dpdk_zero_copy_msb *>> &free_bufs) - : _sock(sock), _buf(nullptr), _free_bufs(free_bufs) {}; + dpdk_zero_copy_msb(struct uhd_dpdk_socket* sock, + std::stack<dpdk_zero_copy_msb*, std::vector<dpdk_zero_copy_msb*>>& free_bufs) + : _sock(sock), _buf(nullptr), _free_bufs(free_bufs){}; ~dpdk_zero_copy_msb(void) {} void release(void) { if (_buf) { - _buf->pkt_len = _length; + _buf->pkt_len = _length; _buf->data_len = _length; - int num_tx = uhd_dpdk_send(_sock, &_buf, 1); + int num_tx = uhd_dpdk_send(_sock, &_buf, 1); if (num_tx == 0) { /* Drop packet and free buffer (do not share sockets!) */ - UHD_LOG_ERROR("DPDK", "Invalid shared socket usage detected. Dropping packet..."); + UHD_LOG_ERROR( + "DPDK", "Invalid shared socket usage detected. Dropping packet..."); uhd_dpdk_free_buf(_buf); } // Push back into pool @@ -170,21 +170,21 @@ public: if (bufs != 1 || !_buf) return sptr(); - return make(this, uhd_dpdk_buf_to_data(_sock, _buf), - DEFAULT_FRAME_SIZE); + return make(this, uhd_dpdk_buf_to_data(_sock, _buf), DEFAULT_FRAME_SIZE); } private: - struct uhd_dpdk_socket *_sock; - struct rte_mbuf *_buf; - std::stack<dpdk_zero_copy_msb *, std::vector<dpdk_zero_copy_msb *>> &_free_bufs; + struct uhd_dpdk_socket* _sock; + struct rte_mbuf* _buf; + std::stack<dpdk_zero_copy_msb*, std::vector<dpdk_zero_copy_msb*>>& _free_bufs; }; -class dpdk_zero_copy_mrb : public managed_recv_buffer { +class dpdk_zero_copy_mrb : public managed_recv_buffer +{ public: - dpdk_zero_copy_mrb(struct uhd_dpdk_socket *sock, - std::stack<dpdk_zero_copy_mrb *, std::vector<dpdk_zero_copy_mrb *>> &free_bufs) - : _sock(sock), _buf(nullptr), _free_bufs(free_bufs) {}; + dpdk_zero_copy_mrb(struct uhd_dpdk_socket* sock, + std::stack<dpdk_zero_copy_mrb*, std::vector<dpdk_zero_copy_mrb*>>& free_bufs) + : _sock(sock), _buf(nullptr), _free_bufs(free_bufs){}; ~dpdk_zero_copy_mrb(void) {} void release(void) @@ -197,7 +197,7 @@ public: sptr get_new(double timeout) { - int bufs = uhd_dpdk_recv(_sock, &_buf, 1, (int) (timeout*USEC)); + int bufs = uhd_dpdk_recv(_sock, &_buf, 1, (int)(timeout * USEC)); if (bufs != 1 || _buf == nullptr) { // Push back into pool if we didn't get a real buffer _free_bufs.push(this); @@ -210,32 +210,32 @@ public: return sptr(); } - return make(this, uhd_dpdk_buf_to_data(_sock, _buf), - uhd_dpdk_get_len(_sock, _buf)); + return make( + this, uhd_dpdk_buf_to_data(_sock, _buf), uhd_dpdk_get_len(_sock, _buf)); } private: - struct uhd_dpdk_socket *_sock; - struct rte_mbuf *_buf; - std::stack<dpdk_zero_copy_mrb *, std::vector<dpdk_zero_copy_mrb *>> &_free_bufs; + struct uhd_dpdk_socket* _sock; + struct rte_mbuf* _buf; + std::stack<dpdk_zero_copy_mrb*, std::vector<dpdk_zero_copy_mrb*>>& _free_bufs; }; -class dpdk_zero_copy_impl : public dpdk_zero_copy { +class dpdk_zero_copy_impl : public dpdk_zero_copy +{ public: - - dpdk_zero_copy_impl(struct uhd_dpdk_ctx &ctx, - const unsigned int dpdk_port_id, - const std::string &addr, - const std::string &remote_port, - const std::string &local_port, - const zero_copy_xport_params& xport_params) - : _num_send_frames(xport_params.num_send_frames), - _send_frame_size(xport_params.send_frame_size), - _num_recv_frames(xport_params.num_recv_frames), - _recv_frame_size(xport_params.recv_frame_size), - _port_id(dpdk_port_id), - _rx_empty_count(0), - _tx_empty_count(0) + dpdk_zero_copy_impl(struct uhd_dpdk_ctx& ctx, + const unsigned int dpdk_port_id, + const std::string& addr, + const std::string& remote_port, + const std::string& local_port, + const zero_copy_xport_params& xport_params) + : _num_send_frames(xport_params.num_send_frames) + , _send_frame_size(xport_params.send_frame_size) + , _num_recv_frames(xport_params.num_recv_frames) + , _recv_frame_size(xport_params.recv_frame_size) + , _port_id(dpdk_port_id) + , _rx_empty_count(0) + , _tx_empty_count(0) { // TODO: Handle xport_params UHD_ASSERT_THROW(xport_params.recv_frame_size > 0); @@ -247,30 +247,28 @@ public: const int num_ports = uhd_dpdk_port_count(); UHD_ASSERT_THROW(num_ports > 0); - UHD_ASSERT_THROW(dpdk_port_id < (unsigned int) num_ports); + UHD_ASSERT_THROW(dpdk_port_id < (unsigned int)num_ports); // Convert ipv4 addr from string to uint32_t, network format - uint32_t dst_ipv4 = (uint32_t) inet_addr(addr.c_str()); + uint32_t dst_ipv4 = (uint32_t)inet_addr(addr.c_str()); // Convert port from string to uint16_t, network format uint16_t dst_port = htons(std::stoi(remote_port, NULL, 0)); uint16_t src_port = htons(std::stoi(local_port, NULL, 0)); // Create RX socket first - struct uhd_dpdk_sockarg_udp sockarg = { - .is_tx = false, - .local_port = src_port, - .remote_port = dst_port, - .dst_addr = dst_ipv4 - }; + struct uhd_dpdk_sockarg_udp sockarg = {.is_tx = false, + .local_port = src_port, + .remote_port = dst_port, + .dst_addr = dst_ipv4}; _rx_sock = uhd_dpdk_sock_open(dpdk_port_id, UHD_DPDK_SOCK_UDP, &sockarg); UHD_ASSERT_THROW(_rx_sock != nullptr); // Backfill the local port, in case it was auto-assigned uhd_dpdk_udp_get_info(_rx_sock, &sockarg); - sockarg.is_tx = true; + sockarg.is_tx = true; sockarg.remote_port = dst_port; - sockarg.dst_addr = dst_ipv4; + sockarg.dst_addr = dst_ipv4; _tx_sock = uhd_dpdk_sock_open(dpdk_port_id, UHD_DPDK_SOCK_UDP, &sockarg); UHD_ASSERT_THROW(_tx_sock != nullptr); @@ -282,9 +280,10 @@ public: _msb_pool.push(new dpdk_zero_copy_msb(_tx_sock, _msb_pool)); } - UHD_LOG_TRACE("DPDK", "Created transports between " << addr << ":" - << remote_port << " and NIC(" << dpdk_port_id - << "):" << ntohs(sockarg.local_port)); + UHD_LOG_TRACE("DPDK", + "Created transports between " << addr << ":" << remote_port << " and NIC(" + << dpdk_port_id + << "):" << ntohs(sockarg.local_port)); } ~dpdk_zero_copy_impl(void) @@ -293,18 +292,23 @@ public: size_t count; uhd_dpdk_udp_get_info(_rx_sock, &sockarg); uhd_dpdk_get_drop_count(_rx_sock, &count); - UHD_LOG_TRACE("DPDK", "Closing transports between " << sockarg.dst_addr << ":" - << ntohs(sockarg.remote_port) << " and local:" - << ntohs(sockarg.local_port)); - UHD_LOG_TRACE("DPDK", "(" << ntohs(sockarg.remote_port) << "," << ntohs(sockarg.local_port) << ") " - << " Dropped "<< count << " packets"); + UHD_LOG_TRACE("DPDK", + "Closing transports between " << sockarg.dst_addr << ":" + << ntohs(sockarg.remote_port) + << " and local:" << ntohs(sockarg.local_port)); + UHD_LOG_TRACE("DPDK", + "(" << ntohs(sockarg.remote_port) << "," << ntohs(sockarg.local_port) << ") " + << " Dropped " << count << " packets"); uhd_dpdk_get_xfer_count(_rx_sock, &count); - UHD_LOG_TRACE("DPDK", "(" << ntohs(sockarg.remote_port) << "," << ntohs(sockarg.local_port) << ") " - << " Received "<< count << " packets"); - UHD_LOG_TRACE("DPDK", "(" << ntohs(sockarg.remote_port) << "," << ntohs(sockarg.local_port) << ") " - << "RX empty count is " << _rx_empty_count); - UHD_LOG_TRACE("DPDK", "(" << ntohs(sockarg.remote_port) << "," << ntohs(sockarg.local_port) << ") " - << "TX empty count is " << _tx_empty_count); + UHD_LOG_TRACE("DPDK", + "(" << ntohs(sockarg.remote_port) << "," << ntohs(sockarg.local_port) << ") " + << " Received " << count << " packets"); + UHD_LOG_TRACE("DPDK", + "(" << ntohs(sockarg.remote_port) << "," << ntohs(sockarg.local_port) << ") " + << "RX empty count is " << _rx_empty_count); + UHD_LOG_TRACE("DPDK", + "(" << ntohs(sockarg.remote_port) << "," << ntohs(sockarg.local_port) << ") " + << "TX empty count is " << _tx_empty_count); uhd_dpdk_sock_close(_rx_sock); uhd_dpdk_sock_close(_tx_sock); } @@ -316,7 +320,7 @@ public: return managed_recv_buffer::sptr(); } - dpdk_zero_copy_mrb *mrb = _mrb_pool.top(); + dpdk_zero_copy_mrb* mrb = _mrb_pool.top(); _mrb_pool.pop(); managed_recv_buffer::sptr buff = mrb->get_new(timeout); if (!buff) @@ -341,7 +345,7 @@ public: return managed_send_buffer::sptr(); } - dpdk_zero_copy_msb *msb = _msb_pool.top(); + dpdk_zero_copy_msb* msb = _msb_pool.top(); _msb_pool.pop(); managed_send_buffer::sptr buff = msb->get_new(timeout); if (!buff) @@ -369,14 +373,11 @@ public: std::string get_local_addr(void) const { uint32_t ipv4_addr; - int status = uhd_dpdk_get_ipv4_addr(_port_id, &ipv4_addr, NULL); - auto retval = std::to_string(ipv4_addr >> 0 & 0xff) + - "." + - std::to_string(ipv4_addr >> 8 & 0xff) + - "." + - std::to_string(ipv4_addr >> 16 & 0xff) + - "." + - std::to_string(ipv4_addr >> 24 & 0xff); + int status = uhd_dpdk_get_ipv4_addr(_port_id, &ipv4_addr, NULL); + auto retval = std::to_string(ipv4_addr >> 0 & 0xff) + "." + + std::to_string(ipv4_addr >> 8 & 0xff) + "." + + std::to_string(ipv4_addr >> 16 & 0xff) + "." + + std::to_string(ipv4_addr >> 24 & 0xff); return retval; } @@ -386,9 +387,10 @@ public: uhd_dpdk_get_drop_count(_rx_sock, &drop_count); return drop_count; } + private: - struct uhd_dpdk_socket *_rx_sock; - struct uhd_dpdk_socket *_tx_sock; + struct uhd_dpdk_socket* _rx_sock; + struct uhd_dpdk_socket* _tx_sock; const size_t _num_send_frames; const size_t _send_frame_size; const size_t _num_recv_frames; @@ -397,22 +399,20 @@ private: unsigned int _rx_empty_count; unsigned int _tx_empty_count; - std::stack<dpdk_zero_copy_mrb *, std::vector<dpdk_zero_copy_mrb *>> _mrb_pool; - std::stack<dpdk_zero_copy_msb *, std::vector<dpdk_zero_copy_msb *>> _msb_pool; + std::stack<dpdk_zero_copy_mrb*, std::vector<dpdk_zero_copy_mrb*>> _mrb_pool; + std::stack<dpdk_zero_copy_msb*, std::vector<dpdk_zero_copy_msb*>> _msb_pool; }; -dpdk_zero_copy::sptr dpdk_zero_copy::make( - struct uhd_dpdk_ctx &ctx, +dpdk_zero_copy::sptr dpdk_zero_copy::make(struct uhd_dpdk_ctx& ctx, const unsigned int dpdk_port_id, - const std::string &addr, - const std::string &remote_port, - const std::string &local_port, - const zero_copy_xport_params &default_buff_args, - const device_addr_t &hints) + const std::string& addr, + const std::string& remote_port, + const std::string& local_port, + const zero_copy_xport_params& default_buff_args, + const device_addr_t& hints) { - return dpdk_zero_copy::sptr( - new dpdk_zero_copy_impl(ctx, dpdk_port_id, addr, remote_port, local_port, default_buff_args) - ); + return dpdk_zero_copy::sptr(new dpdk_zero_copy_impl( + ctx, dpdk_port_id, addr, remote_port, local_port, default_buff_args)); } -}} +}} // namespace uhd::transport |