src/devices/mesh/dot11s/hwmp-mac-plugin.cc
changeset 5063 97b947e83640
parent 5057 95a72c98f08d
child 5083 5b154b30a8a1
--- a/src/devices/mesh/dot11s/hwmp-mac-plugin.cc	Wed Jun 10 20:26:44 2009 +0400
+++ b/src/devices/mesh/dot11s/hwmp-mac-plugin.cc	Mon Jun 15 13:10:56 2009 +0400
@@ -47,89 +47,106 @@
 {
   m_parent = parent;
 }
+
+bool
+HwmpMacPlugin::ReceiveData (Ptr<Packet> packet, const WifiMacHeader & header)
+{
+  NS_ASSERT (header.IsData());
+
+  MeshHeader meshHdr;
+  HwmpTag tag;
+  if(packet->PeekPacketTag (tag))
+  {
+    NS_FATAL_ERROR ("HWMP tag is not supposed to be received by network");
+  }
+  
+  packet->RemoveHeader(meshHdr);
+  m_stats.rxData ++;
+  m_stats.rxDataBytes += packet->GetSize ();
+  
+  //TODO: address extension
+  Mac48Address destination;
+  Mac48Address source;
+  switch (meshHdr.GetAddressExt ())
+  {
+    case 0:
+      source = header.GetAddr4 ();
+      destination = header.GetAddr3 ();
+      break;
+    default:
+      NS_FATAL_ERROR ("6-address scheme is not yet supported and 4-address extension is not supposed to be used for data frames.");
+  };
+  tag.SetSeqno (meshHdr.GetMeshSeqno ());
+  tag.SetTtl (meshHdr.GetMeshTtl ());
+  if(m_protocol->GetAddress() != destination)
+    packet->AddPacketTag(tag);
+  
+  if (destination == Mac48Address::GetBroadcast ())
+    if(m_protocol->DropDataFrame (meshHdr.GetMeshSeqno (), source))
+      return false;
+  
+  return true;
+}
+
+bool
+HwmpMacPlugin::ReceiveAction (Ptr<Packet> packet, const WifiMacHeader & header)
+{
+  m_stats.rxMgt ++;
+  m_stats.rxMgtBytes += packet->GetSize ();
+  WifiMeshActionHeader actionHdr;
+  packet->RemoveHeader (actionHdr);
+  WifiMeshActionHeader::ActionValue actionValue = actionHdr.GetAction ();
+  if(actionHdr.GetCategory () != WifiMeshActionHeader::MESH_PATH_SELECTION)
+    return true;
+  switch (actionValue.pathSelection)
+  {
+    case WifiMeshActionHeader::PATH_REQUEST:
+      {
+        IePreq preq;
+        m_stats.rxPreq ++;
+        packet->RemoveHeader (preq);
+        if(preq.GetOriginatorAddress () == m_protocol->GetAddress ())
+          return false;
+        if (preq.GetTtl () == 0)
+          return false;
+        preq.DecrementTtl ();
+        m_protocol->ReceivePreq (preq, header.GetAddr2 (), m_ifIndex, header.GetAddr3 (), m_parent->GetLinkMetric(header.GetAddr2 ()));
+        return false;
+      }
+    case WifiMeshActionHeader::PATH_REPLY:
+      {
+        IePrep prep;
+        m_stats.rxPrep ++;
+        packet->RemoveHeader (prep);
+        if(prep.GetTtl () == 0)
+          return false;
+        prep.DecrementTtl ();
+        m_protocol->ReceivePrep (prep, header.GetAddr2 (), m_ifIndex, header.GetAddr3 (), m_parent->GetLinkMetric(header.GetAddr2 ()));
+        return false;
+      }
+    case WifiMeshActionHeader::PATH_ERROR:
+      {
+        IePerr perr;
+        m_stats.rxPerr ++;
+        packet->RemoveHeader (perr);
+        m_protocol->ReceivePerr (perr, header.GetAddr2 (), m_ifIndex, header.GetAddr3 ());
+        return false;
+      }
+    case WifiMeshActionHeader::ROOT_ANNOUNCEMENT:
+      return false;
+  }
+  return true;
+}
+
 bool
 HwmpMacPlugin::Receive (Ptr<Packet> packet, const WifiMacHeader & header)
 {
-  //TODO: here we fix only mesh header
-  if(header.IsData())
-  {
-    MeshHeader meshHdr;
-    HwmpTag tag;
-    if(packet->PeekPacketTag (tag))
-    {
-      NS_ASSERT (false);
-    }
-    packet->RemoveHeader(meshHdr);
-    m_stats.rxData ++;
-    m_stats.rxDataBytes += packet->GetSize ();
-    //TODO: address extension
-    Mac48Address destination;
-    Mac48Address source;
-    switch (meshHdr.GetAddressExt ())
-    {
-      case 0:
-        source = header.GetAddr4 ();
-        destination = header.GetAddr3 ();
-        break;
-      default:
-        NS_ASSERT(false);
-    };
-    tag.SetSeqno (meshHdr.GetMeshSeqno ());
-    tag.SetTtl (meshHdr.GetMeshTtl ());
-    if(m_protocol->GetAddress() != destination)
-      packet->AddPacketTag(tag);
-    if (destination == Mac48Address::GetBroadcast ())
-      if(m_protocol->DropDataFrame (meshHdr.GetMeshSeqno (), source))
-        return false;
-  }
-  if(header.IsAction())
-  {
-    m_stats.rxMgt ++;
-    m_stats.rxMgtBytes += packet->GetSize ();
-    WifiMeshActionHeader actionHdr;
-    packet->RemoveHeader (actionHdr);
-    WifiMeshActionHeader::ActionValue actionValue = actionHdr.GetAction ();
-    if(actionHdr.GetCategory () != WifiMeshActionHeader::MESH_PATH_SELECTION)
-      return true;
-    switch (actionValue.pathSelection)
-    {
-      case WifiMeshActionHeader::PATH_REQUEST:
-        {
-          IePreq preq;
-          m_stats.rxPreq ++;
-          packet->RemoveHeader (preq);
-          if(preq.GetOriginatorAddress () == m_protocol->GetAddress ())
-            return false;
-          if (preq.GetTtl () == 0)
-            return false;
-          preq.DecrementTtl ();
-          m_protocol->ReceivePreq (preq, header.GetAddr2 (), m_ifIndex, header.GetAddr3 (), m_parent->GetLinkMetric(header.GetAddr2 ()));
-          return false;
-        }
-      case WifiMeshActionHeader::PATH_REPLY:
-        {
-          IePrep prep;
-          m_stats.rxPrep ++;
-          packet->RemoveHeader (prep);
-          if(prep.GetTtl () == 0)
-            return false;
-          prep.DecrementTtl ();
-          m_protocol->ReceivePrep (prep, header.GetAddr2 (), m_ifIndex, header.GetAddr3 (), m_parent->GetLinkMetric(header.GetAddr2 ()));
-          return false;
-        }
-      case WifiMeshActionHeader::PATH_ERROR:
-        {
-          IePerr perr;
-          m_stats.rxPerr ++;
-          packet->RemoveHeader (perr);
-          m_protocol->ReceivePerr (perr, header.GetAddr2 (), m_ifIndex, header.GetAddr3 ());
-          return false;
-        }
-      case WifiMeshActionHeader::ROOT_ANNOUNCEMENT:
-        return false;
-    }
-  }
-  return true;
+  if (header.IsData ())
+    return ReceiveData (packet, header);
+  else if (header.IsAction ())
+    return ReceiveAction (packet, header);
+  else
+    return true; // don't care
 }
 bool
 HwmpMacPlugin::UpdateOutcomingFrame (Ptr<Packet> packet, WifiMacHeader & header, Mac48Address from, Mac48Address to)
@@ -140,8 +157,7 @@
   bool tagExists = packet->RemovePacketTag(tag);
   if (!tagExists)
   {
-     //do it this way to silence compiler
-     NS_ASSERT (false);
+    NS_FATAL_ERROR ("HWMP tag must exist at this point");
   }
   m_stats.txData ++;
   m_stats.txDataBytes += packet->GetSize ();