summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--host/include/uhd/types/device_addr.hpp37
-rw-r--r--host/include/uhd/types/dict.hpp7
-rw-r--r--host/include/uhd/types/mac_addr.hpp35
-rw-r--r--host/lib/device.cpp8
-rw-r--r--host/lib/simple_device.cpp26
-rw-r--r--host/lib/types.cpp63
-rw-r--r--host/lib/usrp/dboard_manager.cpp6
-rw-r--r--host/lib/usrp/usrp2/mboard_impl.cpp6
-rw-r--r--host/test/addr_test.cpp2
-rw-r--r--host/utils/usrp2_burner.cpp17
10 files changed, 143 insertions, 64 deletions
diff --git a/host/include/uhd/types/device_addr.hpp b/host/include/uhd/types/device_addr.hpp
index d32dfa77e..1162884fb 100644
--- a/host/include/uhd/types/device_addr.hpp
+++ b/host/include/uhd/types/device_addr.hpp
@@ -26,15 +26,40 @@
namespace uhd{
/*!
- * The device address args are just a mapping of key/value string pairs.
- * When left empty, the discovery routine will try to find all usrps.
- * The discovery can be narrowed down by specifying the transport type arguments.
+ * Mapping of key/value pairs for locating devices on the system.
+ * When left empty, the device discovery routines will search
+ * all available transports on the system (ethernet, usb...).
*
- * For example, to access a specific usrp2 one would specify the transport type
- * ("type", "udp") and the transport args ("addr", "<resolvable_hostname_or_addr>").
+ * To narrow down the discovery process to a particular device,
+ * specify a transport key/value pair specific to your device.
+ * Ex, to find a usrp2: my_dev_addr["addr"] = <resolvable_hostname_or_ip>
+ *
+ * The device address can also be used to pass arguments into
+ * the transport layer control to set (for example) buffer sizes.
*/
class UHD_API device_addr_t : public dict<std::string, std::string>{
- public: std::string to_string(void) const;
+ public:
+
+ /*!
+ * Convert a device address into a printable string.
+ * \return string good for use with std::cout <<
+ */
+ std::string to_string(void) const;
+
+ /*!
+ * Convert the device address into an args string.
+ * The args string contains delimiter symbols.
+ * \return a string with delimiter markup
+ */
+ std::string to_args_str(void) const;
+
+ /*!
+ * Make a device address from an args string.
+ * The args string contains delimiter symbols.
+ * \param args_str the arguments string
+ * \return the new device address
+ */
+ static device_addr_t from_args_str(const std::string &args_str);
};
//handy typedef for a vector of device addresses
diff --git a/host/include/uhd/types/dict.hpp b/host/include/uhd/types/dict.hpp
index 5b9883704..7fb712e76 100644
--- a/host/include/uhd/types/dict.hpp
+++ b/host/include/uhd/types/dict.hpp
@@ -18,10 +18,11 @@
#ifndef INCLUDED_UHD_TYPES_DICT_HPP
#define INCLUDED_UHD_TYPES_DICT_HPP
-#include <list>
-#include <vector>
-#include <stdexcept>
+#include <uhd/config.hpp>
#include <boost/foreach.hpp>
+#include <stdexcept>
+#include <vector>
+#include <list>
namespace uhd{
diff --git a/host/include/uhd/types/mac_addr.hpp b/host/include/uhd/types/mac_addr.hpp
index 2cac7d343..3cd1fe86b 100644
--- a/host/include/uhd/types/mac_addr.hpp
+++ b/host/include/uhd/types/mac_addr.hpp
@@ -28,10 +28,39 @@ namespace uhd{
* Wrapper for an ethernet mac address.
* Provides conversion between string and binary formats.
*/
- struct UHD_API mac_addr_t{
- boost::uint8_t mac_addr[6];
- mac_addr_t(const std::string &mac_addr_str = "00:00:00:00:00:00");
+ class UHD_API mac_addr_t{
+ public:
+ static const size_t hlen = 6;
+
+ /*!
+ * Create a mac address a byte array.
+ * \param bytes a pointer for the byte array
+ * \return a new mac address
+ */
+ static mac_addr_t from_bytes(const boost::uint8_t *bytes);
+
+ /*!
+ * Create a mac address from a string.
+ * \param mac_addr_str the string with delimiters
+ * \return a new mac address
+ */
+ static mac_addr_t from_string(const std::string &mac_addr_str);
+
+ /*!
+ * Get the byte representation of the mac address.
+ * \return a pointer to the internal byte array
+ */
+ const boost::uint8_t *to_bytes(void) const;
+
+ /*!
+ * Get the string representation of this mac address.
+ * \return a string with delimiters
+ */
std::string to_string(void) const;
+
+ private:
+ mac_addr_t(const boost::uint8_t *bytes); //private constructor
+ boost::uint8_t _bytes[hlen]; //internal representation
};
} //namespace uhd
diff --git a/host/lib/device.cpp b/host/lib/device.cpp
index 833e7a0da..ca45d0795 100644
--- a/host/lib/device.cpp
+++ b/host/lib/device.cpp
@@ -47,7 +47,7 @@ static size_t hash_device_addr(
//combine the hashes of sorted keys/value pairs
size_t hash = 0;
- BOOST_FOREACH(std::string key, keys){
+ BOOST_FOREACH(const std::string &key, keys){
boost::hash_combine(hash, key);
boost::hash_combine(hash, dev_addr[key]);
}
@@ -76,7 +76,7 @@ void device::register_device(
device_addrs_t device::discover(const device_addr_t &hint){
device_addrs_t device_addrs;
- BOOST_FOREACH(dev_fcn_reg_t fcn, get_dev_fcn_regs()){
+ BOOST_FOREACH(const dev_fcn_reg_t &fcn, get_dev_fcn_regs()){
device_addrs_t discovered_addrs = fcn.get<0>()(hint);
device_addrs.insert(
device_addrs.begin(),
@@ -95,11 +95,11 @@ device::sptr device::make(const device_addr_t &hint, size_t which){
typedef boost::tuple<device_addr_t, make_t> dev_addr_make_t;
std::vector<dev_addr_make_t> dev_addr_makers;
- BOOST_FOREACH(dev_fcn_reg_t fcn, get_dev_fcn_regs()){
+ BOOST_FOREACH(const dev_fcn_reg_t &fcn, get_dev_fcn_regs()){
BOOST_FOREACH(device_addr_t dev_addr, fcn.get<0>()(hint)){
//copy keys that were in hint but not in dev_addr
//this way, we can pass additional transport arguments
- BOOST_FOREACH(std::string key, hint.get_keys()){
+ BOOST_FOREACH(const std::string &key, hint.get_keys()){
if (not dev_addr.has_key(key)) dev_addr[key] = hint[key];
}
//append the discovered address and its factory function
diff --git a/host/lib/simple_device.cpp b/host/lib/simple_device.cpp
index 2e6bffc9c..25beb45a9 100644
--- a/host/lib/simple_device.cpp
+++ b/host/lib/simple_device.cpp
@@ -19,7 +19,6 @@
#include <uhd/utils/tune_helper.hpp>
#include <uhd/utils/assert.hpp>
#include <uhd/props.hpp>
-#include <boost/algorithm/string.hpp>
#include <boost/foreach.hpp>
#include <boost/format.hpp>
#include <stdexcept>
@@ -29,29 +28,6 @@ using namespace uhd;
/***********************************************************************
* Helper Functions
**********************************************************************/
-static std::string trim(const std::string &in){
- return boost::algorithm::trim_copy(in);
-}
-
-device_addr_t args_to_device_addr(const std::string &args){
- device_addr_t addr;
-
- //split the args at the semi-colons
- std::vector<std::string> pairs;
- boost::split(pairs, args, boost::is_any_of(";"));
- BOOST_FOREACH(std::string pair, pairs){
- if (trim(pair) == "") continue;
-
- //split the key value pairs at the equals
- std::vector<std::string> key_val;
- boost::split(key_val, pair, boost::is_any_of("="));
- if (key_val.size() != 2) throw std::runtime_error("invalid args string: "+args);
- addr[trim(key_val[0])] = trim(key_val[1]);
- }
-
- return addr;
-}
-
static std::vector<double> get_xx_rates(wax::obj decerps, wax::obj rate){
std::vector<double> rates;
BOOST_FOREACH(size_t decerp, decerps.as<std::vector<size_t> >()){
@@ -223,5 +199,5 @@ private:
* The Make Function
**********************************************************************/
simple_device::sptr simple_device::make(const std::string &args){
- return sptr(new simple_device_impl(args_to_device_addr(args)));
+ return sptr(new simple_device_impl(device_addr_t::from_args_str(args)));
}
diff --git a/host/lib/types.cpp b/host/lib/types.cpp
index bd5dc8e26..3fde40596 100644
--- a/host/lib/types.cpp
+++ b/host/lib/types.cpp
@@ -123,14 +123,55 @@ std::string device_addr_t::to_string(void) const{
return ss.str();
}
+static const std::string arg_delim = ";";
+static const std::string pair_delim = "=";
+
+static std::string trim(const std::string &in){
+ return boost::algorithm::trim_copy(in);
+}
+
+std::string device_addr_t::to_args_str(void) const{
+ std::string args_str;
+ const device_addr_t &device_addr = *this;
+ BOOST_FOREACH(const std::string &key, device_addr.get_keys()){
+ args_str += key + pair_delim + device_addr[key] + arg_delim;
+ }
+ return args_str;
+}
+
+device_addr_t device_addr_t::from_args_str(const std::string &args_str){
+ device_addr_t addr;
+
+ //split the args at the semi-colons
+ std::vector<std::string> pairs;
+ boost::split(pairs, args_str, boost::is_any_of(arg_delim));
+ BOOST_FOREACH(const std::string &pair, pairs){
+ if (trim(pair) == "") continue;
+
+ //split the key value pairs at the equals
+ std::vector<std::string> key_val;
+ boost::split(key_val, pair, boost::is_any_of(pair_delim));
+ if (key_val.size() != 2) throw std::runtime_error("invalid args string: "+args_str);
+ addr[trim(key_val[0])] = trim(key_val[1]);
+ }
+
+ return addr;
+}
+
/***********************************************************************
* mac addr
**********************************************************************/
-uhd::mac_addr_t::mac_addr_t(const std::string &mac_addr_str_){
- std::string mac_addr_str = (mac_addr_str_ == "")? "ff:ff:ff:ff:ff:ff" : mac_addr_str_;
+mac_addr_t::mac_addr_t(const boost::uint8_t *bytes){
+ std::copy(bytes, bytes+hlen, _bytes);
+}
- //ether_aton_r(str.c_str(), &mac_addr);
- boost::uint8_t p[6] = {0x00, 0x50, 0xC2, 0x85, 0x30, 0x00}; // Matt's IAB
+mac_addr_t mac_addr_t::from_bytes(const boost::uint8_t *bytes){
+ return mac_addr_t(bytes);
+}
+
+mac_addr_t mac_addr_t::from_string(const std::string &mac_addr_str){
+
+ boost::uint8_t p[hlen] = {0x00, 0x50, 0xC2, 0x85, 0x30, 0x00}; // Matt's IAB
try{
//only allow patterns of xx:xx or xx:xx:xx:xx:xx:xx
@@ -155,15 +196,17 @@ uhd::mac_addr_t::mac_addr_t(const std::string &mac_addr_str_){
));
}
- memcpy(&mac_addr, p, sizeof(mac_addr));
+ return from_bytes(p);
+}
+
+const boost::uint8_t *mac_addr_t::to_bytes(void) const{
+ return _bytes;
}
-std::string uhd::mac_addr_t::to_string(void) const{
- //ether_ntoa_r(&mac_addr, addr_buf);
- const boost::uint8_t *p = reinterpret_cast<const boost::uint8_t *>(&mac_addr);
+std::string mac_addr_t::to_string(void) const{
return str(
boost::format("%02x:%02x:%02x:%02x:%02x:%02x")
- % int(p[0]) % int(p[1]) % int(p[2])
- % int(p[3]) % int(p[4]) % int(p[5])
+ % int(to_bytes()[0]) % int(to_bytes()[1]) % int(to_bytes()[2])
+ % int(to_bytes()[3]) % int(to_bytes()[4]) % int(to_bytes()[5])
);
}
diff --git a/host/lib/usrp/dboard_manager.cpp b/host/lib/usrp/dboard_manager.cpp
index f86545696..424626023 100644
--- a/host/lib/usrp/dboard_manager.cpp
+++ b/host/lib/usrp/dboard_manager.cpp
@@ -204,7 +204,7 @@ dboard_manager_impl::dboard_manager_impl(
//make xcvr subdevs (make one subdev for both rx and tx dboards)
if (rx_dboard_ctor == tx_dboard_ctor){
ASSERT_THROW(rx_subdevs == tx_subdevs);
- BOOST_FOREACH(std::string subdev, rx_subdevs){
+ BOOST_FOREACH(const std::string &subdev, rx_subdevs){
dboard_base::sptr xcvr_dboard = rx_dboard_ctor(
dboard_base::ctor_args_t(subdev, interface, rx_dboard_id, tx_dboard_id)
);
@@ -222,7 +222,7 @@ dboard_manager_impl::dboard_manager_impl(
//make tx and rx subdevs (separate subdevs for rx and tx dboards)
else{
//make the rx subdevs
- BOOST_FOREACH(std::string subdev, rx_subdevs){
+ BOOST_FOREACH(const std::string &subdev, rx_subdevs){
dboard_base::sptr rx_dboard = rx_dboard_ctor(
dboard_base::ctor_args_t(subdev, interface, rx_dboard_id, dboard_id::NONE)
);
@@ -232,7 +232,7 @@ dboard_manager_impl::dboard_manager_impl(
);
}
//make the tx subdevs
- BOOST_FOREACH(std::string subdev, tx_subdevs){
+ BOOST_FOREACH(const std::string &subdev, tx_subdevs){
dboard_base::sptr tx_dboard = tx_dboard_ctor(
dboard_base::ctor_args_t(subdev, interface, dboard_id::NONE, tx_dboard_id)
);
diff --git a/host/lib/usrp/usrp2/mboard_impl.cpp b/host/lib/usrp/usrp2/mboard_impl.cpp
index b6919a738..35dfd6287 100644
--- a/host/lib/usrp/usrp2/mboard_impl.cpp
+++ b/host/lib/usrp/usrp2/mboard_impl.cpp
@@ -116,7 +116,7 @@ void usrp2_impl::mboard_get(const wax::obj &key_, wax::obj &val){
ASSERT_THROW(htonl(in_data.id) == USRP2_CTRL_ID_THIS_IS_MY_MAC_ADDR_DUDE);
//extract the address
- val = reinterpret_cast<mac_addr_t*>(in_data.data.mac_addr)->to_string();
+ val = mac_addr_t::from_bytes(in_data.data.mac_addr).to_string();
return;
}
@@ -211,8 +211,8 @@ void usrp2_impl::mboard_set(const wax::obj &key, const wax::obj &val){
//setup the out data
usrp2_ctrl_data_t out_data;
out_data.id = htonl(USRP2_CTRL_ID_HERE_IS_A_NEW_MAC_ADDR_BRO);
- mac_addr_t mac_addr(val.as<std::string>());
- std::memcpy(out_data.data.mac_addr, &mac_addr, sizeof(mac_addr_t));
+ mac_addr_t mac_addr = mac_addr_t::from_string(val.as<std::string>());
+ std::copy(mac_addr.to_bytes(), mac_addr.to_bytes()+mac_addr_t::hlen, out_data.data.mac_addr);
//send and recv
usrp2_ctrl_data_t in_data = ctrl_send_and_recv(out_data);
diff --git a/host/test/addr_test.cpp b/host/test/addr_test.cpp
index 0c8f63b0a..a75804949 100644
--- a/host/test/addr_test.cpp
+++ b/host/test/addr_test.cpp
@@ -22,7 +22,7 @@
BOOST_AUTO_TEST_CASE(test_mac_addr){
std::cout << "Testing mac addr..." << std::endl;
const std::string mac_addr_str("00:01:23:45:67:89");
- uhd::mac_addr_t mac_addr(mac_addr_str);
+ uhd::mac_addr_t mac_addr = uhd::mac_addr_t::from_string(mac_addr_str);
std::cout << "Input: " << mac_addr_str << std::endl;
std::cout << "Output: " << mac_addr.to_string() << std::endl;
BOOST_CHECK_EQUAL(mac_addr_str, mac_addr.to_string());
diff --git a/host/utils/usrp2_burner.cpp b/host/utils/usrp2_burner.cpp
index ff6d4426f..b24425316 100644
--- a/host/utils/usrp2_burner.cpp
+++ b/host/utils/usrp2_burner.cpp
@@ -57,27 +57,32 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
uhd::device::sptr u2_dev = uhd::usrp::usrp2::make(device_addr);
//FIXME usees the default mboard for now (until the mimo link is supported)
wax::obj u2_mb = (*u2_dev)[uhd::DEVICE_PROP_MBOARD];
+ std::cout << std::endl;
+
+ //fetch and print current settings
+ std::cout << "Fetching current settings from usrp2 eeprom:" << std::endl;
+ std::string curr_ip = u2_mb[std::string("ip-addr")].as<std::string>();
+ std::cout << boost::format(" Current IP Address: %s") % curr_ip << std::endl;
+ std::string curr_mac = u2_mb[std::string("mac-addr")].as<std::string>();
+ std::cout << boost::format(" Current MAC Address: %s") % curr_mac << std::endl;
+ std::cout << " Done" << std::endl << std::endl;
//try to set the new ip (if provided)
if (vm.count("new-ip")){
std::cout << "Burning a new ip address into the usrp2 eeprom:" << std::endl;
- std::string old_ip = u2_mb[std::string("ip-addr")].as<std::string>();
- std::cout << boost::format(" Old IP Address: %s") % old_ip << std::endl;
std::string new_ip = vm["new-ip"].as<std::string>();
std::cout << boost::format(" New IP Address: %s") % new_ip << std::endl;
u2_mb[std::string("ip-addr")] = new_ip;
- std::cout << " Done" << std::endl;
+ std::cout << " Done" << std::endl << std::endl;
}
//try to set the new mac (if provided)
if (vm.count("new-mac")){
std::cout << "Burning a new mac address into the usrp2 eeprom:" << std::endl;
- std::string old_mac = u2_mb[std::string("mac-addr")].as<std::string>();
- std::cout << boost::format(" Old MAC Address: %s") % old_mac << std::endl;
std::string new_mac = vm["new-mac"].as<std::string>();
std::cout << boost::format(" New MAC Address: %s") % new_mac << std::endl;
u2_mb[std::string("mac-addr")] = new_mac;
- std::cout << " Done" << std::endl;
+ std::cout << " Done" << std::endl << std::endl;
}
std::cout << "Power-cycle the usrp2 for the changes to take effect." << std::endl;