src/internet/helper/ipv6-address-helper.h
changeset 8798 5d8dfd7c6609
parent 7385 10beb0e53130
child 9871 90c92578f680
--- 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 */