wifi: Make WifiMac subclasses independent of MacLow

This commit is contained in:
Stefano Avallone
2020-12-03 15:26:53 +01:00
parent 557ad4c76e
commit b589c232b9
9 changed files with 68 additions and 63 deletions

View File

@@ -23,7 +23,6 @@
#include "ns3/mesh-wifi-beacon.h"
#include "ns3/log.h"
#include "ns3/boolean.h"
#include "ns3/mac-low.h"
#include "ns3/random-variable-stream.h"
#include "ns3/simulator.h"
#include "ns3/yans-wifi-phy.h"
@@ -33,6 +32,7 @@
#include "ns3/trace-source-accessor.h"
#include "ns3/socket.h"
#include "ns3/wifi-net-device.h"
#include "ns3/channel-access-manager.h"
namespace ns3 {
@@ -98,7 +98,7 @@ void
MeshWifiInterfaceMac::Enqueue (Ptr<Packet> packet, Mac48Address to)
{
NS_LOG_FUNCTION (this << packet << to);
ForwardDown (packet, m_low->GetAddress (), to);
ForwardDown (packet, GetAddress (), to);
}
bool
MeshWifiInterfaceMac::SupportsSendFrom () const

View File

@@ -26,7 +26,6 @@
#include "ht-capabilities.h"
#include "vht-capabilities.h"
#include "he-capabilities.h"
#include "mac-low.h"
namespace ns3 {
@@ -138,7 +137,7 @@ AdhocWifiMac::Enqueue (Ptr<Packet> packet, Mac48Address to)
hdr.SetNoOrder (); // explicitly set to 0 for the time being since HT control field is not yet implemented (set it to 1 when implemented)
}
hdr.SetAddr1 (to);
hdr.SetAddr2 (m_low->GetAddress ());
hdr.SetAddr2 (GetAddress ());
hdr.SetAddr3 (GetBssid ());
hdr.SetDsNotFrom ();
hdr.SetDsNotTo ();

View File

@@ -27,7 +27,7 @@
#include "ns3/string.h"
#include "ns3/random-variable-stream.h"
#include "ap-wifi-mac.h"
#include "mac-low.h"
#include "channel-access-manager.h"
#include "mac-tx-middle.h"
#include "mac-rx-middle.h"
#include "mgt-headers.h"
@@ -155,7 +155,7 @@ Time
ApWifiMac::GetBeaconInterval (void) const
{
NS_LOG_FUNCTION (this);
return m_low->GetBeaconInterval ();
return m_beaconInterval;
}
void
@@ -191,7 +191,7 @@ ApWifiMac::SetBeaconInterval (Time interval)
{
NS_FATAL_ERROR ("beacon interval should be smaller then or equal to 65535 * 1024us (802.11 time unit)");
}
m_low->SetBeaconInterval (interval);
m_beaconInterval = interval;
}
int64_t
@@ -370,7 +370,7 @@ ApWifiMac::Enqueue (Ptr<Packet> packet, Mac48Address to)
//We're sending this packet with a from address that is our own. We
//get that address from the lower MAC and make use of the
//from-spoofing Enqueue() method to avoid duplicated code.
Enqueue (packet, to, m_low->GetAddress ());
Enqueue (packet, to, GetAddress ());
}
bool

View File

@@ -294,6 +294,7 @@ private:
Ptr<Txop> m_beaconTxop; //!< Dedicated Txop for beacons
bool m_enableBeaconGeneration; //!< Flag whether beacons are being generated
Time m_beaconInterval; //!< Beacon interval
EventId m_beaconEvent; //!< Event to generate one beacon
EventId m_cfpEvent; //!< Event to generate one PCF frame
Ptr<UniformRandomVariable> m_beaconJitter; //!< UniformRandomVariable used to randomize the time of the first beacon

View File

@@ -56,6 +56,7 @@ FrameExchangeManager::GetTypeId (void)
FrameExchangeManager::FrameExchangeManager ()
: m_navEnd (Seconds (0)),
m_promisc (false),
m_moreFragments (false)
{
NS_LOG_FUNCTION (this);
@@ -166,6 +167,15 @@ FrameExchangeManager::SetWifiPhy (Ptr<WifiPhy> phy)
m_phy->SetReceiveOkCallback (MakeCallback (&FrameExchangeManager::Receive, this));
}
void
FrameExchangeManager::ResetPhy (void)
{
m_phy->TraceDisconnectWithoutContext ("PhyRxPayloadBegin",
MakeCallback (&FrameExchangeManager::RxStartIndication, this));
m_phy->SetReceiveOkCallback (MakeNullCallback<void, Ptr<WifiPsdu>, double, WifiTxVector, std::vector<bool>> ());
m_phy = 0;
}
void
FrameExchangeManager::SetAddress (Mac48Address address)
{
@@ -180,6 +190,18 @@ FrameExchangeManager::SetBssid (Mac48Address bssid)
m_bssid = bssid;
}
void
FrameExchangeManager::SetPromisc (void)
{
m_promisc = true;
}
bool
FrameExchangeManager::IsPromisc (void) const
{
return m_promisc;
}
void
FrameExchangeManager::NotifyPacketDiscarded (Ptr<const WifiMacQueueItem> mpdu)
{
@@ -841,6 +863,10 @@ FrameExchangeManager::Receive (Ptr<WifiPsdu> psdu, double rxSnr,
Mac48Address addr1 = psdu->GetAddr1 ();
if (!addr1.IsGroup () && addr1 != m_self)
{
if (m_promisc && psdu->GetNMpdus () == 1 && psdu->GetHeader (0).IsData ())
{
m_rxMiddle->Receive (*psdu->begin ());
}
return;
}

View File

@@ -110,6 +110,10 @@ public:
* \param phy the PHY layer to use
*/
virtual void SetWifiPhy (const Ptr<WifiPhy> phy);
/**
* Remove WifiPhy associated with this MacLow.
*/
virtual void ResetPhy (void);
/**
* Set the Protection Manager to use
*
@@ -134,6 +138,17 @@ public:
* \param bssid the BSSID
*/
virtual void SetBssid (Mac48Address bssid);
/**
* Enable promiscuous mode.
*/
void SetPromisc (void);
/**
* Check if the device is operating in promiscuous mode.
*
* \return true if the device is operating in promiscuous mode,
* false otherwise
*/
bool IsPromisc (void) const;
/**
* Get the Protection Manager used by this node.
@@ -334,6 +349,7 @@ protected:
Mac48Address m_self; //!< the MAC address of this device
Mac48Address m_bssid; //!< BSSID address (Mac48Address)
Time m_navEnd; //!< NAV expiration time
bool m_promisc; //!< Flag if the device is operating in promiscuous mode
/**
* Forward an MPDU down to the PHY layer.

View File

@@ -25,7 +25,6 @@
#include "wifi-phy.h"
#include "mac-rx-middle.h"
#include "mac-tx-middle.h"
#include "mac-low.h"
#include "msdu-aggregator.h"
#include "mpdu-aggregator.h"
#include "mgt-headers.h"
@@ -37,6 +36,7 @@
#include <algorithm>
#include <cmath>
#include "he-frame-exchange-manager.h"
#include "channel-access-manager.h"
namespace ns3 {
@@ -55,10 +55,6 @@ RegularWifiMac::RegularWifiMac ()
m_txMiddle = Create<MacTxMiddle> ();
m_low = CreateObject<MacLow> ();
m_low->SetRxCallback (MakeCallback (&MacRxMiddle::Receive, m_rxMiddle));
m_low->SetMac (this);
m_channelAccessManager = CreateObject<ChannelAccessManager> ();
m_txop = CreateObject<Txop> ();
@@ -102,9 +98,6 @@ RegularWifiMac::DoDispose ()
m_rxMiddle = 0;
m_txMiddle = 0;
m_low->Dispose ();
m_low = 0;
m_phy = 0;
m_stationManager = 0;
if (m_feManager != 0)
@@ -180,7 +173,6 @@ RegularWifiMac::SetWifiRemoteStationManager (const Ptr<WifiRemoteStationManager>
{
NS_LOG_FUNCTION (this << stationManager);
m_stationManager = stationManager;
m_low->SetWifiRemoteStationManager (stationManager);
m_txop->SetWifiRemoteStationManager (stationManager);
for (EdcaQueues::const_iterator i = m_edca.begin (); i != m_edca.end (); ++i)
{
@@ -548,7 +540,6 @@ RegularWifiMac::SetWifiPhy (const Ptr<WifiPhy> phy)
NS_LOG_FUNCTION (this << phy);
m_phy = phy;
m_channelAccessManager->SetupPhyListener (phy);
m_low->SetPhy (phy);
NS_ASSERT (m_feManager != 0);
m_feManager->SetWifiPhy (phy);
}
@@ -564,7 +555,8 @@ void
RegularWifiMac::ResetWifiPhy (void)
{
NS_LOG_FUNCTION (this);
m_low->ResetPhy ();
NS_ASSERT (m_feManager != 0);
m_feManager->ResetPhy ();
m_channelAccessManager->RemovePhyListener (m_phy);
m_phy = 0;
}
@@ -667,20 +659,20 @@ void
RegularWifiMac::SetCtsToSelfSupported (bool enable)
{
NS_LOG_FUNCTION (this);
m_low->SetCtsToSelfSupported (enable);
m_ctsToSelfSupported = enable;
}
void
RegularWifiMac::SetAddress (Mac48Address address)
{
NS_LOG_FUNCTION (this << address);
m_low->SetAddress (address);
m_address = address;
}
Mac48Address
RegularWifiMac::GetAddress (void) const
{
return m_low->GetAddress ();
return m_address;
}
void
@@ -700,7 +692,7 @@ void
RegularWifiMac::SetBssid (Mac48Address bssid)
{
NS_LOG_FUNCTION (this << bssid);
m_low->SetBssid (bssid);
m_bssid = bssid;
if (m_feManager)
{
m_feManager->SetBssid (bssid);
@@ -710,13 +702,14 @@ RegularWifiMac::SetBssid (Mac48Address bssid)
Mac48Address
RegularWifiMac::GetBssid (void) const
{
return m_low->GetBssid ();
return m_bssid;
}
void
RegularWifiMac::SetPromisc (void)
{
m_low->SetPromisc ();
NS_ASSERT (m_feManager != 0);
m_feManager->SetPromisc ();
}
void
@@ -830,9 +823,11 @@ RegularWifiMac::Receive (Ptr<WifiMacQueueItem> mpdu)
{
//This DELBA frame was sent by the originator, so
//this means that an ingoing established
//agreement exists in MacLow and we need to
//agreement exists in HtFrameExchangeManager and we need to
//destroy it.
m_low->DestroyBlockAckAgreement (from, delBaHdr.GetTid ());
NS_ASSERT (m_feManager != 0);
Ptr<HtFrameExchangeManager> htFem = StaticCast<HtFrameExchangeManager> (m_feManager);
htFem->DestroyBlockAckAgreement (from, delBaHdr.GetTid ());
}
else
{
@@ -1119,7 +1114,6 @@ RegularWifiMac::ConfigureStandard (WifiStandard standard)
case WIFI_STANDARD_80211ax_5GHZ:
case WIFI_STANDARD_80211ax_6GHZ:
{
EnableAggregation ();
SetQosSupported (true);
cwmin = 15;
cwmax = 1023;
@@ -1128,7 +1122,6 @@ RegularWifiMac::ConfigureStandard (WifiStandard standard)
case WIFI_STANDARD_80211ax_2_4GHZ:
case WIFI_STANDARD_80211n_2_4GHZ:
{
EnableAggregation ();
SetQosSupported (true);
}
case WIFI_STANDARD_80211g:
@@ -1181,30 +1174,4 @@ RegularWifiMac::TxFailed (const WifiMacHeader &hdr)
m_txErrCallback (hdr);
}
void
RegularWifiMac::EnableAggregation (void)
{
NS_LOG_FUNCTION (this);
if (m_low->GetMsduAggregator () == 0)
{
Ptr<MsduAggregator> msduAggregator = CreateObject<MsduAggregator> ();
msduAggregator->SetWifiMac (this);
m_low->SetMsduAggregator (msduAggregator);
}
if (m_low->GetMpduAggregator () == 0)
{
Ptr<MpduAggregator> mpduAggregator = CreateObject<MpduAggregator> ();
mpduAggregator->SetWifiMac (this);
m_low->SetMpduAggregator (mpduAggregator);
}
}
void
RegularWifiMac::DisableAggregation (void)
{
NS_LOG_FUNCTION (this);
m_low->SetMsduAggregator (0);
m_low->SetMpduAggregator (0);
}
} //namespace ns3

View File

@@ -27,7 +27,6 @@
namespace ns3 {
class MacLow;
class MacRxMiddle;
class MacTxMiddle;
class ChannelAccessManager;
@@ -179,7 +178,6 @@ protected:
Ptr<MacRxMiddle> m_rxMiddle; //!< RX middle (defragmentation etc.)
Ptr<MacTxMiddle> m_txMiddle; //!< TX middle (aggregation etc.)
Ptr<MacLow> m_low; //!< MacLow (RTS, CTS, Data, Ack etc.)
Ptr<ChannelAccessManager> m_channelAccessManager; //!< channel access manager
Ptr<WifiPhy> m_phy; //!< Wifi PHY
Ptr<FrameExchangeManager> m_feManager; //!< Frame Exchange Manager
@@ -450,10 +448,8 @@ private:
*/
bool m_dsssSupported;
/// Enable aggregation function
void EnableAggregation (void);
/// Disable aggregation function
void DisableAggregation (void);
Mac48Address m_address; ///< MAC address of this station
Mac48Address m_bssid; ///< the BSSID
uint16_t m_voMaxAmsduSize; ///< maximum A-MSDU size for AC_VO (in bytes)
uint16_t m_viMaxAmsduSize; ///< maximum A-MSDU size for AC_VI (in bytes)
@@ -469,6 +465,7 @@ private:
TracedCallback<const WifiMacHeader &> m_txErrCallback; ///< transmit error callback
bool m_shortSlotTimeSupported; ///< flag whether short slot time is supported
bool m_ctsToSelfSupported; ///< flag indicating whether CTS-To-Self is supported
};
} //namespace ns3

View File

@@ -25,7 +25,6 @@
#include "ns3/simulator.h"
#include "sta-wifi-mac.h"
#include "wifi-phy.h"
#include "mac-low.h"
#include "mgt-headers.h"
#include "snr-tag.h"
#include "wifi-net-device.h"
@@ -476,7 +475,7 @@ StaWifiMac::Enqueue (Ptr<Packet> packet, Mac48Address to)
}
hdr.SetAddr1 (GetBssid ());
hdr.SetAddr2 (m_low->GetAddress ());
hdr.SetAddr2 (GetAddress ());
hdr.SetAddr3 (to);
hdr.SetDsNotFrom ();
hdr.SetDsTo ();