Flame bugfixes

This commit is contained in:
Kirill Andreev
2009-06-19 12:38:01 +04:00
parent 867841acf6
commit 43f91caa75
4 changed files with 48 additions and 22 deletions

View File

@@ -49,7 +49,8 @@ FlameProtocolMac::Receive (Ptr<Packet> packet, const WifiMacHeader & header)
{
NS_FATAL_ERROR ("FLAME tag is not supposed to be received by network");
}
tag.address = header.GetAddr2 ();
tag.receiver = header.GetAddr1 ();
tag.transmitter = header.GetAddr2 ();
packet->AddPacketTag (tag);
return true;
}
@@ -63,7 +64,7 @@ FlameProtocolMac::UpdateOutcomingFrame (Ptr<Packet> packet, WifiMacHeader & head
{
NS_FATAL_ERROR ("FLAME tag must exist here");
}
header.SetAddr1 (tag.address);
header.SetAddr1 (tag.receiver);
return true;
}
uint16_t

View File

@@ -56,16 +56,20 @@ FlameTag::GetInstanceTypeId () const
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 @@ FlameTag::Deserialize (TagBuffer i)
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 @@ FlameProtocol::RequestRoute (uint32_t sourceIface, const Mac48Address source, c
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 @@ FlameProtocol::RequestRoute (uint32_t sourceIface, const Mac48Address source, c
{
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 @@ FlameProtocol::RequestRoute (uint32_t sourceIface, const Mac48Address source, c
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 @@ FlameProtocol::RequestRoute (uint32_t sourceIface, const Mac48Address source, c
}
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 @@ FlameProtocol::RemoveRoutingStuff (uint32_t fromIface, const Mac48Address source
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 @@ FlameProtocol::Install (Ptr<MeshPointDevice> mp)
// Installing plugins:
Ptr<FlameProtocolMac> flameMac = Create<FlameProtocolMac> (wifiNetDev->GetIfIndex (), this);
m_interfaces[wifiNetDev->GetIfIndex ()] = flameMac;
mac->SetBeaconGeneration (false);
mac->InstallPlugin (flameMac);
}
mp->SetRoutingProtocol (this);

View File

@@ -37,11 +37,13 @@ namespace flame {
class FlameTag : public Tag
{
public:
/// Retransmitter:
Mac48Address address;
//transmitter for incoming:
Mac48Address transmitter;
// Receiver of the packet:
Mac48Address receiver;
FlameTag (Mac48Address a = Mac48Address ()) :
address (a){}
receiver (a){}
///\name Inherited from Tag
//\{

View File

@@ -158,6 +158,8 @@ public:
///\brief Statistics:
void Report (std::ostream &) const;
void ResetStats ();
/// Enable/disable beacons
void SetBeaconGeneration (bool enable);
private:
Ptr<DcaTxop> GetBE(void) const;
void SetBE (Ptr<DcaTxop> dcaTxop);
@@ -173,8 +175,6 @@ private:
void SendBeacon ();
/// Schedule next beacon
void ScheduleNextBeacon ();
/// Enable/disable beacons
void SetBeaconGeneration (bool enable);
/// Get current beaconing status
bool GetBeaconGeneration () const;
/// Real d-tor