wifi: Ensure mgt and ctrl frames are protected if needed
This commit is contained in:
@@ -133,14 +133,16 @@ HtFrameExchangeManager::NeedSetupBlockAck(Mac48Address recipient, uint8_t tid)
|
|||||||
return establish;
|
return establish;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
bool
|
||||||
HtFrameExchangeManager::SendAddBaRequest(Mac48Address dest,
|
HtFrameExchangeManager::SendAddBaRequest(Mac48Address dest,
|
||||||
uint8_t tid,
|
uint8_t tid,
|
||||||
uint16_t startingSeq,
|
uint16_t startingSeq,
|
||||||
uint16_t timeout,
|
uint16_t timeout,
|
||||||
bool immediateBAck)
|
bool immediateBAck,
|
||||||
|
Time availableTime)
|
||||||
{
|
{
|
||||||
NS_LOG_FUNCTION(this << dest << +tid << startingSeq << timeout << immediateBAck);
|
NS_LOG_FUNCTION(this << dest << +tid << startingSeq << timeout << immediateBAck
|
||||||
|
<< availableTime);
|
||||||
NS_LOG_DEBUG("Send ADDBA request to " << dest);
|
NS_LOG_DEBUG("Send ADDBA request to " << dest);
|
||||||
|
|
||||||
WifiMacHeader hdr;
|
WifiMacHeader hdr;
|
||||||
@@ -193,12 +195,16 @@ HtFrameExchangeManager::SendAddBaRequest(Mac48Address dest,
|
|||||||
WifiTxParameters txParams;
|
WifiTxParameters txParams;
|
||||||
txParams.m_txVector =
|
txParams.m_txVector =
|
||||||
GetWifiRemoteStationManager()->GetDataTxVector(mpdu->GetHeader(), m_allowedWidth);
|
GetWifiRemoteStationManager()->GetDataTxVector(mpdu->GetHeader(), m_allowedWidth);
|
||||||
txParams.m_protection = std::unique_ptr<WifiProtection>(new WifiNoProtection);
|
if (!TryAddMpdu(mpdu, txParams, availableTime))
|
||||||
txParams.m_acknowledgment = GetAckManager()->TryAddMpdu(mpdu, txParams);
|
{
|
||||||
|
NS_LOG_DEBUG("Not enough time to send the ADDBA Request frame");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// Wifi MAC queue scheduler is expected to prioritize management frames
|
// Wifi MAC queue scheduler is expected to prioritize management frames
|
||||||
m_mac->GetQosTxop(tid)->GetWifiMacQueue()->Enqueue(mpdu);
|
m_mac->GetQosTxop(tid)->GetWifiMacQueue()->Enqueue(mpdu);
|
||||||
SendMpduWithProtection(mpdu, txParams);
|
SendMpduWithProtection(mpdu, txParams);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -381,12 +387,12 @@ HtFrameExchangeManager::StartFrameExchange(Ptr<QosTxop> edca, Time availableTime
|
|||||||
(hdr.IsRetry()
|
(hdr.IsRetry()
|
||||||
? hdr.GetSequenceNumber()
|
? hdr.GetSequenceNumber()
|
||||||
: m_txMiddle->GetNextSeqNumberByTidAndAddress(hdr.GetQosTid(), hdr.GetAddr1()));
|
: m_txMiddle->GetNextSeqNumberByTidAndAddress(hdr.GetQosTid(), hdr.GetAddr1()));
|
||||||
SendAddBaRequest(hdr.GetAddr1(),
|
return SendAddBaRequest(hdr.GetAddr1(),
|
||||||
hdr.GetQosTid(),
|
hdr.GetQosTid(),
|
||||||
startingSeq,
|
startingSeq,
|
||||||
edca->GetBlockAckInactivityTimeout(),
|
edca->GetBlockAckInactivityTimeout(),
|
||||||
true);
|
true,
|
||||||
return true;
|
availableTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Use SendDataFrame if we can try aggregation
|
// Use SendDataFrame if we can try aggregation
|
||||||
@@ -570,25 +576,8 @@ HtFrameExchangeManager::SendMpduFromBaManager(Ptr<WifiMpdu> mpdu,
|
|||||||
WifiTxParameters txParams;
|
WifiTxParameters txParams;
|
||||||
txParams.m_txVector =
|
txParams.m_txVector =
|
||||||
GetWifiRemoteStationManager()->GetDataTxVector(mpdu->GetHeader(), m_allowedWidth);
|
GetWifiRemoteStationManager()->GetDataTxVector(mpdu->GetHeader(), m_allowedWidth);
|
||||||
txParams.m_protection = std::unique_ptr<WifiProtection>(new WifiNoProtection);
|
|
||||||
txParams.m_acknowledgment = GetAckManager()->TryAddMpdu(mpdu, txParams);
|
|
||||||
|
|
||||||
NS_ABORT_IF(txParams.m_acknowledgment->method != WifiAcknowledgment::BLOCK_ACK);
|
if (!TryAddMpdu(mpdu, txParams, availableTime))
|
||||||
|
|
||||||
WifiBlockAck* blockAcknowledgment = static_cast<WifiBlockAck*>(txParams.m_acknowledgment.get());
|
|
||||||
CalculateAcknowledgmentTime(blockAcknowledgment);
|
|
||||||
// the BlockAckReq frame is sent using the same TXVECTOR as the BlockAck frame
|
|
||||||
txParams.m_txVector = blockAcknowledgment->blockAckTxVector;
|
|
||||||
|
|
||||||
Time barTxDuration = m_phy->CalculateTxDuration(mpdu->GetSize(),
|
|
||||||
blockAcknowledgment->blockAckTxVector,
|
|
||||||
m_phy->GetPhyBand());
|
|
||||||
|
|
||||||
// if the available time is limited and we are not transmitting the initial
|
|
||||||
// frame of the TXOP, we have to check that this frame and its response fit
|
|
||||||
// within the given time limits
|
|
||||||
if (availableTime != Time::Min() && !initialFrame &&
|
|
||||||
barTxDuration + m_phy->GetSifs() + blockAcknowledgment->acknowledgmentTime > availableTime)
|
|
||||||
{
|
{
|
||||||
NS_LOG_DEBUG("Not enough time to send the BAR frame returned by the Block Ack Manager");
|
NS_LOG_DEBUG("Not enough time to send the BAR frame returned by the Block Ack Manager");
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -317,12 +317,16 @@ class HtFrameExchangeManager : public QosFrameExchangeManager
|
|||||||
* \param startingSeq the BA agreement starting sequence number
|
* \param startingSeq the BA agreement starting sequence number
|
||||||
* \param timeout timeout value.
|
* \param timeout timeout value.
|
||||||
* \param immediateBAck flag to indicate whether immediate BlockAck is used.
|
* \param immediateBAck flag to indicate whether immediate BlockAck is used.
|
||||||
|
* \param availableTime the amount of time allowed for the frame exchange. Equals
|
||||||
|
* Time::Min() in case the TXOP limit is null
|
||||||
|
* \return true if ADDBA Request frame is transmitted, false otherwise
|
||||||
*/
|
*/
|
||||||
void SendAddBaRequest(Mac48Address recipient,
|
bool SendAddBaRequest(Mac48Address recipient,
|
||||||
uint8_t tid,
|
uint8_t tid,
|
||||||
uint16_t startingSeq,
|
uint16_t startingSeq,
|
||||||
uint16_t timeout,
|
uint16_t timeout,
|
||||||
bool immediateBAck);
|
bool immediateBAck,
|
||||||
|
Time availableTime);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a BlockAck frame with header equal to <i>blockAck</i> and start its transmission.
|
* Create a BlockAck frame with header equal to <i>blockAck</i> and start its transmission.
|
||||||
|
|||||||
Reference in New Issue
Block a user