diff --git a/src/wifi/model/mac-low.cc b/src/wifi/model/mac-low.cc index 648042270..7349dd1a7 100644 --- a/src/wifi/model/mac-low.cc +++ b/src/wifi/model/mac-low.cc @@ -1145,22 +1145,194 @@ MacLow::GetDataTxVector (Ptr packet, const WifiMacHeader *hdr) con return m_stationManager->GetDataTxVector (to, hdr, packet); } +WifiMode +MacLow::GetControlAnswerMode (WifiMode reqMode) const +{ + /** + * The standard has relatively unambiguous rules for selecting a + * control response rate (the below is quoted from IEEE 802.11-2012, + * Section 9.7): + * + * To allow the transmitting STA to calculate the contents of the + * Duration/ID field, a STA responding to a received frame shall + * transmit its Control Response frame (either CTS or ACK), other + * than the BlockAck control frame, at the highest rate in the + * BSSBasicRateSet parameter that is less than or equal to the + * rate of the immediately previous frame in the frame exchange + * sequence (as defined in Annex G) and that is of the same + * modulation class (see Section 9.7.8) as the received frame... + */ + NS_LOG_FUNCTION (this << reqMode); + WifiMode mode = m_stationManager->GetDefaultMode (); + bool found = false; + //First, search the BSS Basic Rate set + for (uint8_t i = 0; i < m_stationManager->GetNBasicModes (); i++) + { + WifiMode testMode = m_stationManager->GetBasicMode (i); + if ((!found || testMode.IsHigherDataRate (mode)) + && (!testMode.IsHigherDataRate (reqMode)) + && (IsAllowedControlAnswerModulationClass (reqMode.GetModulationClass (), testMode.GetModulationClass ()))) + { + mode = testMode; + //We've found a potentially-suitable transmit rate, but we + //need to continue and consider all the basic rates before + //we can be sure we've got the right one. + found = true; + } + } + if (m_stationManager->GetHtSupported () || m_stationManager->GetVhtSupported () || m_stationManager->GetHeSupported ()) + { + if (!found) + { + mode = m_stationManager->GetDefaultMcs (); + for (uint8_t i = 0; i != m_stationManager->GetNBasicMcs (); i++) + { + WifiMode testMode = m_stationManager->GetBasicMcs (i); + if ((!found || testMode.IsHigherDataRate (mode)) + && (!testMode.IsHigherDataRate (reqMode)) + && (testMode.GetModulationClass () == reqMode.GetModulationClass ())) + { + mode = testMode; + //We've found a potentially-suitable transmit rate, but we + //need to continue and consider all the basic rates before + //we can be sure we've got the right one. + found = true; + } + } + } + } + //If we found a suitable rate in the BSSBasicRateSet, then we are + //done and can return that mode. + if (found) + { + NS_LOG_DEBUG ("MacLow::GetControlAnswerMode returning " << mode); + return mode; + } + + /** + * If no suitable basic rate was found, we search the mandatory + * rates. The standard (IEEE 802.11-2007, Section 9.6) says: + * + * ...If no rate contained in the BSSBasicRateSet parameter meets + * these conditions, then the control frame sent in response to a + * received frame shall be transmitted at the highest mandatory + * rate of the PHY that is less than or equal to the rate of the + * received frame, and that is of the same modulation class as the + * received frame. In addition, the Control Response frame shall + * be sent using the same PHY options as the received frame, + * unless they conflict with the requirement to use the + * BSSBasicRateSet parameter. + * + * \todo Note that we're ignoring the last sentence for now, because + * there is not yet any manipulation here of PHY options. + */ + for (uint8_t idx = 0; idx < m_phy->GetNModes (); idx++) + { + WifiMode thismode = m_phy->GetMode (idx); + /* If the rate: + * + * - is a mandatory rate for the PHY, and + * - is equal to or faster than our current best choice, and + * - is less than or equal to the rate of the received frame, and + * - is of the same modulation class as the received frame + * + * ...then it's our best choice so far. + */ + if (thismode.IsMandatory () + && (!found || thismode.IsHigherDataRate (mode)) + && (!thismode.IsHigherDataRate (reqMode)) + && (IsAllowedControlAnswerModulationClass (reqMode.GetModulationClass (), thismode.GetModulationClass ()))) + { + mode = thismode; + //As above; we've found a potentially-suitable transmit + //rate, but we need to continue and consider all the + //mandatory rates before we can be sure we've got the right one. + found = true; + } + } + if (m_stationManager->GetHtSupported () || m_stationManager->GetVhtSupported () || m_stationManager->GetHeSupported ()) + { + for (uint8_t idx = 0; idx < m_phy->GetNMcs (); idx++) + { + WifiMode thismode = m_phy->GetMcs (idx); + if (thismode.IsMandatory () + && (!found || thismode.IsHigherDataRate (mode)) + && (!thismode.IsHigherCodeRate (reqMode)) + && (thismode.GetModulationClass () == reqMode.GetModulationClass ())) + { + mode = thismode; + //As above; we've found a potentially-suitable transmit + //rate, but we need to continue and consider all the + //mandatory rates before we can be sure we've got the right one. + found = true; + } + } + } + + /** + * If we still haven't found a suitable rate for the response then + * someone has messed up the simulation config. This probably means + * that the WifiPhyStandard is not set correctly, or that a rate that + * is not supported by the PHY has been explicitly requested. + * + * Either way, it is serious - we can either disobey the standard or + * fail, and I have chosen to do the latter... + */ + if (!found) + { + NS_FATAL_ERROR ("Can't find response rate for " << reqMode); + } + + NS_LOG_DEBUG ("MacLow::GetControlAnswerMode returning " << mode); + return mode; +} + WifiTxVector MacLow::GetCtsTxVector (Mac48Address to, WifiMode rtsTxMode) const { - return m_stationManager->GetCtsTxVector (to, rtsTxMode); + NS_ASSERT (!to.IsGroup ()); + WifiMode ctsMode = GetControlAnswerMode (rtsTxMode); + WifiTxVector v; + v.SetMode (ctsMode); + v.SetPreambleType (GetPreambleForTransmission (ctsMode.GetModulationClass (), m_stationManager->GetShortPreambleEnabled (), m_stationManager->UseGreenfieldForDestination (to))); + v.SetTxPowerLevel (m_stationManager->GetDefaultTxPowerLevel ()); + v.SetChannelWidth (GetChannelWidthForTransmission (ctsMode, m_phy->GetChannelWidth ())); + uint16_t ctsTxGuardInterval = ConvertGuardIntervalToNanoSeconds (ctsMode, m_phy->GetShortGuardInterval (), m_phy->GetGuardInterval ()); + v.SetGuardInterval (ctsTxGuardInterval); + v.SetNss (1); + return v; } WifiTxVector MacLow::GetAckTxVector (Mac48Address to, WifiMode dataTxMode) const { - return m_stationManager->GetAckTxVector (to, dataTxMode); + NS_ASSERT (!to.IsGroup ()); + WifiMode ackMode = GetControlAnswerMode (dataTxMode); + WifiTxVector v; + v.SetMode (ackMode); + v.SetPreambleType (GetPreambleForTransmission (ackMode.GetModulationClass (), m_stationManager->GetShortPreambleEnabled (), m_stationManager->UseGreenfieldForDestination (to))); + v.SetTxPowerLevel (m_stationManager->GetDefaultTxPowerLevel ()); + v.SetChannelWidth (GetChannelWidthForTransmission (ackMode, m_phy->GetChannelWidth ())); + uint16_t ackTxGuardInterval = ConvertGuardIntervalToNanoSeconds (ackMode, m_phy->GetShortGuardInterval (), m_phy->GetGuardInterval ()); + v.SetGuardInterval (ackTxGuardInterval); + v.SetNss (1); + return v; } WifiTxVector MacLow::GetBlockAckTxVector (Mac48Address to, WifiMode dataTxMode) const { - return m_stationManager->GetBlockAckTxVector (to, dataTxMode); + NS_ASSERT (!to.IsGroup ()); + WifiMode blockAckMode = GetControlAnswerMode (dataTxMode); + WifiTxVector v; + v.SetMode (blockAckMode); + v.SetPreambleType (GetPreambleForTransmission (blockAckMode.GetModulationClass (), m_stationManager->GetShortPreambleEnabled (), m_stationManager->UseGreenfieldForDestination (to))); + v.SetTxPowerLevel (m_stationManager->GetDefaultTxPowerLevel ()); + v.SetChannelWidth (GetChannelWidthForTransmission (blockAckMode, m_phy->GetChannelWidth ())); +uint16_t blockAckTxGuardInterval = ConvertGuardIntervalToNanoSeconds (blockAckMode, m_phy->GetShortGuardInterval (), m_phy->GetGuardInterval ()); + v.SetGuardInterval (blockAckTxGuardInterval); + v.SetNss (1); + return v; } WifiTxVector diff --git a/src/wifi/model/mac-low.h b/src/wifi/model/mac-low.h index f230449bd..48d631574 100644 --- a/src/wifi/model/mac-low.h +++ b/src/wifi/model/mac-low.h @@ -541,6 +541,14 @@ private: * \return TXVECTOR for the Block ACK */ WifiTxVector GetAckTxVectorForData (Mac48Address to, WifiMode dataTxMode) const; + /** + * Get control answer mode function. + * + * \param reqMode request mode + * + * \return control answer mode + */ + WifiMode GetControlAnswerMode (WifiMode reqMode) const; /** * Return the time required to transmit the CTS (including preamble and FCS). * diff --git a/src/wifi/model/wifi-remote-station-manager.cc b/src/wifi/model/wifi-remote-station-manager.cc index 53ca3ae65..8e598e71f 100644 --- a/src/wifi/model/wifi-remote-station-manager.cc +++ b/src/wifi/model/wifi-remote-station-manager.cc @@ -1055,288 +1055,6 @@ WifiRemoteStationManager::IsLastFragment (Mac48Address address, const WifiMacHea return isLast; } -WifiMode -WifiRemoteStationManager::GetControlAnswerMode (WifiMode reqMode) -{ - /** - * The standard has relatively unambiguous rules for selecting a - * control response rate (the below is quoted from IEEE 802.11-2012, - * Section 9.7): - * - * To allow the transmitting STA to calculate the contents of the - * Duration/ID field, a STA responding to a received frame shall - * transmit its Control Response frame (either CTS or ACK), other - * than the BlockAck control frame, at the highest rate in the - * BSSBasicRateSet parameter that is less than or equal to the - * rate of the immediately previous frame in the frame exchange - * sequence (as defined in Annex G) and that is of the same - * modulation class (see Section 9.7.8) as the received frame... - */ - NS_LOG_FUNCTION (this << reqMode); - WifiMode mode = GetDefaultMode (); - bool found = false; - //First, search the BSS Basic Rate set - for (WifiModeListIterator i = m_bssBasicRateSet.begin (); i != m_bssBasicRateSet.end (); i++) - { - if ((!found || i->IsHigherDataRate (mode)) - && (!i->IsHigherDataRate (reqMode)) - && (IsAllowedControlAnswerModulationClass (reqMode.GetModulationClass (), i->GetModulationClass ()))) - { - mode = *i; - //We've found a potentially-suitable transmit rate, but we - //need to continue and consider all the basic rates before - //we can be sure we've got the right one. - found = true; - } - } - if (GetHtSupported () || GetVhtSupported () || GetHeSupported ()) - { - if (!found) - { - mode = GetDefaultMcs (); - for (WifiModeListIterator i = m_bssBasicMcsSet.begin (); i != m_bssBasicMcsSet.end (); i++) - { - if ((!found || i->IsHigherDataRate (mode)) - && (!i->IsHigherDataRate (reqMode)) - && (i->GetModulationClass () == reqMode.GetModulationClass ())) - { - mode = *i; - //We've found a potentially-suitable transmit rate, but we - //need to continue and consider all the basic rates before - //we can be sure we've got the right one. - found = true; - } - } - } - } - //If we found a suitable rate in the BSSBasicRateSet, then we are - //done and can return that mode. - if (found) - { - NS_LOG_DEBUG ("WifiRemoteStationManager::GetControlAnswerMode returning " << mode); - return mode; - } - - /** - * If no suitable basic rate was found, we search the mandatory - * rates. The standard (IEEE 802.11-2007, Section 9.6) says: - * - * ...If no rate contained in the BSSBasicRateSet parameter meets - * these conditions, then the control frame sent in response to a - * received frame shall be transmitted at the highest mandatory - * rate of the PHY that is less than or equal to the rate of the - * received frame, and that is of the same modulation class as the - * received frame. In addition, the Control Response frame shall - * be sent using the same PHY options as the received frame, - * unless they conflict with the requirement to use the - * BSSBasicRateSet parameter. - * - * \todo Note that we're ignoring the last sentence for now, because - * there is not yet any manipulation here of PHY options. - */ - for (uint8_t idx = 0; idx < m_wifiPhy->GetNModes (); idx++) - { - WifiMode thismode = m_wifiPhy->GetMode (idx); - /* If the rate: - * - * - is a mandatory rate for the PHY, and - * - is equal to or faster than our current best choice, and - * - is less than or equal to the rate of the received frame, and - * - is of the same modulation class as the received frame - * - * ...then it's our best choice so far. - */ - if (thismode.IsMandatory () - && (!found || thismode.IsHigherDataRate (mode)) - && (!thismode.IsHigherDataRate (reqMode)) - && (IsAllowedControlAnswerModulationClass (reqMode.GetModulationClass (), thismode.GetModulationClass ()))) - { - mode = thismode; - //As above; we've found a potentially-suitable transmit - //rate, but we need to continue and consider all the - //mandatory rates before we can be sure we've got the right one. - found = true; - } - } - if (GetHtSupported () || GetVhtSupported () || GetHeSupported ()) - { - for (uint8_t idx = 0; idx < m_wifiPhy->GetNMcs (); idx++) - { - WifiMode thismode = m_wifiPhy->GetMcs (idx); - if (thismode.IsMandatory () - && (!found || thismode.IsHigherDataRate (mode)) - && (!thismode.IsHigherCodeRate (reqMode)) - && (thismode.GetModulationClass () == reqMode.GetModulationClass ())) - { - mode = thismode; - //As above; we've found a potentially-suitable transmit - //rate, but we need to continue and consider all the - //mandatory rates before we can be sure we've got the right one. - found = true; - } - } - } - - /** - * If we still haven't found a suitable rate for the response then - * someone has messed up the simulation config. This probably means - * that the WifiPhyStandard is not set correctly, or that a rate that - * is not supported by the PHY has been explicitly requested in a - * WifiRemoteStationManager (or descendant) configuration. - * - * Either way, it is serious - we can either disobey the standard or - * fail, and I have chosen to do the latter... - */ - if (!found) - { - NS_FATAL_ERROR ("Can't find response rate for " << reqMode); - } - - NS_LOG_DEBUG ("WifiRemoteStationManager::GetControlAnswerMode returning " << mode); - return mode; -} - -WifiTxVector -WifiRemoteStationManager::GetCtsTxVector (Mac48Address address, WifiMode rtsMode) -{ - NS_ASSERT (!address.IsGroup ()); - WifiMode ctsMode = GetControlAnswerMode (rtsMode); - WifiTxVector v; - v.SetMode (ctsMode); - v.SetPreambleType (GetPreambleForTransmission (ctsMode.GetModulationClass (), GetShortPreambleEnabled (), UseGreenfieldForDestination (address))); - v.SetTxPowerLevel (DoGetCtsTxPowerLevel (address, ctsMode)); - v.SetChannelWidth (GetChannelWidthForTransmission (ctsMode, DoGetCtsTxChannelWidth (address, ctsMode))); - v.SetGuardInterval (DoGetCtsTxGuardInterval (address, ctsMode)); - v.SetNss (DoGetCtsTxNss (address, ctsMode)); - v.SetNess (DoGetCtsTxNess (address, ctsMode)); - v.SetStbc (0); - return v; -} - -WifiTxVector -WifiRemoteStationManager::GetAckTxVector (Mac48Address address, WifiMode dataMode) -{ - NS_ASSERT (!address.IsGroup ()); - WifiMode ackMode = GetControlAnswerMode (dataMode); - WifiTxVector v; - v.SetMode (ackMode); - v.SetPreambleType (GetPreambleForTransmission (ackMode.GetModulationClass (), GetShortPreambleEnabled (), UseGreenfieldForDestination (address))); - v.SetTxPowerLevel (DoGetAckTxPowerLevel (address, ackMode)); - v.SetChannelWidth (GetChannelWidthForTransmission (ackMode, DoGetAckTxChannelWidth (address, ackMode))); - v.SetGuardInterval (DoGetAckTxGuardInterval (address, ackMode)); - v.SetNss (DoGetAckTxNss (address, ackMode)); - v.SetNess (DoGetAckTxNess (address, ackMode)); - v.SetStbc (0); - return v; -} - -WifiTxVector -WifiRemoteStationManager::GetBlockAckTxVector (Mac48Address address, WifiMode blockAckReqMode) -{ - NS_ASSERT (!address.IsGroup ()); - WifiMode blockAckMode = GetControlAnswerMode (blockAckReqMode); - WifiTxVector v; - v.SetMode (blockAckMode); - v.SetPreambleType (GetPreambleForTransmission (blockAckMode.GetModulationClass (), GetShortPreambleEnabled (), UseGreenfieldForDestination (address))); - v.SetTxPowerLevel (DoGetBlockAckTxPowerLevel (address, blockAckMode)); - v.SetChannelWidth (GetChannelWidthForTransmission (blockAckMode, DoGetBlockAckTxChannelWidth (address, blockAckMode))); - v.SetGuardInterval (DoGetBlockAckTxGuardInterval (address, blockAckMode)); - v.SetNss (DoGetBlockAckTxNss (address, blockAckMode)); - v.SetNess (DoGetBlockAckTxNess (address, blockAckMode)); - v.SetStbc (0); - return v; -} - -uint8_t -WifiRemoteStationManager::DoGetCtsTxPowerLevel (Mac48Address address, WifiMode ctsMode) -{ - return m_defaultTxPowerLevel; -} - -uint16_t -WifiRemoteStationManager::DoGetCtsTxChannelWidth (Mac48Address address, WifiMode ctsMode) -{ - return m_wifiPhy->GetChannelWidth (); -} - -uint16_t -WifiRemoteStationManager::DoGetCtsTxGuardInterval (Mac48Address address, WifiMode ctsMode) -{ - return ConvertGuardIntervalToNanoSeconds (ctsMode, DynamicCast (m_wifiPhy->GetDevice ())); -} - -uint8_t -WifiRemoteStationManager::DoGetCtsTxNss (Mac48Address address, WifiMode ctsMode) -{ - return 1; -} - -uint8_t -WifiRemoteStationManager::DoGetCtsTxNess (Mac48Address address, WifiMode ctsMode) -{ - return 0; -} - -uint8_t -WifiRemoteStationManager::DoGetAckTxPowerLevel (Mac48Address address, WifiMode ackMode) -{ - return m_defaultTxPowerLevel; -} - -uint16_t -WifiRemoteStationManager::DoGetAckTxChannelWidth (Mac48Address address, WifiMode ctsMode) -{ - return m_wifiPhy->GetChannelWidth (); -} - -uint16_t -WifiRemoteStationManager::DoGetAckTxGuardInterval (Mac48Address address, WifiMode ackMode) -{ - return ConvertGuardIntervalToNanoSeconds (ackMode, DynamicCast (m_wifiPhy->GetDevice ())); -} - -uint8_t -WifiRemoteStationManager::DoGetAckTxNss (Mac48Address address, WifiMode ackMode) -{ - return 1; -} - -uint8_t -WifiRemoteStationManager::DoGetAckTxNess (Mac48Address address, WifiMode ackMode) -{ - return 0; -} - -uint8_t -WifiRemoteStationManager::DoGetBlockAckTxPowerLevel (Mac48Address address, WifiMode blockAckMode) -{ - return m_defaultTxPowerLevel; -} - -uint16_t -WifiRemoteStationManager::DoGetBlockAckTxChannelWidth (Mac48Address address, WifiMode ctsMode) -{ - return m_wifiPhy->GetChannelWidth (); -} - -uint16_t -WifiRemoteStationManager::DoGetBlockAckTxGuardInterval (Mac48Address address, WifiMode blockAckMode) -{ - return ConvertGuardIntervalToNanoSeconds (blockAckMode, DynamicCast (m_wifiPhy->GetDevice ())); -} - -uint8_t -WifiRemoteStationManager::DoGetBlockAckTxNss (Mac48Address address, WifiMode blockAckMode) -{ - return 1; -} - -uint8_t -WifiRemoteStationManager::DoGetBlockAckTxNess (Mac48Address address, WifiMode blockAckMode) -{ - return 0; -} - uint8_t WifiRemoteStationManager::GetDefaultTxPowerLevel (void) const { diff --git a/src/wifi/model/wifi-remote-station-manager.h b/src/wifi/model/wifi-remote-station-manager.h index aeb1ec377..1e7bb09ec 100644 --- a/src/wifi/model/wifi-remote-station-manager.h +++ b/src/wifi/model/wifi-remote-station-manager.h @@ -848,27 +848,6 @@ public: bool IsLastFragment (Mac48Address address, const WifiMacHeader *header, Ptr packet, uint32_t fragmentNumber); - /** - * \param address remote address - * \param rtsMode the transmission mode used to send an RTS we just received - * - * \return the transmission mode to use for the CTS to complete the RTS/CTS handshake. - */ - WifiTxVector GetCtsTxVector (Mac48Address address, WifiMode rtsMode); - /** - * \param address - * \param dataMode the transmission mode used to send an ACK we just received - * - * \return the transmission mode to use for the ACK to complete the data/ACK handshake. - */ - WifiTxVector GetAckTxVector (Mac48Address address, WifiMode dataMode); - /** - * \param address - * \param dataMode the transmission mode used to send an ACK we just received - * - * \return the transmission mode to use for the ACK to complete the data/ACK handshake. - */ - WifiTxVector GetBlockAckTxVector (Mac48Address address, WifiMode dataMode); /** * \return the default transmission power */ @@ -893,6 +872,14 @@ public: * \return the maximum number of spatial streams supported by the phy layer */ uint8_t GetMaxNumberOfTransmitStreams (void) const; + /** + * \returns whether HT greenfield should be used for a given destination address. + * + * \param dest the destination address + * + * \return whether HT greenfield should be used for a given destination address + */ + bool UseGreenfieldForDestination (Mac48Address dest) const; /** * TracedCallback signature for power change events. @@ -1071,14 +1058,6 @@ protected: * \return the number of Ness the station has */ uint8_t GetNess (const WifiRemoteStation *station) const; - /** - * \returns whether HT greenfield should be used for a given destination address. - * - * \param dest the destination address - * - * \return whether HT greenfield should be used for a given destination address - */ - bool UseGreenfieldForDestination (Mac48Address dest) const; /** * Return the WifiPhy. @@ -1163,112 +1142,6 @@ private: * to decide which transmission mode to use for the rts. */ virtual WifiTxVector DoGetRtsTxVector (WifiRemoteStation *station) = 0; - /** - * \param address the address of the recipient of the CTS - * \param ctsMode the mode to be used for the CTS - * - * \return the power level to be used to send the CTS - */ - virtual uint8_t DoGetCtsTxPowerLevel (Mac48Address address, WifiMode ctsMode); - /** - * \param address the address of the recipient of the ACK - * \param ackMode the mode to be used for the ACK - * - * \return the power level to be used to send the ACK - */ - virtual uint8_t DoGetAckTxPowerLevel (Mac48Address address, WifiMode ackMode); - /** - * \param address the address of the recipient of the Block ACK - * \param blockAckMode the mode to be used for the Block ACK - * - * \return the power level to be used to send the Block ACK - */ - virtual uint8_t DoGetBlockAckTxPowerLevel (Mac48Address address, WifiMode blockAckMode); - - /** - * \param address the address of the recipient - * \param ctsMode the mode to be used - * - * \return the CTS transmit channel width - */ - virtual uint16_t DoGetCtsTxChannelWidth (Mac48Address address, WifiMode ctsMode); - /** - * \param address the address of the recipient - * \param ctsMode the mode to be used - * - * \return the CTS transmit guard interval - */ - virtual uint16_t DoGetCtsTxGuardInterval (Mac48Address address, WifiMode ctsMode); - /** - * \param address the address of the recipient - * \param ctsMode the mode to be used - * - * \return the CTS transmit NSS - */ - virtual uint8_t DoGetCtsTxNss (Mac48Address address, WifiMode ctsMode); - /** - * \param address the address of the recipient - * \param ctsMode the mode to be used - * - * \return the CTS transmit NESS - */ - virtual uint8_t DoGetCtsTxNess (Mac48Address address, WifiMode ctsMode); - /** - * \param address the address of the recipient - * \param ctsMode the mode to be used - * - * \return the ack transmit channel width - */ - virtual uint16_t DoGetAckTxChannelWidth (Mac48Address address, WifiMode ctsMode); - /** - * \param address the address of the recipient - * \param ackMode the mode to be used - * - * \return the ack transmit guard interval - */ - virtual uint16_t DoGetAckTxGuardInterval (Mac48Address address, WifiMode ackMode); - /** - * \param address the address of the recipient - * \param ackMode the mode to be used - * - * \return the ack transmit NSS - */ - virtual uint8_t DoGetAckTxNss (Mac48Address address, WifiMode ackMode); - /** - * \param address the address of the recipient - * \param ackMode the mode to be used - * - * \return the ack transmit NESS - */ - virtual uint8_t DoGetAckTxNess (Mac48Address address, WifiMode ackMode); - /** - * \param address the address of the recipient - * \param ctsMode the mode to be used - * - * \return the block ack transmit channel width - */ - virtual uint16_t DoGetBlockAckTxChannelWidth (Mac48Address address, WifiMode ctsMode); - /** - * \param address the address of the recipient - * \param blockAckMode the mode to be used - * - * \return the block ack transmit guard interval - */ - virtual uint16_t DoGetBlockAckTxGuardInterval (Mac48Address address, WifiMode blockAckMode); - /** - * \param address the address of the recipient - * \param blockAckMode the mode to be used - * - * \return the block ack transmit NSS - */ - virtual uint8_t DoGetBlockAckTxNss (Mac48Address address, WifiMode blockAckMode); - /** - * \param address the address of the recipient - * \param blockAckMode the mode to be used - * - * \return the block ack transmit NESS - */ - virtual uint8_t DoGetBlockAckTxNess (Mac48Address address, WifiMode blockAckMode); /** * This method is a pure virtual method that must be implemented by the sub-class. @@ -1373,15 +1246,6 @@ private: */ WifiRemoteStation* Lookup (Mac48Address address, const WifiMacHeader *header) const; - /** - * Get control answer mode function. - * - * \param reqMode request mode - * - * \return control answer mode - */ - WifiMode GetControlAnswerMode (WifiMode reqMode); - /** * Actually sets the fragmentation threshold, it also checks the validity of * the given threshold.