Move tests from the internet module to its test library
authorMitch Watrous <watrous@u.washington.edu>
Mon, 28 Mar 2011 15:09:39 -0700
changeset 6967 51775b082612
parent 6966 e125fae42a20
child 6968 4b68e211540c
Move tests from the internet module to its test library
src/internet/model/global-route-manager-impl.cc
src/internet/model/ipv4-list-routing.cc
src/internet/model/ipv4-packet-info-tag.cc
src/internet/model/ipv4-packet-info-tag.h
src/internet/model/ipv6-list-routing.cc
src/internet/model/ipv6-packet-info-tag.cc
src/internet/model/ipv6-packet-info-tag.h
src/internet/test/global-route-manager-impl-test-suite.cc
src/internet/test/ipv4-list-routing-test-suite.cc
src/internet/test/ipv4-packet-info-tag-test-suite.cc
src/internet/test/ipv6-list-routing-test-suite.cc
src/internet/test/ipv6-packet-info-tag-test-suite.cc
src/internet/wscript
--- a/src/internet/model/global-route-manager-impl.cc	Mon Mar 28 19:46:05 2011 +0100
+++ b/src/internet/model/global-route-manager-impl.cc	Mon Mar 28 15:09:39 2011 -0700
@@ -2191,211 +2191,3 @@
 } // namespace ns3
 
 
-#include "ns3/test.h"
-#include "ns3/simulator.h"
-#include <stdlib.h> // for rand()
-
-namespace ns3 {
-
-class GlobalRouteManagerImplTestCase : public TestCase
-{
-public:
-  GlobalRouteManagerImplTestCase();
-  virtual void DoRun(void);
-};
-
-GlobalRouteManagerImplTestCase::GlobalRouteManagerImplTestCase()
-  : TestCase("GlobalRouteManagerImplTestCase")
-{}
-void
-GlobalRouteManagerImplTestCase::DoRun(void)
-{
-  CandidateQueue candidate;
-
-  for (int i = 0; i < 100; ++i)
-    {
-      SPFVertex *v = new SPFVertex;
-      v->SetDistanceFromRoot (rand () % 100);
-      candidate.Push (v);
-    }
-
-  uint32_t lastDistance = 0;
-
-  for (int i = 0; i < 100; ++i)
-    {
-      SPFVertex *v = candidate.Pop ();
-      if (v->GetDistanceFromRoot () < lastDistance)
-        {
-          // XXX does nothing.
-          UpdateErrorStatus (false);
-        }
-      lastDistance = v->GetDistanceFromRoot ();
-      delete v;
-      v = 0;
-    }
-
-  // Build fake link state database; four routers (0-3), 3 point-to-point
-  // links
-  //
-  //   n0
-  //      \ link 0
-  //       \          link 2
-  //        n2 -------------------------n3
-  //       /
-  //      / link 1
-  //    n1
-  //
-  //  link0:  10.1.1.1/30, 10.1.1.2/30
-  //  link1:  10.1.2.1/30, 10.1.2.2/30
-  //  link2:  10.1.3.1/30, 10.1.3.2/30
-  //
-  // Router 0
-  GlobalRoutingLinkRecord* lr0 = new GlobalRoutingLinkRecord (
-    GlobalRoutingLinkRecord::PointToPoint, 
-    "0.0.0.2",  // router ID 0.0.0.2
-    "10.1.1.1", // local ID
-    1);         // metric
-
-  GlobalRoutingLinkRecord* lr1 = new GlobalRoutingLinkRecord (
-    GlobalRoutingLinkRecord::StubNetwork,
-    "10.1.1.1",
-    "255.255.255.252",
-    1);
-
-  GlobalRoutingLSA* lsa0 = new GlobalRoutingLSA ();
-  lsa0->SetLSType (GlobalRoutingLSA::RouterLSA);
-  lsa0->SetLinkStateId ("0.0.0.0");
-  lsa0->SetAdvertisingRouter ("0.0.0.0");
-  lsa0->AddLinkRecord (lr0);
-  lsa0->AddLinkRecord (lr1);
-
-  // Router 1
-  GlobalRoutingLinkRecord* lr2 = new GlobalRoutingLinkRecord (
-    GlobalRoutingLinkRecord::PointToPoint,
-    "0.0.0.2",
-    "10.1.2.1",
-    1);
-
-  GlobalRoutingLinkRecord* lr3 = new GlobalRoutingLinkRecord (
-    GlobalRoutingLinkRecord::StubNetwork,
-    "10.1.2.1",
-    "255.255.255.252",
-    1);
-
-  GlobalRoutingLSA* lsa1 = new GlobalRoutingLSA ();
-  lsa1->SetLSType (GlobalRoutingLSA::RouterLSA);
-  lsa1->SetLinkStateId ("0.0.0.1");
-  lsa1->SetAdvertisingRouter ("0.0.0.1");
-  lsa1->AddLinkRecord (lr2);
-  lsa1->AddLinkRecord (lr3);
-  
-  // Router 2 
-  GlobalRoutingLinkRecord* lr4 = new GlobalRoutingLinkRecord (
-    GlobalRoutingLinkRecord::PointToPoint,
-    "0.0.0.0",
-    "10.1.1.2",
-    1);
-
-  GlobalRoutingLinkRecord* lr5 = new GlobalRoutingLinkRecord (
-    GlobalRoutingLinkRecord::StubNetwork,
-    "10.1.1.2",
-    "255.255.255.252",
-    1);
-
-  GlobalRoutingLinkRecord* lr6 = new GlobalRoutingLinkRecord (
-    GlobalRoutingLinkRecord::PointToPoint,
-    "0.0.0.1",
-    "10.1.2.2",
-    1);
-
-  GlobalRoutingLinkRecord* lr7 = new GlobalRoutingLinkRecord (
-    GlobalRoutingLinkRecord::StubNetwork,
-    "10.1.2.2",
-    "255.255.255.252",
-    1);
-
-  GlobalRoutingLinkRecord* lr8 = new GlobalRoutingLinkRecord (
-    GlobalRoutingLinkRecord::PointToPoint,
-    "0.0.0.3",
-    "10.1.3.2",
-    1);
-
-  GlobalRoutingLinkRecord* lr9 = new GlobalRoutingLinkRecord (
-    GlobalRoutingLinkRecord::StubNetwork,
-    "10.1.3.2",
-    "255.255.255.252",
-    1);
-
-  GlobalRoutingLSA* lsa2 = new GlobalRoutingLSA ();
-  lsa2->SetLSType (GlobalRoutingLSA::RouterLSA);
-  lsa2->SetLinkStateId ("0.0.0.2");
-  lsa2->SetAdvertisingRouter ("0.0.0.2");
-  lsa2->AddLinkRecord (lr4);
-  lsa2->AddLinkRecord (lr5);
-  lsa2->AddLinkRecord (lr6);
-  lsa2->AddLinkRecord (lr7);
-  lsa2->AddLinkRecord (lr8);
-  lsa2->AddLinkRecord (lr9);
-
-  // Router 3
-  GlobalRoutingLinkRecord* lr10 = new GlobalRoutingLinkRecord (
-    GlobalRoutingLinkRecord::PointToPoint,
-    "0.0.0.2",
-    "10.1.2.1",
-    1);
-
-  GlobalRoutingLinkRecord* lr11 = new GlobalRoutingLinkRecord (
-    GlobalRoutingLinkRecord::StubNetwork,
-    "10.1.2.1",
-    "255.255.255.252",
-    1);
-
-  GlobalRoutingLSA* lsa3 = new GlobalRoutingLSA ();
-  lsa3->SetLSType (GlobalRoutingLSA::RouterLSA);
-  lsa3->SetLinkStateId ("0.0.0.3");
-  lsa3->SetAdvertisingRouter ("0.0.0.3");
-  lsa3->AddLinkRecord (lr10);
-  lsa3->AddLinkRecord (lr11);
-
-  // Test the database 
-  GlobalRouteManagerLSDB* srmlsdb = new GlobalRouteManagerLSDB ();
-  srmlsdb->Insert (lsa0->GetLinkStateId (), lsa0);
-  srmlsdb->Insert (lsa1->GetLinkStateId (), lsa1);
-  srmlsdb->Insert (lsa2->GetLinkStateId (), lsa2);
-  srmlsdb->Insert (lsa3->GetLinkStateId (), lsa3);
-  NS_ASSERT (lsa2 == srmlsdb->GetLSA (lsa2->GetLinkStateId ()));
-
-  // next, calculate routes based on the manually created LSDB
-  GlobalRouteManagerImpl* srm = new GlobalRouteManagerImpl ();
-  srm->DebugUseLsdb (srmlsdb);  // manually add in an LSDB
-  // Note-- this will succeed without any nodes in the topology
-  // because the NodeList is empty
-  srm->DebugSPFCalculate (lsa0->GetLinkStateId ());  // node n0
-
-  Simulator::Run ();
-
-// XXX here we should do some verification of the routes built
-
-  Simulator::Destroy ();
-
-  // This delete clears the srm, which deletes the LSDB, which clears 
-  // all of the LSAs, which each destroys the attached LinkRecords.
-  delete srm;
-
-  // XXX
-  // No testing has actually been done other than making sure that this code
-  // does not crash
-}
-
-
-static class GlobalRouteManagerImplTestSuite : public TestSuite
-{
-public:
-  GlobalRouteManagerImplTestSuite()
-    : TestSuite("global-route-manager-impl", UNIT)
-  {
-    AddTestCase(new GlobalRouteManagerImplTestCase());
-  }
-} g_globalRoutingManagerImplTestSuite;
-
-} // namespace ns3
--- a/src/internet/model/ipv4-list-routing.cc	Mon Mar 28 19:46:05 2011 +0100
+++ b/src/internet/model/ipv4-list-routing.cc	Mon Mar 28 15:09:39 2011 -0700
@@ -295,111 +295,3 @@
 
 } // namespace ns3
 
-#include "ns3/test.h"
-#include "ipv4-list-routing.h"
-#include "ns3/ipv4-routing-protocol.h"
-
-namespace ns3 {
-
-class Ipv4ARouting : public Ipv4RoutingProtocol {
-public:
-  Ptr<Ipv4Route> RouteOutput (Ptr<Packet> p, const Ipv4Header &header, Ptr<NetDevice> oif, Socket::SocketErrno &sockerr)  { return 0;}
-  bool RouteInput  (Ptr<const Packet> p, const Ipv4Header &header, Ptr<const NetDevice> idev,
-                             UnicastForwardCallback ucb, MulticastForwardCallback mcb,
-                             LocalDeliverCallback lcb, ErrorCallback ecb) {return false;}
-  void NotifyInterfaceUp (uint32_t interface) {}
-  void NotifyInterfaceDown (uint32_t interface) {}
-  void NotifyAddAddress (uint32_t interface, Ipv4InterfaceAddress address) {}
-  void NotifyRemoveAddress (uint32_t interface, Ipv4InterfaceAddress address) {}
-  void SetIpv4 (Ptr<Ipv4> ipv4) {}
-  void PrintRoutingTable (Ptr<OutputStreamWrapper> stream) const {}
-};
-
-class Ipv4BRouting : public Ipv4RoutingProtocol {
-public:
-  Ptr<Ipv4Route> RouteOutput (Ptr<Packet> p, const Ipv4Header &header, Ptr<NetDevice> oif, Socket::SocketErrno &sockerr)  { return 0;}
-  bool RouteInput  (Ptr<const Packet> p, const Ipv4Header &header, Ptr<const NetDevice> idev,
-                             UnicastForwardCallback ucb, MulticastForwardCallback mcb,
-                             LocalDeliverCallback lcb, ErrorCallback ecb) {return false;}
-  void NotifyInterfaceUp (uint32_t interface) {}
-  void NotifyInterfaceDown (uint32_t interface) {}
-  void NotifyAddAddress (uint32_t interface, Ipv4InterfaceAddress address) {}
-  void NotifyRemoveAddress (uint32_t interface, Ipv4InterfaceAddress address) {}
-  void SetIpv4 (Ptr<Ipv4> ipv4) {}
-  void PrintRoutingTable (Ptr<OutputStreamWrapper> stream) const {}
-};
-
-class Ipv4ListRoutingNegativeTestCase : public TestCase
-{
-public:
-  Ipv4ListRoutingNegativeTestCase();
-  virtual void DoRun (void);
-};
-
-Ipv4ListRoutingNegativeTestCase::Ipv4ListRoutingNegativeTestCase()
-  : TestCase("Check negative priorities")
-{}
-void
-Ipv4ListRoutingNegativeTestCase::DoRun (void)
-{
-  Ptr<Ipv4ListRouting> lr = CreateObject<Ipv4ListRouting> ();
-  Ptr<Ipv4RoutingProtocol> aRouting = CreateObject<Ipv4ARouting> ();
-  Ptr<Ipv4RoutingProtocol> bRouting = CreateObject<Ipv4BRouting> ();
-  // The Ipv4BRouting should be added with higher priority (larger integer value)
-  lr->AddRoutingProtocol (aRouting, -10);
-  lr->AddRoutingProtocol (bRouting, -5);
-  int16_t first = 3;
-  uint32_t num = lr->GetNRoutingProtocols ();
-  NS_TEST_ASSERT_MSG_EQ (num, 2, "XXX");
-  Ptr<Ipv4RoutingProtocol> firstRp = lr->GetRoutingProtocol (0, first);
-  NS_TEST_ASSERT_MSG_EQ (-5, first, "XXX");
-  NS_TEST_ASSERT_MSG_EQ (firstRp, bRouting, "XXX");
-}
-
-class Ipv4ListRoutingPositiveTestCase : public TestCase
-{
-public:
-  Ipv4ListRoutingPositiveTestCase();
-  virtual void DoRun (void);
-};
-
-Ipv4ListRoutingPositiveTestCase::Ipv4ListRoutingPositiveTestCase()
-  : TestCase("Check positive priorities")
-{}
-void
-Ipv4ListRoutingPositiveTestCase::DoRun (void)
-{
-  Ptr<Ipv4ListRouting> lr = CreateObject<Ipv4ListRouting> ();
-  Ptr<Ipv4RoutingProtocol> aRouting = CreateObject<Ipv4ARouting> ();
-  Ptr<Ipv4RoutingProtocol> bRouting = CreateObject<Ipv4BRouting> ();
-  // The Ipv4ARouting should be added with higher priority (larger integer 
-  // value) and will be fetched first below
-  lr->AddRoutingProtocol (aRouting, 10);
-  lr->AddRoutingProtocol (bRouting, 5);
-  int16_t first = 3;
-  int16_t second = 3;
-  uint32_t num = lr->GetNRoutingProtocols ();
-  NS_TEST_ASSERT_MSG_EQ (num, 2, "XXX");
-  Ptr<Ipv4RoutingProtocol> firstRp = lr->GetRoutingProtocol (0, first);
-  NS_TEST_ASSERT_MSG_EQ (10, first, "XXX");
-  NS_TEST_ASSERT_MSG_EQ (firstRp, aRouting, "XXX");
-  Ptr<Ipv4RoutingProtocol> secondRp = lr->GetRoutingProtocol (1, second);
-  NS_TEST_ASSERT_MSG_EQ (5, second, "XXX");
-  NS_TEST_ASSERT_MSG_EQ (secondRp, bRouting, "XXX");
-}
-
-static class Ipv4ListRoutingTestSuite : public TestSuite
-{
-public:
-  Ipv4ListRoutingTestSuite()
-    : TestSuite("ipv4-list-routing", UNIT)
-  {
-    AddTestCase(new Ipv4ListRoutingPositiveTestCase());
-    AddTestCase(new Ipv4ListRoutingNegativeTestCase());
-  }
-
-} g_ipv4ListRoutingTestSuite;
-
-} // namespace ns3
-
-
--- a/src/internet/model/ipv4-packet-info-tag.cc	Mon Mar 28 19:46:05 2011 +0100
+++ b/src/internet/model/ipv4-packet-info-tag.cc	Mon Mar 28 15:09:39 2011 -0700
@@ -21,7 +21,6 @@
 
 #include <stdint.h>
 #include "ns3/ipv4-address.h"
-#include "ns3/test.h"
 #include "ipv4-packet-info-tag.h"
 
 namespace ns3 {
@@ -139,187 +138,3 @@
 }
 }//namespace ns3
 
-//-----------------------------------------------------------------------------
-// Unit tests
-//-----------------------------------------------------------------------------
-
-#include "ns3/log.h"
-#include "ns3/abort.h"
-#include "ns3/attribute.h"
-#include "ns3/simple-net-device.h"
-#include "ns3/object-factory.h"
-#include "ns3/socket-factory.h"
-#include "ns3/udp-socket-factory.h"
-#include "ns3/udp-socket.h"
-#include "ns3/inet-socket-address.h"
-#include "ns3/ipv4-l3-protocol.h"
-#include "ns3/ipv4-raw-socket-factory.h"
-#include "ns3/ipv4-interface.h"
-#include "ns3/arp-l3-protocol.h"
-#include "ns3/icmpv4-l4-protocol.h"
-#include "ns3/ipv4-static-routing.h"
-#include "ns3/ipv4-list-routing.h"
-#include "ns3/udp-l4-protocol.h"
-#include "ns3/tcp-l4-protocol.h"
-#include "ns3/simulator.h"
-#include "ns3/node.h"
-
-namespace ns3 {
-
-static void
-AddInternetStack (Ptr<Node> node)
-{
-  //ARP
-  Ptr<ArpL3Protocol> arp = CreateObject<ArpL3Protocol> ();
-  node->AggregateObject(arp);
-  //IPV4
-  Ptr<Ipv4L3Protocol> ipv4 = CreateObject<Ipv4L3Protocol> ();
-  //Routing for Ipv4
-  Ptr<Ipv4ListRouting> ipv4Routing = CreateObject<Ipv4ListRouting> ();
-  ipv4->SetRoutingProtocol (ipv4Routing);
-  Ptr<Ipv4StaticRouting> ipv4staticRouting = CreateObject<Ipv4StaticRouting> ();
-  ipv4Routing->AddRoutingProtocol (ipv4staticRouting, 0);
-  node->AggregateObject(ipv4);
-  //ICMP
-  Ptr<Icmpv4L4Protocol> icmp = CreateObject<Icmpv4L4Protocol> ();
-  node->AggregateObject(icmp);
-  //UDP
-  Ptr<UdpL4Protocol> udp = CreateObject<UdpL4Protocol> ();
-  node->AggregateObject(udp); 
-}
-
-class Ipv4PacketInfoTagTest: public TestCase 
-{
-public:
-  Ipv4PacketInfoTagTest ();
-private:
-  virtual void DoRun (void);
-  void RxCb (Ptr<Socket> socket);
-  void DoSendData (Ptr<Socket> socket, std::string to);
-};
-
-Ipv4PacketInfoTagTest::Ipv4PacketInfoTagTest ()
-  : TestCase ("Ipv4PacketInfoTagTest") 
-{}
-
-void
-Ipv4PacketInfoTagTest::RxCb (Ptr<Socket> socket)
-{
-  uint32_t availableData;
-  Ptr<Packet> m_receivedPacket;
-
-  availableData = socket->GetRxAvailable ();
-  m_receivedPacket = socket->Recv (std::numeric_limits<uint32_t>::max(), 0);
-  NS_ASSERT (availableData == m_receivedPacket->GetSize ());
-
-  Ipv4PacketInfoTag tag;
-  bool found;
-  found = m_receivedPacket->RemovePacketTag (tag);
-  NS_ASSERT (found);
-  tag.Print (std::cout);
-}
-
-void
-Ipv4PacketInfoTagTest::DoSendData (Ptr<Socket> socket, std::string to)
-{
-  Address realTo = InetSocketAddress (Ipv4Address (to.c_str()), 200);
-  if (DynamicCast<UdpSocket> (socket) != 0)
-    {
-      NS_TEST_EXPECT_MSG_EQ (socket->SendTo (Create<Packet> (123), 0, realTo),
-                             123, "XXX");
-    }
-  // Should only Ipv4RawSock
-  else
-    {
-      socket->SendTo (Create<Packet> (123), 0, realTo);
-    }
-}
-
-void
-Ipv4PacketInfoTagTest::DoRun (void)
-{
-  Ptr<Node> node0 = CreateObject<Node> ();
-  Ptr<Node> node1 = CreateObject<Node> ();
-
-  Ptr<SimpleNetDevice> device = CreateObject<SimpleNetDevice> ();
-  Ptr<SimpleNetDevice> device2 = CreateObject<SimpleNetDevice> ();
-
-  // For Node 0
-  node0->AddDevice (device);
-  AddInternetStack (node0);
-  Ptr<Ipv4> ipv4 = node0->GetObject<Ipv4> ();
-
-  uint32_t index = ipv4->AddInterface (device);
-  Ipv4InterfaceAddress ifaceAddr1 = Ipv4InterfaceAddress ("10.1.1.1",
-                                                          "255.255.255.0");
-  ipv4->AddAddress (index, ifaceAddr1);
-  ipv4->SetMetric (index, 1);
-  ipv4->SetUp (index);
-
-  // For Node 1
-  node1->AddDevice (device2);
-  AddInternetStack (node1);
-  ipv4 = node1->GetObject<Ipv4> ();
-
-  index = ipv4->AddInterface (device2);
-  Ipv4InterfaceAddress ifaceAddr2 = Ipv4InterfaceAddress ("10.1.1.2",
-                                                          "255.255.255.0");
-  ipv4->AddAddress (index, ifaceAddr2);
-  ipv4->SetMetric (index, 1);
-  ipv4->SetUp (index);
-
-  // IPv4 test
-  Ptr<SocketFactory> factory = node0->GetObject<SocketFactory> (UdpSocketFactory::GetTypeId ());
-  Ptr<Socket> socket = factory->CreateSocket ();
-  InetSocketAddress local =  InetSocketAddress (Ipv4Address::GetAny (), 200);
-  socket->Bind (local);
-  socket->SetRecvPktInfo (true);
-  socket->SetRecvCallback (MakeCallback (&ns3::Ipv4PacketInfoTagTest::RxCb, this));
-
-  // receive on loopback 
-  Simulator::ScheduleWithContext (socket->GetNode ()->GetId (), Seconds (0),
-                                  &Ipv4PacketInfoTagTest::DoSendData, this, socket, "127.0.0.1");
-  Simulator::Run ();
-
-  Ptr<SocketFactory> factory2 = node1->GetObject<SocketFactory> (UdpSocketFactory::GetTypeId ());
-  Ptr<Socket> socket2 = factory2->CreateSocket ();
-  Simulator::ScheduleWithContext (socket2->GetNode ()->GetId (), Seconds (0),
-                                  &Ipv4PacketInfoTagTest::DoSendData, this, socket, "10.1.1.1");
-  Simulator::Run ();
-
-  // ipv4 w rawsocket
-  factory = node0->GetObject<SocketFactory> (Ipv4RawSocketFactory::GetTypeId ());
-  socket = factory->CreateSocket ();
-  local =  InetSocketAddress (Ipv4Address::GetAny (), 0);
-  socket->Bind (local);
-  socket->SetRecvPktInfo (true);
-  socket->SetRecvCallback (MakeCallback (&ns3::Ipv4PacketInfoTagTest::RxCb, this));
-
-  // receive on loopback 
-  Simulator::ScheduleWithContext (socket->GetNode ()->GetId (), Seconds (0),
-                                  &Ipv4PacketInfoTagTest::DoSendData, this, socket, "127.0.0.1");
-  Simulator::Run ();
-
-  factory2 = node1->GetObject<SocketFactory> (Ipv4RawSocketFactory::GetTypeId ());
-  socket2 = factory2->CreateSocket ();
-  Simulator::ScheduleWithContext (socket2->GetNode ()->GetId (), Seconds (0),
-                                  &Ipv4PacketInfoTagTest::DoSendData, this, socket, "10.1.1.1");
-  Simulator::Run ();
-  Simulator::Destroy ();
-}
-
-static class Ipv4PacketInfoTagTestSuite : public TestSuite
-{
-public:
-  Ipv4PacketInfoTagTestSuite ();
-private:
-} g_packetinfotagTests;
-
-Ipv4PacketInfoTagTestSuite::Ipv4PacketInfoTagTestSuite ()
-  : TestSuite ("ipv4-packet-info-tag", UNIT)
-{
-  AddTestCase (new Ipv4PacketInfoTagTest ());
-}
-
-
-}
--- a/src/internet/model/ipv4-packet-info-tag.h	Mon Mar 28 19:46:05 2011 +0100
+++ b/src/internet/model/ipv4-packet-info-tag.h	Mon Mar 28 15:09:39 2011 -0700
@@ -22,6 +22,7 @@
 #define __IPV4_PACKET_INFO_TAG_H__
 
 #include "ns3/tag.h"
+#include "ns3/ipv4-address.h"
 
 namespace ns3 {
 
--- a/src/internet/model/ipv6-list-routing.cc	Mon Mar 28 19:46:05 2011 +0100
+++ b/src/internet/model/ipv6-list-routing.cc	Mon Mar 28 15:09:39 2011 -0700
@@ -333,114 +333,3 @@
 
 } // namespace ns3
 
-
-#include "ns3/test.h"
-#include "ipv6-list-routing.h"
-#include "ns3/ipv6-routing-protocol.h"
-
-namespace ns3 {
-
-    class Ipv6ARouting : public Ipv6RoutingProtocol {
-    public:
-      Ptr<Ipv6Route> RouteOutput (Ptr<Packet> p, const Ipv6Header &header, Ptr<NetDevice> oif, Socket::SocketErrno &sockerr)  { return 0;}
-      bool RouteInput  (Ptr<const Packet> p, const Ipv6Header &header, Ptr<const NetDevice> idev,
-                        UnicastForwardCallback ucb, MulticastForwardCallback mcb,
-                        LocalDeliverCallback lcb, ErrorCallback ecb) {return false;}
-      void NotifyInterfaceUp (uint32_t interface) {}
-      void NotifyInterfaceDown (uint32_t interface) {}
-      void NotifyAddAddress (uint32_t interface, Ipv6InterfaceAddress address) {}
-      void NotifyRemoveAddress (uint32_t interface, Ipv6InterfaceAddress address) {}
-      void NotifyAddRoute (Ipv6Address dst, Ipv6Prefix mask, Ipv6Address nextHop, uint32_t interface, Ipv6Address prefixToUse = Ipv6Address::
-                           GetZero ()) {}
-      void NotifyRemoveRoute (Ipv6Address dst, Ipv6Prefix mask, Ipv6Address nextHop, uint32_t interface, Ipv6Address prefixToUse) {}
-      void SetIpv6 (Ptr<Ipv6> ipv6) {}
-    };
-
-    class Ipv6BRouting : public Ipv6RoutingProtocol {
-    public:
-      Ptr<Ipv6Route> RouteOutput (Ptr<Packet> p, const Ipv6Header &header, Ptr<NetDevice> oif, Socket::SocketErrno &sockerr)  { return 0;}
-      bool RouteInput  (Ptr<const Packet> p, const Ipv6Header &header, Ptr<const NetDevice> idev,
-                        UnicastForwardCallback ucb, MulticastForwardCallback mcb,
-                        LocalDeliverCallback lcb, ErrorCallback ecb) {return false;}
-      void NotifyInterfaceUp (uint32_t interface) {}
-      void NotifyInterfaceDown (uint32_t interface) {}
-      void NotifyAddAddress (uint32_t interface, Ipv6InterfaceAddress address) {}
-      void NotifyRemoveAddress (uint32_t interface, Ipv6InterfaceAddress address) {}
-      void NotifyAddRoute (Ipv6Address dst, Ipv6Prefix mask, Ipv6Address nextHop, uint32_t interface, Ipv6Address prefixToUse = Ipv6Address::
-                           GetZero ()) {}
-      void NotifyRemoveRoute (Ipv6Address dst, Ipv6Prefix mask, Ipv6Address nextHop, uint32_t interface, Ipv6Address prefixToUse) {}
-      void SetIpv6 (Ptr<Ipv6> ipv6) {}
-    };
-
-    class Ipv6ListRoutingNegativeTestCase : public TestCase
-    {
-  public:
-    Ipv6ListRoutingNegativeTestCase();
-    virtual void DoRun (void);
-    };
-
-    Ipv6ListRoutingNegativeTestCase::Ipv6ListRoutingNegativeTestCase()
-      : TestCase("Check negative priorities")
-      {}
-    void
-      Ipv6ListRoutingNegativeTestCase::DoRun (void)
-        {
-          Ptr<Ipv6ListRouting> lr = CreateObject<Ipv6ListRouting> ();
-          Ptr<Ipv6RoutingProtocol> aRouting = CreateObject<Ipv6ARouting> ();
-          Ptr<Ipv6RoutingProtocol> bRouting = CreateObject<Ipv6BRouting> ();
-          // The Ipv6BRouting should be added with higher priority (larger integer value)
-          lr->AddRoutingProtocol (aRouting, -10);
-          lr->AddRoutingProtocol (bRouting, -5);
-          int16_t first = 3;
-          uint32_t num = lr->GetNRoutingProtocols ();
-          NS_TEST_ASSERT_MSG_EQ (num, 2, "XXX");
-          Ptr<Ipv6RoutingProtocol> firstRp = lr->GetRoutingProtocol (0, first);
-          NS_TEST_ASSERT_MSG_EQ (-5, first, "XXX");
-          NS_TEST_ASSERT_MSG_EQ (firstRp, bRouting, "XXX");
-        }
-
-    class Ipv6ListRoutingPositiveTestCase : public TestCase
-    {
-  public:
-    Ipv6ListRoutingPositiveTestCase();
-    virtual void DoRun (void);
-    };
-
-    Ipv6ListRoutingPositiveTestCase::Ipv6ListRoutingPositiveTestCase()
-      : TestCase("Check positive priorities")
-      {}
-    void
-      Ipv6ListRoutingPositiveTestCase::DoRun (void)
-        {
-          Ptr<Ipv6ListRouting> lr = CreateObject<Ipv6ListRouting> ();
-          Ptr<Ipv6RoutingProtocol> aRouting = CreateObject<Ipv6ARouting> ();
-          Ptr<Ipv6RoutingProtocol> bRouting = CreateObject<Ipv6BRouting> ();
-          // The Ipv6ARouting should be added with higher priority (larger integer 
-          // value) and will be fetched first below
-          lr->AddRoutingProtocol (aRouting, 10);
-          lr->AddRoutingProtocol (bRouting, 5);
-          int16_t first = 3;
-          int16_t second = 3;
-          uint32_t num = lr->GetNRoutingProtocols ();
-          NS_TEST_ASSERT_MSG_EQ (num, 2, "XXX");
-          Ptr<Ipv6RoutingProtocol> firstRp = lr->GetRoutingProtocol (0, first);
-          NS_TEST_ASSERT_MSG_EQ (10, first, "XXX");
-          NS_TEST_ASSERT_MSG_EQ (firstRp, aRouting, "XXX");
-          Ptr<Ipv6RoutingProtocol> secondRp = lr->GetRoutingProtocol (1, second);
-          NS_TEST_ASSERT_MSG_EQ (5, second, "XXX");
-          NS_TEST_ASSERT_MSG_EQ (secondRp, bRouting, "XXX");
-        }
-
-    static class Ipv6ListRoutingTestSuite : public TestSuite
-    {
-  public:
-    Ipv6ListRoutingTestSuite()
-      : TestSuite("ipv6-list-routing", UNIT)
-      {
-        AddTestCase(new Ipv6ListRoutingPositiveTestCase());
-        AddTestCase(new Ipv6ListRoutingNegativeTestCase());
-      }
-
-    } g_ipv6ListRoutingTestSuite;
-
-} // namespace ns3
--- a/src/internet/model/ipv6-packet-info-tag.cc	Mon Mar 28 19:46:05 2011 +0100
+++ b/src/internet/model/ipv6-packet-info-tag.cc	Mon Mar 28 15:09:39 2011 -0700
@@ -21,7 +21,6 @@
 
 #include <stdint.h>
 #include "ns3/ipv6-address.h"
-#include "ns3/test.h"
 #include "ipv6-packet-info-tag.h"
 
 namespace ns3 {
@@ -137,196 +136,3 @@
 }
 }//namespace ns3
 
-//-----------------------------------------------------------------------------
-// Unit tests
-//-----------------------------------------------------------------------------
-
-#include "ns3/log.h"
-#include "ns3/abort.h"
-#include "ns3/attribute.h"
-#include "ns3/simple-net-device.h"
-#include "ns3/object-factory.h"
-#include "ns3/socket-factory.h"
-#include "ns3/udp-socket-factory.h"
-#include "ns3/udp-socket.h"
-#include "ns3/ipv6-l3-protocol.h"
-#include "ns3/ipv6-raw-socket-factory.h"
-#include "ns3/ipv6-interface.h"
-#include "ns3/icmpv6-l4-protocol.h"
-#include "ns3/ipv6-static-routing.h"
-#include "ns3/ipv6-list-routing.h"
-#include "ns3/inet6-socket-address.h"
-#include "ns3/simulator.h"
-#include "ns3/uinteger.h"
-#include "ns3/boolean.h"
-#include "ns3/node.h"
-
-namespace ns3 {
-
-static void
-AddInternetStack (Ptr<Node> node)
-{
-  Ptr<Ipv6L3Protocol> ipv6 = CreateObject<Ipv6L3Protocol> ();
-  Ptr<Icmpv6L4Protocol> icmpv6 = CreateObject<Icmpv6L4Protocol> ();
-  node->AggregateObject (ipv6);
-  node->AggregateObject (icmpv6);
-  ipv6->Insert (icmpv6);
-  icmpv6->SetAttribute ("DAD", BooleanValue (false));
-
-  //Routing for Ipv6
-  Ptr<Ipv6ListRouting> ipv6Routing = CreateObject<Ipv6ListRouting> ();
-  ipv6->SetRoutingProtocol (ipv6Routing);
-  Ptr<Ipv6StaticRouting> ipv6staticRouting = CreateObject<Ipv6StaticRouting> ();
-  ipv6Routing->AddRoutingProtocol (ipv6staticRouting, 0);
-
-  /* register IPv6 extensions and options */
-  ipv6->RegisterExtensions ();
-  ipv6->RegisterOptions ();
-}
-
-class Ipv6PacketInfoTagTest: public TestCase 
-{
-public:
-  Ipv6PacketInfoTagTest ();
-private:
-  virtual void DoRun (void);
-  void RxCb (Ptr<Socket> socket);
-  void DoSendData (Ptr<Socket> socket, std::string to);
-};
-
-Ipv6PacketInfoTagTest::Ipv6PacketInfoTagTest ()
-  : TestCase ("Ipv6PacketInfoTagTest") 
-{}
-
-void
-Ipv6PacketInfoTagTest::RxCb (Ptr<Socket> socket)
-{
-  uint32_t availableData;
-  Ptr<Packet> m_receivedPacket;
-
-  availableData = socket->GetRxAvailable ();
-  m_receivedPacket = socket->Recv (std::numeric_limits<uint32_t>::max(), 0);
-  NS_ASSERT (availableData == m_receivedPacket->GetSize ());
-
-  Ipv6PacketInfoTag tag;
-  bool found;
-  found = m_receivedPacket->RemovePacketTag (tag);
-  NS_ASSERT (found);
-  tag.Print (std::cout);
-  std::cout << std::endl;
-}
-
-void
-Ipv6PacketInfoTagTest::DoSendData (Ptr<Socket> socket, std::string to)
-{
-  Address realTo = Inet6SocketAddress (Ipv6Address (to.c_str()), 200);
-  if (DynamicCast<UdpSocket> (socket) != 0)
-    {
-      NS_TEST_EXPECT_MSG_EQ (socket->SendTo (Create<Packet> (123), 0, realTo),
-                             123, "XXX");
-    }
-  // Should only Ipv6RawSock
-  else
-    {
-      socket->SendTo (Create<Packet> (123), 0, realTo);
-    }
-}
-
-void
-Ipv6PacketInfoTagTest::DoRun (void)
-{
-  Ptr<Node> node0 = CreateObject<Node> ();
-  Ptr<Node> node1 = CreateObject<Node> ();
-
-  Ptr<SimpleNetDevice> device = CreateObject<SimpleNetDevice> ();
-  Ptr<SimpleNetDevice> device2 = CreateObject<SimpleNetDevice> ();
-
-  // For Node 0
-  node0->AddDevice (device);
-  AddInternetStack (node0);
-  Ptr<Ipv6> ipv6 = node0->GetObject<Ipv6> ();
-
-  uint32_t index = ipv6->AddInterface (device);
-  Ipv6InterfaceAddress ifaceAddr1 = Ipv6InterfaceAddress (Ipv6Address("2000:1000:0:2000::1"), 
-                                                          Ipv6Prefix(64));
-  ipv6->AddAddress (index, ifaceAddr1);
-  ipv6->SetMetric (index, 1);
-  ipv6->SetUp (index);
-
-  // For Node 1
-  node1->AddDevice (device2);
-  AddInternetStack (node1);
-  ipv6 = node1->GetObject<Ipv6> ();
-
-  index = ipv6->AddInterface (device2);
-  Ipv6InterfaceAddress ifaceAddr2 = Ipv6InterfaceAddress (Ipv6Address("2000:1000:0:2000::2"), 
-                                                          Ipv6Prefix(64));
-  ipv6->AddAddress (index, ifaceAddr2);
-  ipv6->SetMetric (index, 1);
-  ipv6->SetUp (index);
-
-  // ipv6 w rawsocket
-  Ptr<SocketFactory> factory = node0->GetObject<SocketFactory> (Ipv6RawSocketFactory::GetTypeId ());
-  Ptr<Socket> socket = factory->CreateSocket ();
-  Inet6SocketAddress local =  Inet6SocketAddress (Ipv6Address::GetAny (), 0);
-  socket->SetAttribute ("Protocol", UintegerValue (Ipv6Header::IPV6_ICMPV6));
-  socket->Bind (local);
-  socket->SetRecvPktInfo (true);
-  socket->SetRecvCallback (MakeCallback (&ns3::Ipv6PacketInfoTagTest::RxCb, this));
-
-  // receive on loopback 
-  Simulator::ScheduleWithContext (socket->GetNode ()->GetId (), Seconds (0),
-                                  &Ipv6PacketInfoTagTest::DoSendData, this, socket, "::1");
-  Simulator::Run ();
-
-  Ptr<SocketFactory> factory2 = node1->GetObject<SocketFactory> (Ipv6RawSocketFactory::GetTypeId ());
-  Ptr<Socket> socket2 = factory2->CreateSocket ();
-  std::stringstream dst;
-  dst << ifaceAddr1.GetAddress ();
-  Simulator::ScheduleWithContext (socket2->GetNode ()->GetId (), Seconds (0),
-                                  &Ipv6PacketInfoTagTest::DoSendData, this, socket, 
-                                  dst.str ());
-  Simulator::Run ();
-
-#ifdef UDP6_SUPPORTED
-  // IPv6 test
-  factory = node0->GetObject<SocketFactory> (UdpSocketFactory::GetTypeId ());
-  socket = factory->CreateSocket ();
-  local =  Inet6SocketAddress (Ipv6Address::GetAny (), 200);
-  socket->Bind (local);
-  socket->SetRecvPktInfo (true);
-  socket->SetRecvCallback (MakeCallback (&ns3::Ipv6PacketInfoTagTest::RxCb, this));
-
-  // receive on loopback 
-  Simulator::ScheduleWithContext (socket->GetNode ()->GetId (), Seconds (0),
-                                  &Ipv6PacketInfoTagTest::DoSendData, this, socket, "::1");
-  Simulator::Run ();
-
-  factory2 = node1->GetObject<SocketFactory> (UdpSocketFactory::GetTypeId ());
-  socket2 = factory2->CreateSocket ();
-  Simulator::ScheduleWithContext (socket2->GetNode ()->GetId (), Seconds (0),
-                                  &Ipv6PacketInfoTagTest::DoSendData, this, socket, "10.1.1.1");
-  Simulator::Run ();
-
-#endif  // UDP6_SUPPORTED
-
-  Simulator::Destroy ();
-  // IPv6 test
-}
-
-static class Ipv6PacketInfoTagTestSuite : public TestSuite
-{
-public:
-  Ipv6PacketInfoTagTestSuite ();
-private:
-} g_packetinfotagTests;
-
-Ipv6PacketInfoTagTestSuite::Ipv6PacketInfoTagTestSuite ()
-  : TestSuite ("ipv6-packet-info-tag", UNIT)
-{
-  AddTestCase (new Ipv6PacketInfoTagTest ());
-}
-
-
-}
-
--- a/src/internet/model/ipv6-packet-info-tag.h	Mon Mar 28 19:46:05 2011 +0100
+++ b/src/internet/model/ipv6-packet-info-tag.h	Mon Mar 28 15:09:39 2011 -0700
@@ -22,6 +22,7 @@
 #define __IPV6_PACKET_INFO_TAG_H__
 
 #include "ns3/tag.h"
+#include "ns3/ipv6-address.h"
 
 namespace ns3 {
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/internet/test/global-route-manager-impl-test-suite.cc	Mon Mar 28 15:09:39 2011 -0700
@@ -0,0 +1,234 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright 2007 University of Washington
+ * Copyright (C) 1999, 2000 Kunihiro Ishiguro, Toshiaki Takada
+ * 
+ * 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
+ *
+ * Authors:  Tom Henderson (tomhend@u.washington.edu)
+ * 
+ * Kunihiro Ishigura, Toshiaki Takada (GNU Zebra) are attributed authors
+ * of the quagga 0.99.7/src/ospfd/ospf_spf.c code which was ported here
+ */
+
+#include "ns3/test.h"
+#include "ns3/global-route-manager-impl.h"
+#include "ns3/candidate-queue.h"
+#include "ns3/simulator.h"
+#include <stdlib.h> // for rand()
+
+namespace ns3 {
+
+class GlobalRouteManagerImplTestCase : public TestCase
+{
+public:
+  GlobalRouteManagerImplTestCase();
+  virtual void DoRun(void);
+};
+
+GlobalRouteManagerImplTestCase::GlobalRouteManagerImplTestCase()
+  : TestCase("GlobalRouteManagerImplTestCase")
+{}
+void
+GlobalRouteManagerImplTestCase::DoRun(void)
+{
+  CandidateQueue candidate;
+
+  for (int i = 0; i < 100; ++i)
+    {
+      SPFVertex *v = new SPFVertex;
+      v->SetDistanceFromRoot (rand () % 100);
+      candidate.Push (v);
+    }
+
+  uint32_t lastDistance = 0;
+
+  for (int i = 0; i < 100; ++i)
+    {
+      SPFVertex *v = candidate.Pop ();
+      if (v->GetDistanceFromRoot () < lastDistance)
+        {
+          // XXX does nothing.
+          UpdateErrorStatus (false);
+        }
+      lastDistance = v->GetDistanceFromRoot ();
+      delete v;
+      v = 0;
+    }
+
+  // Build fake link state database; four routers (0-3), 3 point-to-point
+  // links
+  //
+  //   n0
+  //      \ link 0
+  //       \          link 2
+  //        n2 -------------------------n3
+  //       /
+  //      / link 1
+  //    n1
+  //
+  //  link0:  10.1.1.1/30, 10.1.1.2/30
+  //  link1:  10.1.2.1/30, 10.1.2.2/30
+  //  link2:  10.1.3.1/30, 10.1.3.2/30
+  //
+  // Router 0
+  GlobalRoutingLinkRecord* lr0 = new GlobalRoutingLinkRecord (
+    GlobalRoutingLinkRecord::PointToPoint, 
+    "0.0.0.2",  // router ID 0.0.0.2
+    "10.1.1.1", // local ID
+    1);         // metric
+
+  GlobalRoutingLinkRecord* lr1 = new GlobalRoutingLinkRecord (
+    GlobalRoutingLinkRecord::StubNetwork,
+    "10.1.1.1",
+    "255.255.255.252",
+    1);
+
+  GlobalRoutingLSA* lsa0 = new GlobalRoutingLSA ();
+  lsa0->SetLSType (GlobalRoutingLSA::RouterLSA);
+  lsa0->SetLinkStateId ("0.0.0.0");
+  lsa0->SetAdvertisingRouter ("0.0.0.0");
+  lsa0->AddLinkRecord (lr0);
+  lsa0->AddLinkRecord (lr1);
+
+  // Router 1
+  GlobalRoutingLinkRecord* lr2 = new GlobalRoutingLinkRecord (
+    GlobalRoutingLinkRecord::PointToPoint,
+    "0.0.0.2",
+    "10.1.2.1",
+    1);
+
+  GlobalRoutingLinkRecord* lr3 = new GlobalRoutingLinkRecord (
+    GlobalRoutingLinkRecord::StubNetwork,
+    "10.1.2.1",
+    "255.255.255.252",
+    1);
+
+  GlobalRoutingLSA* lsa1 = new GlobalRoutingLSA ();
+  lsa1->SetLSType (GlobalRoutingLSA::RouterLSA);
+  lsa1->SetLinkStateId ("0.0.0.1");
+  lsa1->SetAdvertisingRouter ("0.0.0.1");
+  lsa1->AddLinkRecord (lr2);
+  lsa1->AddLinkRecord (lr3);
+  
+  // Router 2 
+  GlobalRoutingLinkRecord* lr4 = new GlobalRoutingLinkRecord (
+    GlobalRoutingLinkRecord::PointToPoint,
+    "0.0.0.0",
+    "10.1.1.2",
+    1);
+
+  GlobalRoutingLinkRecord* lr5 = new GlobalRoutingLinkRecord (
+    GlobalRoutingLinkRecord::StubNetwork,
+    "10.1.1.2",
+    "255.255.255.252",
+    1);
+
+  GlobalRoutingLinkRecord* lr6 = new GlobalRoutingLinkRecord (
+    GlobalRoutingLinkRecord::PointToPoint,
+    "0.0.0.1",
+    "10.1.2.2",
+    1);
+
+  GlobalRoutingLinkRecord* lr7 = new GlobalRoutingLinkRecord (
+    GlobalRoutingLinkRecord::StubNetwork,
+    "10.1.2.2",
+    "255.255.255.252",
+    1);
+
+  GlobalRoutingLinkRecord* lr8 = new GlobalRoutingLinkRecord (
+    GlobalRoutingLinkRecord::PointToPoint,
+    "0.0.0.3",
+    "10.1.3.2",
+    1);
+
+  GlobalRoutingLinkRecord* lr9 = new GlobalRoutingLinkRecord (
+    GlobalRoutingLinkRecord::StubNetwork,
+    "10.1.3.2",
+    "255.255.255.252",
+    1);
+
+  GlobalRoutingLSA* lsa2 = new GlobalRoutingLSA ();
+  lsa2->SetLSType (GlobalRoutingLSA::RouterLSA);
+  lsa2->SetLinkStateId ("0.0.0.2");
+  lsa2->SetAdvertisingRouter ("0.0.0.2");
+  lsa2->AddLinkRecord (lr4);
+  lsa2->AddLinkRecord (lr5);
+  lsa2->AddLinkRecord (lr6);
+  lsa2->AddLinkRecord (lr7);
+  lsa2->AddLinkRecord (lr8);
+  lsa2->AddLinkRecord (lr9);
+
+  // Router 3
+  GlobalRoutingLinkRecord* lr10 = new GlobalRoutingLinkRecord (
+    GlobalRoutingLinkRecord::PointToPoint,
+    "0.0.0.2",
+    "10.1.2.1",
+    1);
+
+  GlobalRoutingLinkRecord* lr11 = new GlobalRoutingLinkRecord (
+    GlobalRoutingLinkRecord::StubNetwork,
+    "10.1.2.1",
+    "255.255.255.252",
+    1);
+
+  GlobalRoutingLSA* lsa3 = new GlobalRoutingLSA ();
+  lsa3->SetLSType (GlobalRoutingLSA::RouterLSA);
+  lsa3->SetLinkStateId ("0.0.0.3");
+  lsa3->SetAdvertisingRouter ("0.0.0.3");
+  lsa3->AddLinkRecord (lr10);
+  lsa3->AddLinkRecord (lr11);
+
+  // Test the database 
+  GlobalRouteManagerLSDB* srmlsdb = new GlobalRouteManagerLSDB ();
+  srmlsdb->Insert (lsa0->GetLinkStateId (), lsa0);
+  srmlsdb->Insert (lsa1->GetLinkStateId (), lsa1);
+  srmlsdb->Insert (lsa2->GetLinkStateId (), lsa2);
+  srmlsdb->Insert (lsa3->GetLinkStateId (), lsa3);
+  NS_ASSERT (lsa2 == srmlsdb->GetLSA (lsa2->GetLinkStateId ()));
+
+  // next, calculate routes based on the manually created LSDB
+  GlobalRouteManagerImpl* srm = new GlobalRouteManagerImpl ();
+  srm->DebugUseLsdb (srmlsdb);  // manually add in an LSDB
+  // Note-- this will succeed without any nodes in the topology
+  // because the NodeList is empty
+  srm->DebugSPFCalculate (lsa0->GetLinkStateId ());  // node n0
+
+  Simulator::Run ();
+
+// XXX here we should do some verification of the routes built
+
+  Simulator::Destroy ();
+
+  // This delete clears the srm, which deletes the LSDB, which clears 
+  // all of the LSAs, which each destroys the attached LinkRecords.
+  delete srm;
+
+  // XXX
+  // No testing has actually been done other than making sure that this code
+  // does not crash
+}
+
+
+static class GlobalRouteManagerImplTestSuite : public TestSuite
+{
+public:
+  GlobalRouteManagerImplTestSuite()
+    : TestSuite("global-route-manager-impl", UNIT)
+  {
+    AddTestCase(new GlobalRouteManagerImplTestCase());
+  }
+} g_globalRoutingManagerImplTestSuite;
+
+} // namespace ns3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/internet/test/ipv4-list-routing-test-suite.cc	Mon Mar 28 15:09:39 2011 -0700
@@ -0,0 +1,127 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2009 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/test.h"
+#include "ns3/ipv4-list-routing.h"
+#include "ns3/ipv4-routing-protocol.h"
+
+namespace ns3 {
+
+class Ipv4ARouting : public Ipv4RoutingProtocol {
+public:
+  Ptr<Ipv4Route> RouteOutput (Ptr<Packet> p, const Ipv4Header &header, Ptr<NetDevice> oif, Socket::SocketErrno &sockerr)  { return 0;}
+  bool RouteInput  (Ptr<const Packet> p, const Ipv4Header &header, Ptr<const NetDevice> idev,
+                             UnicastForwardCallback ucb, MulticastForwardCallback mcb,
+                             LocalDeliverCallback lcb, ErrorCallback ecb) {return false;}
+  void NotifyInterfaceUp (uint32_t interface) {}
+  void NotifyInterfaceDown (uint32_t interface) {}
+  void NotifyAddAddress (uint32_t interface, Ipv4InterfaceAddress address) {}
+  void NotifyRemoveAddress (uint32_t interface, Ipv4InterfaceAddress address) {}
+  void SetIpv4 (Ptr<Ipv4> ipv4) {}
+  void PrintRoutingTable (Ptr<OutputStreamWrapper> stream) const {}
+};
+
+class Ipv4BRouting : public Ipv4RoutingProtocol {
+public:
+  Ptr<Ipv4Route> RouteOutput (Ptr<Packet> p, const Ipv4Header &header, Ptr<NetDevice> oif, Socket::SocketErrno &sockerr)  { return 0;}
+  bool RouteInput  (Ptr<const Packet> p, const Ipv4Header &header, Ptr<const NetDevice> idev,
+                             UnicastForwardCallback ucb, MulticastForwardCallback mcb,
+                             LocalDeliverCallback lcb, ErrorCallback ecb) {return false;}
+  void NotifyInterfaceUp (uint32_t interface) {}
+  void NotifyInterfaceDown (uint32_t interface) {}
+  void NotifyAddAddress (uint32_t interface, Ipv4InterfaceAddress address) {}
+  void NotifyRemoveAddress (uint32_t interface, Ipv4InterfaceAddress address) {}
+  void SetIpv4 (Ptr<Ipv4> ipv4) {}
+  void PrintRoutingTable (Ptr<OutputStreamWrapper> stream) const {}
+};
+
+class Ipv4ListRoutingNegativeTestCase : public TestCase
+{
+public:
+  Ipv4ListRoutingNegativeTestCase();
+  virtual void DoRun (void);
+};
+
+Ipv4ListRoutingNegativeTestCase::Ipv4ListRoutingNegativeTestCase()
+  : TestCase("Check negative priorities")
+{}
+void
+Ipv4ListRoutingNegativeTestCase::DoRun (void)
+{
+  Ptr<Ipv4ListRouting> lr = CreateObject<Ipv4ListRouting> ();
+  Ptr<Ipv4RoutingProtocol> aRouting = CreateObject<Ipv4ARouting> ();
+  Ptr<Ipv4RoutingProtocol> bRouting = CreateObject<Ipv4BRouting> ();
+  // The Ipv4BRouting should be added with higher priority (larger integer value)
+  lr->AddRoutingProtocol (aRouting, -10);
+  lr->AddRoutingProtocol (bRouting, -5);
+  int16_t first = 3;
+  uint32_t num = lr->GetNRoutingProtocols ();
+  NS_TEST_ASSERT_MSG_EQ (num, 2, "XXX");
+  Ptr<Ipv4RoutingProtocol> firstRp = lr->GetRoutingProtocol (0, first);
+  NS_TEST_ASSERT_MSG_EQ (-5, first, "XXX");
+  NS_TEST_ASSERT_MSG_EQ (firstRp, bRouting, "XXX");
+}
+
+class Ipv4ListRoutingPositiveTestCase : public TestCase
+{
+public:
+  Ipv4ListRoutingPositiveTestCase();
+  virtual void DoRun (void);
+};
+
+Ipv4ListRoutingPositiveTestCase::Ipv4ListRoutingPositiveTestCase()
+  : TestCase("Check positive priorities")
+{}
+void
+Ipv4ListRoutingPositiveTestCase::DoRun (void)
+{
+  Ptr<Ipv4ListRouting> lr = CreateObject<Ipv4ListRouting> ();
+  Ptr<Ipv4RoutingProtocol> aRouting = CreateObject<Ipv4ARouting> ();
+  Ptr<Ipv4RoutingProtocol> bRouting = CreateObject<Ipv4BRouting> ();
+  // The Ipv4ARouting should be added with higher priority (larger integer 
+  // value) and will be fetched first below
+  lr->AddRoutingProtocol (aRouting, 10);
+  lr->AddRoutingProtocol (bRouting, 5);
+  int16_t first = 3;
+  int16_t second = 3;
+  uint32_t num = lr->GetNRoutingProtocols ();
+  NS_TEST_ASSERT_MSG_EQ (num, 2, "XXX");
+  Ptr<Ipv4RoutingProtocol> firstRp = lr->GetRoutingProtocol (0, first);
+  NS_TEST_ASSERT_MSG_EQ (10, first, "XXX");
+  NS_TEST_ASSERT_MSG_EQ (firstRp, aRouting, "XXX");
+  Ptr<Ipv4RoutingProtocol> secondRp = lr->GetRoutingProtocol (1, second);
+  NS_TEST_ASSERT_MSG_EQ (5, second, "XXX");
+  NS_TEST_ASSERT_MSG_EQ (secondRp, bRouting, "XXX");
+}
+
+static class Ipv4ListRoutingTestSuite : public TestSuite
+{
+public:
+  Ipv4ListRoutingTestSuite()
+    : TestSuite("ipv4-list-routing", UNIT)
+  {
+    AddTestCase(new Ipv4ListRoutingPositiveTestCase());
+    AddTestCase(new Ipv4ListRoutingNegativeTestCase());
+  }
+
+} g_ipv4ListRoutingTestSuite;
+
+} // namespace ns3
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/internet/test/ipv4-packet-info-tag-test-suite.cc	Mon Mar 28 15:09:39 2011 -0700
@@ -0,0 +1,209 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2010 Hajime Tazaki
+ *
+ * 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
+ *
+ * Authors: Hajime Tazaki <tazaki@sfc.wide.ad.jp>
+ */
+
+//-----------------------------------------------------------------------------
+// Unit tests
+//-----------------------------------------------------------------------------
+
+#include <string>
+
+#include "ns3/test.h"
+#include "ns3/ipv4-packet-info-tag.h"
+#include "ns3/ipv4-address.h"
+#include "ns3/log.h"
+#include "ns3/abort.h"
+#include "ns3/attribute.h"
+#include "ns3/simple-net-device.h"
+#include "ns3/object-factory.h"
+#include "ns3/socket-factory.h"
+#include "ns3/udp-socket-factory.h"
+#include "ns3/udp-socket.h"
+#include "ns3/inet-socket-address.h"
+#include "ns3/ipv4-l3-protocol.h"
+#include "ns3/ipv4-raw-socket-factory.h"
+#include "ns3/ipv4-interface.h"
+#include "ns3/arp-l3-protocol.h"
+#include "ns3/icmpv4-l4-protocol.h"
+#include "ns3/ipv4-static-routing.h"
+#include "ns3/ipv4-list-routing.h"
+#include "ns3/udp-l4-protocol.h"
+#include "ns3/tcp-l4-protocol.h"
+#include "ns3/simulator.h"
+#include "ns3/node.h"
+
+namespace ns3 {
+
+static void
+AddInternetStack (Ptr<Node> node)
+{
+  //ARP
+  Ptr<ArpL3Protocol> arp = CreateObject<ArpL3Protocol> ();
+  node->AggregateObject(arp);
+  //IPV4
+  Ptr<Ipv4L3Protocol> ipv4 = CreateObject<Ipv4L3Protocol> ();
+  //Routing for Ipv4
+  Ptr<Ipv4ListRouting> ipv4Routing = CreateObject<Ipv4ListRouting> ();
+  ipv4->SetRoutingProtocol (ipv4Routing);
+  Ptr<Ipv4StaticRouting> ipv4staticRouting = CreateObject<Ipv4StaticRouting> ();
+  ipv4Routing->AddRoutingProtocol (ipv4staticRouting, 0);
+  node->AggregateObject(ipv4);
+  //ICMP
+  Ptr<Icmpv4L4Protocol> icmp = CreateObject<Icmpv4L4Protocol> ();
+  node->AggregateObject(icmp);
+  //UDP
+  Ptr<UdpL4Protocol> udp = CreateObject<UdpL4Protocol> ();
+  node->AggregateObject(udp); 
+}
+
+class Ipv4PacketInfoTagTest: public TestCase 
+{
+public:
+  Ipv4PacketInfoTagTest ();
+private:
+  virtual void DoRun (void);
+  void RxCb (Ptr<Socket> socket);
+  void DoSendData (Ptr<Socket> socket, std::string to);
+};
+
+Ipv4PacketInfoTagTest::Ipv4PacketInfoTagTest ()
+  : TestCase ("Ipv4PacketInfoTagTest") 
+{}
+
+void
+Ipv4PacketInfoTagTest::RxCb (Ptr<Socket> socket)
+{
+  uint32_t availableData;
+  Ptr<Packet> m_receivedPacket;
+
+  availableData = socket->GetRxAvailable ();
+  m_receivedPacket = socket->Recv (std::numeric_limits<uint32_t>::max(), 0);
+  NS_ASSERT (availableData == m_receivedPacket->GetSize ());
+
+  Ipv4PacketInfoTag tag;
+  bool found;
+  found = m_receivedPacket->RemovePacketTag (tag);
+  NS_ASSERT (found);
+  tag.Print (std::cout);
+}
+
+void
+Ipv4PacketInfoTagTest::DoSendData (Ptr<Socket> socket, std::string to)
+{
+  Address realTo = InetSocketAddress (Ipv4Address (to.c_str()), 200);
+  if (DynamicCast<UdpSocket> (socket) != 0)
+    {
+      NS_TEST_EXPECT_MSG_EQ (socket->SendTo (Create<Packet> (123), 0, realTo),
+                             123, "XXX");
+    }
+  // Should only Ipv4RawSock
+  else
+    {
+      socket->SendTo (Create<Packet> (123), 0, realTo);
+    }
+}
+
+void
+Ipv4PacketInfoTagTest::DoRun (void)
+{
+  Ptr<Node> node0 = CreateObject<Node> ();
+  Ptr<Node> node1 = CreateObject<Node> ();
+
+  Ptr<SimpleNetDevice> device = CreateObject<SimpleNetDevice> ();
+  Ptr<SimpleNetDevice> device2 = CreateObject<SimpleNetDevice> ();
+
+  // For Node 0
+  node0->AddDevice (device);
+  AddInternetStack (node0);
+  Ptr<Ipv4> ipv4 = node0->GetObject<Ipv4> ();
+
+  uint32_t index = ipv4->AddInterface (device);
+  Ipv4InterfaceAddress ifaceAddr1 = Ipv4InterfaceAddress ("10.1.1.1",
+                                                          "255.255.255.0");
+  ipv4->AddAddress (index, ifaceAddr1);
+  ipv4->SetMetric (index, 1);
+  ipv4->SetUp (index);
+
+  // For Node 1
+  node1->AddDevice (device2);
+  AddInternetStack (node1);
+  ipv4 = node1->GetObject<Ipv4> ();
+
+  index = ipv4->AddInterface (device2);
+  Ipv4InterfaceAddress ifaceAddr2 = Ipv4InterfaceAddress ("10.1.1.2",
+                                                          "255.255.255.0");
+  ipv4->AddAddress (index, ifaceAddr2);
+  ipv4->SetMetric (index, 1);
+  ipv4->SetUp (index);
+
+  // IPv4 test
+  Ptr<SocketFactory> factory = node0->GetObject<SocketFactory> (UdpSocketFactory::GetTypeId ());
+  Ptr<Socket> socket = factory->CreateSocket ();
+  InetSocketAddress local =  InetSocketAddress (Ipv4Address::GetAny (), 200);
+  socket->Bind (local);
+  socket->SetRecvPktInfo (true);
+  socket->SetRecvCallback (MakeCallback (&ns3::Ipv4PacketInfoTagTest::RxCb, this));
+
+  // receive on loopback 
+  Simulator::ScheduleWithContext (socket->GetNode ()->GetId (), Seconds (0),
+                                  &Ipv4PacketInfoTagTest::DoSendData, this, socket, "127.0.0.1");
+  Simulator::Run ();
+
+  Ptr<SocketFactory> factory2 = node1->GetObject<SocketFactory> (UdpSocketFactory::GetTypeId ());
+  Ptr<Socket> socket2 = factory2->CreateSocket ();
+  Simulator::ScheduleWithContext (socket2->GetNode ()->GetId (), Seconds (0),
+                                  &Ipv4PacketInfoTagTest::DoSendData, this, socket, "10.1.1.1");
+  Simulator::Run ();
+
+  // ipv4 w rawsocket
+  factory = node0->GetObject<SocketFactory> (Ipv4RawSocketFactory::GetTypeId ());
+  socket = factory->CreateSocket ();
+  local =  InetSocketAddress (Ipv4Address::GetAny (), 0);
+  socket->Bind (local);
+  socket->SetRecvPktInfo (true);
+  socket->SetRecvCallback (MakeCallback (&ns3::Ipv4PacketInfoTagTest::RxCb, this));
+
+  // receive on loopback 
+  Simulator::ScheduleWithContext (socket->GetNode ()->GetId (), Seconds (0),
+                                  &Ipv4PacketInfoTagTest::DoSendData, this, socket, "127.0.0.1");
+  Simulator::Run ();
+
+  factory2 = node1->GetObject<SocketFactory> (Ipv4RawSocketFactory::GetTypeId ());
+  socket2 = factory2->CreateSocket ();
+  Simulator::ScheduleWithContext (socket2->GetNode ()->GetId (), Seconds (0),
+                                  &Ipv4PacketInfoTagTest::DoSendData, this, socket, "10.1.1.1");
+  Simulator::Run ();
+  Simulator::Destroy ();
+}
+
+static class Ipv4PacketInfoTagTestSuite : public TestSuite
+{
+public:
+  Ipv4PacketInfoTagTestSuite ();
+private:
+} g_packetinfotagTests;
+
+Ipv4PacketInfoTagTestSuite::Ipv4PacketInfoTagTestSuite ()
+  : TestSuite ("ipv4-packet-info-tag", UNIT)
+{
+  AddTestCase (new Ipv4PacketInfoTagTest ());
+}
+
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/internet/test/ipv6-list-routing-test-suite.cc	Mon Mar 28 15:09:39 2011 -0700
@@ -0,0 +1,130 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2009 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/test.h"
+#include "ns3/ipv6-list-routing.h"
+#include "ns3/ipv6-route.h"
+#include "ns3/ipv6-routing-protocol.h"
+
+namespace ns3 {
+
+    class Ipv6ARouting : public Ipv6RoutingProtocol {
+    public:
+      Ptr<Ipv6Route> RouteOutput (Ptr<Packet> p, const Ipv6Header &header, Ptr<NetDevice> oif, Socket::SocketErrno &sockerr)  { return 0;}
+      bool RouteInput  (Ptr<const Packet> p, const Ipv6Header &header, Ptr<const NetDevice> idev,
+                        UnicastForwardCallback ucb, MulticastForwardCallback mcb,
+                        LocalDeliverCallback lcb, ErrorCallback ecb) {return false;}
+      void NotifyInterfaceUp (uint32_t interface) {}
+      void NotifyInterfaceDown (uint32_t interface) {}
+      void NotifyAddAddress (uint32_t interface, Ipv6InterfaceAddress address) {}
+      void NotifyRemoveAddress (uint32_t interface, Ipv6InterfaceAddress address) {}
+      void NotifyAddRoute (Ipv6Address dst, Ipv6Prefix mask, Ipv6Address nextHop, uint32_t interface, Ipv6Address prefixToUse = Ipv6Address::
+                           GetZero ()) {}
+      void NotifyRemoveRoute (Ipv6Address dst, Ipv6Prefix mask, Ipv6Address nextHop, uint32_t interface, Ipv6Address prefixToUse) {}
+      void SetIpv6 (Ptr<Ipv6> ipv6) {}
+    };
+
+    class Ipv6BRouting : public Ipv6RoutingProtocol {
+    public:
+      Ptr<Ipv6Route> RouteOutput (Ptr<Packet> p, const Ipv6Header &header, Ptr<NetDevice> oif, Socket::SocketErrno &sockerr)  { return 0;}
+      bool RouteInput  (Ptr<const Packet> p, const Ipv6Header &header, Ptr<const NetDevice> idev,
+                        UnicastForwardCallback ucb, MulticastForwardCallback mcb,
+                        LocalDeliverCallback lcb, ErrorCallback ecb) {return false;}
+      void NotifyInterfaceUp (uint32_t interface) {}
+      void NotifyInterfaceDown (uint32_t interface) {}
+      void NotifyAddAddress (uint32_t interface, Ipv6InterfaceAddress address) {}
+      void NotifyRemoveAddress (uint32_t interface, Ipv6InterfaceAddress address) {}
+      void NotifyAddRoute (Ipv6Address dst, Ipv6Prefix mask, Ipv6Address nextHop, uint32_t interface, Ipv6Address prefixToUse = Ipv6Address::
+                           GetZero ()) {}
+      void NotifyRemoveRoute (Ipv6Address dst, Ipv6Prefix mask, Ipv6Address nextHop, uint32_t interface, Ipv6Address prefixToUse) {}
+      void SetIpv6 (Ptr<Ipv6> ipv6) {}
+    };
+
+    class Ipv6ListRoutingNegativeTestCase : public TestCase
+    {
+  public:
+    Ipv6ListRoutingNegativeTestCase();
+    virtual void DoRun (void);
+    };
+
+    Ipv6ListRoutingNegativeTestCase::Ipv6ListRoutingNegativeTestCase()
+      : TestCase("Check negative priorities")
+      {}
+    void
+      Ipv6ListRoutingNegativeTestCase::DoRun (void)
+        {
+          Ptr<Ipv6ListRouting> lr = CreateObject<Ipv6ListRouting> ();
+          Ptr<Ipv6RoutingProtocol> aRouting = CreateObject<Ipv6ARouting> ();
+          Ptr<Ipv6RoutingProtocol> bRouting = CreateObject<Ipv6BRouting> ();
+          // The Ipv6BRouting should be added with higher priority (larger integer value)
+          lr->AddRoutingProtocol (aRouting, -10);
+          lr->AddRoutingProtocol (bRouting, -5);
+          int16_t first = 3;
+          uint32_t num = lr->GetNRoutingProtocols ();
+          NS_TEST_ASSERT_MSG_EQ (num, 2, "XXX");
+          Ptr<Ipv6RoutingProtocol> firstRp = lr->GetRoutingProtocol (0, first);
+          NS_TEST_ASSERT_MSG_EQ (-5, first, "XXX");
+          NS_TEST_ASSERT_MSG_EQ (firstRp, bRouting, "XXX");
+        }
+
+    class Ipv6ListRoutingPositiveTestCase : public TestCase
+    {
+  public:
+    Ipv6ListRoutingPositiveTestCase();
+    virtual void DoRun (void);
+    };
+
+    Ipv6ListRoutingPositiveTestCase::Ipv6ListRoutingPositiveTestCase()
+      : TestCase("Check positive priorities")
+      {}
+    void
+      Ipv6ListRoutingPositiveTestCase::DoRun (void)
+        {
+          Ptr<Ipv6ListRouting> lr = CreateObject<Ipv6ListRouting> ();
+          Ptr<Ipv6RoutingProtocol> aRouting = CreateObject<Ipv6ARouting> ();
+          Ptr<Ipv6RoutingProtocol> bRouting = CreateObject<Ipv6BRouting> ();
+          // The Ipv6ARouting should be added with higher priority (larger integer 
+          // value) and will be fetched first below
+          lr->AddRoutingProtocol (aRouting, 10);
+          lr->AddRoutingProtocol (bRouting, 5);
+          int16_t first = 3;
+          int16_t second = 3;
+          uint32_t num = lr->GetNRoutingProtocols ();
+          NS_TEST_ASSERT_MSG_EQ (num, 2, "XXX");
+          Ptr<Ipv6RoutingProtocol> firstRp = lr->GetRoutingProtocol (0, first);
+          NS_TEST_ASSERT_MSG_EQ (10, first, "XXX");
+          NS_TEST_ASSERT_MSG_EQ (firstRp, aRouting, "XXX");
+          Ptr<Ipv6RoutingProtocol> secondRp = lr->GetRoutingProtocol (1, second);
+          NS_TEST_ASSERT_MSG_EQ (5, second, "XXX");
+          NS_TEST_ASSERT_MSG_EQ (secondRp, bRouting, "XXX");
+        }
+
+    static class Ipv6ListRoutingTestSuite : public TestSuite
+    {
+  public:
+    Ipv6ListRoutingTestSuite()
+      : TestSuite("ipv6-list-routing", UNIT)
+      {
+        AddTestCase(new Ipv6ListRoutingPositiveTestCase());
+        AddTestCase(new Ipv6ListRoutingNegativeTestCase());
+      }
+
+    } g_ipv6ListRoutingTestSuite;
+
+} // namespace ns3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/internet/test/ipv6-packet-info-tag-test-suite.cc	Mon Mar 28 15:09:39 2011 -0700
@@ -0,0 +1,216 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2010 Hajime Tazaki
+ *
+ * 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
+ *
+ * Authors: Hajime Tazaki <tazaki@sfc.wide.ad.jp>
+ */
+
+//-----------------------------------------------------------------------------
+// Unit tests
+//-----------------------------------------------------------------------------
+
+#include "ns3/test.h"
+#include "ns3/ipv6-address.h"
+#include "ns3/ipv6-packet-info-tag.h"
+#include "ns3/log.h"
+#include "ns3/abort.h"
+#include "ns3/attribute.h"
+#include "ns3/simple-net-device.h"
+#include "ns3/object-factory.h"
+#include "ns3/socket-factory.h"
+#include "ns3/udp-socket-factory.h"
+#include "ns3/udp-socket.h"
+#include "ns3/ipv6-l3-protocol.h"
+#include "ns3/ipv6-raw-socket-factory.h"
+#include "ns3/ipv6-interface.h"
+#include "ns3/icmpv6-l4-protocol.h"
+#include "ns3/ipv6-static-routing.h"
+#include "ns3/ipv6-list-routing.h"
+#include "ns3/inet6-socket-address.h"
+#include "ns3/simulator.h"
+#include "ns3/uinteger.h"
+#include "ns3/boolean.h"
+#include "ns3/node.h"
+
+namespace ns3 {
+
+static void
+AddInternetStack (Ptr<Node> node)
+{
+  Ptr<Ipv6L3Protocol> ipv6 = CreateObject<Ipv6L3Protocol> ();
+  Ptr<Icmpv6L4Protocol> icmpv6 = CreateObject<Icmpv6L4Protocol> ();
+  node->AggregateObject (ipv6);
+  node->AggregateObject (icmpv6);
+  ipv6->Insert (icmpv6);
+  icmpv6->SetAttribute ("DAD", BooleanValue (false));
+
+  //Routing for Ipv6
+  Ptr<Ipv6ListRouting> ipv6Routing = CreateObject<Ipv6ListRouting> ();
+  ipv6->SetRoutingProtocol (ipv6Routing);
+  Ptr<Ipv6StaticRouting> ipv6staticRouting = CreateObject<Ipv6StaticRouting> ();
+  ipv6Routing->AddRoutingProtocol (ipv6staticRouting, 0);
+
+  /* register IPv6 extensions and options */
+  ipv6->RegisterExtensions ();
+  ipv6->RegisterOptions ();
+}
+
+class Ipv6PacketInfoTagTest: public TestCase 
+{
+public:
+  Ipv6PacketInfoTagTest ();
+private:
+  virtual void DoRun (void);
+  void RxCb (Ptr<Socket> socket);
+  void DoSendData (Ptr<Socket> socket, std::string to);
+};
+
+Ipv6PacketInfoTagTest::Ipv6PacketInfoTagTest ()
+  : TestCase ("Ipv6PacketInfoTagTest") 
+{}
+
+void
+Ipv6PacketInfoTagTest::RxCb (Ptr<Socket> socket)
+{
+  uint32_t availableData;
+  Ptr<Packet> m_receivedPacket;
+
+  availableData = socket->GetRxAvailable ();
+  m_receivedPacket = socket->Recv (std::numeric_limits<uint32_t>::max(), 0);
+  NS_ASSERT (availableData == m_receivedPacket->GetSize ());
+
+  Ipv6PacketInfoTag tag;
+  bool found;
+  found = m_receivedPacket->RemovePacketTag (tag);
+  NS_ASSERT (found);
+  tag.Print (std::cout);
+  std::cout << std::endl;
+}
+
+void
+Ipv6PacketInfoTagTest::DoSendData (Ptr<Socket> socket, std::string to)
+{
+  Address realTo = Inet6SocketAddress (Ipv6Address (to.c_str()), 200);
+  if (DynamicCast<UdpSocket> (socket) != 0)
+    {
+      NS_TEST_EXPECT_MSG_EQ (socket->SendTo (Create<Packet> (123), 0, realTo),
+                             123, "XXX");
+    }
+  // Should only Ipv6RawSock
+  else
+    {
+      socket->SendTo (Create<Packet> (123), 0, realTo);
+    }
+}
+
+void
+Ipv6PacketInfoTagTest::DoRun (void)
+{
+  Ptr<Node> node0 = CreateObject<Node> ();
+  Ptr<Node> node1 = CreateObject<Node> ();
+
+  Ptr<SimpleNetDevice> device = CreateObject<SimpleNetDevice> ();
+  Ptr<SimpleNetDevice> device2 = CreateObject<SimpleNetDevice> ();
+
+  // For Node 0
+  node0->AddDevice (device);
+  AddInternetStack (node0);
+  Ptr<Ipv6> ipv6 = node0->GetObject<Ipv6> ();
+
+  uint32_t index = ipv6->AddInterface (device);
+  Ipv6InterfaceAddress ifaceAddr1 = Ipv6InterfaceAddress (Ipv6Address("2000:1000:0:2000::1"), 
+                                                          Ipv6Prefix(64));
+  ipv6->AddAddress (index, ifaceAddr1);
+  ipv6->SetMetric (index, 1);
+  ipv6->SetUp (index);
+
+  // For Node 1
+  node1->AddDevice (device2);
+  AddInternetStack (node1);
+  ipv6 = node1->GetObject<Ipv6> ();
+
+  index = ipv6->AddInterface (device2);
+  Ipv6InterfaceAddress ifaceAddr2 = Ipv6InterfaceAddress (Ipv6Address("2000:1000:0:2000::2"), 
+                                                          Ipv6Prefix(64));
+  ipv6->AddAddress (index, ifaceAddr2);
+  ipv6->SetMetric (index, 1);
+  ipv6->SetUp (index);
+
+  // ipv6 w rawsocket
+  Ptr<SocketFactory> factory = node0->GetObject<SocketFactory> (Ipv6RawSocketFactory::GetTypeId ());
+  Ptr<Socket> socket = factory->CreateSocket ();
+  Inet6SocketAddress local =  Inet6SocketAddress (Ipv6Address::GetAny (), 0);
+  socket->SetAttribute ("Protocol", UintegerValue (Ipv6Header::IPV6_ICMPV6));
+  socket->Bind (local);
+  socket->SetRecvPktInfo (true);
+  socket->SetRecvCallback (MakeCallback (&ns3::Ipv6PacketInfoTagTest::RxCb, this));
+
+  // receive on loopback 
+  Simulator::ScheduleWithContext (socket->GetNode ()->GetId (), Seconds (0),
+                                  &Ipv6PacketInfoTagTest::DoSendData, this, socket, "::1");
+  Simulator::Run ();
+
+  Ptr<SocketFactory> factory2 = node1->GetObject<SocketFactory> (Ipv6RawSocketFactory::GetTypeId ());
+  Ptr<Socket> socket2 = factory2->CreateSocket ();
+  std::stringstream dst;
+  dst << ifaceAddr1.GetAddress ();
+  Simulator::ScheduleWithContext (socket2->GetNode ()->GetId (), Seconds (0),
+                                  &Ipv6PacketInfoTagTest::DoSendData, this, socket, 
+                                  dst.str ());
+  Simulator::Run ();
+
+#ifdef UDP6_SUPPORTED
+  // IPv6 test
+  factory = node0->GetObject<SocketFactory> (UdpSocketFactory::GetTypeId ());
+  socket = factory->CreateSocket ();
+  local =  Inet6SocketAddress (Ipv6Address::GetAny (), 200);
+  socket->Bind (local);
+  socket->SetRecvPktInfo (true);
+  socket->SetRecvCallback (MakeCallback (&ns3::Ipv6PacketInfoTagTest::RxCb, this));
+
+  // receive on loopback 
+  Simulator::ScheduleWithContext (socket->GetNode ()->GetId (), Seconds (0),
+                                  &Ipv6PacketInfoTagTest::DoSendData, this, socket, "::1");
+  Simulator::Run ();
+
+  factory2 = node1->GetObject<SocketFactory> (UdpSocketFactory::GetTypeId ());
+  socket2 = factory2->CreateSocket ();
+  Simulator::ScheduleWithContext (socket2->GetNode ()->GetId (), Seconds (0),
+                                  &Ipv6PacketInfoTagTest::DoSendData, this, socket, "10.1.1.1");
+  Simulator::Run ();
+
+#endif  // UDP6_SUPPORTED
+
+  Simulator::Destroy ();
+  // IPv6 test
+}
+
+static class Ipv6PacketInfoTagTestSuite : public TestSuite
+{
+public:
+  Ipv6PacketInfoTagTestSuite ();
+private:
+} g_packetinfotagTests;
+
+Ipv6PacketInfoTagTestSuite::Ipv6PacketInfoTagTestSuite ()
+  : TestSuite ("ipv6-packet-info-tag", UNIT)
+{
+  AddTestCase (new Ipv6PacketInfoTagTest ());
+}
+
+
+}
+
--- a/src/internet/wscript	Mon Mar 28 19:46:05 2011 +0100
+++ b/src/internet/wscript	Mon Mar 28 15:09:39 2011 -0700
@@ -187,9 +187,14 @@
 
     internet_test = bld.create_ns3_module_test_library('internet')
     internet_test.source = [
+        'test/global-route-manager-impl-test-suite.cc',
+        'test/ipv4-list-routing-test-suite.cc',
+        'test/ipv4-packet-info-tag-test-suite.cc',
         'test/ipv4-raw-test.cc',
         'test/ipv4-test.cc',
         'test/ipv6-extension-header-test-suite.cc',
+        'test/ipv6-list-routing-test-suite.cc',
+        'test/ipv6-packet-info-tag-test-suite.cc',
         'test/ipv6-test.cc',
         'test/tcp-test.cc',
         'test/udp-test.cc',
@@ -253,6 +258,8 @@
         'helper/ipv6-static-routing-helper.h',
         'model/global-router-interface.h',
         'model/global-route-manager.h',
+        'model/global-route-manager-impl.h',
+        'model/candidate-queue.h',
         'model/ipv4-global-routing.h',
         'helper/ipv4-global-routing-helper.h',
         'helper/internet-stack-helper.h',