Fixed seqno in HWMP
authorKirill Andreev <andreev@iitp.ru>
Thu, 23 Jul 2009 13:39:51 +0400
changeset 5134 26472734b69f
parent 5133 1e44b8fa74cd
child 5135 10c2f3ae8c2f
Fixed seqno in HWMP
src/devices/mesh/dot11s/hwmp-protocol.cc
src/devices/mesh/dot11s/ie-dot11s-preq.cc
src/devices/mesh/mesh-wifi-interface-mac.cc
--- a/src/devices/mesh/dot11s/hwmp-protocol.cc	Wed Jul 22 16:57:12 2009 +0400
+++ b/src/devices/mesh/dot11s/hwmp-protocol.cc	Thu Jul 23 13:39:51 2009 +0400
@@ -508,7 +508,7 @@
           //we have got from PREQ, and set the rest lifetime of the
           //route if the information is correct
           uint32_t lifetime = result.lifetime.GetMicroSeconds () / 1024;
-          if (lifetime > 0)
+          if ((lifetime > 0) && (result.seqnum >= (*i)->GetDestSeqNumber ()))
             {
               SendPrep (
                   (*i)->GetDestinationAddress (),
@@ -516,19 +516,19 @@
                   from,
                   result.metric,
                   preq.GetOriginatorSeqNumber (),
-                  result.seqnum +1,
+                  result.seqnum,
                   lifetime,
                   interface
                   );
-            }
-          if ((*i)->IsRf ())
-            {
-              (*i)->SetFlags (true, false, (*i)->IsUsn ()); //DO = 1, RF = 0
-            }
-          else
-            {
-              preq.DelDestinationAddressElement ((*i)->GetDestinationAddress ());
-              continue;
+              if ((*i)->IsRf ())
+                {
+                  (*i)->SetFlags (true, false, (*i)->IsUsn ()); //DO = 1, RF = 0
+                }
+              else
+                {
+                  preq.DelDestinationAddressElement ((*i)->GetDestinationAddress ());
+                  continue;
+                }
             }
         }
     }
@@ -982,11 +982,7 @@
       return;
     }
   uint32_t originator_seqno = GetNextHwmpSeqno ();
-  uint32_t dst_seqno = 0;
-  if (result.retransmitter != Mac48Address::GetBroadcast ())
-    {
-      dst_seqno = result.seqnum;
-    }
+  uint32_t dst_seqno = m_rtable->LookupReactiveExpired (dst).seqnum;
   for (HwmpProtocolMacMap::const_iterator i = m_interfaces.begin (); i != m_interfaces.end (); i ++)
     {
       i->second->RequestDestination (dst, originator_seqno, dst_seqno);
--- a/src/devices/mesh/dot11s/ie-dot11s-preq.cc	Wed Jul 22 16:57:12 2009 +0400
+++ b/src/devices/mesh/dot11s/ie-dot11s-preq.cc	Thu Jul 23 13:39:51 2009 +0400
@@ -355,7 +355,7 @@
     }
   //TODO: check overflow
   Ptr<DestinationAddressUnit> new_element = Create<DestinationAddressUnit> ();
-  new_element->SetFlags (doFlag, rfFlag, false);
+  new_element->SetFlags (doFlag, rfFlag, (dest_seq_number == 0));
   new_element->SetDestinationAddress (dest_address);
   new_element->SetDestSeqNumber (dest_seq_number);
   m_destinations.push_back (new_element);
--- a/src/devices/mesh/mesh-wifi-interface-mac.cc	Wed Jul 22 16:57:12 2009 +0400
+++ b/src/devices/mesh/mesh-wifi-interface-mac.cc	Thu Jul 23 13:39:51 2009 +0400
@@ -399,8 +399,7 @@
     }
   m_stats.sentFrames++;
   m_stats.sentBytes += packet->GetSize ();
-  Queues::iterator i = m_queues.find (AC_VO);
-  if (i == m_queues.end ())
+  if (m_queues.find (AC_VO) == m_queues.end ())
     {
       NS_FATAL_ERROR ("Voice queue is not set up!");
     }
@@ -654,8 +653,7 @@
 void
 MeshWifiInterfaceMac::SetQueue (Ptr<DcaTxop> queue, AccessClass ac)
 {
-  Queues::iterator i = m_queues.find (ac);
-  if (i != m_queues.end ())
+  if (m_queues.find (ac) != m_queues.end ())
     {
       NS_LOG_WARN ("Queue is already set!");
       return;
@@ -667,7 +665,7 @@
 Ptr<DcaTxop>
 MeshWifiInterfaceMac::GetQueue (AccessClass ac)
 {
-  Queues::iterator i = m_queues.find (ac);
+  Queues::const_iterator i = m_queues.find (ac);
   if (i != m_queues.end ())
     {
       NS_LOG_WARN ("Queue is not found! Check access class!");