A Discrete-Event Network Simulator
API
ipv6-address-helper.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2008-2009 Strasbourg University
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: Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
19  */
20 
21 #include "ns3/assert.h"
22 #include "ns3/log.h"
23 #include "ns3/ptr.h"
24 #include "ns3/node.h"
25 #include "ns3/net-device.h"
26 #include "ns3/mac16-address.h"
27 #include "ns3/mac48-address.h"
28 #include "ns3/mac64-address.h"
29 #include "ns3/ipv6.h"
30 #include "ns3/ipv6-address-generator.h"
31 
32 #include "ipv6-address-helper.h"
33 
34 namespace ns3
35 {
36 
37 NS_LOG_COMPONENT_DEFINE ("Ipv6AddressHelper");
38 
40 {
41  NS_LOG_FUNCTION (this);
42  Ipv6AddressGenerator::Init (Ipv6Address ("2001:db8::"), Ipv6Prefix (64));
43 }
44 
46  Ipv6Address base)
47 {
48  NS_LOG_FUNCTION (this << network << prefix << base);
49  Ipv6AddressGenerator::Init (network, prefix, base);
50 }
51 
53  Ipv6Address base)
54 {
55  NS_LOG_FUNCTION (this << network << prefix << base);
58  Ipv6AddressGenerator::Init (network, Ipv6Prefix (64), base);
59 }
60 
61 
63 {
64  NS_LOG_FUNCTION (this << addr);
66  {
70  return address;
71  }
72  else if (Mac48Address::IsMatchingType (addr))
73  {
77  return address;
78  }
79  else if (Mac16Address::IsMatchingType (addr))
80  {
84  return address;
85  }
86  else
87  {
88  NS_FATAL_ERROR ("Did not pass in a valid Mac Address (16, 48 or 64 bits)");
89  }
90  /* never reached */
91  return Ipv6Address ("::");
92 }
93 
95 {
96  NS_LOG_FUNCTION (this);
97 //
98 // The way this is expected to be used is that an address and network number
99 // are initialized, and then NewAddress() is called repeatedly to allocate and
100 // get new addresses on a given subnet. The client will expect that the first
101 // address she gets back is the one she used to initialize the generator with.
102 // This implies that this operation is a post-increment.
103 //
105 }
106 
108 {
109  NS_LOG_FUNCTION (this);
111 }
112 
114 {
115  NS_LOG_FUNCTION (this);
116  Ipv6InterfaceContainer retval;
117 
118  for (uint32_t i = 0; i < c.GetN (); ++i)
119  {
120  Ptr<NetDevice> device = c.Get (i);
121 
122  Ptr<Node> node = device->GetNode ();
123  NS_ASSERT_MSG (node, "Ipv6AddressHelper::Allocate (): Bad node");
124 
125  Ptr<Ipv6> ipv6 = node->GetObject<Ipv6> ();
126  NS_ASSERT_MSG (ipv6, "Ipv6AddressHelper::Allocate (): Bad ipv6");
127  int32_t ifIndex = 0;
128 
129  ifIndex = ipv6->GetInterfaceForDevice (device);
130  if (ifIndex == -1)
131  {
132  ifIndex = ipv6->AddInterface (device);
133  }
134  NS_ASSERT_MSG (ifIndex >= 0, "Ipv6AddressHelper::Allocate (): "
135  "Interface index not found");
136 
137  Ipv6InterfaceAddress ipv6Addr = Ipv6InterfaceAddress (NewAddress (device->GetAddress ()), Ipv6Prefix (64));
138  ipv6->SetMetric (ifIndex, 1);
139  ipv6->AddAddress (ifIndex, ipv6Addr);
140  ipv6->SetUp (ifIndex);
141 
142  retval.Add (ipv6, ifIndex);
143  }
144  return retval;
145 }
146 
147 Ipv6InterfaceContainer Ipv6AddressHelper::Assign (const NetDeviceContainer &c, std::vector<bool> withConfiguration)
148 {
149  NS_LOG_FUNCTION (this);
150  Ipv6InterfaceContainer retval;
151  for (uint32_t i = 0; i < c.GetN (); ++i)
152  {
153  Ptr<NetDevice> device = c.Get (i);
154 
155  Ptr<Node> node = device->GetNode ();
156  NS_ASSERT_MSG (node, "Ipv6AddressHelper::Allocate (): Bad node");
157 
158  Ptr<Ipv6> ipv6 = node->GetObject<Ipv6> ();
159  NS_ASSERT_MSG (ipv6, "Ipv6AddressHelper::Allocate (): Bad ipv6");
160 
161  int32_t ifIndex = ipv6->GetInterfaceForDevice (device);
162  if (ifIndex == -1)
163  {
164  ifIndex = ipv6->AddInterface (device);
165  }
166  NS_ASSERT_MSG (ifIndex >= 0, "Ipv6AddressHelper::Allocate (): "
167  "Interface index not found");
168 
169  ipv6->SetMetric (ifIndex, 1);
170 
171  if (withConfiguration.at (i))
172  {
173  Ipv6InterfaceAddress ipv6Addr = Ipv6InterfaceAddress (NewAddress (device->GetAddress ()), Ipv6Prefix (64));
174  ipv6->AddAddress (ifIndex, ipv6Addr);
175  }
176 
177  ipv6->SetUp (ifIndex);
178  retval.Add (ipv6, ifIndex);
179  }
180  return retval;
181 }
182 
183 // Helper API that is redundant with Assign (c, false);
185 {
186  NS_LOG_FUNCTION (this);
187  std::vector<bool> withConfiguration;
188  for (uint32_t i = 0; i < c.GetN (); ++i)
189  {
190  withConfiguration.push_back (false);
191  }
192  return Assign (c, withConfiguration);
193 }
194 
195 } /* namespace ns3 */
196 
static bool IsMatchingType(const Address &address)
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:73
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
Keep track of a set of IPv6 interfaces.
Access to the IPv6 forwarding table, interfaces, and configuration.
Definition: ipv6.h:80
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr stored in this container at a given index.
static Mac16Address ConvertFrom(const Address &address)
static bool IsMatchingType(const Address &address)
void Add(Ptr< Ipv6 > ipv6, uint32_t interface)
Add a couple IPv6/interface.
static Ipv6Address MakeAutoconfiguredAddress(Mac16Address addr, Ipv6Address prefix)
Make the autoconfigured IPv6 address with Mac16Address.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:201
IPv6 address associated with an interface.
static Ipv6Address NextNetwork(const Ipv6Prefix prefix)
Get the next network according to the given Ipv6Prefix.
void SetBase(Ipv6Address network, Ipv6Prefix prefix, Ipv6Address base=Ipv6Address("::1"))
Set the base network number, network prefix, and base interface ID.
#define NS_FATAL_ERROR(msg)
Fatal error handling.
Definition: fatal-error.h:100
a polymophic address class
Definition: address.h:90
Ipv6InterfaceContainer Assign(const NetDeviceContainer &c)
Allocate an Ipv6InterfaceContainer with auto-assigned addresses.
uint32_t GetN(void) const
Get the number of Ptr stored in this container.
static void Init(const Ipv6Address net, const Ipv6Prefix prefix, const Ipv6Address interfaceId="::1")
Initialise the base network and interfaceId for the generator.
holds a vector of ns3::NetDevice pointers
static Mac48Address ConvertFrom(const Address &address)
Every class exported by the ns3 library is enclosed in the ns3 namespace.
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
Definition: assert.h:84
Describes an IPv6 address.
Definition: ipv6-address.h:47
static Mac64Address ConvertFrom(const Address &address)
Describes an IPv6 prefix.
Definition: ipv6-address.h:389
static bool AddAllocated(const Ipv6Address addr)
Add the Ipv6Address to the list of IPv6 entries.
tuple address
Definition: first.py:37
static bool IsMatchingType(const Address &address)
Ipv6InterfaceContainer AssignWithoutAddress(const NetDeviceContainer &c)
Allocate an Ipv6InterfaceContainer but do not assign any IPv6 addresses.
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
Definition: object.h:455
static Ipv6Address NextAddress(const Ipv6Prefix prefix)
Allocate the next Ipv6Address for the configured network and prefix.
Ipv6AddressHelper()
Constructor.
void NewNetwork(void)
Allocate a new network.
static Ipv6Address GetNetwork(const Ipv6Prefix prefix)
Get the current network of the given Ipv6Prefix.
Ipv6Address NewAddress(void)
Allocate a new Ipv6Address with interface ID equal to the next one in the underlying generator...