Initial flame implementation
authorKirill Andreev <andreev@iitp.ru>
Thu, 18 Jun 2009 16:50:52 +0400
changeset 5084 ddf23699f0b7
parent 5083 5b154b30a8a1
child 5085 5cfc1e9372af
Initial flame implementation
src/devices/mesh/flame/flame-protocol-mac.cc
src/devices/mesh/flame/flame-protocol.cc
src/devices/mesh/flame/flame-protocol.h
src/devices/mesh/mesh-point-device.cc
--- a/src/devices/mesh/flame/flame-protocol-mac.cc	Thu Jun 18 13:50:43 2009 +0400
+++ b/src/devices/mesh/flame/flame-protocol-mac.cc	Thu Jun 18 16:50:52 2009 +0400
@@ -44,13 +44,13 @@
 {
   if (!header.IsData ())
     return true;
-  if (m_protocol->GetAddress () == header.GetAddr2 ())
-    return false;
   FlameTag tag;
   if(packet->PeekPacketTag (tag))
   {
     NS_FATAL_ERROR ("FLAME tag is not supposed to be received by network");
   }
+  tag.address = header.GetAddr2 ();
+  packet->AddPacketTag (tag);
   return true;
 }
 bool
--- a/src/devices/mesh/flame/flame-protocol.cc	Thu Jun 18 13:50:43 2009 +0400
+++ b/src/devices/mesh/flame/flame-protocol.cc	Thu Jun 18 16:50:52 2009 +0400
@@ -19,7 +19,6 @@
  */
 
 #include "flame-protocol.h"
-#include "flame-rtable.h"
 #include "flame-header.h"
 #include "ns3/llc-snap-header.h"
 #include "ns3/log.h"
@@ -37,6 +36,7 @@
 // FlameTag
 //-----------------------------------------------------------------------------
 NS_OBJECT_ENSURE_REGISTERED (FlameTag);
+NS_LOG_COMPONENT_DEFINE ("FlameProtocol");
 
 TypeId
 FlameTag::GetTypeId ()
@@ -102,7 +102,8 @@
 FlameProtocol::FlameProtocol () :
   m_broadcastInterval (Seconds (5)),
   m_lastBroadcast (Simulator::Now ()),
-  m_myLastSeqno (0)
+  m_myLastSeqno (0),
+  m_rtable (CreateObject<FlameRtable> ())
 {
 }
 FlameProtocol::~FlameProtocol ()
@@ -120,34 +121,36 @@
   if (source == m_address)
   {
     //Packet from upper layer!
-    if(destination == Mac48Address::GetBroadcast ())
+    FlameTag tag;
+    if(packet->PeekPacketTag (tag))
     {
-      //Broadcast always is forwarded as broadcast!
-      FlameHeader flameHdr;
-      FlameTag tag (Mac48Address::GetBroadcast ());
-      flameHdr.AddCost (0);
-      flameHdr.SetSeqno (m_myLastSeqno ++);
-      flameHdr.SetProtocol (protocolType);
-      flameHdr.SetOrigDst (destination);
-      flameHdr.SetOrigSrc (source);
-      packet->AddHeader (flameHdr);
-      packet->AddPacketTag (tag);
-      routeReply (true, packet, source, destination, FLAME_PORT, FlameRtable::INTERFACE_ANY);
+      NS_FATAL_ERROR ("FLAME tag is not supposed to be received from upper layers");
     }
-    else
-      NS_FATAL_ERROR ("unicast not done yet!");
+    FlameHeader flameHdr;
+    //TODO: check when last broadcast was sent
+    tag.address =  m_rtable->Lookup(destination).retransmitter;
+    flameHdr.AddCost (0);
+    flameHdr.SetSeqno (m_myLastSeqno ++);
+    flameHdr.SetProtocol (protocolType);
+    flameHdr.SetOrigDst (destination);
+    flameHdr.SetOrigSrc (source);
+    packet->AddHeader (flameHdr);
+    packet->AddPacketTag (tag);
+    routeReply (true, packet, source, destination, FLAME_PORT, FlameRtable::INTERFACE_ANY);
   }
   else
   {
     FlameHeader flameHdr;
     packet->RemoveHeader (flameHdr); 
-    //if(DropDataFrame(flameHdr.GetSeqno (), source))
-    //  return false;
+    FlameTag tag;
+    if(!packet->RemovePacketTag (tag))
+    {
+      NS_FATAL_ERROR ("FLAME tag is not supposed to be received by network");
+    }
     if(destination == Mac48Address::GetBroadcast ())
     {
       //Broadcast always is forwarded as broadcast!
-      //Broadcast was filtered in RemoveRoutingStuff, because mesh
-      //point device first calss it
+      NS_ASSERT (DropDataFrame(flameHdr.GetSeqno (), source));
       FlameTag tag (Mac48Address::GetBroadcast ());
       flameHdr.AddCost (1);
       packet->AddHeader (flameHdr);
@@ -159,7 +162,19 @@
     {
       if(DropDataFrame(flameHdr.GetSeqno (), source))
         return false;
-      NS_FATAL_ERROR ("not done yet!");
+      m_rtable->AddPath (source, tag.address, sourceIface, flameHdr.GetCost (), flameHdr.GetSeqno ());
+      FlameRtable::LookupResult result = m_rtable->Lookup(destination);
+      if(tag.address != Mac48Address::GetBroadcast ())
+      {
+        if(result.retransmitter == Mac48Address::GetBroadcast ())
+          return false;
+      }
+      tag.address = result.retransmitter;
+      flameHdr.AddCost (1);
+      packet->AddHeader (flameHdr);
+      packet->AddPacketTag (tag);
+      routeReply (true, packet, source, destination, FLAME_PORT, result.ifIndex);
+      return true;
     }
     return true;
   }
@@ -170,12 +185,23 @@
       const Mac48Address destination, Ptr<Packet>  packet, uint16_t&  protocolType)
 {
   //Filter seqno:
+  if(source == GetAddress ())
+  {
+    NS_LOG_DEBUG("Dropped my own frame!");
+    return false;
+  }
+  FlameTag tag;
+  if(!packet->RemovePacketTag (tag))
+  {
+    NS_FATAL_ERROR ("FLAME tag is not supposed to be received by network");
+  }
   FlameHeader flameHdr;
   packet->RemoveHeader (flameHdr);
   NS_ASSERT(protocolType == FLAME_PORT);
   protocolType = flameHdr.GetProtocol ();
   if(DropDataFrame(flameHdr.GetSeqno (), source))
     return false;
+  m_rtable->AddPath (source, tag.address, fromIface, flameHdr.GetCost (), flameHdr.GetSeqno ());
   return true;
 }
 bool
@@ -213,15 +239,11 @@
 {
   if(source == GetAddress ())
     return true;
-  std::map<Mac48Address, uint16_t,std::less<Mac48Address> >::const_iterator i = m_lastSeqno.find (source);
-  if (i == m_lastSeqno.end ())
-    m_lastSeqno[source] = seqno;
-  else
-  {
-    if (i->second >= seqno)
-      return true;
-    m_lastSeqno[source] = seqno;
-  }
+  FlameRtable::LookupResult result = m_rtable->Lookup (source);
+  if (result.retransmitter == Mac48Address::GetBroadcast ())
+    return false;
+  if(result.seqnum >= seqno)
+    return true;
   return false;
 }
 
--- a/src/devices/mesh/flame/flame-protocol.h	Thu Jun 18 13:50:43 2009 +0400
+++ b/src/devices/mesh/flame/flame-protocol.h	Thu Jun 18 16:50:52 2009 +0400
@@ -22,6 +22,7 @@
 #define FLAME_PROTOCOL_H
 
 #include "flame-protocol-mac.h"
+#include "flame-rtable.h"
 
 #include "ns3/mesh-l2-routing-protocol.h"
 #include "ns3/tag.h"
@@ -111,7 +112,8 @@
   ///\}
   /// Sequence number:
   uint16_t m_myLastSeqno;
-
+  /// Routng table:
+  Ptr<FlameRtable> m_rtable;
 };
 } //namespace flame
 } //namespace ns3
--- a/src/devices/mesh/mesh-point-device.cc	Thu Jun 18 13:50:43 2009 +0400
+++ b/src/devices/mesh/mesh-point-device.cc	Thu Jun 18 16:50:52 2009 +0400
@@ -99,7 +99,7 @@
     return;
   }
   if(dst48 == m_address)
-  {  
+  {
     Ptr<Packet> packet_copy = packet->Copy ();
     if(m_removeRoutingStuff (incomingPort->GetIfIndex (), src48, dst48, packet_copy, realProtocol))
     {