From c9536cdbf0a37810cf44e9f054d3ef8ba3768a73 Mon Sep 17 00:00:00 2001 From: Kirill Andreev Date: Thu, 18 Jun 2009 16:50:52 +0400 Subject: [PATCH] Initial flame implementation --- src/devices/mesh/flame/flame-protocol-mac.cc | 4 +- src/devices/mesh/flame/flame-protocol.cc | 82 +++++++++++++------- src/devices/mesh/flame/flame-protocol.h | 4 +- src/devices/mesh/mesh-point-device.cc | 2 +- 4 files changed, 58 insertions(+), 34 deletions(-) diff --git a/src/devices/mesh/flame/flame-protocol-mac.cc b/src/devices/mesh/flame/flame-protocol-mac.cc index 4176b99d1..8fe0d9cfb 100644 --- a/src/devices/mesh/flame/flame-protocol-mac.cc +++ b/src/devices/mesh/flame/flame-protocol-mac.cc @@ -44,13 +44,13 @@ FlameMacPlugin::Receive (Ptr packet, const WifiMacHeader & header) { 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 diff --git a/src/devices/mesh/flame/flame-protocol.cc b/src/devices/mesh/flame/flame-protocol.cc index d326fe7c1..65b87e3c2 100644 --- a/src/devices/mesh/flame/flame-protocol.cc +++ b/src/devices/mesh/flame/flame-protocol.cc @@ -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 @@ namespace flame { // FlameTag //----------------------------------------------------------------------------- NS_OBJECT_ENSURE_REGISTERED (FlameTag); +NS_LOG_COMPONENT_DEFINE ("FlameProtocol"); TypeId FlameTag::GetTypeId () @@ -102,7 +102,8 @@ FlameProtocol::GetTypeId () FlameProtocol::FlameProtocol () : m_broadcastInterval (Seconds (5)), m_lastBroadcast (Simulator::Now ()), - m_myLastSeqno (0) + m_myLastSeqno (0), + m_rtable (CreateObject ()) { } FlameProtocol::~FlameProtocol () @@ -120,34 +121,36 @@ FlameProtocol::RequestRoute (uint32_t sourceIface, const Mac48Address source, c 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 @@ FlameProtocol::RequestRoute (uint32_t sourceIface, const Mac48Address source, c { 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 @@ FlameProtocol::RemoveRoutingStuff (uint32_t fromIface, const Mac48Address source const Mac48Address destination, Ptr 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 @@ FlameProtocol::DropDataFrame(uint16_t seqno, Mac48Address source) { if(source == GetAddress ()) return true; - std::map >::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; } diff --git a/src/devices/mesh/flame/flame-protocol.h b/src/devices/mesh/flame/flame-protocol.h index e5878e09f..585c39fbf 100644 --- a/src/devices/mesh/flame/flame-protocol.h +++ b/src/devices/mesh/flame/flame-protocol.h @@ -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 @@ private: ///\} /// Sequence number: uint16_t m_myLastSeqno; - + /// Routng table: + Ptr m_rtable; }; } //namespace flame } //namespace ns3 diff --git a/src/devices/mesh/mesh-point-device.cc b/src/devices/mesh/mesh-point-device.cc index d5410d2c9..5d3d7a28b 100644 --- a/src/devices/mesh/mesh-point-device.cc +++ b/src/devices/mesh/mesh-point-device.cc @@ -99,7 +99,7 @@ MeshPointDevice::ReceiveFromDevice (Ptr incomingPort, Ptr packet_copy = packet->Copy (); if(m_removeRoutingStuff (incomingPort->GetIfIndex (), src48, dst48, packet_copy, realProtocol)) {