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