22 #include "ap-wifi-mac.h"
24 #include "ns3/assert.h"
26 #include "ns3/simulator.h"
27 #include "ns3/string.h"
28 #include "ns3/pointer.h"
29 #include "ns3/boolean.h"
33 #include "dcf-manager.h"
34 #include "mac-rx-middle.h"
35 #include "mac-tx-middle.h"
36 #include "mgt-headers.h"
38 #include "amsdu-subframe-header.h"
39 #include "msdu-aggregator.h"
45 NS_OBJECT_ENSURE_REGISTERED (ApWifiMac);
48 ApWifiMac::GetTypeId (
void)
50 static TypeId tid = TypeId (
"ns3::ApWifiMac")
51 .SetParent<RegularWifiMac> ()
52 .AddConstructor<ApWifiMac> ()
53 .AddAttribute (
"BeaconInterval",
"Delay between two beacons",
58 .AddAttribute (
"BeaconGeneration",
"Whether or not beacons are generated.",
60 MakeBooleanAccessor (&ApWifiMac::SetBeaconGeneration,
61 &ApWifiMac::GetBeaconGeneration),
62 MakeBooleanChecker ())
67 ApWifiMac::ApWifiMac ()
70 m_beaconDca = CreateObject<DcaTxop> ();
71 m_beaconDca->SetAifsn (1);
72 m_beaconDca->SetMinCw (0);
73 m_beaconDca->SetMaxCw (0);
74 m_beaconDca->SetLow (m_low);
75 m_beaconDca->SetManager (m_dcfManager);
80 m_enableBeaconGeneration =
false;
83 ApWifiMac::~ApWifiMac ()
93 m_enableBeaconGeneration =
false;
109 ApWifiMac::SetBeaconGeneration (
bool enable)
116 else if (enable && !m_enableBeaconGeneration)
120 m_enableBeaconGeneration = enable;
124 ApWifiMac::GetBeaconGeneration (
void)
const
127 return m_enableBeaconGeneration;
134 return m_beaconInterval;
141 m_beaconDca->SetWifiRemoteStationManager (stationManager);
163 NS_LOG_WARN (
"beacon interval should be multiple of 1024us, see IEEE Std. 802.11-2007, section 11.1.1.1");
165 m_beaconInterval = interval;
198 ForwardDown (packet, from, to, tid);
202 ApWifiMac::ForwardDown (Ptr<const Packet> packet, Mac48Address from,
203 Mac48Address to, uint8_t tid)
205 NS_LOG_FUNCTION (
this << packet << from << to << static_cast<uint32_t> (tid));
215 hdr.SetType (WIFI_MAC_QOSDATA);
216 hdr.SetQosAckPolicy (WifiMacHeader::NORMAL_ACK);
218 hdr.SetQosNoAmsdu ();
221 hdr.SetQosTxopLimit (0);
244 m_dca->Queue (packet, hdr);
252 if (to.
IsBroadcast () || m_stationManager->IsAssociated (to))
254 ForwardDown (packet, from, to);
265 Enqueue (packet, to, m_low->GetAddress ());
269 ApWifiMac::SupportsSendFrom (
void)
const
276 ApWifiMac::GetSupportedRates (
void)
const
281 SupportedRates rates;
282 for (uint32_t i = 0; i < m_phy->
GetNModes (); i++)
284 WifiMode mode = m_phy->
GetMode (i);
285 rates.AddSupportedRate (mode.GetDataRate ());
288 for (uint32_t j = 0; j < m_stationManager->GetNBasicModes (); j++)
290 WifiMode mode = m_stationManager->GetBasicMode (j);
291 rates.SetBasicRate (mode.GetDataRate ());
297 ApWifiMac::SendProbeResp (Mac48Address to)
307 Ptr<Packet> packet = Create<Packet> ();
308 MgtProbeResponseHeader probe;
310 probe.SetSupportedRates (GetSupportedRates ());
312 packet->AddHeader (probe);
318 m_dca->Queue (packet, hdr);
322 ApWifiMac::SendAssocResp (Mac48Address to,
bool success)
332 Ptr<Packet> packet = Create<Packet> ();
333 MgtAssocResponseHeader assoc;
343 assoc.SetSupportedRates (GetSupportedRates ());
344 assoc.SetStatusCode (code);
345 packet->AddHeader (assoc);
351 m_dca->Queue (packet, hdr);
355 ApWifiMac::SendOneBeacon (
void)
365 Ptr<Packet> packet = Create<Packet> ();
366 MgtBeaconHeader beacon;
368 beacon.SetSupportedRates (GetSupportedRates ());
371 packet->AddHeader (beacon);
374 m_beaconDca->Queue (packet, hdr);
379 ApWifiMac::TxOk (
const WifiMacHeader &hdr)
382 RegularWifiMac::TxOk (hdr);
384 if (hdr.IsAssocResp ()
385 && m_stationManager->IsWaitAssocTxOk (hdr.GetAddr1 ()))
387 NS_LOG_DEBUG (
"associated with sta=" << hdr.GetAddr1 ());
388 m_stationManager->RecordGotAssocTxOk (hdr.GetAddr1 ());
393 ApWifiMac::TxFailed (
const WifiMacHeader &hdr)
396 RegularWifiMac::TxFailed (hdr);
398 if (hdr.IsAssocResp ()
399 && m_stationManager->IsWaitAssocTxOk (hdr.GetAddr1 ()))
401 NS_LOG_DEBUG (
"assoc failed with sta=" << hdr.GetAddr1 ());
402 m_stationManager->RecordGotAssocTxFailed (hdr.GetAddr1 ());
416 if (!hdr->IsFromDs ()
419 && m_stationManager->IsAssociated (from))
425 if (hdr->IsQosData ())
427 if (hdr->IsQosAmsdu ())
435 ForwardUp (packet, from, bssid);
440 ForwardUp (packet, from, bssid);
444 || m_stationManager->IsAssociated (to))
446 NS_LOG_DEBUG (
"forwarding frame from=" << from <<
", to=" << to);
452 if (hdr->IsQosData ())
454 ForwardDown (packet, from, to, hdr->GetQosTid ());
458 ForwardDown (packet, from, to);
460 ForwardUp (copy, from, to);
464 ForwardUp (packet, from, to);
467 else if (hdr->IsFromDs ()
482 else if (hdr->IsMgt ())
484 if (hdr->IsProbeReq ())
487 SendProbeResp (from);
492 if (hdr->IsAssocReq ())
499 bool problem =
false;
500 for (uint32_t i = 0; i < m_stationManager->GetNBasicModes (); i++)
502 WifiMode mode = m_stationManager->GetBasicMode (i);
514 SendAssocResp (hdr->GetAddr2 (),
false);
520 for (uint32_t j = 0; j < m_phy->
GetNModes (); j++)
525 m_stationManager->AddSupportedMode (from, mode);
528 m_stationManager->RecordWaitAssocTxOk (from);
530 SendAssocResp (hdr->GetAddr2 (),
true);
534 else if (hdr->IsDisassociation ())
536 m_stationManager->RecordDisassociated (from);
553 MsduAggregator::DeaggregatedMsdus packets =
554 MsduAggregator::Deaggregate (aggregatedPacket);
556 for (MsduAggregator::DeaggregatedMsdusCI i = packets.begin ();
557 i != packets.end (); ++i)
559 if ((*i).second.GetDestinationAddr () ==
GetAddress ())
561 ForwardUp ((*i).first, (*i).second.GetSourceAddr (),
562 (*i).second.GetDestinationAddr ());
568 NS_LOG_DEBUG (
"forwarding QoS frame from=" << from <<
", to=" << to);
569 ForwardDown ((*i).first, from, to, hdr->GetQosTid ());
578 m_beaconDca->Initialize ();
580 if (m_enableBeaconGeneration)
virtual void DoInitialize(void)
uint32_t RemoveHeader(Header &header)
void SetBeaconInterval(Time interval)
smart pointer class similar to boost::intrusive_ptr
#define NS_LOG_FUNCTION(parameters)
virtual void SetWifiRemoteStationManager(Ptr< WifiRemoteStationManager > stationManager)
virtual uint32_t GetNModes(void) const =0
#define NS_ASSERT(condition)
#define NS_LOG_COMPONENT_DEFINE(name)
uint32_t GetSize(void) const
bool IsBroadcast(void) const
void NotifyRxDrop(Ptr< const Packet > packet)
static EventId Schedule(Time const &time, MEM mem_ptr, OBJ obj)
virtual Ssid GetSsid(void) const
The Supported Rates Information ElementThis class knows how to serialise and deserialise the Supporte...
represent a single transmission modeA WifiMode is implemented by a single integer which is used to lo...
virtual void Receive(Ptr< Packet > packet, const WifiMacHeader *hdr)
uint8_t QosUtilsGetTidForPacket(Ptr< const Packet > packet)
virtual void Enqueue(Ptr< const Packet > packet, Mac48Address to)
virtual void SetBssid(Mac48Address bssid)
virtual void SetWifiRemoteStationManager(Ptr< WifiRemoteStationManager > stationManager)
void SetTypeOfStation(TypeOfStation type)
int64_t GetMicroSeconds(void) const
AcIndex QosUtilsMapTidToAc(uint8_t tid)
virtual void SetAddress(Mac48Address address)
static Mac48Address GetBroadcast(void)
virtual void Receive(Ptr< Packet > packet, const WifiMacHeader *hdr)
virtual void DeaggregateAmsduAndForward(Ptr< Packet > aggregatedPacket, const WifiMacHeader *hdr)
Ptr< Packet > Copy(void) const
virtual void SetLinkUpCallback(Callback< void > linkUp)
virtual void SetLinkUpCallback(Callback< void > linkUp)
virtual WifiMode GetMode(uint32_t mode) const =0
static EventId ScheduleNow(MEM mem_ptr, OBJ obj)
virtual void DoDispose(void)
virtual void SetAddress(Mac48Address address)
#define NS_LOG_DEBUG(msg)
virtual Mac48Address GetAddress(void) const
virtual void DoInitialize()
Time GetBeaconInterval(void) const
uint64_t GetDataRate(void) const
void StartBeaconing(void)
Time MicroSeconds(uint64_t us)
create ns3::Time instances in units of microseconds.