diff -r a3c5fea29467 src/network/examples/ipv4-address-vector-example.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/network/examples/ipv4-address-vector-example.cc Fri Mar 25 14:24:23 2016 -0700 @@ -0,0 +1,127 @@ +/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ +/* + * Copyright (c) 2016 University of Washington + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation; + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Author: Tom Henderson + */ + +// +// Simple example showing how to add a vector of Ipv4Address instances to an +// attribute +// + +#include "ns3/object.h" +#include "ns3/string.h" +#include "ns3/config.h" +#include "ns3/address-utils.h" + +using namespace ns3; + +class SampleIpv4AddressVectorClass : public Object +{ +public: + static TypeId GetTypeId (void); + virtual TypeId GetInstanceTypeId (void) const; + + void Print (std::ostream &os) const; + +private: + static Ipv4AddressVector GetDefault (void); + Ipv4AddressVector m_vector; + Ipv4AddressVector m_vector2; +}; + +TypeId +SampleIpv4AddressVectorClass::GetTypeId (void) +{ + static TypeId tid = TypeId ("ns3::SampleIpv4AddressVectorClass") + .SetParent () + .AddConstructor () + .AddAttribute ("Ipv4Addresses", + "Ipv4 addresses", + Ipv4AddressVectorValue (SampleIpv4AddressVectorClass::GetDefault ()), + MakeIpv4AddressVectorAccessor (&SampleIpv4AddressVectorClass::m_vector), + MakeIpv4AddressVectorChecker ()) + // Another way to configure the default value is with a StringValue + .AddAttribute ("Ipv4Addresses2", + "Ipv4 addresses", + StringValue ("127.0.0.1,127.0.1.1"), + MakeIpv4AddressVectorAccessor (&SampleIpv4AddressVectorClass::m_vector2), + MakeIpv4AddressVectorChecker ()) + ; + return tid; +} + +TypeId +SampleIpv4AddressVectorClass::GetInstanceTypeId (void) const +{ + return GetTypeId (); +} + +void +SampleIpv4AddressVectorClass::Print (std::ostream &os) const +{ + for (std::vector::const_iterator it = m_vector.begin (); + it != m_vector.end (); ) + { + it->Print (os); + if (++it != m_vector.end ()) + { + os << ","; + } + else + { + break; + } + } +} + +Ipv4AddressVector +SampleIpv4AddressVectorClass::GetDefault (void) +{ + Ipv4AddressVector v; + v.push_back (Ipv4Address ("0.0.0.0")); + return v; +} + +int main (int argc, char *argv[]) +{ + Ptr t = CreateObject (); + + // Print out default + t->Print (std::cout); + std::cout << std::endl; + + Config::SetDefault ("ns3::SampleIpv4AddressVectorClass::Ipv4Addresses", StringValue ("10.0.0.1,10.0.0.2")); + + Ptr t2 = CreateObject (); + // Print out new default + t2->Print (std::cout); + std::cout << std::endl; + + // Modify the attribute value + Ipv4AddressVector v; + v.push_back (Ipv4Address ("192.168.0.1")); + v.push_back (Ipv4Address ("192.168.1.1")); + v.push_back (Ipv4Address ("192.168.2.1")); + t->SetAttribute ("Ipv4Addresses", Ipv4AddressVectorValue (v)); + + // Print out modified + t->Print (std::cout); + std::cout << std::endl; + + return 0; +} diff -r a3c5fea29467 src/network/examples/wscript --- a/src/network/examples/wscript Thu Mar 24 20:54:02 2016 +0100 +++ b/src/network/examples/wscript Fri Mar 25 14:24:23 2016 -0700 @@ -10,5 +10,8 @@ obj = bld.create_ns3_program('main-packet-tag', ['network']) obj.source = 'main-packet-tag.cc' + obj = bld.create_ns3_program('ipv4-address-vector-example', ['network']) + obj.source = 'ipv4-address-vector-example.cc' + obj = bld.create_ns3_program('packet-socket-apps', ['core', 'network']) obj.source = 'packet-socket-apps.cc' diff -r a3c5fea29467 src/network/utils/address-utils.cc --- a/src/network/utils/address-utils.cc Thu Mar 24 20:54:02 2016 +0100 +++ b/src/network/utils/address-utils.cc Fri Mar 25 14:24:23 2016 -0700 @@ -126,4 +126,50 @@ } // namespace addressUtils +ATTRIBUTE_HELPER_CPP (Ipv4AddressVector); + +std::ostream & +operator << (std::ostream &os, const Ipv4AddressVector &ipv4AddressVector) +{ + for (uint32_t i = 0; i < ipv4AddressVector.size (); i++) + { + os << ipv4AddressVector[i]; + if (i < (ipv4AddressVector.size () - 1)) + { + os << ","; + } + } + return os; +} + +std::istream & +operator >> (std::istream &is, Ipv4AddressVector &ipv4AddressVector) +{ + char delim = ','; + std::string addressStr; + is >> addressStr; + std::vector addrs; + + // parse input stream for addresses + for (size_t p=0, q=0; p != addressStr.npos; p = q) + { + addrs.push_back (addressStr.substr (p + (p != 0), (q = addressStr.find (delim, p+1)) - p - (p != 0))); + } + if (addrs.size () > 0) + { + ipv4AddressVector.clear (); + ipv4AddressVector.resize (addrs.size ()); + for (uint32_t i = 0; i < addrs.size (); i++) + { + ipv4AddressVector[i] = Ipv4Address (addrs[i].c_str ()); + } + } + else + { + is.setstate (std::ios_base::failbit); + } + + return is; +} + } // namespace ns3 diff -r a3c5fea29467 src/network/utils/address-utils.h --- a/src/network/utils/address-utils.h Thu Mar 24 20:54:02 2016 +0100 +++ b/src/network/utils/address-utils.h Fri Mar 25 14:24:23 2016 -0700 @@ -124,6 +124,11 @@ bool IsMulticast (const Address &ad); }; +typedef std::vector Ipv4AddressVector; +std::ostream &operator << (std::ostream &os, const Ipv4AddressVector &ipv4AddressVector); +std::istream &operator >> (std::istream &is, Ipv4AddressVector &ipv4AddressVector); +ATTRIBUTE_HELPER_HEADER (Ipv4AddressVector); + }; #endif /* ADDRESS_UTILS_H */