Bug 1702 - A router should't aways add itself as the default router
authorTommaso Pecorella <tommaso.pecorella@unifi.it>
Wed, 07 Aug 2013 23:18:48 +0200
changeset 10131 0dc090fc749d
parent 10130 17cfc5197ff8
child 10132 c11b8c143664
Bug 1702 - A router should't aways add itself as the default router
CHANGES.html
RELEASE_NOTES
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
src/fd-net-device/examples/fd-tap-ping6.cc
src/internet/helper/ipv6-interface-container.cc
src/internet/helper/ipv6-interface-container.h
src/internet/model/ipv6-static-routing.cc
src/internet/model/ipv6-static-routing.h
--- a/CHANGES.html	Mon Aug 12 15:54:59 2013 +0200
+++ b/CHANGES.html	Wed Aug 07 23:18:48 2013 +0200
@@ -77,6 +77,11 @@
 
 <h2>Changes to existing API:</h2>
 <ul>
+  <li> The Ipv6InterfaceContainer functions to set a node in forwarding state (i.e., a router) 
+  and to install a default router in a group of nodes have been extensively changed.
+  The old function "void Ipv6InterfaceContainer::SetRouter (uint32_t i, bool router)"
+  is now DEPRECATED.
+  </li>
   <li> The documentation's IPv6 addresses (2001:db8::/32, RFC 3849) are now
   dropped by routers.
   </li>
@@ -88,7 +93,7 @@
   include it from the core module.
   </li>
   <li> The Ipv6 UnicastForwardCallback and  MulticastForwardCallback 
-  have a new parmater, the NetDevice the packet has been received from.
+  have a new parameter, the NetDevice the packet has been received from.
   Existing Ipv6RoutingProtocols should update their RouteInput function
   accordingly. E.g., from ucb (rtentry, p, header); to ucb (idev, rtentry, p, header);
   </li>
--- a/RELEASE_NOTES	Mon Aug 12 15:54:59 2013 +0200
+++ b/RELEASE_NOTES	Wed Aug 07 23:18:48 2013 +0200
@@ -63,6 +63,7 @@
 - Bug 1698 - mobility.SetPositionAllocator misses prefix "ns3::"
 - Bug 1700 - Ipv6RawSocket does not honor the bound address when sending packets
 - Bug 1701 - Ipv6StaticRouting: the source address should match the destination scope
+- Bug 1702 - Ipv6InterfaceContainer::SetRouter should not always add the router as the default router.
 - Bug 1703 - Nodes don't react to a DAD
 - Bug 1712 - The IP (v4 and v6) forwarding needs a test
 - Bug 1718 - Ipv4StaticRouting log component is misspelled
--- a/examples/ipv6/fragmentation-ipv6.cc	Mon Aug 12 15:54:59 2013 +0200
+++ b/examples/ipv6/fragmentation-ipv6.cc	Wed Aug 07 23:18:48 2013 +0200
@@ -129,10 +129,12 @@
   Ipv6AddressHelper ipv6;
   ipv6.SetBase (Ipv6Address ("2001:1::"), Ipv6Prefix (64));
   Ipv6InterfaceContainer i1 = ipv6.Assign (d1);
-  i1.SetRouter (1, true);
+  i1.SetForwarding (1, true);
+  i1.SetDefaultRouteInAllNodes (1);
   ipv6.SetBase (Ipv6Address ("2001:2::"), Ipv6Prefix (64));
   Ipv6InterfaceContainer i2 = ipv6.Assign (d2);
-  i2.SetRouter (0, true);
+  i2.SetForwarding (0, true);
+  i2.SetDefaultRouteInAllNodes (0);
 
   stackHelper.PrintRoutingTable (n0);
 
--- a/examples/ipv6/icmpv6-redirect.cc	Mon Aug 12 15:54:59 2013 +0200
+++ b/examples/ipv6/icmpv6-redirect.cc	Wed Aug 07 23:18:48 2013 +0200
@@ -148,12 +148,14 @@
 
   ipv6.SetBase (Ipv6Address ("2001:1::"), Ipv6Prefix (64));
   Ipv6InterfaceContainer iic1 = ipv6.Assign (ndc1);
-  iic1.SetRouter (2, true);
-  iic1.SetRouter (1, true);
+  iic1.SetForwarding (2, true);
+  iic1.SetForwarding (1, true);
+  iic1.SetDefaultRouteInAllNodes (1);
 
   ipv6.SetBase (Ipv6Address ("2001:2::"), Ipv6Prefix (64));
   Ipv6InterfaceContainer iic2 = ipv6.Assign (ndc2);
-  iic2.SetRouter (0, true);
+  iic2.SetForwarding (0, true);
+  iic2.SetDefaultRouteInAllNodes (0);
 
   stackHelper.AddHostRouteTo (r1, iic2.GetAddress (1, 1), iic1.GetAddress (2, 0), iic1.GetInterfaceIndex (1));
 
--- a/examples/ipv6/loose-routing-ipv6.cc	Mon Aug 12 15:54:59 2013 +0200
+++ b/examples/ipv6/loose-routing-ipv6.cc	Wed Aug 07 23:18:48 2013 +0200
@@ -106,31 +106,41 @@
 
   ipv6.SetBase (Ipv6Address ("2001:1::"), Ipv6Prefix (64));
   Ipv6InterfaceContainer i1 = ipv6.Assign (d1);
-  i1.SetRouter (1, true);
+  i1.SetForwarding (1, true);
+  i1.SetDefaultRouteInAllNodes (1);
 
   ipv6.SetBase (Ipv6Address ("2001:2::"), Ipv6Prefix (64));
   Ipv6InterfaceContainer i2 = ipv6.Assign (d2);
-  i2.SetRouter (1, true);
+  i2.SetForwarding (1, true);
+  i2.SetDefaultRouteInAllNodes (1);
 
   ipv6.SetBase (Ipv6Address ("2001:3::"), Ipv6Prefix (64));
   Ipv6InterfaceContainer i3 = ipv6.Assign (d3);
-  i3.SetRouter (0, true);
-  i3.SetRouter (1, true);
+  i3.SetForwarding (0, true);
+  i3.SetDefaultRouteInAllNodes (0);
+  i3.SetForwarding (1, true);
+  i3.SetDefaultRouteInAllNodes (1);
 
   ipv6.SetBase (Ipv6Address ("2001:4::"), Ipv6Prefix (64));
   Ipv6InterfaceContainer i4 = ipv6.Assign (d4);
-  i4.SetRouter (0, true);
-  i4.SetRouter (1, true);
+  i4.SetForwarding (0, true);
+  i4.SetDefaultRouteInAllNodes (0);
+  i4.SetForwarding (1, true);
+  i4.SetDefaultRouteInAllNodes (1);
 
   ipv6.SetBase (Ipv6Address ("2001:5::"), Ipv6Prefix (64));
   Ipv6InterfaceContainer i5 = ipv6.Assign (d5);
-  i5.SetRouter (0, true);
-  i5.SetRouter (1, true);
+  i5.SetForwarding (0, true);
+  i5.SetDefaultRouteInAllNodes (0);
+  i5.SetForwarding (1, true);
+  i5.SetDefaultRouteInAllNodes (1);
 
   ipv6.SetBase (Ipv6Address ("2001:6::"), Ipv6Prefix (64));
   Ipv6InterfaceContainer i6 = ipv6.Assign (d6);
-  i6.SetRouter (0, true);
-  i6.SetRouter (1, true);
+  i6.SetForwarding (0, true);
+  i6.SetDefaultRouteInAllNodes (0);
+  i6.SetForwarding (1, true);
+  i6.SetDefaultRouteInAllNodes (1);
 
   NS_LOG_INFO ("Create Applications.");
 
--- a/examples/ipv6/radvd-two-prefix.cc	Mon Aug 12 15:54:59 2013 +0200
+++ b/examples/ipv6/radvd-two-prefix.cc	Wed Aug 07 23:18:48 2013 +0200
@@ -166,7 +166,8 @@
   NetDeviceContainer tmp2;
   tmp2.Add (d1.Get (1)); /* R */
   Ipv6InterfaceContainer iicr1 = ipv6.Assign (tmp2); /* R interface to the first subnet is just statically assigned */
-  iicr1.SetRouter (0, true);
+  iicr1.SetForwarding (0, true);
+  iicr1.SetDefaultRouteInAllNodes (0);
   iic1.Add (iicr1);
 
   /* add another IPv6 address for second prefix advertised on first subnet */
@@ -177,7 +178,8 @@
   NetDeviceContainer tmp3;
   tmp3.Add (d2.Get (0)); /* R */
   Ipv6InterfaceContainer iicr2 = ipv6.Assign (tmp3); /* R interface */
-  iicr2.SetRouter (0, true);
+  iicr2.SetForwarding (0, true);
+  iicr2.SetDefaultRouteInAllNodes (0);
 
   NetDeviceContainer tmp4;
   tmp4.Add (d2.Get (1)); /* n1 */
--- a/examples/ipv6/radvd.cc	Mon Aug 12 15:54:59 2013 +0200
+++ b/examples/ipv6/radvd.cc	Wed Aug 07 23:18:48 2013 +0200
@@ -92,7 +92,8 @@
   NetDeviceContainer tmp2;
   tmp2.Add (d1.Get (1)); /* R */
   Ipv6InterfaceContainer iicr1 = ipv6.Assign (tmp2); /* R interface to the first subnet is just statically assigned */
-  iicr1.SetRouter (0, true);
+  iicr1.SetForwarding (0, true);
+  iicr1.SetDefaultRouteInAllNodes (0);
   iic1.Add (iicr1);
 
   /* second subnet R - n1 */
@@ -100,7 +101,8 @@
   NetDeviceContainer tmp3;
   tmp3.Add (d2.Get (0)); /* R */
   Ipv6InterfaceContainer iicr2 = ipv6.Assign (tmp3); /* R interface */
-  iicr2.SetRouter (0, true);
+  iicr2.SetForwarding (0, true);
+  iicr2.SetDefaultRouteInAllNodes (0);
 
   NetDeviceContainer tmp4;
   tmp4.Add (d2.Get (1)); /* n1 */
--- a/examples/routing/simple-routing-ping6.cc	Mon Aug 12 15:54:59 2013 +0200
+++ b/examples/routing/simple-routing-ping6.cc	Wed Aug 07 23:18:48 2013 +0200
@@ -130,10 +130,12 @@
   Ipv6AddressHelper ipv6;
   ipv6.SetBase (Ipv6Address ("2001:1::"), Ipv6Prefix (64));
   Ipv6InterfaceContainer i1 = ipv6.Assign (d1);
-  i1.SetRouter (1, true);
+  i1.SetForwarding (1, true);
+  i1.SetDefaultRouteInAllNodes (1);
   ipv6.SetBase (Ipv6Address ("2001:2::"), Ipv6Prefix (64));
   Ipv6InterfaceContainer i2 = ipv6.Assign (d2);
-  i2.SetRouter (0, true);
+  i2.SetForwarding (0, true);
+  i2.SetDefaultRouteInAllNodes (0);
 
   stackHelper.PrintRoutingTable (n0);
 
--- a/src/fd-net-device/examples/fd-tap-ping6.cc	Mon Aug 12 15:54:59 2013 +0200
+++ b/src/fd-net-device/examples/fd-tap-ping6.cc	Wed Aug 07 23:18:48 2013 +0200
@@ -102,7 +102,8 @@
  
   ipv6.SetBase (Ipv6Address ("2001:0DB8:1::"), Ipv6Prefix (64));
   Ipv6InterfaceContainer i1 = ipv6.Assign (devs);
-  i1.SetRouter (1, true);
+  i1.SetForwarding (1, true);
+  i1.SetDefaultRouteInAllNodes (1);
   
   ipv6.SetBase (Ipv6Address ("2001:0DB8:2::"), Ipv6Prefix (64));
   Ipv6Address tapAddr = ipv6.NewAddress ();
@@ -124,7 +125,8 @@
   Ptr<FdNetDevice> fdevice = device->GetObject<FdNetDevice> ();
   fdevice-> SetIsMulticast (true);
   Ipv6InterfaceContainer i2 = ipv6.Assign (fdevs);
-  i2.SetRouter (0, true);
+  i2.SetForwarding (0, true);
+  i2.SetDefaultRouteInAllNodes (0);
 
   //
   // Create the Ping6 application.
--- a/src/internet/helper/ipv6-interface-container.cc	Mon Aug 12 15:54:59 2013 +0200
+++ b/src/internet/helper/ipv6-interface-container.cc	Wed Aug 07 23:18:48 2013 +0200
@@ -1,6 +1,7 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
  * Copyright (c) 2008-2009 Strasbourg University
+ *               2013 Universita' di Firenze
  *
  * 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
@@ -16,6 +17,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
  * Author: Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
+ *         Tommaso Pecorella <tommaso.pecorella@unifi.it>
  */
 
 #include "ns3/node-list.h"
@@ -24,20 +26,19 @@
 #include "ipv6-interface-container.h"
 #include "ns3/ipv6-static-routing-helper.h"
 
-namespace ns3 
-{
+namespace ns3 {
 
 Ipv6InterfaceContainer::Ipv6InterfaceContainer ()
 {
 }
 
-Ipv6InterfaceContainer::Iterator 
+Ipv6InterfaceContainer::Iterator
 Ipv6InterfaceContainer::Begin (void) const
 {
   return m_interfaces.begin ();
 }
 
-Ipv6InterfaceContainer::Iterator 
+Ipv6InterfaceContainer::Iterator
 Ipv6InterfaceContainer::End (void) const
 {
   return m_interfaces.end ();
@@ -81,6 +82,10 @@
 
 void Ipv6InterfaceContainer::SetRouter (uint32_t i, bool router)
 {
+  // This function is deprecated and should be substituted by:
+  // SetForwarding (RouterInterfaceIndex, true);
+  // SetDefaultRouteInAllNodes (RouterInterfaceIndex);
+
   Ptr<Ipv6> ipv6 = m_interfaces[i].first;
   ipv6->SetForwarding (m_interfaces[i].second, router);
 
@@ -105,11 +110,82 @@
     }
 }
 
-void Ipv6InterfaceContainer::SetDefaultRoute (uint32_t i, uint32_t router)
+void Ipv6InterfaceContainer::SetForwarding (uint32_t i, bool router)
 {
   Ptr<Ipv6> ipv6 = m_interfaces[i].first;
-  Ptr<Ipv6> ipv6Router = m_interfaces[router].first;
-  Ipv6Address routerAddress = ipv6Router->GetAddress (m_interfaces[router].second, 0).GetAddress ();
+  ipv6->SetForwarding (m_interfaces[i].second, router);
+}
+
+void Ipv6InterfaceContainer::SetDefaultRouteInAllNodes (uint32_t router)
+{
+  Ptr<Ipv6> ipv6 = m_interfaces[router].first;
+  uint32_t other;
+
+  Ipv6Address routerAddress = GetLinkLocalAddress (router);
+  NS_ASSERT_MSG (routerAddress != Ipv6Address::GetAny (), "No link-local address found on router, aborting");
+
+  for (other = 0; other < m_interfaces.size (); other++)
+    {
+      if (other != router)
+        {
+          Ptr<Ipv6StaticRouting> routing = 0;
+          Ipv6StaticRoutingHelper routingHelper;
+
+          ipv6 = m_interfaces[other].first;
+          routing = routingHelper.GetStaticRouting (ipv6);
+          routing->SetDefaultRoute (routerAddress, m_interfaces[other].second);
+        }
+    }
+}
+
+void Ipv6InterfaceContainer::SetDefaultRouteInAllNodes (Ipv6Address routerAddress)
+{
+  uint32_t routerIndex;
+  bool found = false;
+  for (uint32_t index = 0; index < m_interfaces.size (); index++)
+    {
+      Ptr<Ipv6> ipv6 = m_interfaces[index].first;
+      for (uint32_t i = 0; i < ipv6->GetNAddresses (m_interfaces[index].second); i++)
+        {
+          Ipv6Address addr = ipv6->GetAddress (m_interfaces[index].second, i).GetAddress ();
+          if (addr == routerAddress)
+            {
+              routerIndex = index;
+              found = true;
+              break;
+            }
+        }
+      if (found)
+        {
+          break;
+        }
+    }
+  NS_ASSERT_MSG (found != true, "No such address in the interfaces. Aborting.");
+
+  for (uint32_t other = 0; other < m_interfaces.size (); other++)
+    {
+      if (other != routerIndex)
+        {
+          Ptr<Ipv6StaticRouting> routing = 0;
+          Ipv6StaticRoutingHelper routingHelper;
+
+          Ptr<Ipv6> ipv6 = m_interfaces[other].first;
+          routing = routingHelper.GetStaticRouting (ipv6);
+          routing->SetDefaultRoute (routerAddress, m_interfaces[other].second);
+        }
+    }
+}
+
+
+void Ipv6InterfaceContainer::SetDefaultRoute (uint32_t i, uint32_t router)
+{
+  NS_ASSERT_MSG (i != router, "A node shouldn't set itself as the default router, isn't it? Aborting.");
+
+  Ptr<Ipv6> ipv6 = m_interfaces[i].first;
+
+  Ipv6Address routerAddress = GetLinkLocalAddress (router);
+  NS_ASSERT_MSG (routerAddress != Ipv6Address::GetAny (), "No link-local address found on router, aborting");
+
   Ptr<Ipv6StaticRouting> routing = 0;
   Ipv6StaticRoutingHelper routingHelper;
 
@@ -117,5 +193,100 @@
   routing->SetDefaultRoute (routerAddress, m_interfaces[i].second);
 }
 
+
+void Ipv6InterfaceContainer::SetDefaultRoute (uint32_t i, Ipv6Address routerAddr)
+{
+  uint32_t routerIndex;
+  bool found = false;
+  for (uint32_t index = 0; index < m_interfaces.size (); index++)
+    {
+      Ptr<Ipv6> ipv6 = m_interfaces[index].first;
+      for (uint32_t i = 0; i < ipv6->GetNAddresses (m_interfaces[index].second); i++)
+        {
+          Ipv6Address addr = ipv6->GetAddress (m_interfaces[index].second, i).GetAddress ();
+          if (addr == routerAddr)
+            {
+              routerIndex = index;
+              found = true;
+              break;
+            }
+        }
+      if (found)
+        {
+          break;
+        }
+    }
+  NS_ASSERT_MSG (found != true, "No such address in the interfaces. Aborting.");
+
+  NS_ASSERT_MSG (i != routerIndex, "A node shouldn't set itself as the default router, isn't it? Aborting.");
+
+  Ptr<Ipv6> ipv6 = m_interfaces[i].first;
+  Ipv6Address routerLinkLocalAddress = GetLinkLocalAddress (routerIndex);
+  Ptr<Ipv6StaticRouting> routing = 0;
+  Ipv6StaticRoutingHelper routingHelper;
+
+  routing = routingHelper.GetStaticRouting (ipv6);
+  routing->SetDefaultRoute (routerLinkLocalAddress, m_interfaces[i].second);
+}
+
+
+Ipv6Address Ipv6InterfaceContainer::GetLinkLocalAddress (uint32_t index)
+{
+  Ptr<Ipv6> ipv6 = m_interfaces[index].first;
+  for (uint32_t i = 0; i < ipv6->GetNAddresses (m_interfaces[index].second); i++)
+    {
+      Ipv6InterfaceAddress iAddress;
+      iAddress = ipv6->GetAddress (m_interfaces[index].second, i);
+      if (iAddress.GetScope () == Ipv6InterfaceAddress::LINKLOCAL)
+        {
+          return iAddress.GetAddress ();
+        }
+    }
+  return Ipv6Address::GetAny ();
+}
+
+Ipv6Address Ipv6InterfaceContainer::GetLinkLocalAddress (Ipv6Address address)
+{
+  if (address.IsLinkLocal ())
+    {
+      return address;
+    }
+
+  uint32_t nodeIndex;
+  bool found = false;
+  for (uint32_t index = 0; index < m_interfaces.size (); index++)
+    {
+      Ptr<Ipv6> ipv6 = m_interfaces[index].first;
+      for (uint32_t i = 0; i < ipv6->GetNAddresses (m_interfaces[index].second); i++)
+        {
+          Ipv6Address addr = ipv6->GetAddress (m_interfaces[index].second, i).GetAddress ();
+          if (addr == address)
+            {
+              nodeIndex = index;
+              found = true;
+              break;
+            }
+        }
+      if (found)
+        {
+          break;
+        }
+    }
+  NS_ASSERT_MSG (found != true, "No such address in the interfaces. Aborting.");
+
+  Ptr<Ipv6> ipv6 = m_interfaces[nodeIndex].first;
+  for (uint32_t i = 0; i < ipv6->GetNAddresses (m_interfaces[nodeIndex].second); i++)
+    {
+      Ipv6InterfaceAddress iAddress;
+      iAddress = ipv6->GetAddress (m_interfaces[nodeIndex].second, i);
+      if (iAddress.GetScope () == Ipv6InterfaceAddress::LINKLOCAL)
+        {
+          return iAddress.GetAddress ();
+        }
+    }
+  return Ipv6Address::GetAny ();
+}
+
+
 } /* namespace ns3 */
 
--- a/src/internet/helper/ipv6-interface-container.h	Mon Aug 12 15:54:59 2013 +0200
+++ b/src/internet/helper/ipv6-interface-container.h	Wed Aug 07 23:18:48 2013 +0200
@@ -1,6 +1,7 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
  * Copyright (c) 2008-2009 Strasbourg University
+ *               2013 Universita' di Firenze
  *
  * 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
@@ -16,6 +17,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
  * Author: Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
+ *         Tommaso Pecorella <tommaso.pecorella@unifi.it>
  */
 
 #ifndef IPV6_INTERFACE_CONTAINER_H
@@ -27,6 +29,7 @@
 
 #include "ns3/ipv6.h"
 #include "ns3/ipv6-address.h"
+#include "ns3/deprecated.h"
 
 namespace ns3
 {
@@ -81,6 +84,20 @@
   Ipv6Address GetAddress (uint32_t i, uint32_t j) const;
 
   /**
+   * \brief Get the link-local address for the specified index.
+   * \param i index
+   * \return the link-local address, or "::" if the interface has no link local address.
+   */
+  Ipv6Address GetLinkLocalAddress (uint32_t i);
+
+  /**
+   * \brief Get the link-local address for the node with the specified global address.
+   * \param address the address to find.
+   * \return the link-local address, or "::" if the interface has no link local address.
+   */
+  Ipv6Address GetLinkLocalAddress (Ipv6Address address);
+
+  /**
    * \brief Add a couple IPv6/interface.
    * \param ipv6 IPv6 address
    * \param interface interface index
@@ -149,7 +166,28 @@
    * \param i index
    * \param router true : is a router, false : is an host
    */
-  void SetRouter (uint32_t i, bool router);
+  void SetRouter (uint32_t i, bool router) NS_DEPRECATED;
+
+  /**
+   * \brief Set the state of the stack (act as a router or as an host) for the specified index.
+   * This automatically sets all the node's interfaces to the same forwarding state.
+   * \param i index
+   * \param state true : is a router, false : is an host
+   */
+  void SetForwarding (uint32_t i, bool state);
+
+  /**
+   * \brief Set the default route for all the devices (except the router itself).
+   * \param router the default router index
+   */
+  void SetDefaultRouteInAllNodes (uint32_t router);
+
+  /**
+   * \brief Set the default route for all the devices (except the router itself).
+   * Note that the route will be set to the link-local address of the node with the specified address.
+   * \param routerAddr the default router address
+   */
+  void SetDefaultRouteInAllNodes (Ipv6Address routerAddr);
 
   /**
    * \brief Set the default route for the specified index.
@@ -158,6 +196,14 @@
    */
   void SetDefaultRoute (uint32_t i, uint32_t router);
 
+  /**
+   * \brief Set the default route for the specified index.
+   * Note that the route will be set to the link-local address of the node with the specified address.
+   * \param i index
+   * \param routerAddr the default router address
+   */
+  void SetDefaultRoute (uint32_t i, Ipv6Address routerAddr);
+
 private:
   typedef std::vector<std::pair<Ptr<Ipv6>, uint32_t> > InterfaceVector;
 
--- a/src/internet/model/ipv6-static-routing.cc	Mon Aug 12 15:54:59 2013 +0200
+++ b/src/internet/model/ipv6-static-routing.cc	Wed Aug 07 23:18:48 2013 +0200
@@ -97,7 +97,10 @@
 void Ipv6StaticRouting::AddHostRouteTo (Ipv6Address dst, Ipv6Address nextHop, uint32_t interface, Ipv6Address prefixToUse, uint32_t metric)
 {
   NS_LOG_FUNCTION (this << dst << nextHop << interface << prefixToUse << metric);
-  NS_ASSERT_MSG(nextHop.IsLinkLocal(), "Ipv6StaticRouting::AddHostRouteTo - Next hop must be link-local");
+  if (nextHop.IsLinkLocal())
+    {
+      NS_LOG_WARN ("Ipv6StaticRouting::AddHostRouteTo - Next hop should be link-local");
+    }
 
   AddNetworkRouteTo (dst, Ipv6Prefix::GetOnes (), nextHop, interface, prefixToUse, metric);
 }
@@ -119,7 +122,10 @@
 void Ipv6StaticRouting::AddNetworkRouteTo (Ipv6Address network, Ipv6Prefix networkPrefix, Ipv6Address nextHop, uint32_t interface, Ipv6Address prefixToUse, uint32_t metric)
 {
   NS_LOG_FUNCTION (this << network << networkPrefix << nextHop << interface << prefixToUse << metric);
-  NS_ASSERT_MSG(nextHop.IsLinkLocal(), "Ipv6StaticRouting::AddNetworkRouteTo - Next hop must be link-local");
+  if (nextHop.IsLinkLocal())
+    {
+      NS_LOG_WARN ("Ipv6StaticRouting::AddNetworkRouteTo - Next hop should be link-local");
+    }
 
   Ipv6RoutingTableEntry* route = new Ipv6RoutingTableEntry ();
   *route = Ipv6RoutingTableEntry::CreateNetworkRouteTo (network, networkPrefix, nextHop, interface, prefixToUse);
--- a/src/internet/model/ipv6-static-routing.h	Mon Aug 12 15:54:59 2013 +0200
+++ b/src/internet/model/ipv6-static-routing.h	Wed Aug 07 23:18:48 2013 +0200
@@ -74,7 +74,7 @@
   /**
    * \brief Add route to host.
    * \param dest destination address
-   * \param nextHop next hop address to route the packet. Must be a link-local address
+   * \param nextHop next hop address to route the packet.
    * \param interface interface index
    * \param prefixToUse prefix that should be used for source address for this destination
    * \param metric metric of route in case of multiple routes to same destination
@@ -103,7 +103,7 @@
    * \brief Add route to network.
    * \param network network address
    * \param networkPrefix network prefix*
-   * \param nextHop next hop address to route the packet. Must be a link-local address
+   * \param nextHop next hop address to route the packet.
    * \param interface interface index
    * \param prefixToUse prefix that should be used for source address for this destination
    * \param metric metric of route in case of multiple routes to same destination