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:59
#define NS_LOG_FUNCTION(parameters)
Definition: log.h:311
Keep track of a set of IPv6 interfaces.
Access to the IPv6 forwarding table, interfaces, and configuration.
Definition: ipv6.h:79
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.
IPv6 address associated with an interface.
static Ipv6Address NextNetwork(const Ipv6Prefix prefix)
Get the next network acoording 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:72
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)
Definition: assert.h:86
Describes an IPv6 address.
Definition: ipv6-address.h:46
NS_LOG_COMPONENT_DEFINE("PacketLossCounter")
static Mac64Address ConvertFrom(const Address &address)
Describes an IPv6 prefix. It is just a bitmask like Ipv4Mask.
Definition: ipv6-address.h:364
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:360
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...