Bugfixes. HWMP on 2-interface network works!
--- a/examples/mesh.cc Thu Apr 02 19:20:01 2009 +0400
+++ b/examples/mesh.cc Thu Apr 02 20:41:08 2009 +0400
@@ -39,12 +39,12 @@
main (int argc, char *argv[])
{
// Creating square topology with nNodes x nNodes grid
- int xSize = 4;
- int ySize = 4;
+ int xSize = 3;
+ int ySize = 3;
double step = 100.0; // Grid with one-hop edge
double randomStart = 0.1; // One beacon interval
uint32_t nIfaces = 2;
- bool chan = false;
+ bool chan = true;
bool pcap = false;
// Command line arguments
--- a/src/devices/mesh/dot11s/hwmp-mac-plugin.cc Thu Apr 02 19:20:01 2009 +0400
+++ b/src/devices/mesh/dot11s/hwmp-mac-plugin.cc Thu Apr 02 20:41:08 2009 +0400
@@ -97,7 +97,7 @@
{
IePreq preq;
packet->RemoveHeader (preq);
- if (preq.GetOriginatorAddress () == m_parent->GetAddress ())
+ if(preq.GetOriginatorAddress () == m_protocol->GetAddress ())
return false;
if (preq.GetTtl () == 0)
return false;
@@ -171,7 +171,7 @@
else
{
NS_ASSERT (m_myPreq->GetOriginatorAddress() == m_parent->GetAddress());
- m_myPreq->AddDestinationAddressElement (false, false, dst, 0); //DO = 0, RF = 0
+ m_myPreq->AddDestinationAddressElement (m_protocol->GetDoFlag(), m_protocol->GetRfFlag(), dst, 0); //DO = 0, RF = 0
}
}
void
--- a/src/devices/mesh/dot11s/hwmp-protocol.cc Thu Apr 02 19:20:01 2009 +0400
+++ b/src/devices/mesh/dot11s/hwmp-protocol.cc Thu Apr 02 20:41:08 2009 +0400
@@ -117,17 +117,33 @@
UintegerValue (0),
MakeUintegerAccessor (&HwmpProtocol::m_unicastPreqThreshold),
MakeUintegerChecker<uint8_t> (0)
+ )
+ .AddAttribute ("isRoot",
+ "Root mesh point",
+ BooleanValue (false),
+ MakeUintegerAccessor (&HwmpProtocol::m_isRoot),
+ MakeUintegerChecker<bool> ()
+ )
+ .AddAttribute ("doFlag",
+ "Destination only HWMP flag",
+ BooleanValue (true),
+ MakeUintegerAccessor (&HwmpProtocol::m_doFlag),
+ MakeUintegerChecker<bool> ()
+ )
+ .AddAttribute ("rfFlag",
+ "Reply and forward flag",
+ BooleanValue (false),
+ MakeUintegerAccessor (&HwmpProtocol::m_rfFlag),
+ MakeUintegerChecker<bool> ()
);
+
return tid;
}
HwmpProtocol::HwmpProtocol ():
m_dataSeqno (1),
m_hwmpSeqno (1),
m_preqId (0),
- m_rtable (CreateObject<HwmpRtable> ()),
- m_isRoot (false),
- m_doFlag (false),
- m_rfFlag (false)
+ m_rtable (CreateObject<HwmpRtable> ())
{
}
@@ -279,6 +295,7 @@
m_lastHwmpSeqno[preq.GetOriginatorAddress ()] = preq.GetOriginatorSeqNumber();
m_lastHwmpMetric[preq.GetOriginatorAddress ()] = preq.GetMetric();
}
+ NS_LOG_DEBUG("I am "<<m_address<<"Accepted preq from address"<<from<<", preq:"<<preq);
//check if can answer:
std::vector<Ptr<DestinationAddressUnit> > destinations = preq.GetDestinationList ();
for (std::vector<Ptr<DestinationAddressUnit> >::iterator i = destinations.begin (); i != destinations.end(); i++)
@@ -376,7 +393,6 @@
{
prep.IncrementMetric (1);
//acceptance cretirea:
- NS_LOG_DEBUG("I am "<<m_address<<", received prep");
std::map<Mac48Address, uint32_t>::iterator i = m_lastHwmpSeqno.find (prep.GetOriginatorAddress());
if (i == m_lastHwmpSeqno.end ())
{
@@ -385,6 +401,7 @@
else
if (i->second > prep.GetOriginatorSeqNumber ())
return;
+ NS_LOG_DEBUG("I am "<<m_address<<", received prep from "<<prep.GetOriginatorAddress ()<<", receiver was:"<<from);
//update routing info
//Now add a path to destination and add precursor to source
m_rtable->AddPrecursor (prep.GetDestinationAddress (), interface, from);
@@ -395,8 +412,6 @@
prep.GetMetric (),
MicroSeconds(prep.GetLifetime () * 1024),
prep.GetOriginatorSeqNumber ());
- if(prep.GetDestinationAddress() == m_address)
- NS_LOG_UNCOND("Destination resolved:"<<prep.GetOriginatorAddress ());
HwmpRtable::LookupResult result = m_rtable->LookupReactive(prep.GetDestinationAddress());
if (result.retransmitter == Mac48Address::GetBroadcast ())
//try to look for default route
@@ -408,7 +423,6 @@
HwmpPluginMap::iterator prep_sender = m_interfaces.find (result.ifIndex);
NS_ASSERT(prep_sender != m_interfaces.end ());
prep_sender->second->SendPrep(prep, result.retransmitter);
-
}
void
HwmpProtocol::ReceivePerr (IePerr perr, Mac48Address from, uint32_t interface)
@@ -434,7 +448,6 @@
}
if(perr.GetNumOfDest () == 0)
return;
- NS_LOG_UNCOND("Forward PERR");
MakePathError (destinations);
}
void
@@ -495,10 +508,7 @@
{
HwmpRtable::LookupResult result = m_rtable->LookupReactive(meshPointAddress);
if(result.retransmitter == Mac48Address::GetBroadcast ())
- {
- NS_LOG_UNCOND("I am"<<m_address<<" MP:"<<meshPointAddress<<"accessible through interface"<<interface<<", ra = "<<peerAddress);
- //m_rtable->AddReactivePath(meshPointAddress, peerAddress, interface, 1, Seconds (0), 0);
- }
+ m_rtable->AddReactivePath(meshPointAddress, peerAddress, interface, 1, Seconds (0), 0);
}
else
{
@@ -699,10 +709,7 @@
return;
}
for(HwmpPluginMap::iterator i = m_interfaces.begin (); i != m_interfaces.end (); i ++)
- {
- i->second->RequestDestination(Mac48Address("00:00:00:00:00:20"));
i->second->RequestDestination(dst);
- }
m_preqTimeouts[dst] = Simulator::Schedule (
MilliSeconds (2*(m_dot11MeshHWMPnetDiameterTraversalTime.GetMilliSeconds())),
&HwmpProtocol::RetryPathDiscovery, this, dst, numOfRetry);