diff --git a/examples/wireless/examples-to-run.py b/examples/wireless/examples-to-run.py index a5d8b93a1..db9787b98 100755 --- a/examples/wireless/examples-to-run.py +++ b/examples/wireless/examples-to-run.py @@ -57,9 +57,6 @@ cpp_examples = [ ("wifi-80211e-txop --simulationTime=1 --verifyResults=1", "True", "True"), ("wifi-multi-tos --simulationTime=1 --nWifi=16 --useRts=1 --useShortGuardInterval=1", "True", "True"), ("wifi-tcp", "True", "True"), - ("wifi-pcf --simulationTime=1 --withData=0", "True", "True"), - ("wifi-pcf --simulationTime=1 --withData=1 --trafficDirection=upstream", "True", "True"), - ("wifi-pcf --simulationTime=1 --withData=1 --trafficDirection=downstream", "True", "True"), ("wifi-hidden-terminal --wifiManager=Arf", "True", "True"), ("wifi-hidden-terminal --wifiManager=Aarf", "True", "True"), ("wifi-hidden-terminal --wifiManager=Aarfcd", "True", "True"), diff --git a/examples/wireless/wifi-pcf.cc b/examples/wireless/wifi-pcf.cc deleted file mode 100644 index cf03457a2..000000000 --- a/examples/wireless/wifi-pcf.cc +++ /dev/null @@ -1,286 +0,0 @@ -/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */ -/* - * Copyright (c) 2017 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation; - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Author: Sebastien Deronne - */ - -#include "ns3/log.h" -#include "ns3/config.h" -#include "ns3/command-line.h" -#include "ns3/uinteger.h" -#include "ns3/boolean.h" -#include "ns3/string.h" -#include "ns3/yans-wifi-helper.h" -#include "ns3/mobility-helper.h" -#include "ns3/internet-stack-helper.h" -#include "ns3/ipv4-address-helper.h" -#include "ns3/packet-sink-helper.h" -#include "ns3/on-off-helper.h" -#include "ns3/packet-sink.h" -#include "ns3/ssid.h" -#include "ns3/wifi-mac-header.h" - -/* This is a simple example in order to show the frames exchanged in 802.11 PCF. - * The output prints the overal throughput as well as the number of different PCF frames that have been transmitted. - * - * It is possible to tune some parameters using the command line: - * - number of connected stations - * - enable/disable PCF - * - enable PCAP output file generation in order to vizualise frame exchange. - * - configure UDP data traffic: - * -> enable/disable data generation: --withData=<0|1> - * -> select traffic direction: --trafficDirection= - * - * For example, one can observe the benefit of PCF over DCF when the number of stations increased: - * ./waf --run "wifi-pcf enablePcf=0 --nWifi=10" => DCF only - * ./waf --run "wifi-pcf enablePcf=1 --nWifi=10" => alternance of PCF and DCF - * - * One can also change the value of cfpMaxDuration: a shorter valer means the granted time for PCF is shorter, and so it's benefit is reduced. - * ./waf --run "wifi-pcf enablePcf=1 --nWifi=10 --cfpMaxDuration=10240" - * - * One can also see the different types of piggybacked frames depending on the traffic direction and whether PCF is enabled or not: - * ./waf --run "wifi-pcf enablePcf=0 --nWifi=1" => only CF_POLL and DATA_NULL frames should be seen - * ./waf --run "wifi-pcf enablePcf=1 --nWifi=1 --trafficDirection=upstream" => no DATA_NULL frames should be seen - * ./waf --run "wifi-pcf enablePcf=1 --nWifi=1 --trafficDirection=downstream" => no CF_END_ACK frames should be seen - */ - -using namespace ns3; - -NS_LOG_COMPONENT_DEFINE ("WifiPcf"); - -uint64_t m_countBeacon; -uint64_t m_countCfPoll; -uint64_t m_countCfPollAck; -uint64_t m_countCfPollData; -uint64_t m_countCfPollDataAck; -uint64_t m_countCfEnd; -uint64_t m_countCfEndAck; -uint64_t m_countDataNull; -uint64_t m_countData; - -void TxCallback (std::string context, Ptr p, double txPowerW) -{ - WifiMacHeader hdr; - p->PeekHeader (hdr); - if (hdr.IsBeacon ()) - { - m_countBeacon++; - } - else if (hdr.IsCfPoll ()) - { - if (hdr.IsCfAck () && hdr.HasData ()) - { - m_countCfPollDataAck++; - } - else if (!hdr.IsCfAck () && hdr.HasData ()) - { - m_countCfPollData++; - } - else if (hdr.IsCfAck () && !hdr.HasData ()) - { - m_countCfPollAck++; - } - else - { - m_countCfPoll++; - } - } - else if (hdr.IsCfEnd ()) - { - if (hdr.IsCfAck ()) - { - m_countCfEndAck++; - } - else - { - m_countCfEnd++; - } - } - else if (hdr.IsData ()) - { - if (!hdr.HasData ()) - { - m_countDataNull++; - } - else - { - m_countData++; - } - } -} - -int main (int argc, char *argv[]) -{ - uint32_t nWifi = 1; - bool enablePcap = false; - bool enablePcf = true; - bool withData = true; - std::string trafficDirection = "upstream"; - uint64_t cfpMaxDurationUs = 65536; //microseconds - double simulationTime = 10; //seconds - - CommandLine cmd (__FILE__); - cmd.AddValue ("nWifi", "Number of wifi STA devices", nWifi); - cmd.AddValue ("enablePcf", "Enable/disable PCF mode", enablePcf); - cmd.AddValue ("withData", "Enable/disable UDP data packets generation", withData); - cmd.AddValue ("trafficDirection", "Data traffic direction (if withData is set to 1): upstream (all STAs -> AP) or downstream (AP -> all STAs)", trafficDirection); - cmd.AddValue ("cfpMaxDuration", "CFP max duration in microseconds", cfpMaxDurationUs); - cmd.AddValue ("simulationTime", "Simulation time in seconds", simulationTime); - cmd.AddValue ("enablePcap", "Enable/disable PCAP output", enablePcap); - cmd.Parse (argc, argv); - - m_countBeacon = 0; - m_countCfEnd = 0; - m_countCfEndAck = 0; - m_countCfPoll = 0; - m_countCfPollAck = 0; - m_countCfPollData = 0; - m_countCfPollDataAck = 0; - m_countDataNull = 0; - m_countData = 0; - m_countDataNull = 0; - m_countData = 0; - - NodeContainer wifiStaNodes; - wifiStaNodes.Create (nWifi); - - NodeContainer wifiApNode; - wifiApNode.Create (1); - - YansWifiChannelHelper channel = YansWifiChannelHelper::Default (); - YansWifiPhyHelper phy; - phy.SetPcapDataLinkType (YansWifiPhyHelper::DLT_IEEE802_11_RADIO); - phy.SetChannel (channel.Create ()); - - WifiHelper wifi; - WifiMacHelper mac; - - Ssid ssid = Ssid ("wifi-pcf"); - wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue ("OfdmRate54Mbps"), "ControlMode", StringValue ("OfdmRate24Mbps")); - - NetDeviceContainer staDevices; - mac.SetType ("ns3::StaWifiMac", - "Ssid", SsidValue (ssid), - "ActiveProbing", BooleanValue (false), - "PcfSupported", BooleanValue (enablePcf)); - staDevices = wifi.Install (phy, mac, wifiStaNodes); - - mac.SetType ("ns3::ApWifiMac", - "Ssid", SsidValue (ssid), - "BeaconGeneration", BooleanValue (true), - "PcfSupported", BooleanValue (enablePcf), - "CfpMaxDuration", TimeValue (MicroSeconds (cfpMaxDurationUs))); - - NetDeviceContainer apDevice; - apDevice = wifi.Install (phy, mac, wifiApNode); - - MobilityHelper mobility; - - Ptr positionAlloc = CreateObject (); - - for (uint32_t i = 0; i < nWifi; i++) - { - positionAlloc->Add (Vector (1.0, 0.0, 0.0)); - } - positionAlloc->Add (Vector (0.0, 0.0, 0.0)); - mobility.SetPositionAllocator (positionAlloc); - - mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel"); - - mobility.Install (wifiApNode); - mobility.Install (wifiStaNodes); - - InternetStackHelper stack; - stack.Install (wifiApNode); - stack.Install (wifiStaNodes); - - Ipv4AddressHelper address; - - address.SetBase ("10.1.1.0", "255.255.255.0"); - Ipv4InterfaceContainer StaInterface; - StaInterface = address.Assign (staDevices); - Ipv4InterfaceContainer ApInterface; - ApInterface = address.Assign (apDevice); - - ApplicationContainer sourceApplications, sinkApplications; - if (withData) - { - uint32_t portNumber = 9; - for (uint32_t index = 0; index < nWifi; ++index) - { - auto ipv4 = (trafficDirection == "upstream") ? wifiApNode.Get (0)->GetObject () : wifiStaNodes.Get (index)->GetObject (); - const auto address = ipv4->GetAddress (1, 0).GetLocal (); - InetSocketAddress sinkSocket (address, portNumber++); - OnOffHelper onOffHelper ("ns3::UdpSocketFactory", sinkSocket); - onOffHelper.SetAttribute ("OnTime", StringValue ("ns3::ConstantRandomVariable[Constant=1]")); - onOffHelper.SetAttribute ("OffTime", StringValue ("ns3::ConstantRandomVariable[Constant=0]")); - onOffHelper.SetAttribute ("DataRate", DataRateValue (50000000 / nWifi)); - onOffHelper.SetAttribute ("PacketSize", UintegerValue (1472)); //bytes - PacketSinkHelper packetSinkHelper ("ns3::UdpSocketFactory", sinkSocket); - if (trafficDirection == "upstream") - { - sourceApplications.Add (onOffHelper.Install (wifiStaNodes.Get (index))); - sinkApplications.Add (packetSinkHelper.Install (wifiApNode.Get (0))); - } - else if (trafficDirection == "downstream") - { - sinkApplications.Add (packetSinkHelper.Install (wifiStaNodes.Get (index))); - sourceApplications.Add (onOffHelper.Install (wifiApNode.Get (0))); - } - else - { - NS_ASSERT_MSG (false, "Invalid trafficDirection!"); - } - } - sinkApplications.Start (Seconds (0.0)); - sinkApplications.Stop (Seconds (simulationTime + 1)); - sourceApplications.Start (Seconds (1.0)); - sourceApplications.Stop (Seconds (simulationTime + 1)); - } - - Config::Connect ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/$ns3::WifiPhy/PhyTxBegin", MakeCallback (&TxCallback)); - - if (enablePcap) - { - phy.EnablePcap ("wifi_pcf", apDevice.Get (0)); - } - - Simulator::Stop (Seconds (simulationTime + 1)); - Simulator::Run (); - - double throughput = 0; - for (uint32_t index = 0; index < sinkApplications.GetN (); ++index) - { - uint64_t totalPacketsThrough = DynamicCast (sinkApplications.Get (index))->GetTotalRx (); - throughput += ((totalPacketsThrough * 8) / (simulationTime * 1000000.0)); //Mbit/s - } - - std::cout << "Throughput: " << throughput << " Mbit/s" << std::endl; - - std::cout << "# tx beacons: " << m_countBeacon << std::endl; - std::cout << "# tx CF-END: " << m_countCfEnd << std::endl; - std::cout << "# tx CF-END-ACK: " << m_countCfEndAck << std::endl; - std::cout << "# tx CF-POLL: " << m_countCfPoll << std::endl; - std::cout << "# tx CF-POLL-ACK: " << m_countCfPollAck << std::endl; - std::cout << "# tx CF-POLL-DATA: " << m_countCfPollData << std::endl; - std::cout << "# tx CF-POLL-DATA-ACK: " << m_countCfPollDataAck << std::endl; - std::cout << "# tx DATA-NULL: " << m_countDataNull << std::endl; - std::cout << "# tx DATA: " << m_countData << std::endl; - - Simulator::Destroy (); - return 0; -} diff --git a/examples/wireless/wscript b/examples/wireless/wscript index 6822ca674..93a0b3662 100644 --- a/examples/wireless/wscript +++ b/examples/wireless/wscript @@ -116,9 +116,6 @@ def build(bld): obj = bld.create_ns3_program('wifi-backward-compatibility', ['wifi', 'applications']) obj.source = 'wifi-backward-compatibility.cc' - obj = bld.create_ns3_program('wifi-pcf', ['wifi', 'applications']) - obj.source = 'wifi-pcf.cc' - obj = bld.create_ns3_program('wifi-spatial-reuse', ['wifi', 'applications']) obj.source = 'wifi-spatial-reuse.cc' diff --git a/src/wifi/model/ap-wifi-mac.cc b/src/wifi/model/ap-wifi-mac.cc index 43f7ba6e8..5e35edfa0 100644 --- a/src/wifi/model/ap-wifi-mac.cc +++ b/src/wifi/model/ap-wifi-mac.cc @@ -57,11 +57,6 @@ ApWifiMac::GetTypeId (void) MakeTimeAccessor (&ApWifiMac::GetBeaconInterval, &ApWifiMac::SetBeaconInterval), MakeTimeChecker ()) - .AddAttribute ("CfpMaxDuration", "The maximum size of the CFP (used when AP supports PCF)", - TimeValue (MicroSeconds (51200)), - MakeTimeAccessor (&ApWifiMac::GetCfpMaxDuration, - &ApWifiMac::SetCfpMaxDuration), - MakeTimeChecker ()) .AddAttribute ("BeaconJitter", "A uniform random variable to cause the initial beacon starting time (after simulation time 0) " "to be distributed between 0 and the BeaconInterval.", @@ -104,7 +99,6 @@ ApWifiMac::ApWifiMac () m_beaconTxop->SetChannelAccessManager (m_channelAccessManager); m_beaconTxop->SetTxMiddle (m_txMiddle); m_beaconTxop->SetTxOkCallback (MakeCallback (&ApWifiMac::TxOk, this)); - m_rxMiddle->SetPcfCallback (MakeCallback (&ApWifiMac::SendNextCfFrame, this)); //Let the lower layers know that we are acting as an AP. SetTypeOfStation (AP); @@ -165,13 +159,6 @@ ApWifiMac::GetBeaconInterval (void) const return m_low->GetBeaconInterval (); } -Time -ApWifiMac::GetCfpMaxDuration (void) const -{ - NS_LOG_FUNCTION (this); - return m_low->GetCfpMaxDuration (); -} - void ApWifiMac::SetWifiRemoteStationManager (const Ptr stationManager) { @@ -208,17 +195,6 @@ ApWifiMac::SetBeaconInterval (Time interval) m_low->SetBeaconInterval (interval); } -void -ApWifiMac::SetCfpMaxDuration (Time duration) -{ - NS_LOG_FUNCTION (this << duration); - if ((duration.GetMicroSeconds () % 1024) != 0) - { - NS_LOG_WARN ("CFP max duration should be multiple of 1024us (802.11 time unit)"); - } - m_low->SetCfpMaxDuration (duration); -} - int64_t ApWifiMac::AssignStreams (int64_t stream) { @@ -547,21 +523,6 @@ ApWifiMac::GetEdcaParameterSet (void) const return edcaParameters; } -CfParameterSet -ApWifiMac::GetCfParameterSet (void) const -{ - CfParameterSet cfParameterSet; - if (GetPcfSupported () && !m_cfPollingList.empty ()) - { - cfParameterSet.SetPcfSupported (1); - cfParameterSet.SetCFPCount (0); - cfParameterSet.SetCFPPeriod (1); - cfParameterSet.SetCFPMaxDurationUs (GetCfpMaxDuration ().GetMicroSeconds ()); - cfParameterSet.SetCFPDurRemainingUs (GetCfpMaxDuration ().GetMicroSeconds ()); - } - return cfParameterSet; -} - HtOperation ApWifiMac::GetHtOperation (void) const { @@ -881,10 +842,6 @@ ApWifiMac::SendOneBeacon (void) beacon.SetCapabilities (GetCapabilities ()); m_stationManager->SetShortPreambleEnabled (GetShortPreambleEnabled ()); m_stationManager->SetShortSlotTimeEnabled (GetShortSlotTimeEnabled ()); - if (GetPcfSupported ()) - { - beacon.SetCfParameterSet (GetCfParameterSet ()); - } if (GetDsssSupported ()) { beacon.SetDsssParameterSet (GetDsssParameterSet ()); @@ -937,39 +894,6 @@ ApWifiMac::SendOneBeacon (void) } } -void -ApWifiMac::SendNextCfFrame (void) -{ - if (!GetPcfSupported ()) - { - return; - } - if (m_txop->CanStartNextPolling ()) - { - SendCfPoll (); - } - else if (m_low->IsCfPeriod ()) - { - SendCfEnd (); - } -} - -void -ApWifiMac::SendCfPoll (void) -{ - NS_LOG_FUNCTION (this); - NS_ASSERT (GetPcfSupported ()); - m_txop->SendCfFrame (WIFI_MAC_DATA_NULL_CFPOLL, *m_itCfPollingList); -} - -void -ApWifiMac::SendCfEnd (void) -{ - NS_LOG_FUNCTION (this); - NS_ASSERT (GetPcfSupported ()); - m_txop->SendCfFrame (WIFI_MAC_CTL_END, Mac48Address::GetBroadcast ()); -} - void ApWifiMac::TxOk (const WifiMacHeader &hdr) { @@ -981,21 +905,6 @@ ApWifiMac::TxOk (const WifiMacHeader &hdr) NS_LOG_DEBUG ("associated with sta=" << hdr.GetAddr1 ()); m_stationManager->RecordGotAssocTxOk (hdr.GetAddr1 ()); } - else if (hdr.IsBeacon () && GetPcfSupported ()) - { - if (!m_cfPollingList.empty ()) - { - SendCfPoll (); - } - else - { - SendCfEnd (); - } - } - else if (hdr.IsCfPoll ()) - { - IncrementPollingListIterator (); - } } void @@ -1010,11 +919,6 @@ ApWifiMac::TxFailed (const WifiMacHeader &hdr) NS_LOG_DEBUG ("association failed with sta=" << hdr.GetAddr1 ()); m_stationManager->RecordGotAssocTxFailed (hdr.GetAddr1 ()); } - else if (hdr.IsCfPoll ()) - { - IncrementPollingListIterator (); - SendNextCfFrame (); - } } void @@ -1234,14 +1138,6 @@ ApWifiMac::Receive (Ptr mpdu) m_stationManager->AddSupportedMode (from, mode); } } - if (GetPcfSupported () && capabilities.IsCfPollable ()) - { - m_cfPollingList.push_back (from); - if (m_itCfPollingList == m_cfPollingList.end ()) - { - IncrementPollingListIterator (); - } - } if (GetHtSupported ()) { HtCapabilities htCapabilities = assocReq.GetHtCapabilities (); @@ -1608,17 +1504,6 @@ ApWifiMac::GetNextAssociationId (void) return 0; } -void -ApWifiMac::IncrementPollingListIterator (void) -{ - NS_LOG_FUNCTION (this); - m_itCfPollingList++; - if (m_itCfPollingList == m_cfPollingList.end ()) - { - m_itCfPollingList = m_cfPollingList.begin (); - } -} - uint8_t ApWifiMac::GetBufferStatus (uint8_t tid, Mac48Address address) const { diff --git a/src/wifi/model/ap-wifi-mac.h b/src/wifi/model/ap-wifi-mac.h index 9d81c300c..542c6e44f 100644 --- a/src/wifi/model/ap-wifi-mac.h +++ b/src/wifi/model/ap-wifi-mac.h @@ -73,14 +73,6 @@ public: * \return the interval between two beacon transmissions. */ Time GetBeaconInterval (void) const; - /** - * \param duration the maximum duration for the CF period. - */ - void SetCfpMaxDuration (Time duration); - /** - * \return the maximum duration for the CF period. - */ - Time GetCfpMaxDuration (void) const; /** * Determine whether short slot time should be enabled or not in the BSS. * Typically, true is returned only when there is no non-ERP stations associated @@ -228,18 +220,6 @@ private: * Forward a beacon packet to the beacon special DCF. */ void SendOneBeacon (void); - /** - * Determine what is the next PCF frame and trigger its transmission. - */ - void SendNextCfFrame (void); - /** - * Send a CF-Poll packet to the next polling STA. - */ - void SendCfPoll (void); - /** - * Send a CF-End packet. - */ - void SendCfEnd (void); /** * Return the Capability information of the current AP. @@ -259,12 +239,6 @@ private: * \return the EDCA Parameter Set that we support */ EdcaParameterSet GetEdcaParameterSet (void) const; - /** - * Return the CF parameter set of the current AP. - * - * \return the CF parameter set that we support - */ - CfParameterSet GetCfParameterSet (void) const; /** * Return the HT operation of the current AP. * @@ -309,11 +283,6 @@ private: * false otherwise */ bool GetUseNonErpProtection (void) const; - /** - * Increment the PCF polling list iterator to indicate - * that the next polling station can be polled. - */ - void IncrementPollingListIterator (void); void DoDispose (void); void DoInitialize (void); diff --git a/src/wifi/model/channel-access-manager.cc b/src/wifi/model/channel-access-manager.cc index aa0c1645e..2f013e4d2 100644 --- a/src/wifi/model/channel-access-manager.cc +++ b/src/wifi/model/channel-access-manager.cc @@ -298,7 +298,7 @@ ChannelAccessManager::NeedBackoffUponAccess (Ptr txop) } void -ChannelAccessManager::RequestAccess (Ptr txop, bool isCfPeriod) +ChannelAccessManager::RequestAccess (Ptr txop) { NS_LOG_FUNCTION (this << txop); if (m_phy) @@ -310,13 +310,6 @@ ChannelAccessManager::RequestAccess (Ptr txop, bool isCfPeriod) { return; } - if (isCfPeriod) - { - txop->NotifyAccessRequested (); - Time delay = (MostRecent ({GetAccessGrantStart (true), Simulator::Now ()}) - Simulator::Now ()); - m_accessTimeout = Simulator::Schedule (delay, &ChannelAccessManager::DoGrantPcfAccess, this, txop); - return; - } /* * EDCAF operations shall be performed at slot boundaries (Sec. 10.22.2.4 of 802.11-2016) */ @@ -339,12 +332,6 @@ ChannelAccessManager::RequestAccess (Ptr txop, bool isCfPeriod) DoRestartAccessTimeoutIfNeeded (); } -void -ChannelAccessManager::DoGrantPcfAccess (Ptr txop) -{ - txop->NotifyAccessGranted (); -} - void ChannelAccessManager::DoGrantDcfAccess (void) { diff --git a/src/wifi/model/channel-access-manager.h b/src/wifi/model/channel-access-manager.h index 347264360..9a9798c59 100644 --- a/src/wifi/model/channel-access-manager.h +++ b/src/wifi/model/channel-access-manager.h @@ -103,14 +103,13 @@ public: /** * \param txop a Txop - * \param isCfPeriod flag whether it is called during the CF period * * Notify the ChannelAccessManager that a specific Txop needs access to the * medium. The ChannelAccessManager is then responsible for starting an access - * timer and, invoking Txop::DoNotifyAccessGranted when the access + * timer and, invoking FrameExchangeManager::StartTransmission when the access * is granted if it ever gets granted. */ - void RequestAccess (Ptr txop, bool isCfPeriod = false); + void RequestAccess (Ptr txop); /** * Access will never be granted to the medium _before_ @@ -268,12 +267,6 @@ private: * Grant access to Txop using DCF/EDCF contention rules */ void DoGrantDcfAccess (void); - /** - * Grant access to Txop using PCF preemption - * - * \param txop the Txop - */ - void DoGrantPcfAccess (Ptr txop); /** * Return the Short Interframe Space (SIFS) for this PHY. diff --git a/src/wifi/model/mac-low.cc b/src/wifi/model/mac-low.cc index 3b0139a9b..429ace22e 100644 --- a/src/wifi/model/mac-low.cc +++ b/src/wifi/model/mac-low.cc @@ -698,7 +698,6 @@ MacLow::ReceiveError (Ptr psdu) if (IsCfPeriod () && m_currentPacket->GetHeader (0).IsCfPoll ()) { NS_ASSERT (m_currentTxop != 0); - m_currentTxop->MissedCfPollResponse (m_cfAckInfo.expectCfAck); } else if (m_cfAckInfo.expectCfAck) { @@ -956,10 +955,6 @@ MacLow::ReceiveOk (Ptr mpdu, double rxSnr, WifiTxVector txVect m_currentTxop->MissedAck (); } } - if (m_currentTxop != 0) - { - m_currentTxop->GotCfEnd (); - } m_cfAckInfo.expectCfAck = false; } else @@ -1486,7 +1481,6 @@ MacLow::CfPollTimeout (void) if (!busy) { NS_ASSERT (m_currentTxop != 0); - m_currentTxop->MissedCfPollResponse (m_cfAckInfo.expectCfAck); m_cfAckInfo.expectCfAck = false; } } diff --git a/src/wifi/model/mac-rx-middle.cc b/src/wifi/model/mac-rx-middle.cc index 81a3f0eef..eac2069b9 100644 --- a/src/wifi/model/mac-rx-middle.cc +++ b/src/wifi/model/mac-rx-middle.cc @@ -301,10 +301,7 @@ MacRxMiddle::Receive (Ptr mpdu) NS_LOG_FUNCTION (*mpdu); const WifiMacHeader* hdr = &mpdu->GetHeader (); NS_ASSERT (hdr->IsData () || hdr->IsMgt ()); - if (!m_pcfCallback.IsNull ()) - { - m_pcfCallback (); - } + OriginatorRxStatus *originator = Lookup (hdr); /** * The check below is really unneeded because it can fail in a lot of @@ -354,10 +351,4 @@ MacRxMiddle::Receive (Ptr mpdu) } } -void -MacRxMiddle::SetPcfCallback (Callback callback) -{ - m_pcfCallback = callback; -} - } //namespace ns3 diff --git a/src/wifi/model/mac-rx-middle.h b/src/wifi/model/mac-rx-middle.h index 1472ce1f2..f9dd0cbfc 100644 --- a/src/wifi/model/mac-rx-middle.h +++ b/src/wifi/model/mac-rx-middle.h @@ -56,13 +56,6 @@ public: */ void SetForwardCallback (ForwardUpCallback callback); - /** - * Set a callback to trigger the next PCF frame. - * - * \param callback the callback to set - */ - void SetPcfCallback (Callback callback); - /** * Receive a packet. * @@ -133,8 +126,6 @@ private: Originators m_originatorStatus; ///< originator status QosOriginators m_qosOriginatorStatus; ///< QOS originator status ForwardUpCallback m_callback; ///< forward up callback - - Callback m_pcfCallback; //!< PCF callback }; } //namespace ns3 diff --git a/src/wifi/model/sta-wifi-mac.cc b/src/wifi/model/sta-wifi-mac.cc index 64436460c..43b3ab8e3 100644 --- a/src/wifi/model/sta-wifi-mac.cc +++ b/src/wifi/model/sta-wifi-mac.cc @@ -263,14 +263,6 @@ StaWifiMac::SendAssociationRequest (bool isReassoc) &StaWifiMac::AssocRequestTimeout, this); } -void -StaWifiMac::SendCfPollResponse (void) -{ - NS_LOG_FUNCTION (this); - NS_ASSERT (GetPcfSupported ()); - m_txop->SendCfFrame (WIFI_MAC_DATA_NULL, GetBssid ()); -} - void StaWifiMac::TryToEnsureAssociated (void) { @@ -520,10 +512,6 @@ StaWifiMac::Receive (Ptr mpdu) NotifyRxDrop (packet); return; } - else if ((hdr->GetAddr1 () == GetAddress ()) && (hdr->GetAddr2 () == GetBssid ()) && hdr->IsCfPoll ()) - { - SendCfPollResponse (); - } if (hdr->IsData ()) { if (!IsAssociated ()) @@ -586,19 +574,6 @@ StaWifiMac::Receive (Ptr mpdu) NS_LOG_LOGIC ("Beacon is for our SSID"); goodBeacon = true; } - CfParameterSet cfParameterSet = beacon.GetCfParameterSet (); - if (cfParameterSet.GetCFPCount () == 0) - { - //see section 9.3.2.2 802.11-1999 - if (GetPcfSupported ()) - { - m_low->DoNavStartNow (MicroSeconds (cfParameterSet.GetCFPMaxDurationUs ())); - } - else - { - m_low->DoNavStartNow (MicroSeconds (cfParameterSet.GetCFPDurRemainingUs ())); - } - } SupportedRates rates = beacon.GetSupportedRates (); bool bssMembershipSelectorMatch = false; for (uint8_t i = 0; i < m_phy->GetNBssMembershipSelectors (); i++) diff --git a/src/wifi/model/sta-wifi-mac.h b/src/wifi/model/sta-wifi-mac.h index 831f66474..718959ba7 100644 --- a/src/wifi/model/sta-wifi-mac.h +++ b/src/wifi/model/sta-wifi-mac.h @@ -237,10 +237,6 @@ private: * */ void SendAssociationRequest (bool isReassoc); - /** - * Forward a CF-Poll response packet to the CFP queue. - */ - void SendCfPollResponse (void); /** * Try to ensure that we are associated with an AP by taking an appropriate action * depending on the current association status. diff --git a/src/wifi/model/txop.cc b/src/wifi/model/txop.cc index 6f6d03980..35d48c855 100644 --- a/src/wifi/model/txop.cc +++ b/src/wifi/model/txop.cc @@ -714,46 +714,6 @@ Txop::MissedAck (void) RestartAccessIfNeeded (); } -void -Txop::GotCfEnd (void) -{ - NS_LOG_FUNCTION (this); - if (m_currentPacket != 0) - { - RestartAccessIfNeeded (); - } - else - { - StartAccessIfNeeded (); - } -} - -void -Txop::MissedCfPollResponse (bool expectedCfAck) -{ - NS_LOG_FUNCTION (this); - NS_LOG_DEBUG ("missed response to CF-POLL"); - if (expectedCfAck) - { - if (!NeedDataRetransmission (m_currentPacket, m_currentHdr)) - { - NS_LOG_DEBUG ("Ack Fail"); - m_stationManager->ReportFinalDataFailed (Create (m_currentPacket, - m_currentHdr)); - m_currentPacket = 0; - } - else - { - NS_LOG_DEBUG ("Retransmit"); - m_currentHdr.SetRetry (); - } - } - if (!m_txFailedCallback.IsNull ()) - { - m_txFailedCallback (m_currentHdr); - } -} - void Txop::StartNextFragment (void) { @@ -798,84 +758,6 @@ Txop::EndTxNoAck (void) StartAccessIfNeeded (); } -void -Txop::SendCfFrame (WifiMacType frameType, Mac48Address addr) -{ - NS_LOG_FUNCTION (this << frameType << addr); - NS_ASSERT (m_low->IsCfPeriod ()); - if (m_currentPacket != 0 && frameType != WIFI_MAC_CTL_END) - { - if (!NeedDataRetransmission (m_currentPacket, m_currentHdr)) - { - m_stationManager->ReportFinalDataFailed (Create (m_currentPacket, - m_currentHdr)); - m_currentPacket = 0; - } - else - { - m_currentHdr.SetRetry (); - } - } - else if ((m_queue->GetNPacketsByAddress (addr) > 0) && (frameType != WIFI_MAC_CTL_END)) //if no packet for that dest, send to another dest? - { - Ptr item = m_queue->DequeueByAddress (addr); - NS_ASSERT (item != 0); - m_currentPacket = item->GetPacket (); - m_currentHdr = item->GetHeader (); - uint16_t sequence = m_txMiddle->GetNextSequenceNumberFor (&m_currentHdr); - m_currentHdr.SetSequenceNumber (sequence); - m_currentHdr.SetFragmentNumber (0); - m_currentHdr.SetNoMoreFragments (); - m_currentHdr.SetNoRetry (); - } - else - { - m_currentPacket = Create (); - m_currentHdr.SetNoRetry (); - } - - if (m_currentPacket->GetSize () > 0) - { - switch (frameType) - { - case WIFI_MAC_DATA_NULL_CFPOLL: - m_currentHdr.SetType (WIFI_MAC_DATA_CFPOLL); - break; - case WIFI_MAC_DATA_NULL: - m_currentHdr.SetType (WIFI_MAC_DATA); - break; - default: - NS_ASSERT (false); - break; - } - } - else - { - m_currentHdr.SetType (frameType); - } - m_currentHdr.SetAddr1 (addr); - m_currentHdr.SetAddr2 (m_low->GetAddress ()); - if (frameType == WIFI_MAC_DATA_NULL) - { - m_currentHdr.SetAddr3 (m_low->GetBssid ()); - m_currentHdr.SetDsTo (); - m_currentHdr.SetDsNotFrom (); - } - else - { - m_currentHdr.SetAddr3 (m_low->GetAddress ()); - m_currentHdr.SetDsNotTo (); - m_currentHdr.SetDsFrom (); - } - m_channelAccessManager->RequestAccess (this, true); -} - -bool -Txop::CanStartNextPolling () const -{ - return (!m_channelAccessManager->IsBusy () && GetLow ()->CanTransmitNextCfFrame ()); -} - bool Txop::IsQosTxop () const { diff --git a/src/wifi/model/txop.h b/src/wifi/model/txop.h index fb80c6bee..e8ebe4577 100644 --- a/src/wifi/model/txop.h +++ b/src/wifi/model/txop.h @@ -261,14 +261,6 @@ public: */ virtual void Queue (Ptr packet, const WifiMacHeader &hdr); - /** - * Sends CF frame to STA with address addr. - * - * \param frameType the type of frame to be transmitted. - * \param addr address of the recipient. - */ - void SendCfFrame (WifiMacType frameType, Mac48Address addr); - /* Event handlers */ /** * Event handler when a CTS timeout has occurred. @@ -282,16 +274,6 @@ public: * Event handler when an Ack is missed. */ virtual void MissedAck (void); - /** - * Event handler when a CF-END frame is received. - */ - void GotCfEnd (void); - /** - * Event handler when a response to a CF-POLL frame is missed. - * - * \param expectedCfAck flag to indicate whether a CF-Ack was expected in the response. - */ - void MissedCfPollResponse (bool expectedCfAck); /** * Event handler when a BlockAck is received. * @@ -352,15 +334,6 @@ public: */ virtual void NotifyChannelReleased (void); - /** - * Check if the next PCF transmission can fit in the remaining CFP duration. - * - * \return true if the next PCF transmission can fit in the remaining CFP duration, - * false otherwise - */ - bool CanStartNextPolling (void) const; - - /** * Assign a fixed random variable stream number to the random variables * used by this model. Return the number of streams (possibly zero) that