Bugfixes. HWMP on 2-interface network works!
authorKirill Andreev <andreev@iitp.ru>
Thu, 02 Apr 2009 20:41:08 +0400
changeset 4943 ef084a06119d
parent 4942 f6dd61e25464
child 4944 779b641cff5a
Bugfixes. HWMP on 2-interface network works!
examples/mesh.cc
src/devices/mesh/dot11s/hwmp-mac-plugin.cc
src/devices/mesh/dot11s/hwmp-protocol.cc
--- a/examples/mesh.cc	Thu Apr 02 19:20:01 2009 +0400
+++ b/examples/mesh.cc	Thu Apr 02 20:41:08 2009 +0400
@@ -39,12 +39,12 @@
 main (int argc, char *argv[])
 {
   // Creating square topology with nNodes x nNodes grid
-  int      xSize       = 4;
-  int      ySize       = 4;
+  int      xSize       = 3;
+  int      ySize       = 3;
   double   step        = 100.0; // Grid with one-hop edge
   double   randomStart = 0.1;   // One beacon interval
   uint32_t nIfaces     = 2;
-  bool     chan        = false;
+  bool     chan        = true;
   bool     pcap        = false;
   
   // Command line arguments
--- a/src/devices/mesh/dot11s/hwmp-mac-plugin.cc	Thu Apr 02 19:20:01 2009 +0400
+++ b/src/devices/mesh/dot11s/hwmp-mac-plugin.cc	Thu Apr 02 20:41:08 2009 +0400
@@ -97,7 +97,7 @@
         {
           IePreq preq;
           packet->RemoveHeader (preq);
-          if (preq.GetOriginatorAddress () == m_parent->GetAddress ())
+          if(preq.GetOriginatorAddress () == m_protocol->GetAddress ())
             return false;
           if (preq.GetTtl () == 0)
             return false;
@@ -171,7 +171,7 @@
   else
   {
     NS_ASSERT (m_myPreq->GetOriginatorAddress() == m_parent->GetAddress());
-    m_myPreq->AddDestinationAddressElement (false, false, dst, 0); //DO = 0, RF = 0
+    m_myPreq->AddDestinationAddressElement (m_protocol->GetDoFlag(), m_protocol->GetRfFlag(), dst, 0); //DO = 0, RF = 0
   }
 }
 void
--- a/src/devices/mesh/dot11s/hwmp-protocol.cc	Thu Apr 02 19:20:01 2009 +0400
+++ b/src/devices/mesh/dot11s/hwmp-protocol.cc	Thu Apr 02 20:41:08 2009 +0400
@@ -117,17 +117,33 @@
         UintegerValue (0),
         MakeUintegerAccessor (&HwmpProtocol::m_unicastPreqThreshold),
         MakeUintegerChecker<uint8_t> (0)
+        )
+  .AddAttribute ("isRoot",
+        "Root mesh point",
+        BooleanValue (false),
+        MakeUintegerAccessor (&HwmpProtocol::m_isRoot),
+        MakeUintegerChecker<bool> ()
+        )
+  .AddAttribute ("doFlag",
+        "Destination only HWMP flag",
+        BooleanValue (true),
+        MakeUintegerAccessor (&HwmpProtocol::m_doFlag),
+        MakeUintegerChecker<bool> ()
+        )
+  .AddAttribute ("rfFlag",
+        "Reply and forward flag",
+        BooleanValue (false),
+        MakeUintegerAccessor (&HwmpProtocol::m_rfFlag),
+        MakeUintegerChecker<bool> ()
         );
+
   return tid;
 }
 HwmpProtocol::HwmpProtocol ():
     m_dataSeqno (1),
     m_hwmpSeqno (1),
     m_preqId (0),
-    m_rtable (CreateObject<HwmpRtable> ()),
-    m_isRoot (false),
-    m_doFlag (false),
-    m_rfFlag (false)
+    m_rtable (CreateObject<HwmpRtable> ())
 {
 }
 
@@ -279,6 +295,7 @@
       m_lastHwmpSeqno[preq.GetOriginatorAddress ()] = preq.GetOriginatorSeqNumber();
       m_lastHwmpMetric[preq.GetOriginatorAddress ()] = preq.GetMetric();
     }
+  NS_LOG_DEBUG("I am "<<m_address<<"Accepted preq from address"<<from<<", preq:"<<preq);
   //check if can answer:
   std::vector<Ptr<DestinationAddressUnit> > destinations = preq.GetDestinationList ();
   for (std::vector<Ptr<DestinationAddressUnit> >::iterator i = destinations.begin (); i != destinations.end(); i++)
@@ -376,7 +393,6 @@
 {
   prep.IncrementMetric (1);
   //acceptance cretirea:
-  NS_LOG_DEBUG("I am "<<m_address<<", received prep");
   std::map<Mac48Address, uint32_t>::iterator i = m_lastHwmpSeqno.find (prep.GetOriginatorAddress());
   if (i == m_lastHwmpSeqno.end ())
     {
@@ -385,6 +401,7 @@
   else
     if (i->second > prep.GetOriginatorSeqNumber ())
       return;
+  NS_LOG_DEBUG("I am "<<m_address<<", received prep from "<<prep.GetOriginatorAddress ()<<", receiver was:"<<from);
   //update routing info
   //Now add a path to destination and add precursor to source
   m_rtable->AddPrecursor (prep.GetDestinationAddress (), interface, from);
@@ -395,8 +412,6 @@
       prep.GetMetric (),
       MicroSeconds(prep.GetLifetime () * 1024),
       prep.GetOriginatorSeqNumber ());
-  if(prep.GetDestinationAddress() == m_address)
-    NS_LOG_UNCOND("Destination resolved:"<<prep.GetOriginatorAddress ());
   HwmpRtable::LookupResult result = m_rtable->LookupReactive(prep.GetDestinationAddress());
   if (result.retransmitter == Mac48Address::GetBroadcast ())
     //try to look for default route
@@ -408,7 +423,6 @@
   HwmpPluginMap::iterator prep_sender = m_interfaces.find (result.ifIndex);
   NS_ASSERT(prep_sender != m_interfaces.end ());
   prep_sender->second->SendPrep(prep, result.retransmitter);
-
 }
 void
 HwmpProtocol::ReceivePerr (IePerr perr, Mac48Address from, uint32_t interface)
@@ -434,7 +448,6 @@
   }
   if(perr.GetNumOfDest () == 0)
     return;
-  NS_LOG_UNCOND("Forward PERR");
   MakePathError (destinations);
 }
 void
@@ -495,10 +508,7 @@
   {
     HwmpRtable::LookupResult result = m_rtable->LookupReactive(meshPointAddress);
     if(result.retransmitter == Mac48Address::GetBroadcast ())
-    {
-      NS_LOG_UNCOND("I am"<<m_address<<" MP:"<<meshPointAddress<<"accessible through interface"<<interface<<", ra = "<<peerAddress);
-      //m_rtable->AddReactivePath(meshPointAddress, peerAddress, interface, 1, Seconds (0), 0);
-    }
+      m_rtable->AddReactivePath(meshPointAddress, peerAddress, interface, 1, Seconds (0), 0);
   }
   else
   {
@@ -699,10 +709,7 @@
       return;
     }
   for(HwmpPluginMap::iterator i = m_interfaces.begin (); i != m_interfaces.end (); i ++)
-  {
-    i->second->RequestDestination(Mac48Address("00:00:00:00:00:20"));
     i->second->RequestDestination(dst);
-  }
   m_preqTimeouts[dst] = Simulator::Schedule (
       MilliSeconds (2*(m_dot11MeshHWMPnetDiameterTraversalTime.GetMilliSeconds())),
       &HwmpProtocol::RetryPathDiscovery, this, dst, numOfRetry);