handle wifi action frames in high MACs
This commit is contained in:
@@ -31,6 +31,7 @@
|
||||
#include "random-stream.h"
|
||||
#include "wifi-mac-queue.h"
|
||||
#include "msdu-aggregator.h"
|
||||
#include "mgt-headers.h"
|
||||
|
||||
NS_LOG_COMPONENT_DEFINE ("EdcaTxopN");
|
||||
|
||||
@@ -699,4 +700,13 @@ EdcaTxopN::PushFront (Ptr<const Packet> packet, const WifiMacHeader &hdr)
|
||||
StartAccessIfNeeded ();
|
||||
}
|
||||
|
||||
void
|
||||
EdcaTxopN::GotAddBaResponse (const MgtAddBaResponseHeader *respHdr, Mac48Address recipient)
|
||||
{
|
||||
NS_LOG_FUNCTION (this);
|
||||
MY_DEBUG ("received AddBa response from "<<recipient);
|
||||
//?
|
||||
RestartAccessIfNeeded ();
|
||||
}
|
||||
|
||||
} //namespace ns3
|
||||
|
||||
@@ -45,6 +45,8 @@ class WifiMacParameters;
|
||||
class WifiMacQueue;
|
||||
class RandomStream;
|
||||
class MsduAggregator;
|
||||
class MgtAddBaResponseHeader;
|
||||
|
||||
|
||||
/* This queue contains packets for a particular access class.
|
||||
* possibles access classes are:
|
||||
@@ -110,6 +112,7 @@ public:
|
||||
void GotCts (double snr, WifiMode txMode);
|
||||
void MissedCts (void);
|
||||
void GotAck (double snr, WifiMode txMode);
|
||||
void GotAddBaResponse (const MgtAddBaResponseHeader *respHdr, Mac48Address recipient);
|
||||
void MissedAck (void);
|
||||
void StartNext (void);
|
||||
void Cancel (void);
|
||||
|
||||
@@ -354,7 +354,39 @@ QadhocWifiMac::Receive (Ptr<Packet> packet, const WifiMacHeader *hdr)
|
||||
}
|
||||
else if (hdr->IsMgt ())
|
||||
{
|
||||
//Handling action frames
|
||||
if (hdr->IsAction ())
|
||||
{
|
||||
WifiActionHeader actionHdr;
|
||||
packet->RemoveHeader (actionHdr);
|
||||
if (actionHdr.GetCategory () == WifiActionHeader::BLOCK_ACK &&
|
||||
actionHdr.GetAction().blockAck == WifiActionHeader::BLOCK_ACK_ADDBA_REQUEST)
|
||||
{
|
||||
MgtAddBaRequestHeader reqHdr;
|
||||
packet->RemoveHeader (reqHdr);
|
||||
SendAddBaResponse (&reqHdr, hdr->GetAddr2 ());
|
||||
}
|
||||
else if (actionHdr.GetCategory () == WifiActionHeader::BLOCK_ACK &&
|
||||
actionHdr.GetAction().blockAck == WifiActionHeader::BLOCK_ACK_ADDBA_REQUEST)
|
||||
{
|
||||
MgtAddBaResponseHeader respHdr;
|
||||
packet->RemoveHeader (respHdr);
|
||||
m_queues[QosUtilsMapTidToAc (respHdr.GetTid ())]->GotAddBaResponse (&respHdr, hdr->GetAddr2 ());
|
||||
}
|
||||
else if (actionHdr.GetCategory () == WifiActionHeader::BLOCK_ACK &&
|
||||
actionHdr.GetAction().blockAck == WifiActionHeader::BLOCK_ACK_DELBA)
|
||||
{
|
||||
MgtDelBaHeader delBaHdr;
|
||||
packet->RemoveHeader (delBaHdr);
|
||||
if (delBaHdr.IsByOriginator ())
|
||||
{
|
||||
/* Block ack agreement tear down */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* We must notify correct queue tear down of agreement */
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -446,4 +478,59 @@ QadhocWifiMac::FinishConfigureStandard (enum WifiPhyStandard standard)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
QadhocWifiMac::SendAddBaResponse (const MgtAddBaRequestHeader *reqHdr, Mac48Address originator)
|
||||
{
|
||||
NS_LOG_FUNCTION (this);
|
||||
WifiMacHeader hdr;
|
||||
hdr.SetAction ();
|
||||
hdr.SetAddr1 (originator);
|
||||
hdr.SetAddr2 (m_low->GetAddress ());
|
||||
hdr.SetAddr3 (m_low->GetAddress ());
|
||||
hdr.SetDsNotFrom ();
|
||||
hdr.SetDsNotTo ();
|
||||
|
||||
MgtAddBaResponseHeader respHdr;
|
||||
StatusCode code;
|
||||
code.SetSuccess ();
|
||||
respHdr.SetStatusCode (code);
|
||||
//Here a control about queues type?
|
||||
respHdr.SetAmsduSupport (reqHdr->IsAmsduSupported ());
|
||||
|
||||
if (reqHdr->IsImmediateBlockAck ())
|
||||
{
|
||||
respHdr.SetImmediateBlockAck ();
|
||||
}
|
||||
else
|
||||
{
|
||||
respHdr.SetDelayedBlockAck ();
|
||||
}
|
||||
respHdr.SetTid (reqHdr->GetTid ());
|
||||
/* For now there's not no control about limit of reception.
|
||||
We assume that receiver has no limit on reception.
|
||||
However we assume that a receiver sets a bufferSize in order to satisfy
|
||||
next equation:
|
||||
(bufferSize + 1) % 16 = 0
|
||||
So if a recipient is able to buffer a packet, it should be also able to buffer
|
||||
all possible packet's fragments.
|
||||
See section 7.3.1.14 in IEEE802.11e for more details. */
|
||||
respHdr.SetBufferSize (1023);
|
||||
respHdr.SetTimeout (reqHdr->GetTimeout ());
|
||||
|
||||
WifiActionHeader actionHdr;
|
||||
WifiActionHeader::ActionValue action;
|
||||
action.blockAck = WifiActionHeader::BLOCK_ACK_ADDBA_RESPONSE;
|
||||
actionHdr.SetAction (WifiActionHeader::BLOCK_ACK, action);
|
||||
|
||||
Ptr<Packet> packet = Create<Packet> ();
|
||||
packet->AddHeader (respHdr);
|
||||
packet->AddHeader (actionHdr);
|
||||
|
||||
/* ns3::MacLow have to buffer all correctly received packet for this block ack session */
|
||||
//m_low->CreateIngoingAgreement (&respHdr, originator, reqHdr->GetStartingSequence ());
|
||||
|
||||
//Better a management queue?
|
||||
m_queues[QosUtilsMapTidToAc (reqHdr->GetTid ())]->PushFront (packet, hdr);
|
||||
}
|
||||
} //namespace ns3
|
||||
|
||||
@@ -38,6 +38,7 @@ class WifiPhy;
|
||||
class DcfManager;
|
||||
class MacLow;
|
||||
class MacRxMiddle;
|
||||
class MgtAddBaRequestHeader;
|
||||
|
||||
class QadhocWifiMac : public WifiMac
|
||||
{
|
||||
@@ -82,7 +83,8 @@ private:
|
||||
void ForwardUp (Ptr<Packet> packet, Mac48Address from, Mac48Address to);
|
||||
QadhocWifiMac &operator = (const QadhocWifiMac &);
|
||||
QadhocWifiMac (const QadhocWifiMac &);
|
||||
|
||||
void SendAddBaResponse (const MgtAddBaRequestHeader *reqHdr, Mac48Address originator);
|
||||
|
||||
/**
|
||||
* When an A-MSDU is received, is deaggregated by this method and all extracted packets are
|
||||
* forwarded up.
|
||||
|
||||
@@ -673,7 +673,40 @@ QapWifiMac::Receive (Ptr<Packet> packet, const WifiMacHeader *hdr)
|
||||
else if (hdr->IsReassocReq ())
|
||||
{
|
||||
/* we don't support reassoc frames for now */
|
||||
}
|
||||
}
|
||||
else if (hdr->IsAction ())
|
||||
{
|
||||
WifiActionHeader actionHdr;
|
||||
packet->RemoveHeader (actionHdr);
|
||||
if (actionHdr.GetCategory () == WifiActionHeader::BLOCK_ACK &&
|
||||
actionHdr.GetAction().blockAck == WifiActionHeader::BLOCK_ACK_ADDBA_REQUEST)
|
||||
{
|
||||
MgtAddBaRequestHeader reqHdr;
|
||||
packet->RemoveHeader (reqHdr);
|
||||
SendAddBaResponse (&reqHdr, hdr->GetAddr2 ());
|
||||
}
|
||||
else if (actionHdr.GetCategory () == WifiActionHeader::BLOCK_ACK &&
|
||||
actionHdr.GetAction().blockAck == WifiActionHeader::BLOCK_ACK_ADDBA_RESPONSE)
|
||||
{
|
||||
MgtAddBaResponseHeader respHdr;
|
||||
packet->RemoveHeader (respHdr);
|
||||
m_queues[QosUtilsMapTidToAc (respHdr.GetTid ())]->GotAddBaResponse (&respHdr, hdr->GetAddr2 ());
|
||||
}
|
||||
else if (actionHdr.GetCategory () == WifiActionHeader::BLOCK_ACK &&
|
||||
actionHdr.GetAction().blockAck == WifiActionHeader::BLOCK_ACK_DELBA)
|
||||
{
|
||||
MgtDelBaHeader delBaHdr;
|
||||
packet->RemoveHeader (delBaHdr);
|
||||
if (delBaHdr.IsByOriginator ())
|
||||
{
|
||||
/* Block ack agreement tear down */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* We must notify correct queue tear down of agreement */
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (hdr->IsAuthentication () ||
|
||||
hdr->IsDeauthentication ())
|
||||
{
|
||||
@@ -799,4 +832,59 @@ QapWifiMac::DoStart (void)
|
||||
WifiMac::DoStart ();
|
||||
}
|
||||
|
||||
void
|
||||
QapWifiMac::SendAddBaResponse (const MgtAddBaRequestHeader *reqHdr, Mac48Address originator)
|
||||
{
|
||||
NS_LOG_FUNCTION (this);
|
||||
WifiMacHeader hdr;
|
||||
hdr.SetAction ();
|
||||
hdr.SetAddr1 (originator);
|
||||
hdr.SetAddr2 (m_low->GetAddress ());
|
||||
hdr.SetAddr3 (m_low->GetAddress ());
|
||||
hdr.SetDsNotFrom ();
|
||||
hdr.SetDsNotTo ();
|
||||
|
||||
MgtAddBaResponseHeader respHdr;
|
||||
StatusCode code;
|
||||
code.SetSuccess ();
|
||||
respHdr.SetStatusCode (code);
|
||||
//Here a control about queues type?
|
||||
respHdr.SetAmsduSupport (reqHdr->IsAmsduSupported ());
|
||||
|
||||
if (reqHdr->IsImmediateBlockAck ())
|
||||
{
|
||||
respHdr.SetImmediateBlockAck ();
|
||||
}
|
||||
else
|
||||
{
|
||||
respHdr.SetDelayedBlockAck ();
|
||||
}
|
||||
respHdr.SetTid (reqHdr->GetTid ());
|
||||
/* For now there's not no control about limit of reception.
|
||||
We assume that receiver has no limit on reception.
|
||||
However we assume that a receiver sets a bufferSize in order to satisfy
|
||||
next equation:
|
||||
(bufferSize + 1) % 16 = 0
|
||||
So if a recipient is able to buffer a packet, it should be also able to buffer
|
||||
all possible packet's fragments.
|
||||
See section 7.3.1.14 in IEEE802.11e for more details. */
|
||||
respHdr.SetBufferSize (1023);
|
||||
respHdr.SetTimeout (reqHdr->GetTimeout ());
|
||||
|
||||
WifiActionHeader actionHdr;
|
||||
WifiActionHeader::ActionValue action;
|
||||
action.blockAck = WifiActionHeader::BLOCK_ACK_ADDBA_RESPONSE;
|
||||
actionHdr.SetAction (WifiActionHeader::BLOCK_ACK, action);
|
||||
|
||||
Ptr<Packet> packet = Create<Packet> ();
|
||||
packet->AddHeader (respHdr);
|
||||
packet->AddHeader (actionHdr);
|
||||
|
||||
/* ns3::MacLow have to buffer all correctly received packet for this block ack session */
|
||||
//m_low->CreateIngoingAgreement (&respHdr, originator, reqHdr->GetStartingSequence ());
|
||||
|
||||
//Better a management queue?
|
||||
m_queues[QosUtilsMapTidToAc (reqHdr->GetTid ())]->PushFront (packet, hdr);
|
||||
}
|
||||
|
||||
} //namespace ns3
|
||||
|
||||
@@ -47,6 +47,7 @@ class MacTxMiddle;
|
||||
class DcfManager;
|
||||
class AmsduSubframeHeader;
|
||||
class MsduAggregator;
|
||||
class MgtAddBaRequestHeader;
|
||||
|
||||
class QapWifiMac : public WifiMac
|
||||
{
|
||||
@@ -103,6 +104,7 @@ private:
|
||||
void TxFailed (const WifiMacHeader& hdr);
|
||||
void SendProbeResp (Mac48Address to);
|
||||
void SendAssocResp (Mac48Address to, bool success);
|
||||
void SendAddBaResponse (const MgtAddBaRequestHeader *reqHdr, Mac48Address originator);
|
||||
void SendOneBeacon (void);
|
||||
SupportedRates GetSupportedRates (void) const;
|
||||
void SetBeaconGeneration (bool enable);
|
||||
|
||||
@@ -674,6 +674,39 @@ QstaWifiMac::Receive (Ptr<Packet> packet, const WifiMacHeader *hdr)
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (hdr->IsAction ())
|
||||
{
|
||||
WifiActionHeader actionHdr;
|
||||
packet->RemoveHeader (actionHdr);
|
||||
if (actionHdr.GetCategory () == WifiActionHeader::BLOCK_ACK &&
|
||||
actionHdr.GetAction().blockAck == WifiActionHeader::BLOCK_ACK_ADDBA_REQUEST)
|
||||
{
|
||||
MgtAddBaRequestHeader reqHdr;
|
||||
packet->RemoveHeader (reqHdr);
|
||||
SendAddBaResponse (&reqHdr, hdr->GetAddr2 ());
|
||||
}
|
||||
else if (actionHdr.GetCategory () == WifiActionHeader::BLOCK_ACK &&
|
||||
actionHdr.GetAction().blockAck == WifiActionHeader::BLOCK_ACK_ADDBA_RESPONSE)
|
||||
{
|
||||
MgtAddBaResponseHeader respHdr;
|
||||
packet->RemoveHeader (respHdr);
|
||||
m_queues[QosUtilsMapTidToAc (respHdr.GetTid ())]->GotAddBaResponse (&respHdr, hdr->GetAddr2 ());
|
||||
}
|
||||
else if (actionHdr.GetCategory () == WifiActionHeader::BLOCK_ACK &&
|
||||
actionHdr.GetAction().blockAck == WifiActionHeader::BLOCK_ACK_DELBA)
|
||||
{
|
||||
MgtDelBaHeader delBaHdr;
|
||||
packet->RemoveHeader (delBaHdr);
|
||||
if (delBaHdr.IsByOriginator ())
|
||||
{
|
||||
/* Block ack agreement tear down */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* We must notify correct queue tear down of agreement */
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SupportedRates
|
||||
@@ -775,5 +808,59 @@ QstaWifiMac::FinishConfigureStandard (enum WifiPhyStandard standard)
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
QstaWifiMac::SendAddBaResponse (const MgtAddBaRequestHeader *reqHdr, Mac48Address originator)
|
||||
{
|
||||
NS_LOG_FUNCTION (this);
|
||||
WifiMacHeader hdr;
|
||||
hdr.SetAction ();
|
||||
hdr.SetAddr1 (originator);
|
||||
hdr.SetAddr2 (m_low->GetAddress ());
|
||||
hdr.SetAddr3 (m_low->GetAddress ());
|
||||
hdr.SetDsNotFrom ();
|
||||
hdr.SetDsNotTo ();
|
||||
|
||||
MgtAddBaResponseHeader respHdr;
|
||||
StatusCode code;
|
||||
code.SetSuccess ();
|
||||
respHdr.SetStatusCode (code);
|
||||
//Here a control about queues type?
|
||||
respHdr.SetAmsduSupport (reqHdr->IsAmsduSupported ());
|
||||
|
||||
if (reqHdr->IsImmediateBlockAck ())
|
||||
{
|
||||
respHdr.SetImmediateBlockAck ();
|
||||
}
|
||||
else
|
||||
{
|
||||
respHdr.SetDelayedBlockAck ();
|
||||
}
|
||||
respHdr.SetTid (reqHdr->GetTid ());
|
||||
/* For now there's not no control about limit of reception.
|
||||
We assume that receiver has no limit on reception.
|
||||
However we assume that a receiver sets a bufferSize in order to satisfy
|
||||
next equation:
|
||||
(bufferSize + 1) % 16 = 0
|
||||
So if a recipient is able to buffer a packet, it should be also able to buffer
|
||||
all possible packet's fragments.
|
||||
See section 7.3.1.14 in IEEE802.11e for more details. */
|
||||
respHdr.SetBufferSize (1023);
|
||||
respHdr.SetTimeout (reqHdr->GetTimeout ());
|
||||
|
||||
WifiActionHeader actionHdr;
|
||||
WifiActionHeader::ActionValue action;
|
||||
action.blockAck = WifiActionHeader::BLOCK_ACK_ADDBA_RESPONSE;
|
||||
actionHdr.SetAction (WifiActionHeader::BLOCK_ACK, action);
|
||||
|
||||
Ptr<Packet> packet = Create<Packet> ();
|
||||
packet->AddHeader (respHdr);
|
||||
packet->AddHeader (actionHdr);
|
||||
|
||||
/* ns3::MacLow have to buffer all correctly received packet for this block ack session */
|
||||
//m_low->CreateIngoingAgreement (&respHdr, originator, reqHdr->GetStartingSequence ());
|
||||
|
||||
//Better a management queue?
|
||||
m_queues[QosUtilsMapTidToAc (reqHdr->GetTid ())]->PushFront (packet, hdr);
|
||||
}
|
||||
|
||||
} //namespace ns3
|
||||
|
||||
@@ -45,6 +45,7 @@ class MacLow;
|
||||
class WifiMacHeader;
|
||||
class AmsduSubframeHeader;
|
||||
class MsduAggregator;
|
||||
class MgtAddBaRequestHeader;
|
||||
|
||||
class QstaWifiMac : public WifiMac
|
||||
{
|
||||
@@ -100,6 +101,7 @@ private:
|
||||
void ProbeRequestTimeout (void);
|
||||
void SendAssociationRequest (void);
|
||||
void SendProbeRequest (void);
|
||||
void SendAddBaResponse (const MgtAddBaRequestHeader *reqHdr, Mac48Address originator);
|
||||
void TryToEnsureAssociated (void);
|
||||
bool IsAssociated (void) const;
|
||||
bool IsWaitAssocResp (void) const;
|
||||
|
||||
Reference in New Issue
Block a user