A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
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 << network << prefix);
110  SetBase (network, Ipv6Prefix (64));
111 }
112 
114 {
115  NS_LOG_FUNCTION (this);
117 }
118 
120 {
121  NS_LOG_FUNCTION (this);
122  Ipv6InterfaceContainer retval;
123 
124  for (uint32_t i = 0; i < c.GetN (); ++i)
125  {
126  Ptr<NetDevice> device = c.Get (i);
127 
128  Ptr<Node> node = device->GetNode ();
129  NS_ASSERT_MSG (node, "Ipv6AddressHelper::Allocate (): Bad node");
130 
131  Ptr<Ipv6> ipv6 = node->GetObject<Ipv6> ();
132  NS_ASSERT_MSG (ipv6, "Ipv6AddressHelper::Allocate (): Bad ipv6");
133  int32_t ifIndex = 0;
134 
135  ifIndex = ipv6->GetInterfaceForDevice (device);
136  if (ifIndex == -1)
137  {
138  ifIndex = ipv6->AddInterface (device);
139  }
140  NS_ASSERT_MSG (ifIndex >= 0, "Ipv6AddressHelper::Allocate (): "
141  "Interface index not found");
142 
143  Ipv6InterfaceAddress ipv6Addr = Ipv6InterfaceAddress (NewAddress (device->GetAddress ()), Ipv6Prefix (64));
144  ipv6->SetMetric (ifIndex, 1);
145  ipv6->AddAddress (ifIndex, ipv6Addr);
146  ipv6->SetUp (ifIndex);
147 
148  retval.Add (ipv6, ifIndex);
149  }
150  return retval;
151 }
152 
153 Ipv6InterfaceContainer Ipv6AddressHelper::Assign (const NetDeviceContainer &c, std::vector<bool> withConfiguration)
154 {
155  NS_LOG_FUNCTION (this);
156  Ipv6InterfaceContainer retval;
157  for (uint32_t i = 0; i < c.GetN (); ++i)
158  {
159  Ptr<NetDevice> device = c.Get (i);
160 
161  Ptr<Node> node = device->GetNode ();
162  NS_ASSERT_MSG (node, "Ipv6AddressHelper::Allocate (): Bad node");
163 
164  Ptr<Ipv6> ipv6 = node->GetObject<Ipv6> ();
165  NS_ASSERT_MSG (ipv6, "Ipv6AddressHelper::Allocate (): Bad ipv6");
166 
167  int32_t ifIndex = ipv6->GetInterfaceForDevice (device);
168  if (ifIndex == -1)
169  {
170  ifIndex = ipv6->AddInterface (device);
171  }
172  NS_ASSERT_MSG (ifIndex >= 0, "Ipv6AddressHelper::Allocate (): "
173  "Interface index not found");
174 
175  ipv6->SetMetric (ifIndex, 1);
176 
177  if (withConfiguration.at (i))
178  {
179  Ipv6InterfaceAddress ipv6Addr = Ipv6InterfaceAddress (NewAddress (device->GetAddress ()), Ipv6Prefix (64));
180  ipv6->AddAddress (ifIndex, ipv6Addr);
181  }
182 
183  ipv6->SetUp (ifIndex);
184  retval.Add (ipv6, ifIndex);
185  }
186  return retval;
187 }
188 
189 // Helper API that is redundant with Assign (c, false);
191 {
192  NS_LOG_FUNCTION (this);
193  std::vector<bool> withConfiguration;
194  for (uint32_t i = 0; i < c.GetN (); ++i)
195  {
196  withConfiguration.push_back (false);
197  }
198  return Assign (c, withConfiguration);
199 }
200 
201 } /* namespace ns3 */
202 
static bool IsMatchingType(const Address &address)
smart pointer class similar to boost::intrusive_ptr
Definition: ptr.h:60
#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:170
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:95
a polymophic address class
Definition: address.h:86
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)
#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:46
static Mac64Address ConvertFrom(const Address &address)
Describes an IPv6 prefix.
Definition: ipv6-address.h:387
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
Definition: object.h:362
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...