src/routing/olsr/olsr-routing-protocol.cc
changeset 5509 33d52e78605a
parent 5471 61831e265e20
child 5510 ff4cb6dfdad5
--- a/src/routing/olsr/olsr-routing-protocol.cc	Thu Nov 12 14:08:51 2009 +0100
+++ b/src/routing/olsr/olsr-routing-protocol.cc	Fri Nov 13 11:47:02 2009 +0300
@@ -716,6 +716,10 @@
               if (max == NULL || nb_tuple->willingness > max->willingness)
                 {
                   max = nb_tuple;
+                  for (TwoHopNeighborSet::iterator newCovered = N2.begin (); newCovered != N2.end (); newCovered++)
+                    {
+                      coveredTwoHopNeighbors.insert (newCovered->twoHopNeighborAddr);
+                    }
                   max_r = r;
                 }
               else if (nb_tuple->willingness == max->willingness)
@@ -740,11 +744,12 @@
       if (max != NULL)
         {
           mprSet.insert (max->neighborMainAddr);
-          for (TwoHopNeighborSet::iterator twoHopNeigh = N2.begin ();
-               twoHopNeigh != N2.end (); )
+          // Remove the nodes from N2 which are now covered by a node in the MPR set.
+          for (TwoHopNeighborSet::iterator twoHopNeigh = N2.begin (); twoHopNeigh != N2.end (); )
             {
-              if (twoHopNeigh->neighborMainAddr == max->neighborMainAddr)
+              if (coveredTwoHopNeighbors.find (twoHopNeigh->twoHopNeighborAddr) != coveredTwoHopNeighbors.end ())
                 {
+                  NS_LOG_LOGIC ("2-hop neigh. " << twoHopNeigh->twoHopNeighborAddr << " is already covered by an MPR.");
                   twoHopNeigh = N2.erase (twoHopNeigh);
                 }
               else
@@ -2780,6 +2785,128 @@
     }
   return retval;
 }
+OlsrMprTestCase::OlsrMprTestCase ()
+  : TestCase ("Check OLSR MPR computing mechanism")
+{
+}
+OlsrMprTestCase::~OlsrMprTestCase ()
+{
+}
+bool
+OlsrMprTestCase::DoRun ()
+{
+  /*
+      * Create a 3x3 grid like the following:
+      *      3---6---9
+      *      |\ /|\ /|
+      *      | X | X |
+      *      |/ \|/ \|
+      *      2---5---8
+      *      |\ /|\ /|
+      *      | X | X |
+      *      |/ \|/ \|
+      *      1---4---7
+      * PrepareTopology fills all 2-hop neighbors of station 1 and creates a routing protocol
+      * We are the station number 2. Obvious, that an only MPR in this case is 5 
+      */
+   Ptr<RoutingProtocol> m_protocol = CreateObject<RoutingProtocol> ();
+   m_protocol->m_mainAddress = Ipv4Address ("10.0.0.2");
+   // we fill all possible 2-hop neighborhood
+   TwoHopNeighborTuple tuple;
+   tuple.expirationTime = Seconds (3600);
+   // All neighbor stations which are seen from station 5
+   tuple.neighborMainAddr = Ipv4Address ("10.0.0.5");
+   tuple.twoHopNeighborAddr = Ipv4Address ("10.0.0.1");
+   m_protocol->m_state.InsertTwoHopNeighborTuple (tuple);
+   tuple.twoHopNeighborAddr = Ipv4Address ("10.0.0.2");
+   m_protocol->m_state.InsertTwoHopNeighborTuple (tuple);
+   tuple.twoHopNeighborAddr = Ipv4Address ("10.0.0.3");
+   m_protocol->m_state.InsertTwoHopNeighborTuple (tuple);
+   tuple.twoHopNeighborAddr = Ipv4Address ("10.0.0.4");
+   m_protocol->m_state.InsertTwoHopNeighborTuple (tuple);
+   tuple.twoHopNeighborAddr = Ipv4Address ("10.0.0.6");
+   m_protocol->m_state.InsertTwoHopNeighborTuple (tuple);
+   tuple.twoHopNeighborAddr = Ipv4Address ("10.0.0.7");
+   m_protocol->m_state.InsertTwoHopNeighborTuple (tuple);
+   tuple.twoHopNeighborAddr = Ipv4Address ("10.0.0.8");
+   m_protocol->m_state.InsertTwoHopNeighborTuple (tuple);
+   tuple.twoHopNeighborAddr = Ipv4Address ("10.0.0.9");
+   m_protocol->m_state.InsertTwoHopNeighborTuple (tuple);
+   // All neighbor stations which are seen from station 4
+   tuple.neighborMainAddr = Ipv4Address ("10.0.0.4");
+   tuple.twoHopNeighborAddr = Ipv4Address ("10.0.0.1");
+   m_protocol->m_state.InsertTwoHopNeighborTuple (tuple);
+   tuple.twoHopNeighborAddr = Ipv4Address ("10.0.0.2");
+   m_protocol->m_state.InsertTwoHopNeighborTuple (tuple);
+   tuple.twoHopNeighborAddr = Ipv4Address ("10.0.0.5");
+   m_protocol->m_state.InsertTwoHopNeighborTuple (tuple);
+   tuple.twoHopNeighborAddr = Ipv4Address ("10.0.0.8");
+   m_protocol->m_state.InsertTwoHopNeighborTuple (tuple);
+   tuple.twoHopNeighborAddr = Ipv4Address ("10.0.0.7");
+   m_protocol->m_state.InsertTwoHopNeighborTuple (tuple);
+
+   // All neighbor stations which are seen from station 6
+   tuple.neighborMainAddr = Ipv4Address ("10.0.0.6");
+   tuple.twoHopNeighborAddr = Ipv4Address ("10.0.0.3");
+   m_protocol->m_state.InsertTwoHopNeighborTuple (tuple);
+   tuple.twoHopNeighborAddr = Ipv4Address ("10.0.0.2");
+   m_protocol->m_state.InsertTwoHopNeighborTuple (tuple);
+   tuple.twoHopNeighborAddr = Ipv4Address ("10.0.0.5");
+   m_protocol->m_state.InsertTwoHopNeighborTuple (tuple);
+   tuple.twoHopNeighborAddr = Ipv4Address ("10.0.0.8");
+   m_protocol->m_state.InsertTwoHopNeighborTuple (tuple);
+   tuple.twoHopNeighborAddr = Ipv4Address ("10.0.0.9");
+   m_protocol->m_state.InsertTwoHopNeighborTuple (tuple);
+
+   // All neighbor stations which are seen from station 1
+   tuple.neighborMainAddr = Ipv4Address ("10.0.0.1");
+   tuple.twoHopNeighborAddr = Ipv4Address ("10.0.0.2");
+   m_protocol->m_state.InsertTwoHopNeighborTuple (tuple);
+   tuple.twoHopNeighborAddr = Ipv4Address ("10.0.0.5");
+   m_protocol->m_state.InsertTwoHopNeighborTuple (tuple);
+   tuple.twoHopNeighborAddr = Ipv4Address ("10.0.0.4");
+
+   // All neighbor stations which are seen from station 3
+   tuple.neighborMainAddr = Ipv4Address ("10.0.0.3");
+   tuple.twoHopNeighborAddr = Ipv4Address ("10.0.0.2");
+   m_protocol->m_state.InsertTwoHopNeighborTuple (tuple);
+   tuple.twoHopNeighborAddr = Ipv4Address ("10.0.0.5");
+   m_protocol->m_state.InsertTwoHopNeighborTuple (tuple);
+   tuple.twoHopNeighborAddr = Ipv4Address ("10.0.0.6");
+  // First, we fill all neighbors
+  // If neighbors willingness = OLSR_WILL_DEFAULT, an only station number 5 will be an MPR
+  NeighborTuple neigbor;
+  neigbor.status = NeighborTuple::STATUS_SYM;
+  neigbor.willingness = OLSR_WILL_DEFAULT;
+  neigbor.neighborMainAddr = Ipv4Address ("10.0.0.3");
+  m_protocol->m_state.InsertNeighborTuple (neigbor);
+  neigbor.neighborMainAddr = Ipv4Address ("10.0.0.6");
+  m_protocol->m_state.InsertNeighborTuple (neigbor);
+  neigbor.neighborMainAddr = Ipv4Address ("10.0.0.5");
+  m_protocol->m_state.InsertNeighborTuple (neigbor);
+  neigbor.neighborMainAddr = Ipv4Address ("10.0.0.4");
+  m_protocol->m_state.InsertNeighborTuple (neigbor);
+  neigbor.neighborMainAddr = Ipv4Address ("10.0.0.1");
+  m_protocol->m_state.InsertNeighborTuple (neigbor);
+  //Now, calculateMPR
+  m_protocol->MprComputation ();
+  //Check results
+  NS_TEST_ASSERT_MSG_EQ (m_protocol->m_state.FindMprAddress (Ipv4Address ("10.0.0.5")), true, "MPR is incorrect!");
+  NS_TEST_ASSERT_MSG_EQ (m_protocol->m_state.GetMprSet ().size (), 1 , "An only address must be chosen!\n");
+  return false;
+}
+
+static class OlsrProtocolTestSuite : public TestSuite
+{
+public:
+  OlsrProtocolTestSuite ();
+} g_olsrProtocolTestSuite;
+
+OlsrProtocolTestSuite::OlsrProtocolTestSuite()
+  : TestSuite("Routing-OLSR", UNIT)
+{
+  AddTestCase (new OlsrMprTestCase ());
+}
 
 
 }} // namespace olsr, ns3