diff options
Diffstat (limited to 'host/lib/usrp/mpmd/mpmd_xport_mgr.hpp')
-rw-r--r-- | host/lib/usrp/mpmd/mpmd_xport_mgr.hpp | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/host/lib/usrp/mpmd/mpmd_xport_mgr.hpp b/host/lib/usrp/mpmd/mpmd_xport_mgr.hpp new file mode 100644 index 000000000..2da4af323 --- /dev/null +++ b/host/lib/usrp/mpmd/mpmd_xport_mgr.hpp @@ -0,0 +1,95 @@ +// +// Copyright 2017 Ettus Research, a National Instruments Company +// +// SPDX-License-Identifier: GPL-3.0 +// + +#ifndef INCLUDED_MPMD_XPORT_MGR_HPP +#define INCLUDED_MPMD_XPORT_MGR_HPP + +#include "../device3/device3_impl.hpp" +#include <uhd/types/dict.hpp> +#include <memory> +#include <map> +#include <vector> +#include <string> + +namespace uhd { namespace mpmd { namespace xport { + +/*! Return filtered subset from a device_addr_t + * + * The return dictionary will contain all key/value pairs from \p args + * where the key begins with \p prefix. + * + * \param args Bucket of key/value pairs + * \param prefix Key prefix to match against + */ +uhd::dict<std::string, std::string> filter_args( + const uhd::device_addr_t& args, + const std::string& prefix +); + +/*! MPMD Transport Manager + * + * A transport manager is an object which sets up a physical connection to a + * CHDR device. Its implementation is specific to the underlying transport + * medium. For example, if the medium is Ethernet/UDP, this class will create + * sockets. + */ +class mpmd_xport_mgr +{ +public: + using uptr = std::unique_ptr<mpmd_xport_mgr>; + using xport_info_t = std::map<std::string, std::string>; + using xport_info_list_t = std::vector<std::map<std::string, std::string>>; + + /*! Return a reference to a transport manager + * + * \param mb_args Additional args from the motherboard. These may contain + * transport-related args (e.g., "recv_buff_size") which + * can be relevant to the underlying implementation. + * + * \returns Reference to manager object + * \throws uhd::key_error if \p xport_medium is not supported. The ctor of + * the underlying class that is requested can also throw. + */ + static uptr make( + const uhd::device_addr_t& mb_args + ); + + /*! Create a transports object + * + * Implementation details depend on the underlying implementation. + * In general, the implementations will follow the following recipe: + * 1. Pick a suitable element from \p xport_info_list + * 2. Do whatever system calls are necessary to create the physical + * transport; to do so, call the underlying implementation (UDP or + * whatever) + * 3. Update the selected element from xport_info_list + * 5. Return results + * + * \param xport_info_list List of possible options to choose from. Every + * element of this argument needs to have the same + * "type" key (e.g., they all need to be "UDP"). + * \param xport_type Transport type (CTRL, RX_DATA, ...) + * \param xport_args Arbitrary additional transport args. These could come + * from the user, or other places. + * \param xport_info_out The updated dictionary from xport_info_list that + * was eventually chosen + * + * \returns The both_xports_t object containing the actual transport info, + * and xport_info_out contains the updated transport option info. + * The latter needs to get sent back to MPM to complete the + * transport handshake. + */ + virtual both_xports_t make_transport( + const xport_info_list_t &xport_info_list, + const usrp::device3_impl::xport_type_t xport_type, + const uhd::device_addr_t& xport_args, + xport_info_t& xport_info_out + ) = 0; +}; + +}}} /* namespace uhd::mpmd::xport */ + +#endif /* INCLUDED_MPMD_XPORT_MGR_HPP */ |