Fixed PREQ propagation, added comments to PREQ information element

This commit is contained in:
Kirill Andreev
2009-07-08 13:42:46 +04:00
parent 288a157a07
commit ae6b314c1f
4 changed files with 59 additions and 46 deletions

View File

@@ -170,43 +170,9 @@ HwmpProtocolMac::UpdateOutcomingFrame (Ptr<Packet> packet, WifiMacHeader & heade
void
HwmpProtocolMac::SendPreq(IePreq preq)
{
m_preqQueue.push_back (preq);
SendOnePreq ();
}
void
HwmpProtocolMac::RequestDestination (Mac48Address dst, uint32_t originator_seqno, uint32_t dst_seqno)
{
for(std::vector<IePreq>::iterator i = m_preqQueue.begin (); i != m_preqQueue.end (); i ++)
if(i->MayAddAddress(m_protocol->GetAddress ()))
{
i->AddDestinationAddressElement (m_protocol->GetDoFlag(), m_protocol->GetRfFlag(), dst, dst_seqno);
return;
}
IePreq preq;
//fill PREQ:
preq.SetHopcount (0);
preq.SetTTL (m_protocol->GetMaxTtl ());
preq.SetPreqID (m_protocol->GetNextPreqId ());
preq.SetOriginatorAddress (m_protocol->GetAddress ());
preq.SetOriginatorSeqNumber (originator_seqno);
preq.SetLifetime (m_protocol->GetActivePathLifetime ());
preq.AddDestinationAddressElement (m_protocol->GetDoFlag (), m_protocol->GetRfFlag (), dst, dst_seqno);
m_preqQueue.push_back (preq);
//set iterator position to my preq:
SendOnePreq ();
}
void
HwmpProtocolMac::SendOnePreq ()
{
if(m_preqTimer.IsRunning ())
return;
if (m_preqQueue.size () == 0)
return;
//reschedule sending PREQ
NS_ASSERT (!m_preqTimer.IsRunning());
m_preqTimer = Simulator::Schedule (m_protocol->GetPreqMinInterval (), &HwmpProtocolMac::SendOnePreq, this);
Ptr<Packet> packet = Create<Packet> ();
packet->AddHeader(m_preqQueue[0]);
NS_LOG_FUNCTION_NOARGS ();
Ptr<Packet> packet = Create<Packet> ();
packet->AddHeader(preq);
//Action header:
WifiMeshActionHeader actionHdr;
WifiMeshActionHeader::ActionValue action;
@@ -230,12 +196,41 @@ HwmpProtocolMac::SendOnePreq ()
m_stats.txMgtBytes += packet->GetSize ();
m_parent->SendManagementFrame(packet, hdr);
}
//erase queue
m_preqQueue.erase (m_preqQueue.begin());
}
void
HwmpProtocolMac::RequestDestination (Mac48Address dst, uint32_t originator_seqno, uint32_t dst_seqno)
{
NS_LOG_FUNCTION_NOARGS ();
if(m_myPreq.GetDestCount () == 0)
{
m_myPreq.SetHopcount (0);
m_myPreq.SetTTL (m_protocol->GetMaxTtl ());
m_myPreq.SetPreqID (m_protocol->GetNextPreqId ());
m_myPreq.SetOriginatorAddress (m_protocol->GetAddress ());
m_myPreq.SetOriginatorSeqNumber (originator_seqno);
m_myPreq.SetLifetime (m_protocol->GetActivePathLifetime ());
}
m_myPreq.AddDestinationAddressElement (m_protocol->GetDoFlag(), m_protocol->GetRfFlag(), dst, dst_seqno);
SendMyPreq ();
}
void
HwmpProtocolMac::SendMyPreq ()
{
NS_LOG_FUNCTION_NOARGS ();
if(m_preqTimer.IsRunning ())
return;
if(m_myPreq.GetDestCount () == 0)
return;
//reschedule sending PREQ
NS_ASSERT (!m_preqTimer.IsRunning());
m_preqTimer = Simulator::Schedule (m_protocol->GetPreqMinInterval (), &HwmpProtocolMac::SendMyPreq, this);
SendPreq (m_myPreq);
m_myPreq.ClearDestinationAddressElements ();
}
void
HwmpProtocolMac::SendOnePerr()
{
NS_LOG_FUNCTION_NOARGS ();
if(m_perrTimer.IsRunning ())
return;
if(m_myPerr.receivers.size () >= m_protocol->GetUnicastPerrThreshold ())
@@ -275,6 +270,7 @@ HwmpProtocolMac::SendOnePerr()
void
HwmpProtocolMac::SendPrep (IePrep prep, Mac48Address receiver)
{
NS_LOG_FUNCTION_NOARGS ();
//Create packet
Ptr<Packet> packet = Create<Packet> ();
packet->AddHeader(prep);
@@ -301,6 +297,7 @@ HwmpProtocolMac::SendPrep (IePrep prep, Mac48Address receiver)
void
HwmpProtocolMac::SendPerr(IePerr perr, std::vector<Mac48Address> receivers)
{
NS_LOG_FUNCTION_NOARGS ();
m_myPerr.perr.Merge(perr);
for(unsigned int i = 0; i < receivers.size (); i ++)
{

View File

@@ -23,6 +23,7 @@
#define HWMP_STATE_H
#include "ns3/mesh-wifi-interface-mac-plugin.h"
#include "ie-dot11s-preq.h"
#include "ie-dot11s-perr.h"
namespace ns3 {
@@ -73,7 +74,7 @@ private:
//\}
/// Sends one PREQ when PreqMinInterval after last PREQ expires (if any PREQ exists in rhe queue)
void SendOnePreq ();
void SendMyPreq ();
void SendOnePerr ();
/// \return metric to HWMP protocol, needed only by metrics to add
//peer as routing entry
@@ -87,10 +88,10 @@ private:
uint32_t m_ifIndex;
Ptr<HwmpProtocol> m_protocol;
///\name PREQ queue and PREQ timer:
///\name my PREQ and PREQ timer:
//\{
EventId m_preqTimer;
std::vector<IePreq> m_preqQueue;
EventId m_preqTimer;
IePreq m_myPreq;
//\}
///\name PERR timer and stored path error
//\{

View File

@@ -355,7 +355,7 @@ IePreq::DelDestinationAddressElement (Mac48Address dest_address)
}
}
void
IePreq::ClearDestinationAddressElement ()
IePreq::ClearDestinationAddressElements ()
{
int i;
for (std::vector<Ptr<DestinationAddressUnit> >::iterator j = m_destinations.begin (); j != m_destinations.end(); j++)
@@ -363,6 +363,7 @@ IePreq::ClearDestinationAddressElement ()
for (i = 0; i < m_destCount; i ++)
m_destinations.pop_back ();
m_destinations.clear ();
m_destCount = 0;
}
bool operator== (const DestinationAddressUnit & a, const DestinationAddressUnit & b)
{

View File

@@ -64,20 +64,30 @@ class IePreq : public WifiInformationElement
public:
IePreq ();
~IePreq ();
/**
* Add a destination address unit: flags, destination and sequence
* number
*/
void AddDestinationAddressElement (
bool doFlag,
bool rfFlag,
Mac48Address dest_address,
uint32_t dest_seq_number
);
/// Delete a destination address unit by destination
void DelDestinationAddressElement (Mac48Address dest_address);
void ClearDestinationAddressElement ();
/// Clear PREQ: remove all destinations
void ClearDestinationAddressElements ();
/// Get all destinations, which are stored in PREQ:
std::vector<Ptr<DestinationAddressUnit> > GetDestinationList ();
/// SetProper flags which indicate that PREQ is unicast
void SetUnicastPreq ();
/*
* \brief In proactive case: need we send PREP
*/
void SetNeedNotPrep ();
///\name Setters for fields:
///\{
void SetHopcount (uint8_t hopcount);
void SetTTL (uint8_t ttl);
void SetPreqID (uint32_t id);
@@ -86,7 +96,9 @@ public:
void SetLifetime (uint32_t lifetime);
void SetMetric (uint32_t metric);
void SetDestCount (uint8_t dest_count);
///\}
///\name Getters for fields:
///\{
bool IsUnicastPreq () const;
bool IsNeedNotPrep () const;
uint8_t GetHopCount () const;
@@ -97,6 +109,8 @@ public:
uint32_t GetLifetime () const;
uint32_t GetMetric () const;
uint8_t GetDestCount () const;
///\}
/// Handle TTL and Metric:
void DecrementTtl ();
void IncrementMetric (uint32_t metric);
/*