--- 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))
{