bug 1432: Align Ipv6AddressHelper API with Ipv4AddressHelper API
authorTom Henderson <tomh@tomh.org>
Sun, 20 May 2012 15:19:52 -0700
changeset 8798 5d8dfd7c6609
parent 8797 cf6b2a864fb6
child 8799 d51ce48206ee
bug 1432: Align Ipv6AddressHelper API with Ipv4AddressHelper API
CHANGES.html
examples/ipv6/fragmentation-ipv6.cc
examples/ipv6/icmpv6-redirect.cc
examples/ipv6/loose-routing-ipv6.cc
examples/ipv6/radvd-two-prefix.cc
examples/ipv6/radvd.cc
examples/routing/simple-routing-ping6.cc
examples/udp-client-server/udp-client-server.cc
examples/udp-client-server/udp-trace-client-server.cc
examples/udp/udp-echo.cc
src/csma-layout/examples/csma-star.cc
src/csma-layout/model/csma-star-helper.cc
src/internet/helper/ipv6-address-helper.cc
src/internet/helper/ipv6-address-helper.h
src/internet/model/ipv6-address-generator.cc
src/internet/test/ipv4-address-helper-test-suite.cc
src/internet/test/ipv6-address-helper-test-suite.cc
src/internet/wscript
src/network/test/ipv6-address-test-suite.cc
src/network/wscript
src/point-to-point-layout/model/point-to-point-dumbbell.cc
src/point-to-point-layout/model/point-to-point-grid.cc
src/point-to-point-layout/model/point-to-point-star.cc
--- a/CHANGES.html	Wed May 23 12:03:11 2012 +0200
+++ b/CHANGES.html	Sun May 20 15:19:52 2012 -0700
@@ -113,6 +113,13 @@
 the merge of the code from the LENA project. The new API is not
 backwards compatible with the previous version of the LTE module.
 </li>
+<li> The Ipv6AddressHelper API has been aligned with the Ipv4AddressHelper API. 
+The helper can be set with a call to Ipv6AddressHelper::SetBase 
+(Ipv6Address network, Ipv6Prefix prefix) instead of NewNetwork
+(Ipv6Address network, Ipv6Prefix prefix).  A new NewAddress (void) method
+has been added.  Typical usage will involve calls to SetBase (), NewNetwork (),
+and NewAddress (), as in class Ipv4AddressHelper. 
+</li>
 </ul>
 
 <h2>Changes to build system:</h2>
--- a/examples/ipv6/fragmentation-ipv6.cc	Wed May 23 12:03:11 2012 +0200
+++ b/examples/ipv6/fragmentation-ipv6.cc	Sun May 20 15:19:52 2012 -0700
@@ -127,10 +127,10 @@
 
   NS_LOG_INFO ("Create networks and assign IPv6 Addresses.");
   Ipv6AddressHelper ipv6;
-  ipv6.NewNetwork (Ipv6Address ("2001:1::"), 64);
+  ipv6.SetBase (Ipv6Address ("2001:1::"), Ipv6Prefix (64));
   Ipv6InterfaceContainer i1 = ipv6.Assign (d1);
   i1.SetRouter (1, true);
-  ipv6.NewNetwork (Ipv6Address ("2001:2::"), 64);
+  ipv6.SetBase (Ipv6Address ("2001:2::"), Ipv6Prefix (64));
   Ipv6InterfaceContainer i2 = ipv6.Assign (d2);
   i2.SetRouter (0, true);
 
--- a/examples/ipv6/icmpv6-redirect.cc	Wed May 23 12:03:11 2012 +0200
+++ b/examples/ipv6/icmpv6-redirect.cc	Sun May 20 15:19:52 2012 -0700
@@ -146,12 +146,12 @@
   NS_LOG_INFO ("Assign IPv6 Addresses.");
   Ipv6AddressHelper ipv6;
 
-  ipv6.NewNetwork (Ipv6Address ("2001:1::"), 64);
+  ipv6.SetBase (Ipv6Address ("2001:1::"), Ipv6Prefix (64));
   Ipv6InterfaceContainer iic1 = ipv6.Assign (ndc1);
   iic1.SetRouter (2, true);
   iic1.SetRouter (1, true);
 
-  ipv6.NewNetwork (Ipv6Address ("2001:2::"), 64);
+  ipv6.SetBase (Ipv6Address ("2001:2::"), Ipv6Prefix (64));
   Ipv6InterfaceContainer iic2 = ipv6.Assign (ndc2);
   iic2.SetRouter (0, true);
 
--- a/examples/ipv6/loose-routing-ipv6.cc	Wed May 23 12:03:11 2012 +0200
+++ b/examples/ipv6/loose-routing-ipv6.cc	Sun May 20 15:19:52 2012 -0700
@@ -104,30 +104,30 @@
   NS_LOG_INFO ("Create networks and assign IPv6 Addresses.");
   Ipv6AddressHelper ipv6;
 
-  ipv6.NewNetwork (Ipv6Address ("2001:1::"), 64);
+  ipv6.SetBase (Ipv6Address ("2001:1::"), Ipv6Prefix (64));
   Ipv6InterfaceContainer i1 = ipv6.Assign (d1);
   i1.SetRouter (1, true);
 
-  ipv6.NewNetwork (Ipv6Address ("2001:2::"), 64);
+  ipv6.SetBase (Ipv6Address ("2001:2::"), Ipv6Prefix (64));
   Ipv6InterfaceContainer i2 = ipv6.Assign (d2);
   i2.SetRouter (1, true);
 
-  ipv6.NewNetwork (Ipv6Address ("2001:3::"), 64);
+  ipv6.SetBase (Ipv6Address ("2001:3::"), Ipv6Prefix (64));
   Ipv6InterfaceContainer i3 = ipv6.Assign (d3);
   i3.SetRouter (0, true);
   i3.SetRouter (1, true);
 
-  ipv6.NewNetwork (Ipv6Address ("2001:4::"), 64);
+  ipv6.SetBase (Ipv6Address ("2001:4::"), Ipv6Prefix (64));
   Ipv6InterfaceContainer i4 = ipv6.Assign (d4);
   i4.SetRouter (0, true);
   i4.SetRouter (1, true);
 
-  ipv6.NewNetwork (Ipv6Address ("2001:5::"), 64);
+  ipv6.SetBase (Ipv6Address ("2001:5::"), Ipv6Prefix (64));
   Ipv6InterfaceContainer i5 = ipv6.Assign (d5);
   i5.SetRouter (0, true);
   i5.SetRouter (1, true);
 
-  ipv6.NewNetwork (Ipv6Address ("2001:6::"), 64);
+  ipv6.SetBase (Ipv6Address ("2001:6::"), Ipv6Prefix (64));
   Ipv6InterfaceContainer i6 = ipv6.Assign (d6);
   i6.SetRouter (0, true);
   i6.SetRouter (1, true);
--- a/examples/ipv6/radvd-two-prefix.cc	Wed May 23 12:03:11 2012 +0200
+++ b/examples/ipv6/radvd-two-prefix.cc	Sun May 20 15:19:52 2012 -0700
@@ -137,7 +137,7 @@
   Ipv6AddressHelper ipv6;
 
   /* first subnet */
-  ipv6.NewNetwork (Ipv6Address ("2001:1::"), 64);
+  ipv6.SetBase (Ipv6Address ("2001:1::"), Ipv6Prefix (64));
   NetDeviceContainer tmp;
   tmp.Add (d1.Get (0)); /* n0 */
   Ipv6InterfaceContainer iic1 = ipv6.AssignWithoutAddress (tmp); /* n0 interface */
@@ -152,7 +152,7 @@
   stackHelper.AddAddress (r, iic1.GetInterfaceIndex (1), Ipv6Address ("2001:ABCD::2"));
 
   /* second subnet R - n1 */
-  ipv6.NewNetwork (Ipv6Address ("2001:2::"), 64);
+  ipv6.SetBase (Ipv6Address ("2001:2::"), Ipv6Prefix (64));
   NetDeviceContainer tmp3;
   tmp3.Add (d2.Get (0)); /* R */
   Ipv6InterfaceContainer iicr2 = ipv6.Assign (tmp3); /* R interface */
--- a/examples/ipv6/radvd.cc	Wed May 23 12:03:11 2012 +0200
+++ b/examples/ipv6/radvd.cc	Sun May 20 15:19:52 2012 -0700
@@ -84,7 +84,7 @@
   Ipv6AddressHelper ipv6;
 
   /* first subnet */
-  ipv6.NewNetwork (Ipv6Address ("2001:1::"), 64);
+  ipv6.SetBase (Ipv6Address ("2001:1::"), Ipv6Prefix (64));
   NetDeviceContainer tmp;
   tmp.Add (d1.Get (0)); /* n0 */
   Ipv6InterfaceContainer iic1 = ipv6.AssignWithoutAddress (tmp); /* n0 interface */
@@ -96,7 +96,7 @@
   iic1.Add (iicr1);
 
   /* second subnet R - n1 */
-  ipv6.NewNetwork (Ipv6Address ("2001:2::"), 64);
+  ipv6.SetBase (Ipv6Address ("2001:2::"), Ipv6Prefix (64));
   NetDeviceContainer tmp3;
   tmp3.Add (d2.Get (0)); /* R */
   Ipv6InterfaceContainer iicr2 = ipv6.Assign (tmp3); /* R interface */
--- a/examples/routing/simple-routing-ping6.cc	Wed May 23 12:03:11 2012 +0200
+++ b/examples/routing/simple-routing-ping6.cc	Sun May 20 15:19:52 2012 -0700
@@ -128,10 +128,10 @@
 
   NS_LOG_INFO ("Create networks and assign IPv6 Addresses.");
   Ipv6AddressHelper ipv6;
-  ipv6.NewNetwork (Ipv6Address ("2001:1::"), 64);
+  ipv6.SetBase (Ipv6Address ("2001:1::"), Ipv6Prefix (64));
   Ipv6InterfaceContainer i1 = ipv6.Assign (d1);
   i1.SetRouter (1, true);
-  ipv6.NewNetwork (Ipv6Address ("2001:2::"), 64);
+  ipv6.SetBase (Ipv6Address ("2001:2::"), Ipv6Prefix (64));
   Ipv6InterfaceContainer i2 = ipv6.Assign (d2);
   i2.SetRouter (0, true);
 
--- a/examples/udp-client-server/udp-client-server.cc	Wed May 23 12:03:11 2012 +0200
+++ b/examples/udp-client-server/udp-client-server.cc	Sun May 20 15:19:52 2012 -0700
@@ -84,7 +84,7 @@
   else
     {
       Ipv6AddressHelper ipv6;
-      ipv6.NewNetwork ("2001:0000:f00d:cafe::", 64);
+      ipv6.SetBase ("2001:0000:f00d:cafe::", Ipv6Prefix (64));
       Ipv6InterfaceContainer i6 = ipv6.Assign (d);
       serverAddress = Address(i6.GetAddress (1,1));
     }
--- a/examples/udp-client-server/udp-trace-client-server.cc	Wed May 23 12:03:11 2012 +0200
+++ b/examples/udp-client-server/udp-trace-client-server.cc	Sun May 20 15:19:52 2012 -0700
@@ -83,7 +83,7 @@
   else
     {
       Ipv6AddressHelper ipv6;
-      ipv6.NewNetwork ("2001:0000:f00d:cafe::", 64);
+      ipv6.SetBase ("2001:0000:f00d:cafe::", Ipv6Prefix (64));
       Ipv6InterfaceContainer i6 = ipv6.Assign (d);
       serverAddress = Address(i6.GetAddress (1,1));
     }
--- a/examples/udp/udp-echo.cc	Wed May 23 12:03:11 2012 +0200
+++ b/examples/udp/udp-echo.cc	Sun May 20 15:19:52 2012 -0700
@@ -91,7 +91,7 @@
   else
     {
       Ipv6AddressHelper ipv6;
-      ipv6.NewNetwork ("2001:0000:f00d:cafe::", 64);
+      ipv6.SetBase ("2001:0000:f00d:cafe::", Ipv6Prefix (64));
       Ipv6InterfaceContainer i6 = ipv6.Assign (d);
       serverAddress = Address(i6.GetAddress (1,1));
     }
--- a/src/csma-layout/examples/csma-star.cc	Wed May 23 12:03:11 2012 +0200
+++ b/src/csma-layout/examples/csma-star.cc	Sun May 20 15:19:52 2012 -0700
@@ -142,7 +142,7 @@
         {
           Ipv6AddressGenerator::Init (ipv6AddressBase, ipv6AddressPrefix);
           Ipv6Address v6network = Ipv6AddressGenerator::GetNetwork (ipv6AddressPrefix);
-          address6.NewNetwork(v6network, ipv6AddressPrefix);
+          address6.SetBase (v6network, ipv6AddressPrefix);
 
           for (uint32_t j = 0; j < nFill; ++j)
             {
--- a/src/csma-layout/model/csma-star-helper.cc	Wed May 23 12:03:11 2012 +0200
+++ b/src/csma-layout/model/csma-star-helper.cc	Sun May 20 15:19:52 2012 -0700
@@ -129,7 +129,7 @@
   for (uint32_t i = 0; i < m_spokes.GetN (); ++i)
     {
       v6network = Ipv6AddressGenerator::GetNetwork (prefix);
-      addressHelper.NewNetwork(v6network, prefix);
+      addressHelper.SetBase (v6network, prefix);
 
       Ipv6InterfaceContainer ic = addressHelper.Assign (m_hubDevices.Get (i));
       m_hubInterfaces6.Add (ic);
--- a/src/internet/helper/ipv6-address-helper.cc	Wed May 23 12:03:11 2012 +0200
+++ b/src/internet/helper/ipv6-address-helper.cc	Sun May 20 15:19:52 2012 -0700
@@ -25,6 +25,7 @@
 #include "ns3/net-device.h"
 #include "ns3/mac48-address.h"
 #include "ns3/ipv6.h"
+#include "ns3/ipv6-address-generator.h"
 
 #include "ipv6-address-helper.h"
 
@@ -35,37 +36,73 @@
 
 Ipv6AddressHelper::Ipv6AddressHelper ()
 {
-  NS_LOG_FUNCTION_NOARGS ();
-  m_network = Ipv6Address ("2001::");
-  m_prefix = Ipv6Prefix (64);
+  NS_LOG_FUNCTION (this);
+  Ipv6AddressGenerator::Init (Ipv6Address ("2001:db8::"), Ipv6Prefix (64));
+}
+
+Ipv6AddressHelper::Ipv6AddressHelper (Ipv6Address network, Ipv6Prefix prefix,
+                                      Ipv6Address base)
+{
+  NS_LOG_FUNCTION (this << network << prefix << base);
+  Ipv6AddressGenerator::Init (network, prefix, base);
 }
 
+void Ipv6AddressHelper::SetBase (Ipv6Address network, Ipv6Prefix prefix,
+                            Ipv6Address base)
+{
+  NS_LOG_FUNCTION (this << network << prefix << base);
+  // XXX for now we do not enforce the prefix because the underlying
+  // Ipv6AddressGenerator does not handle prefixes well that are not 64 bits
+  Ipv6AddressGenerator::Init (network, Ipv6Prefix (64), base);
+}
+
+
 Ipv6Address Ipv6AddressHelper::NewAddress (Address addr)
 {
   NS_LOG_FUNCTION (this << addr);
-
-  switch (addr.GetLength ())
+  if (Mac48Address::IsMatchingType (addr))
     {
-    case 6:
-      return Ipv6Address::MakeAutoconfiguredAddress (Mac48Address::ConvertFrom (addr), m_network);
-    default:
-      return Ipv6Address ("::");
+      Ipv6Address network = Ipv6AddressGenerator::GetNetwork (Ipv6Prefix (64));
+      Ipv6Address address = Ipv6Address::MakeAutoconfiguredAddress (Mac48Address::ConvertFrom (addr), network);
+      Ipv6AddressGenerator::AddAllocated (address);
+      return address;
+    } 
+  else
+    {
+      NS_FATAL_ERROR ("Did not pass in a Mac48Address");
     }
   /* never reached */
   return Ipv6Address ("::");
 }
 
+Ipv6Address Ipv6AddressHelper::NewAddress (void)
+{
+  NS_LOG_FUNCTION (this);
+//
+// The way this is expected to be used is that an address and network number
+// are initialized, and then NewAddress() is called repeatedly to allocate and
+// get new addresses on a given subnet.  The client will expect that the first
+// address she gets back is the one she used to initialize the generator with.
+// This implies that this operation is a post-increment.
+//
+  return Ipv6AddressGenerator::NextAddress (Ipv6Prefix (64));
+}
+
 void Ipv6AddressHelper::NewNetwork (Ipv6Address network, Ipv6Prefix prefix)
 {
   NS_LOG_FUNCTION (this << network << prefix);
+  SetBase (network, Ipv6Prefix (64));
+}
 
-  m_network = network;
-  m_prefix = prefix;
+void Ipv6AddressHelper::NewNetwork (void)
+{
+  NS_LOG_FUNCTION (this);
+  Ipv6AddressGenerator::NextNetwork (Ipv6Prefix (64));
 }
 
 Ipv6InterfaceContainer Ipv6AddressHelper::Assign (const NetDeviceContainer &c)
 {
-  NS_LOG_FUNCTION_NOARGS ();
+  NS_LOG_FUNCTION (this);
   Ipv6InterfaceContainer retval;
 
   for (uint32_t i = 0; i < c.GetN (); ++i) 
@@ -87,10 +124,10 @@
       NS_ASSERT_MSG (ifIndex >= 0, "Ipv6AddressHelper::Allocate (): "
                      "Interface index not found");
 
-      Ipv6InterfaceAddress ipv6Addr = Ipv6InterfaceAddress (NewAddress (device->GetAddress ()), m_prefix);
+      Ipv6InterfaceAddress ipv6Addr = Ipv6InterfaceAddress (NewAddress (device->GetAddress ()), Ipv6Prefix (64));
       ipv6->SetMetric (ifIndex, 1);
+      ipv6->AddAddress (ifIndex, ipv6Addr);
       ipv6->SetUp (ifIndex);
-      ipv6->AddAddress (ifIndex, ipv6Addr);
 
       retval.Add (ipv6, ifIndex);
     }
@@ -99,7 +136,7 @@
 
 Ipv6InterfaceContainer Ipv6AddressHelper::Assign (const NetDeviceContainer &c, std::vector<bool> withConfiguration)
 {
-  NS_LOG_FUNCTION_NOARGS ();
+  NS_LOG_FUNCTION (this);
   Ipv6InterfaceContainer retval;
   for (uint32_t i = 0; i < c.GetN (); ++i) 
     {
@@ -120,47 +157,29 @@
                      "Interface index not found");
 
       ipv6->SetMetric (ifIndex, 1);
-      ipv6->SetUp (ifIndex);
 
       if (withConfiguration.at (i))
         {
-          Ipv6InterfaceAddress ipv6Addr = Ipv6InterfaceAddress (NewAddress (device->GetAddress ()), m_prefix);
+          Ipv6InterfaceAddress ipv6Addr = Ipv6InterfaceAddress (NewAddress (device->GetAddress ()), Ipv6Prefix (64));
           ipv6->AddAddress (ifIndex, ipv6Addr);
         }
 
+      ipv6->SetUp (ifIndex);
       retval.Add (ipv6, ifIndex);
     }
   return retval;
 }
 
+// Helper API that is redundant with Assign (c, false);
 Ipv6InterfaceContainer Ipv6AddressHelper::AssignWithoutAddress (const NetDeviceContainer &c)
 {
-  NS_LOG_FUNCTION_NOARGS ();
-  Ipv6InterfaceContainer retval;
+  NS_LOG_FUNCTION (this);
+  std::vector<bool> withConfiguration;
   for (uint32_t i = 0; i < c.GetN (); ++i) 
     {
-      Ptr<NetDevice> device = c.Get (i);
-
-      Ptr<Node> node = device->GetNode ();
-      NS_ASSERT_MSG (node, "Ipv6AddressHelper::Allocate (): Bad node");
-
-      Ptr<Ipv6> ipv6 = node->GetObject<Ipv6> ();
-      NS_ASSERT_MSG (ipv6, "Ipv6AddressHelper::Allocate (): Bad ipv6");
-
-      int32_t ifIndex = ipv6->GetInterfaceForDevice (device);
-      if (ifIndex == -1)
-        {
-          ifIndex = ipv6->AddInterface (device);
-        }
-      NS_ASSERT_MSG (ifIndex >= 0, "Ipv6AddressHelper::Allocate (): "
-                     "Interface index not found");
-
-      ipv6->SetMetric (ifIndex, 1);
-      ipv6->SetUp (ifIndex);
-
-      retval.Add (ipv6, ifIndex);
+      withConfiguration.push_back (false);
     }
-  return retval;
+  return Assign (c, withConfiguration);
 }
 
 } /* namespace ns3 */
--- a/src/internet/helper/ipv6-address-helper.h	Wed May 23 12:03:11 2012 +0200
+++ b/src/internet/helper/ipv6-address-helper.h	Sun May 20 15:19:52 2012 -0700
@@ -16,24 +16,63 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
  * Author: Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
+ * modified by Tom Henderson for ns-3.14 release
  */
 
-#ifndef IPV6_ADDRESS_STATIC_HELPER_H
-#define IPV6_ADDRESS_STATIC_HELPER_H
+#ifndef IPV6_ADDRESS_HELPER_H
+#define IPV6_ADDRESS_HELPER_H
 
 #include <vector>
 
 #include "ns3/ipv6-address.h"
-
 #include "ns3/net-device-container.h"
 #include "ipv6-interface-container.h"
+#include "ns3/deprecated.h"
 
-namespace ns3
-{
+namespace ns3 {
 
 /**
  * \class Ipv6AddressHelper
- * \brief Helper class to assign IPv6 address statically.
+ * \brief Helper class to auto-assign global IPv6 unicast addresses
+ *
+ * Assign global unicast IPv6 addresses based on RFC 4291 definition.
+ *
+ *   |         n bits          | 64-n bits |       64 bits              |
+ *   +-------------------------+-----------+----------------------------+
+ *   | global routing prefix   | subnet ID |       interface ID         |
+ *   +-------------------------+-----------+----------------------------+
+ *   <-------------network---------------->
+ *
+ *   11111111111111111111111111000000000000
+ *   <---prefix of length n--->
+ * 
+ * This class handles the following quantities.
+ * 1) The "network" which covers the 64 bit union of the global routing
+ *    prefix and the subnet ID
+ * 2) the "prefix" length "n" which demarcates the global routing prefix
+ *    and the subnet ID
+ * 3) the "base" which is the initial 64-bit interface ID.
+ *
+ * The names "network", "prefix" and "base" are chosen to be consistent 
+ * with a similar address helper for IPv4. 
+ *
+ * This helper class allows users to set or reset the network and
+ * interface components, and call "NewAddress ()" to sequentially increment
+ * the interface ID, and call "NewNetwork ()" to allocate a new subnet
+ * (until the subnet ID quantity rolls over).  A call to NewNetwork ()
+ * that causes the subnet ID to roll over will trigger an assertion.  
+ * 
+ * By default, the prefix is 32 bits and the network is '2001:db8::/32'
+ * (RFC 5156 section 2.6 Documentation prefix).  The prefix may range
+ * from length 0 to 64, with the value 64 having a special meaning that
+ * no subnet ID boundary is enforced (equivalent to value 0).
+ * 
+ * There are two variants of interface ID supported (RFC 4291, Sec. 2.5.1)
+ * The default is a "local" scope, but a "universal" scoped ID may be
+ * formed by calling "NewAddress (Address addr)" with a 48-bit MAC address.
+ * If this method is called, the addressed returned will include a
+ * modified EUI-64-format identifier created from the MAC address as 
+ * specified in RFC 4291.
  */
 class Ipv6AddressHelper
 {
@@ -44,36 +83,92 @@
   Ipv6AddressHelper ();
 
   /**
+   * \brief Constructor.
+   * \param network The IPv6 network
+   * \param prefix The prefix
+   * \param base The base interface ID
+   */
+  Ipv6AddressHelper (Ipv6Address network, Ipv6Prefix prefix,  
+                     Ipv6Address base = Ipv6Address ("::1"));
+
+  /**
+   * \brief Set the base network number, network prefix, and base interface ID
+   *
+   * \param network The IPv6 network
+   * \param prefix The prefix
+   * \param base The base interface ID
+   */
+  void SetBase (Ipv6Address network, Ipv6Prefix prefix,
+                Ipv6Address base = Ipv6Address ("::1"));
+
+  /**
    * \brief Allocate a new network.
+   *
+   * This method will reset the network for future
+   * network IDs, and resets the interface ID to the previously used
+   * base.
+   *  
    * \param network The IPv6 network
    * \param prefix The prefix
    */
-  void NewNetwork (Ipv6Address network, Ipv6Prefix prefix);
+  void NewNetwork (Ipv6Address network, Ipv6Prefix prefix) NS_DEPRECATED;
 
   /**
-   * \brief Allocate a new address.
-   * \param addr L2 address (currently only ethernet address is supported)
+   * \brief Allocate a new network.
+   *
+   * This method will cause the subnet prefix to increment, for future
+   * network IDs, and resets the interface ID to the previously used
+   * base.
+   */
+  void NewNetwork (void);
+
+  /**
+   * \brief Allocate a new Ipv6Address.
+   *
+   * If a Mac48Address is passed in, an Ipv6 autoconfigured address
+   * according to the current subnet prefix is returned.  If something
+   * other than Mac48 address is passed in, the program will terminate.
+   *
+   * \param addr address used to generate the interface ID of the IPv6 address
    * \return newly created Ipv6Address
    */
   Ipv6Address NewAddress (Address addr);
 
   /**
-   * \brief Allocate an Ipv6InterfaceContainer.
+   * \brief Allocate a new Ipv6Address with interface ID equal to the
+   * next one in the underlying generator.
+   *
+   * \return newly created Ipv6Address
+   */
+  Ipv6Address NewAddress (void);
+
+  /**
+   * \brief Allocate an Ipv6InterfaceContainer with auto-assigned addresses.
    * \param c netdevice container
    * \return newly created Ipv6InterfaceContainer
    */
   Ipv6InterfaceContainer Assign (const NetDeviceContainer &c);
 
   /**
-   * \brief Allocate an Ipv6InterfaceContainer.
+   * \brief Allocate an Ipv6InterfaceContainer, and control whether the 
+   *        interfaces have addresses auto-assigned to them
+   *
    * \param c netdevice container
-   * \param withConfiguration true : interface statically configured, false : no static configuration
+   * \param withConfiguration a vector of values for which, for a 
+   *        given device, true : interface automatically addressed, 
+   *        false : no automatic address
    * \return newly created Ipv6InterfaceContainer
    */
   Ipv6InterfaceContainer Assign (const NetDeviceContainer &c, std::vector<bool> withConfiguration);
 
   /**
-   * \brief Allocate an Ipv6InterfaceContainer without static IPv6 configuration.
+   * \brief Allocate an Ipv6InterfaceContainer but do not assign any IPv6 addresses
+   *
+   * This method is used when IPv6 address assignment may occur later
+   * (such as dynamic address assignment)
+   *
+   * Equivalent to AssignWithoutAddress (c, std::vector<bool> of false);
+   *
    * \param c netdevice container
    * \return newly created Ipv6InterfaceContainer
    */
@@ -84,16 +179,27 @@
    * \internal
    * \brief The IPv6 network.
    */
-  Ipv6Address m_network;
+  uint8_t m_network[16];
 
   /**
    * \internal
-   * \brief IPv6 The prefix (mask).
+   * \brief The prefix (mask).
    */
-  Ipv6Prefix m_prefix;
+  uint8_t m_prefix[16];
+
+  /**
+   * \internal
+   * \brief The base interface ID
+   */
+  uint64_t m_base;
+  /**
+   * \internal
+   * \brief The current interface ID
+   */
+  uint64_t m_iid;
 };
 
 } /* namespace ns3 */
 
-#endif /* IPV6_ADDRESS_STATIC_HELPER_H */
+#endif /* IPV6_ADDRESS_STATIC_H */
 
--- a/src/internet/model/ipv6-address-generator.cc	Wed May 23 12:03:11 2012 +0200
+++ b/src/internet/model/ipv6-address-generator.cc	Sun May 20 15:19:52 2012 -0700
@@ -160,6 +160,7 @@
   // network number at bit zero of the int that holds it).
   //
   uint32_t index = PrefixToIndex (prefix);
+  NS_LOG_DEBUG ("Index " << index);
   uint32_t a = m_netTable[index].shift / 8;
   uint32_t b = m_netTable[index].shift % 8;
   for (int32_t j = 15 - a; j >= 0; j--)
--- a/src/internet/test/ipv4-address-helper-test-suite.cc	Wed May 23 12:03:11 2012 +0200
+++ b/src/internet/test/ipv4-address-helper-test-suite.cc	Sun May 20 15:19:52 2012 -0700
@@ -179,6 +179,74 @@
   Simulator::Destroy ();
 }
 
+class IpAddressHelperTestCasev4 : public TestCase
+{
+public:
+  IpAddressHelperTestCasev4 ();
+  virtual ~IpAddressHelperTestCasev4 ();
+
+private:
+  virtual void DoRun (void);
+};
+
+IpAddressHelperTestCasev4::IpAddressHelperTestCasev4 ()
+  : TestCase ("IpAddressHelper Ipv4 test case (similar to IPv6)")
+{
+}
+
+IpAddressHelperTestCasev4::~IpAddressHelperTestCasev4 ()
+{
+}
+
+void
+IpAddressHelperTestCasev4::DoRun (void)
+{
+  Ipv4AddressHelper ip1;
+  Ipv4Address ipAddr1;
+  ipAddr1 = ip1.NewAddress ();
+  // Ipv4AddressHelper that is unconfigured
+  NS_TEST_ASSERT_MSG_EQ (ipAddr1, Ipv4Address ("255.255.255.255"), "Ipv4AddressHelper failure");
+
+  ip1.SetBase ("192.168.0.0", "255.255.255.0");
+  ipAddr1 = ip1.NewAddress ();
+  NS_TEST_ASSERT_MSG_EQ (ipAddr1, Ipv4Address ("192.168.0.1"), "Ipv4AddressHelper failure");
+  ipAddr1 = ip1.NewAddress ();
+  NS_TEST_ASSERT_MSG_EQ (ipAddr1, Ipv4Address ("192.168.0.2"), "Ipv4AddressHelper failure");
+  ip1.NewNetwork ();
+  ipAddr1 = ip1.NewAddress ();
+  NS_TEST_ASSERT_MSG_EQ (ipAddr1, Ipv4Address ("192.168.1.1"), "Ipv4AddressHelper failure");
+  ip1.NewNetwork ();  // 192.168.2
+  ip1.NewNetwork ();  // 192.168.3
+  ip1.NewNetwork ();  // 192.168.4
+  ipAddr1 = ip1.NewAddress (); // 4.1
+  ipAddr1 = ip1.NewAddress (); // 4.2
+  ipAddr1 = ip1.NewAddress (); // 4.3
+  NS_TEST_ASSERT_MSG_EQ (ipAddr1, Ipv4Address ("192.168.4.3"), "Ipv4AddressHelper failure");
+
+  // reset base to start at 192.168.0.100
+  ip1.SetBase ("192.168.0.0", "255.255.255.0", "0.0.0.100");
+  ipAddr1 = ip1.NewAddress ();
+  NS_TEST_ASSERT_MSG_EQ (ipAddr1, Ipv4Address ("192.168.0.100"), "Ipv4AddressHelper failure");
+  
+  // rollover
+  ip1.SetBase ("192.168.0.0", "255.255.255.0", "0.0.0.254");
+  ipAddr1 = ip1.NewAddress (); // .254
+  NS_TEST_ASSERT_MSG_EQ (ipAddr1, Ipv4Address ("192.168.0.254"), "Ipv4AddressHelper failure");
+  // The below will overflow and assert, so it is commented out
+  // ipAddr1 = ip1.NewAddress (); // .255
+
+  // create with arguments
+  Ipv4AddressHelper ip2 = Ipv4AddressHelper ("192.168.1.0", "255.255.255.0", "0.0.0.1");
+  // duplicate assignment
+  ip2.NewNetwork ();  // 192.168.2
+  ip2.NewNetwork ();  // 192.168.3
+  ip2.NewNetwork ();  // 192.168.4
+  // Uncomment below, and 192.168.4.1 will crash since it was allocated above
+  // ipAddr1 = ip2.NewAddress (); // 4.1
+
+}
+
+
 static class Ipv4AddressHelperTestSuite : public TestSuite
 {
 public:
@@ -188,6 +256,7 @@
     AddTestCase (new NetworkAllocatorHelperTestCase ());
     AddTestCase (new AddressAllocatorHelperTestCase ());
     AddTestCase (new ResetAllocatorHelperTestCase ());
+    AddTestCase (new IpAddressHelperTestCasev4 ());
   }
 } g_ipv4AddressHelperTestSuite;
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/internet/test/ipv6-address-helper-test-suite.cc	Sun May 20 15:19:52 2012 -0700
@@ -0,0 +1,145 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2012 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
+ */
+
+#include "ns3/ipv6-address-helper.h"
+#include "ns3/ipv4-address-helper.h"
+#include "ns3/simple-net-device.h"
+#include "ns3/net-device-container.h"
+#include "ns3/node-container.h"
+#include "ns3/internet-stack-helper.h"
+#include "ns3/test.h"
+#include "ns3/log.h"
+
+using namespace ns3;
+
+class IpAddressHelperTestCasev6 : public TestCase
+{
+public:
+  IpAddressHelperTestCasev6 ();
+  virtual ~IpAddressHelperTestCasev6 ();
+
+private:
+  virtual void DoRun (void);
+};
+
+IpAddressHelperTestCasev6::IpAddressHelperTestCasev6 ()
+  : TestCase ("IpAddressHelper Ipv6 test case")
+{
+}
+
+IpAddressHelperTestCasev6::~IpAddressHelperTestCasev6 ()
+{
+}
+
+void
+IpAddressHelperTestCasev6::DoRun (void)
+{
+  Ipv6AddressHelper ip1;
+  Ipv6Address ipAddr1;
+  ipAddr1 = ip1.NewAddress ();
+  // Ipv6AddressHelper that is unconfigured
+  NS_TEST_ASSERT_MSG_EQ (ipAddr1, Ipv6Address ("2001:db8::1"), "Ipv6AddressHelper failure");
+  ipAddr1 = ip1.NewAddress ();
+  NS_TEST_ASSERT_MSG_EQ (ipAddr1, Ipv6Address ("2001:db8::2"), "Ipv6AddressHelper failure");
+  ip1.NewNetwork ();
+  ipAddr1 = ip1.NewAddress ();
+  NS_TEST_ASSERT_MSG_EQ (ipAddr1, Ipv6Address ("2001:db8:0:1:0:0:0:1"), "Ipv6AddressHelper failure");
+
+  // Reset
+  ip1.SetBase (Ipv6Address ("2001:db81::"), Ipv6Prefix (32), Ipv6Address ("::1"));
+  ipAddr1 = ip1.NewAddress ();
+  NS_TEST_ASSERT_MSG_EQ (ipAddr1, Ipv6Address ("2001:db81::1"), "Ipv6AddressHelper failure");
+  // Skip a few addresses
+  ip1.SetBase (Ipv6Address ("2001:db81::"), Ipv6Prefix (32), Ipv6Address ("::15"));
+  ipAddr1 = ip1.NewAddress ();
+  NS_TEST_ASSERT_MSG_EQ (ipAddr1, Ipv6Address ("2001:db81::15"), "Ipv6AddressHelper failure");
+  ipAddr1 = ip1.NewAddress ();
+  NS_TEST_ASSERT_MSG_EQ (ipAddr1, Ipv6Address ("2001:db81::16"), "Ipv6AddressHelper failure");
+  // Increment network
+  ip1.NewNetwork ();
+  ipAddr1 = ip1.NewAddress ();
+  NS_TEST_ASSERT_MSG_EQ (ipAddr1, Ipv6Address ("2001:db81:0:1::15"), "Ipv6AddressHelper failure");
+  // Reset
+  ip1.SetBase (Ipv6Address ("2001:dddd::"), Ipv6Prefix (32), Ipv6Address ("::1"));
+  ipAddr1 = ip1.NewAddress (); // ::1
+  ipAddr1 = ip1.NewAddress (); // ::2
+  ipAddr1 = ip1.NewAddress (); // ::3
+  ip1.NewNetwork (); // 0:1
+  ip1.NewNetwork (); // 0:2
+  ipAddr1 = ip1.NewAddress (); // ::1 again
+  NS_TEST_ASSERT_MSG_EQ (ipAddr1, Ipv6Address ("2001:dddd:0:2::1"), "Ipv6AddressHelper failure");
+
+  // Set again
+  ip1.SetBase (Ipv6Address ("2001:db82::1"), Ipv6Prefix (32));
+  ipAddr1 = ip1.NewAddress ();
+  NS_TEST_ASSERT_MSG_EQ (ipAddr1, Ipv6Address ("2001:db82::1"), "Ipv6AddressHelper failure");
+
+  // Test container assignment
+  NodeContainer n;
+  n.Create (2);
+
+  /* Install IPv4/IPv6 stack */
+  InternetStackHelper internetv6;
+  internetv6.SetIpv4StackInstall (false);
+  internetv6.Install (n);
+
+  NetDeviceContainer d;
+  Ptr<SimpleNetDevice> s1 = CreateObject<SimpleNetDevice> ();
+  s1->SetAddress (Mac48Address::Allocate ());
+  n.Get (0)->AddDevice (s1);
+
+  Ptr<SimpleNetDevice> s2 = CreateObject<SimpleNetDevice> ();
+  s2->SetAddress (Mac48Address::Allocate ());
+  n.Get (1)->AddDevice (s2);
+  d.Add (s1);
+  d.Add (s2);
+  
+  ip1.SetBase (Ipv6Address ("2001:00aa::"), Ipv6Prefix (56));
+  Ipv6InterfaceContainer ic;
+  ic = ip1.Assign (d);
+
+  // Check that d got intended addresses
+  Ipv6InterfaceAddress d1addr;
+  Ipv6InterfaceAddress d2addr;
+  // Interface 0 is loopback, interface 1 is s1, and the 0th addr is linklocal 
+  // so we look at address (1,1)
+  d1addr = n.Get (0)->GetObject <Ipv6> ()->GetAddress (1, 1); 
+  NS_TEST_ASSERT_MSG_EQ (d1addr.GetAddress (), Ipv6Address ("2001:00aa:0000:0000:0200:00ff:fe00:0001"), "Ipv6AddressHelper failure");
+  // Look also at the interface container (device 0, address 1)
+  NS_TEST_ASSERT_MSG_EQ (ic.GetAddress (0,1), Ipv6Address ("2001:00aa:0000:0000:0200:00ff:fe00:0001"), "Ipv6AddressHelper failure");
+  d2addr = n.Get (1)->GetObject <Ipv6> ()->GetAddress (1, 1); 
+  // Look at second container
+  NS_TEST_ASSERT_MSG_EQ (d2addr.GetAddress (), Ipv6Address ("2001:00aa:0000:0000:0200:00ff:fe00:0002"), "Ipv6AddressHelper failure");
+  // Look also at the interface container (device 0, address 1)
+  NS_TEST_ASSERT_MSG_EQ (ic.GetAddress (1,1), Ipv6Address ("2001:00aa:0000:0000:0200:00ff:fe00:0002"), "Ipv6AddressHelper failure");
+}
+
+class Ipv6AddressHelperTestSuite : public TestSuite
+{
+public:
+  Ipv6AddressHelperTestSuite ();
+};
+
+Ipv6AddressHelperTestSuite::Ipv6AddressHelperTestSuite ()
+  : TestSuite ("ipv6-address-helper", UNIT)
+{
+  AddTestCase (new IpAddressHelperTestCasev6);
+}
+
+// Do not forget to allocate an instance of this TestSuite
+static Ipv6AddressHelperTestSuite ipv6AddressHelperTestSuite;
--- a/src/internet/wscript	Wed May 23 12:03:11 2012 +0200
+++ b/src/internet/wscript	Sun May 20 15:19:52 2012 -0700
@@ -207,6 +207,7 @@
         'test/ipv6-address-generator-test-suite.cc',
         'test/ipv6-dual-stack-test-suite.cc',
         'test/ipv6-fragmentation-test.cc',
+        'test/ipv6-address-helper-test-suite.cc',
         ]
 
     headers = bld.new_task_gen(features=['ns3header'])
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/network/test/ipv6-address-test-suite.cc	Sun May 20 15:19:52 2012 -0700
@@ -0,0 +1,107 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * 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
+ */
+
+#include "ns3/test.h"
+#include "ns3/ipv6-address.h"
+
+using namespace ns3;
+
+class Ipv6AddressTestCase1 : public TestCase
+{
+public:
+  Ipv6AddressTestCase1 ();
+  virtual ~Ipv6AddressTestCase1 ();
+
+private:
+  virtual void DoRun (void);
+};
+
+Ipv6AddressTestCase1::Ipv6AddressTestCase1 ()
+  : TestCase ("serialization code")
+{
+}
+
+Ipv6AddressTestCase1::~Ipv6AddressTestCase1 ()
+{
+}
+
+void
+Ipv6AddressTestCase1::DoRun (void)
+{
+  Ipv6Address ip = Ipv6Address ("2001:db8::1");
+  uint8_t ipBytes[16];
+  ip.Serialize (ipBytes);
+  NS_TEST_ASSERT_MSG_EQ (ipBytes[0], 0x20, "Failed string conversion");
+  NS_TEST_ASSERT_MSG_EQ (ipBytes[1], 0x01, "Failed string conversion");
+  NS_TEST_ASSERT_MSG_EQ (ipBytes[2], 0x0d, "Failed string conversion");
+  NS_TEST_ASSERT_MSG_EQ (ipBytes[3], 0xb8, "Failed string conversion");
+  NS_TEST_ASSERT_MSG_EQ (ipBytes[15], 1, "Failed string conversion");
+
+  ip = Ipv6Address ("2001:db8:1::1");
+  ip.Serialize (ipBytes);
+  NS_TEST_ASSERT_MSG_EQ (ipBytes[0], 0x20, "Failed string conversion");
+  NS_TEST_ASSERT_MSG_EQ (ipBytes[1], 0x01, "Failed string conversion");
+  NS_TEST_ASSERT_MSG_EQ (ipBytes[2], 0x0d, "Failed string conversion");
+  NS_TEST_ASSERT_MSG_EQ (ipBytes[3], 0xb8, "Failed string conversion");
+  NS_TEST_ASSERT_MSG_EQ (ipBytes[5], 0x01, "Failed string conversion");
+  NS_TEST_ASSERT_MSG_EQ (ipBytes[15], 1, "Failed string conversion");
+
+  // Zero padding
+  ip = Ipv6Address ("2001:0db8:0001::1");
+  ip.Serialize (ipBytes);
+  NS_TEST_ASSERT_MSG_EQ (ipBytes[0], 0x20, "Failed string conversion");
+  NS_TEST_ASSERT_MSG_EQ (ipBytes[1], 0x01, "Failed string conversion");
+  NS_TEST_ASSERT_MSG_EQ (ipBytes[2], 0x0d, "Failed string conversion");
+  NS_TEST_ASSERT_MSG_EQ (ipBytes[3], 0xb8, "Failed string conversion");
+  NS_TEST_ASSERT_MSG_EQ (ipBytes[5], 0x01, "Failed string conversion");
+  NS_TEST_ASSERT_MSG_EQ (ipBytes[15], 1, "Failed string conversion");
+
+  ip = Ipv6Address ("2001:db8:0:1::1");
+  ip.Serialize (ipBytes);
+  NS_TEST_ASSERT_MSG_EQ (ipBytes[0], 0x20, "Failed string conversion");
+  NS_TEST_ASSERT_MSG_EQ (ipBytes[1], 0x01, "Failed string conversion");
+  NS_TEST_ASSERT_MSG_EQ (ipBytes[2], 0x0d, "Failed string conversion");
+  NS_TEST_ASSERT_MSG_EQ (ipBytes[3], 0xb8, "Failed string conversion");
+  NS_TEST_ASSERT_MSG_EQ (ipBytes[7], 0x01, "Failed string conversion");
+  NS_TEST_ASSERT_MSG_EQ (ipBytes[15], 1, "Failed string conversion");
+
+  ip = Ipv6Address ("2001:db8:0:1:0:0:0:1");
+  ip.Serialize (ipBytes);
+  NS_TEST_ASSERT_MSG_EQ (ipBytes[0], 0x20, "Failed string conversion");
+  NS_TEST_ASSERT_MSG_EQ (ipBytes[1], 0x01, "Failed string conversion");
+  NS_TEST_ASSERT_MSG_EQ (ipBytes[2], 0x0d, "Failed string conversion");
+  NS_TEST_ASSERT_MSG_EQ (ipBytes[3], 0xb8, "Failed string conversion");
+  NS_TEST_ASSERT_MSG_EQ (ipBytes[7], 0x01, "Failed string conversion");
+  NS_TEST_ASSERT_MSG_EQ (ipBytes[15], 1, "Failed string conversion");
+
+  // Please add more tests below
+
+}
+
+class Ipv6AddressTestSuite : public TestSuite
+{
+public:
+  Ipv6AddressTestSuite ();
+};
+
+Ipv6AddressTestSuite::Ipv6AddressTestSuite ()
+  : TestSuite ("ipv6-address", UNIT)
+{
+  AddTestCase (new Ipv6AddressTestCase1);
+}
+
+static Ipv6AddressTestSuite ipv6AddressTestSuite;
+
--- a/src/network/wscript	Wed May 23 12:03:11 2012 +0200
+++ b/src/network/wscript	Sun May 20 15:19:52 2012 -0700
@@ -61,6 +61,7 @@
     network_test.source = [
         'test/buffer-test.cc',
         'test/drop-tail-queue-test-suite.cc',
+        'test/ipv6-address-test-suite.cc',
         'test/packetbb-test-suite.cc',
         'test/packet-test-suite.cc',
         'test/packet-metadata-test.cc',
--- a/src/point-to-point-layout/model/point-to-point-dumbbell.cc	Wed May 23 12:03:11 2012 +0200
+++ b/src/point-to-point-layout/model/point-to-point-dumbbell.cc	Sun May 20 15:19:52 2012 -0700
@@ -166,7 +166,7 @@
   Ipv6AddressHelper addressHelper;
   
   v6network = Ipv6AddressGenerator::GetNetwork (prefix);
-  addressHelper.NewNetwork (v6network, prefix);
+  addressHelper.SetBase (v6network, prefix);
   m_routerInterfaces6 = addressHelper.Assign (m_routerDevices);
   Ipv6AddressGenerator::NextNetwork (prefix);
 
@@ -174,7 +174,7 @@
   for (uint32_t i = 0; i < LeftCount (); ++i)
     {
       v6network = Ipv6AddressGenerator::GetNetwork (prefix);
-      addressHelper.NewNetwork (v6network, prefix);
+      addressHelper.SetBase (v6network, prefix);
 
       NetDeviceContainer ndc;
       ndc.Add (m_leftLeafDevices.Get (i));
@@ -190,7 +190,7 @@
   for (uint32_t i = 0; i < RightCount (); ++i)
     {
       v6network = Ipv6AddressGenerator::GetNetwork (prefix);
-      addressHelper.NewNetwork (v6network, prefix);
+      addressHelper.SetBase (v6network, prefix);
 
       NetDeviceContainer ndc;
       ndc.Add (m_rightLeafDevices.Get (i));
--- a/src/point-to-point-layout/model/point-to-point-grid.cc	Wed May 23 12:03:11 2012 +0200
+++ b/src/point-to-point-layout/model/point-to-point-grid.cc	Sun May 20 15:19:52 2012 -0700
@@ -148,7 +148,7 @@
       for (uint32_t j = 0; j < rowContainer.GetN (); j+=2)
         {
           v6network = Ipv6AddressGenerator::GetNetwork (prefix);
-          addrHelper.NewNetwork(v6network, prefix);
+          addrHelper.SetBase(v6network, prefix);
           Ipv6InterfaceContainer ic = addrHelper.Assign (rowContainer.Get (j));
           rowInterfaces.Add (ic);
           ic = addrHelper.Assign (rowContainer.Get (j+1));
@@ -169,7 +169,7 @@
       for (uint32_t j = 0; j < colContainer.GetN (); j+=2)
         {
           v6network = Ipv6AddressGenerator::GetNetwork (prefix);
-          addrHelper.NewNetwork(v6network, prefix);
+          addrHelper.SetBase(v6network, prefix);
           Ipv6InterfaceContainer ic = addrHelper.Assign (colContainer.Get (j));
           colInterfaces.Add (ic);
           ic = addrHelper.Assign (colContainer.Get (j+1));
--- a/src/point-to-point-layout/model/point-to-point-star.cc	Wed May 23 12:03:11 2012 +0200
+++ b/src/point-to-point-layout/model/point-to-point-star.cc	Sun May 20 15:19:52 2012 -0700
@@ -119,7 +119,7 @@
   for (uint32_t i = 0; i < m_spokes.GetN (); ++i)
     {
       v6network = Ipv6AddressGenerator::GetNetwork (prefix);
-      addressHelper.NewNetwork(v6network, prefix);
+      addressHelper.SetBase (v6network, prefix);
 
       Ipv6InterfaceContainer ic = addressHelper.Assign (m_hubDevices.Get (i));
       m_hubInterfaces6.Add (ic);