src/devices/mesh/flame/flame-protocol.cc
changeset 5092 39e4d3a81e1c
parent 5090 0facd23819b6
child 5094 b98a7a92f020
--- a/src/devices/mesh/flame/flame-protocol.cc	Fri Jun 19 00:00:55 2009 +0400
+++ b/src/devices/mesh/flame/flame-protocol.cc	Fri Jun 19 12:38:01 2009 +0400
@@ -56,16 +56,20 @@
 uint32_t
 FlameTag::GetSerializedSize () const
 {
-  return 6;
+  return 12;
 }
 
 void
 FlameTag::Serialize (TagBuffer i) const
 {
   uint8_t buf[6];
-  address.CopyTo (buf);
+  receiver.CopyTo (buf);
   for (int j = 0; j < 6; j ++)
     i.WriteU8 (buf[j]);
+  transmitter.CopyTo (buf);
+  for (int j = 0; j < 6; j ++)
+    i.WriteU8 (buf[j]);
+
 }
 
 void
@@ -74,13 +78,17 @@
   uint8_t buf[6];
   for (int j = 0; j < 6; j ++)
     buf[j] = i.ReadU8 ();
-  address.CopyFrom (buf);
+  receiver.CopyFrom (buf);
+  for (int j = 0; j < 6; j ++)
+    buf[j] = i.ReadU8 ();
+  transmitter.CopyFrom (buf);
+
 }
 
 void
 FlameTag::Print (std::ostream &os) const
 {
-  os << "address = " << address;
+  os << "receiver = " << receiver << ", transmitter = " << transmitter;
 }
 
 //-----------------------------------------------------------------------------
@@ -125,7 +133,7 @@
       Ptr<const Packet> const_packet, uint16_t  protocolType, RouteReplyCallback  routeReply)
 {
   Ptr<Packet> packet = const_packet->Copy ();
-  if (source == m_address)
+  if (sourceIface == m_mp->GetIfIndex ())
   {
     //Packet from upper layer!
     FlameTag tag;
@@ -133,22 +141,22 @@
     {
       NS_FATAL_ERROR ("FLAME tag is not supposed to be received from upper layers");
     }
-    FlameHeader flameHdr;
     FlameRtable::LookupResult result = m_rtable->Lookup(destination);
-    if(tag.address == Mac48Address::GetBroadcast ())
-      m_lastBroadcast = Simulator::Now ();
     if(m_lastBroadcast + m_broadcastInterval < Simulator::Now ())
     {
       result.retransmitter = Mac48Address::GetBroadcast ();
       result.ifIndex = FlameRtable::INTERFACE_ANY;
+      m_lastBroadcast = Simulator::Now ();
     }
+    FlameHeader flameHdr;
     flameHdr.AddCost (0);
     flameHdr.SetSeqno (m_myLastSeqno ++);
     flameHdr.SetProtocol (protocolType);
     flameHdr.SetOrigDst (destination);
     flameHdr.SetOrigSrc (source);
     packet->AddHeader (flameHdr);
-    tag.address = result.retransmitter;
+    tag.receiver = result.retransmitter;
+    NS_LOG_DEBUG("Source: send packet with RA = " << tag.receiver);
     packet->AddPacketTag (tag);
     routeReply (true, packet, source, destination, FLAME_PORT, result.ifIndex);
   }
@@ -159,12 +167,21 @@
     FlameTag tag;
     if(!packet->RemovePacketTag (tag))
     {
-      NS_FATAL_ERROR ("FLAME tag is not supposed to be received by network");
+      NS_FATAL_ERROR ("FLAME tag must exust here");
+    }
+    if(source == GetAddress ())
+    {
+      if(tag.receiver != Mac48Address::GetBroadcast ())
+        NS_LOG_DEBUG(
+            "received packet with SA = GetAddress (), RA = " << tag.receiver << 
+            ", TA = " << tag.transmitter <<
+            ", I am "<<GetAddress ());
+      return false;
     }
     if(destination == Mac48Address::GetBroadcast ())
     {
       //Broadcast always is forwarded as broadcast!
-      NS_ASSERT (HandleDataFrame(flameHdr.GetSeqno (), source, flameHdr, tag.address, sourceIface));
+      NS_ASSERT (HandleDataFrame(flameHdr.GetSeqno (), source, flameHdr, tag.transmitter, sourceIface));
       FlameTag tag (Mac48Address::GetBroadcast ());
       flameHdr.AddCost (1);
       packet->AddHeader (flameHdr);
@@ -174,15 +191,20 @@
     }
     else
     {
-      if(HandleDataFrame(flameHdr.GetSeqno (), source, flameHdr, tag.address, sourceIface))
+      if(HandleDataFrame(flameHdr.GetSeqno (), source, flameHdr, tag.transmitter, sourceIface))
         return false;
       FlameRtable::LookupResult result = m_rtable->Lookup(destination);
-      if(tag.address != Mac48Address::GetBroadcast ())
+      if(tag.receiver != Mac48Address::GetBroadcast ())
       {
         if(result.retransmitter == Mac48Address::GetBroadcast ())
+        {
+          NS_LOG_DEBUG("unicast packet dropped, because no route! I am "<<GetAddress () << 
+            ", RA = " << tag.receiver << 
+            ", TA = " << tag.transmitter);
           return false;
+        }
       }
-      tag.address = result.retransmitter;
+      tag.receiver = result.retransmitter;
       flameHdr.AddCost (1);
       packet->AddHeader (flameHdr);
       packet->AddPacketTag (tag);
@@ -213,7 +235,7 @@
   packet->RemoveHeader (flameHdr);
   NS_ASSERT(protocolType == FLAME_PORT);
   protocolType = flameHdr.GetProtocol ();
-  return (!HandleDataFrame(flameHdr.GetSeqno (), source, flameHdr, tag.address, fromIface));
+  return (!HandleDataFrame(flameHdr.GetSeqno (), source, flameHdr, tag.transmitter, fromIface));
 }
 bool
 FlameProtocol::Install (Ptr<MeshPointDevice> mp)
@@ -232,6 +254,7 @@
       // Installing plugins:
       Ptr<FlameProtocolMac> flameMac = Create<FlameProtocolMac> (wifiNetDev->GetIfIndex (), this);
       m_interfaces[wifiNetDev->GetIfIndex ()] = flameMac;
+      mac->SetBeaconGeneration (false);
       mac->InstallPlugin (flameMac);
     }
   mp->SetRoutingProtocol (this);