View | Details | Raw Unified | Return to bug 2348
Collapse All | Expand All

(-)a3c5fea29467 (+168 lines)
Added Link Here 
1
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2
/*
3
 * Copyright (c) 2016 University of Washington
4
 *
5
 * This program is free software; you can redistribute it and/or modify
6
 * it under the terms of the GNU General Public License version 2 as
7
 * published by the Free Software Foundation;
8
 *
9
 * This program is distributed in the hope that it will be useful,
10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
 * GNU General Public License for more details.
13
 *
14
 * You should have received a copy of the GNU General Public License
15
 * along with this program; if not, write to the Free Software
16
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
 *
18
 * Author: Tom Henderson <tomhend@u.washington.edu>
19
 */
20
21
//
22
// Simple example showing how to add a vector of Ipv4Address and Ipv6Address
23
// instances to an attribute
24
//
25
26
#include "ns3/object.h"
27
#include "ns3/string.h"
28
#include "ns3/config.h"
29
#include "ns3/address-utils.h"
30
31
using namespace ns3;
32
33
class SampleIpAddressVectorClass : public Object
34
{
35
public:
36
  static TypeId GetTypeId (void);
37
  virtual TypeId GetInstanceTypeId (void) const;
38
39
  void Print (std::ostream &os) const;
40
41
private:
42
  static Ipv4AddressVector GetDefaultIpv4Vector (void);
43
  static Ipv6AddressVector GetDefaultIpv6Vector (void);
44
  Ipv4AddressVector m_vector4;
45
  Ipv4AddressVector m_vector4_1;
46
  Ipv6AddressVector m_vector6;
47
  Ipv6AddressVector m_vector6_1;
48
};
49
50
TypeId 
51
SampleIpAddressVectorClass::GetTypeId (void)
52
{
53
  static TypeId tid = TypeId ("ns3::SampleIpAddressVectorClass")
54
    .SetParent<Object> ()
55
    .AddConstructor<SampleIpAddressVectorClass> ()
56
    .AddAttribute ("Ipv4Addresses",
57
                   "Ipv4 addresses",
58
                   Ipv4AddressVectorValue (SampleIpAddressVectorClass::GetDefaultIpv4Vector ()),
59
                   MakeIpv4AddressVectorAccessor (&SampleIpAddressVectorClass::m_vector4),
60
                   MakeIpv4AddressVectorChecker ())
61
    // Another way to configure the default value is with a StringValue
62
    .AddAttribute ("Ipv4Addresses2",
63
                   "Ipv4 addresses",
64
                   StringValue ("127.0.0.1,127.0.1.1"),
65
                   MakeIpv4AddressVectorAccessor (&SampleIpAddressVectorClass::m_vector4_1),
66
                   MakeIpv4AddressVectorChecker ())
67
    .AddAttribute ("Ipv6Addresses",
68
                   "Ipv6 addresses",
69
                   Ipv6AddressVectorValue (SampleIpAddressVectorClass::GetDefaultIpv6Vector ()),
70
                   MakeIpv6AddressVectorAccessor (&SampleIpAddressVectorClass::m_vector6),
71
                   MakeIpv6AddressVectorChecker ())
72
    .AddAttribute ("Ipv6Addresses2",
73
                   "Ipv6 addresses",
74
                   StringValue ("2001:DB8::1,2001:DB8::2"),
75
                   MakeIpv6AddressVectorAccessor (&SampleIpAddressVectorClass::m_vector6_1),
76
                   MakeIpv6AddressVectorChecker ())
77
  ;
78
  return tid;
79
}
80
81
TypeId 
82
SampleIpAddressVectorClass::GetInstanceTypeId (void) const
83
{
84
  return GetTypeId ();
85
}
86
87
void 
88
SampleIpAddressVectorClass::Print (std::ostream &os) const
89
{
90
  for (std::vector<Ipv4Address>::const_iterator it = m_vector4.begin (); 
91
       it != m_vector4.end (); )
92
    {
93
      it->Print (os);
94
      if (++it != m_vector4.end ())
95
        {
96
          os << ",";
97
        }
98
      else
99
        {
100
          break;
101
        }
102
    }
103
  os << std::endl;
104
  for (std::vector<Ipv6Address>::const_iterator it = m_vector6.begin (); 
105
       it != m_vector6.end (); )
106
    {
107
      it->Print (os);
108
      if (++it != m_vector6.end ())
109
        {
110
          os << ",";
111
        }
112
      else
113
        {
114
          break;
115
        }
116
    }
117
}
118
119
Ipv4AddressVector
120
SampleIpAddressVectorClass::GetDefaultIpv4Vector (void)
121
{
122
  Ipv4AddressVector v;
123
  v.push_back (Ipv4Address ("0.0.0.0"));
124
  return v;
125
}
126
127
Ipv6AddressVector
128
SampleIpAddressVectorClass::GetDefaultIpv6Vector (void)
129
{
130
  Ipv6AddressVector v;
131
  v.push_back (Ipv6Address ("::"));
132
  return v;
133
}
134
135
136
int main (int argc, char *argv[])
137
{
138
  Ptr<SampleIpAddressVectorClass> t = CreateObject<SampleIpAddressVectorClass> ();
139
140
  // Print out defaults 
141
  t->Print (std::cout); 
142
  std::cout << std::endl;
143
144
  Config::SetDefault ("ns3::SampleIpAddressVectorClass::Ipv4Addresses", StringValue ("192.0.2.1,192.0.2.2"));
145
  Config::SetDefault ("ns3::SampleIpAddressVectorClass::Ipv6Addresses", StringValue ("2001:DB8:A::1,2001:DB8:A::2"));
146
147
  Ptr<SampleIpAddressVectorClass> t2 = CreateObject<SampleIpAddressVectorClass> ();
148
  // Print out new defaults
149
  t2->Print (std::cout);
150
  std::cout << std::endl;
151
152
  // Modify the attribute values
153
  Ipv4AddressVector v;
154
  v.push_back (Ipv4Address ("203.0.113.1"));
155
  v.push_back (Ipv4Address ("203.0.113.2"));
156
  v.push_back (Ipv4Address ("203.0.113.3"));
157
  t->SetAttribute ("Ipv4Addresses", Ipv4AddressVectorValue (v));
158
  Ipv6AddressVector v6;
159
  v6.push_back (Ipv6Address ("2001:DB8:C::1"));
160
  v6.push_back (Ipv6Address ("2001:DB8:C::101"));
161
  t->SetAttribute ("Ipv6Addresses", Ipv6AddressVectorValue (v6));
162
163
  // Print out modified
164
  t->Print (std::cout); 
165
  std::cout << std::endl;
166
167
  return 0;
168
}
(-)a/src/network/examples/wscript (+3 lines)
 Lines 10-14    Link Here 
10
    obj = bld.create_ns3_program('main-packet-tag', ['network'])
10
    obj = bld.create_ns3_program('main-packet-tag', ['network'])
11
    obj.source = 'main-packet-tag.cc'
11
    obj.source = 'main-packet-tag.cc'
12
12
13
    obj = bld.create_ns3_program('ip-address-vector-example', ['network'])
14
    obj.source = 'ip-address-vector-example.cc'
15
13
    obj = bld.create_ns3_program('packet-socket-apps', ['core', 'network'])
16
    obj = bld.create_ns3_program('packet-socket-apps', ['core', 'network'])
14
    obj.source = 'packet-socket-apps.cc'
17
    obj.source = 'packet-socket-apps.cc'
(-)a/src/network/utils/address-utils.cc (+92 lines)
 Lines 126-129    Link Here 
126
126
127
} // namespace addressUtils
127
} // namespace addressUtils
128
128
129
ATTRIBUTE_HELPER_CPP (Ipv4AddressVector);
130
131
std::ostream &
132
operator << (std::ostream &os, const Ipv4AddressVector &ipv4AddressVector)
133
{
134
  for (uint32_t i = 0; i < ipv4AddressVector.size (); i++)
135
    {
136
      os << ipv4AddressVector[i];
137
      if (i < (ipv4AddressVector.size () - 1))
138
        {
139
          os << ",";
140
        }
141
    }
142
  return os;
143
}
144
145
std::istream &
146
operator >> (std::istream &is, Ipv4AddressVector &ipv4AddressVector)
147
{
148
  char delim = ',';
149
  std::string addressStr;
150
  is >> addressStr;
151
  std::vector<std::string> addrs;
152
153
  // parse input stream for addresses
154
  for (size_t p=0, q=0; p != addressStr.npos; p = q)
155
    {
156
      addrs.push_back (addressStr.substr (p + (p != 0), (q = addressStr.find (delim, p+1)) - p - (p != 0)));
157
    }
158
  if (addrs.size () > 0)
159
    {
160
      ipv4AddressVector.clear ();
161
      ipv4AddressVector.resize (addrs.size ());
162
      for (uint32_t i = 0; i < addrs.size (); i++)
163
        {
164
          ipv4AddressVector[i] = Ipv4Address (addrs[i].c_str ());
165
        }
166
    }
167
  else
168
    {
169
      is.setstate (std::ios_base::failbit);
170
    }
171
  
172
  return is;
173
}
174
175
ATTRIBUTE_HELPER_CPP (Ipv6AddressVector);
176
177
std::ostream &
178
operator << (std::ostream &os, const Ipv6AddressVector &ipv6AddressVector)
179
{
180
  for (uint32_t i = 0; i < ipv6AddressVector.size (); i++)
181
    {
182
      os << ipv6AddressVector[i];
183
      if (i < (ipv6AddressVector.size () - 1))
184
        {
185
          os << ",";
186
        }
187
    }
188
  return os;
189
}
190
191
std::istream &
192
operator >> (std::istream &is, Ipv6AddressVector &ipv6AddressVector)
193
{
194
  char delim = ',';
195
  std::string addressStr;
196
  is >> addressStr;
197
  std::vector<std::string> addrs;
198
199
  // parse input stream for addresses
200
  for (size_t p=0, q=0; p != addressStr.npos; p = q)
201
    {
202
      addrs.push_back (addressStr.substr (p + (p != 0), (q = addressStr.find (delim, p+1)) - p - (p != 0)));
203
    }
204
  if (addrs.size () > 0)
205
    {
206
      ipv6AddressVector.clear ();
207
      ipv6AddressVector.resize (addrs.size ());
208
      for (uint32_t i = 0; i < addrs.size (); i++)
209
        {
210
          ipv6AddressVector[i] = Ipv6Address (addrs[i].c_str ());
211
        }
212
    }
213
  else
214
    {
215
      is.setstate (std::ios_base::failbit);
216
    }
217
  
218
  return is;
219
}
220
129
} // namespace ns3
221
} // namespace ns3
(-)a/src/network/utils/address-utils.h (+9 lines)
 Lines 124-129    Link Here 
124
bool IsMulticast (const Address &ad);
124
bool IsMulticast (const Address &ad);
125
};
125
};
126
126
127
typedef std::vector<Ipv4Address> Ipv4AddressVector;
128
std::ostream &operator << (std::ostream &os, const Ipv4AddressVector &ipv4AddressVector);
129
std::istream &operator >> (std::istream &is, Ipv4AddressVector &ipv4AddressVector);
130
ATTRIBUTE_HELPER_HEADER (Ipv4AddressVector);
131
132
typedef std::vector<Ipv6Address> Ipv6AddressVector;
133
std::ostream &operator << (std::ostream &os, const Ipv6AddressVector &ipv6AddressVector);
134
std::istream &operator >> (std::istream &is, Ipv6AddressVector &ipv6AddressVector);
135
ATTRIBUTE_HELPER_HEADER (Ipv6AddressVector);
127
};
136
};
128
137
129
#endif /* ADDRESS_UTILS_H */
138
#endif /* ADDRESS_UTILS_H */

Return to bug 2348