Files
unison/src/wifi/model/ctrl-headers.h
Rediet 2cd288b24d wifi: fix other doxygen warnings in src/wifi/model
3 warnings remaining with templated WifiTxTimer::FeedTraceSource
2021-05-25 17:11:06 +02:00

1264 lines
44 KiB
C++

/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2009 MIRKO BANCHI
*
* 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: Mirko Banchi <mk.banchi@gmail.com>
*/
#ifndef CTRL_HEADERS_H
#define CTRL_HEADERS_H
#include <list>
#include <vector>
#include "ns3/header.h"
#include "block-ack-type.h"
#include "ns3/he-ru.h"
#include "ns3/mac48-address.h"
namespace ns3 {
class WifiTxVector;
enum AcIndex : uint8_t;
/**
* \ingroup wifi
* \brief Headers for BlockAckRequest.
*
* 802.11n standard includes three types of BlockAck:
* - Basic BlockAck (unique type in 802.11e)
* - Compressed BlockAck
* - Multi-TID BlockAck
* For now only basic BlockAck and compressed BlockAck
* are supported.
* Basic BlockAck is also default variant.
*/
class CtrlBAckRequestHeader : public Header
{
public:
CtrlBAckRequestHeader ();
~CtrlBAckRequestHeader ();
/**
* \brief Get the type ID.
* \return the object TypeId
*/
static TypeId GetTypeId (void);
TypeId GetInstanceTypeId (void) const override;
void Print (std::ostream &os) const override;
uint32_t GetSerializedSize (void) const override;
void Serialize (Buffer::Iterator start) const override;
uint32_t Deserialize (Buffer::Iterator start) override;
/**
* Enable or disable HT immediate Ack.
*
* \param immediateAck enable or disable HT immediate Ack
*/
void SetHtImmediateAck (bool immediateAck);
/**
* Set the BlockAckRequest type.
*
* \param type the BlockAckRequest type
*/
void SetType (BlockAckReqType type);
/**
* Set Traffic ID (TID).
*
* \param tid the TID
*/
void SetTidInfo (uint8_t tid);
/**
* Set the starting sequence number from the given
* raw sequence control field.
*
* \param seq the raw sequence control
*/
void SetStartingSequence (uint16_t seq);
/**
* Check if the current Ack Policy is immediate.
*
* \return true if the current Ack Policy is immediate,
* false otherwise
*/
bool MustSendHtImmediateAck (void) const;
/**
* Return the BlockAckRequest type.
*
* \return the type of the BlockAckRequest
*/
BlockAckReqType GetType (void) const;
/**
* Return the Traffic ID (TID).
*
* \return TID
*/
uint8_t GetTidInfo (void) const;
/**
* Return the starting sequence number.
*
* \return the starting sequence number
*/
uint16_t GetStartingSequence (void) const;
/**
* Check if the current Ack Policy is Basic Block Ack
* (i.e. not multi-TID nor compressed).
*
* \return true if the current Ack Policy is Basic Block Ack,
* false otherwise
*/
bool IsBasic (void) const;
/**
* Check if the current Ack Policy is Compressed Block Ack
* and not multi-TID.
*
* \return true if the current Ack Policy is Compressed Block Ack,
* false otherwise
*/
bool IsCompressed (void) const;
/**
* Check if the current Ack Policy is Extended Compressed Block Ack.
*
* \return true if the current Ack Policy is Extended Compressed Block Ack,
* false otherwise
*/
bool IsExtendedCompressed (void) const;
/**
* Check if the current Ack Policy has Multi-TID Block Ack.
*
* \return true if the current Ack Policy has Multi-TID Block Ack,
* false otherwise
*/
bool IsMultiTid (void) const;
/**
* Return the starting sequence control.
*
* \return the starting sequence control
*/
uint16_t GetStartingSequenceControl (void) const;
private:
/**
* Set the starting sequence control with the given
* sequence control value
*
* \param seqControl the sequence control value
*/
void SetStartingSequenceControl (uint16_t seqControl);
/**
* Return the Block Ack control.
*
* \return the Block Ack control
*/
uint16_t GetBarControl (void) const;
/**
* Set the Block Ack control.
*
* \param bar the BAR control value
*/
void SetBarControl (uint16_t bar);
/**
* The LSB bit of the BAR control field is used only for the
* HT (High Throughput) delayed block ack configuration.
* For now only non HT immediate BlockAck is implemented so this field
* is here only for a future implementation of HT delayed variant.
*/
bool m_barAckPolicy; ///< bar ack policy
BlockAckReqType m_barType; ///< BAR type
uint16_t m_tidInfo; ///< TID info
uint16_t m_startingSeq; ///< starting seq
};
/**
* \ingroup wifi
* \brief Headers for BlockAck response.
*
* 802.11n standard includes three types of BlockAck:
* - Basic BlockAck (unique type in 802.11e)
* - Compressed BlockAck
* - Multi-TID BlockAck
* For now only basic BlockAck and compressed BlockAck
* are supported.
* Basic BlockAck is also default variant.
*/
class CtrlBAckResponseHeader : public Header
{
public:
CtrlBAckResponseHeader ();
~CtrlBAckResponseHeader ();
/**
* \brief Get the type ID.
* \return the object TypeId
*/
static TypeId GetTypeId (void);
TypeId GetInstanceTypeId (void) const;
void Print (std::ostream &os) const;
uint32_t GetSerializedSize (void) const;
void Serialize (Buffer::Iterator start) const;
uint32_t Deserialize (Buffer::Iterator start);
/**
* Enable or disable HT immediate Ack.
*
* \param immediateAck enable or disable HT immediate Ack
*/
void SetHtImmediateAck (bool immediateAck);
/**
* Set the block ack type.
*
* \param type the BA type
*/
void SetType (BlockAckType type);
/**
* For Block Ack variants other than Multi-STA Block Ack, set the TID_INFO subfield
* of the BA Control field. For Multi-STA Block Acks, set the TID subfield of the
* AID TID Info subfield of the Per AID TID Info subfield identified by the given
* index.
*
* \param tid the traffic ID
* \param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
*/
void SetTidInfo (uint8_t tid, std::size_t index = 0);
/**
* For Block Ack variants other than Multi-STA Block Ack, set the starting sequence
* number to the given value. For Multi-STA Block Acks, set the starting sequence
* number in the Per AID TID Info subfield identified by the given index to the
* given value.
*
* \param seq the starting sequence number
* \param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
*/
void SetStartingSequence (uint16_t seq, std::size_t index = 0);
/**
* Check if the current Ack Policy is immediate.
*
* \return true if the current Ack Policy is immediate,
* false otherwise
*/
bool MustSendHtImmediateAck (void) const;
/**
* Return the block ack type ID.
*
* \return type
*/
BlockAckType GetType (void) const;
/**
* For Block Ack variants other than Multi-STA Block Ack, get the TID_INFO subfield
* of the BA Control field. For Multi-STA Block Acks, get the TID subfield of the
* AID TID Info subfield of the Per AID TID Info subfield identified by the given
* index.
*
* \param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
* \return the Traffic ID
*/
uint8_t GetTidInfo (std::size_t index = 0) const;
/**
* For Block Ack variants other than Multi-STA Block Ack, get the starting sequence
* number. For Multi-STA Block Acks, get the starting sequence number in the
* Per AID TID Info subfield identified by the given index.
*
* \param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
* \return the starting sequence number
*/
uint16_t GetStartingSequence (std::size_t index = 0) const;
/**
* Check if the current BA policy is Basic Block Ack.
*
* \return true if the current BA policy is Basic Block Ack,
* false otherwise
*/
bool IsBasic (void) const;
/**
* Check if the current BA policy is Compressed Block Ack.
*
* \return true if the current BA policy is Compressed Block Ack,
* false otherwise
*/
bool IsCompressed (void) const;
/**
* Check if the current BA policy is Extended Compressed Block Ack.
*
* \return true if the current BA policy is Extended Compressed Block Ack,
* false otherwise
*/
bool IsExtendedCompressed (void) const;
/**
* Check if the current BA policy is Multi-TID Block Ack.
*
* \return true if the current BA policy is Multi-TID Block Ack,
* false otherwise
*/
bool IsMultiTid (void) const;
/**
* Check if the BlockAck frame variant is Multi-STA Block Ack.
*
* \return true if the BlockAck frame variant is Multi-STA Block Ack,
* false otherwise
*/
bool IsMultiSta (void) const;
/**
* For Multi-STA Block Acks, set the AID11 subfield of the Per AID TID Info
* subfield identified by the given index to the given value
*
* \param aid the AID11 value
* \param index the index of the Per AID TID Info subfield
*/
void SetAid11 (uint16_t aid, std::size_t index);
/**
* For Multi-STA Block Acks, get the AID11 subfield of the Per AID TID Info
* subfield identified by the given index.
*
* \param index the index of the Per AID TID Info subfield
* \return the AID11 subfield
*/
uint16_t GetAid11 (std::size_t index) const;
/**
* For Multi-STA Block Acks, set the Ack Type subfield of the Per AID TID Info
* subfield identified by the given index to the given value
*
* \param type the ack type value
* \param index the index of the Per AID TID Info subfield
*/
void SetAckType (bool type, std::size_t index);
/**
* For Multi-STA Block Acks, get the Ack Type subfield of the Per AID TID Info
* subfield identified by the given index.
*
* \param index the index of the Per AID TID Info subfield
* \return the Ack Type
*/
bool GetAckType (std::size_t index) const;
/**
* For Multi-STA Block Acks, set the RA subfield of the Per AID TID Info
* subfield (with AID11 subfield equal to 2045) identified by the given index
* to the given MAC address.
*
* \param ra the MAC address
* \param index the index of the Per AID TID Info subfield
*/
void SetUnassociatedStaAddress (const Mac48Address& ra, std::size_t index);
/**
* For Multi-STA Block Acks, get the RA subfield of the Per AID TID Info
* subfield (with AID11 subfield equal to 2045) identified by the given index
* to the given MAC address.
*
* \param index the index of the Per AID TID Info subfield
* \return the MAC address stored in the RA subfield
*/
Mac48Address GetUnassociatedStaAddress (std::size_t index) const;
/**
* For Multi-STA Block Acks, get the number of Per AID TID Info subfields
* included in this Block Ack.
*
* \return the number of Per AID TID Info subfields included in this Multi-STA Block Ack
*/
std::size_t GetNPerAidTidInfoSubfields (void) const;
/**
* For Multi-STA Block Acks, get the indices of the Per AID TID Info subfields
* carrying the given AID in the AID11 subfield.
*
* \param aid the given AID
* \return a vector containing the indices of the Per AID TID Info subfields
* carrying the given AID in the AID11 subfield
*/
std::vector<uint32_t> FindPerAidTidInfoWithAid (uint16_t aid) const;
/**
* Record in the bitmap that the packet with the given sequence number was
* received. For Multi-STA Block Acks, <i>index</i> identifies the Per AID
* TID Info subfield whose bitmap has to be updated.
*
* \param seq the sequence number of the received packet
* \param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
*/
void SetReceivedPacket (uint16_t seq, std::size_t index = 0);
/**
* Set the bitmap that the packet with the given sequence
* number and fragment number was received.
*
* \param seq the sequence number
* \param frag the fragment number
*/
void SetReceivedFragment (uint16_t seq, uint8_t frag);
/**
* Check if the packet with the given sequence number was acknowledged in this
* BlockAck response. For Multi-STA Block Acks, <i>index</i> identifies the
* Per AID TID Info subfield whose bitmap has to be checked.
*
* \param seq the sequence number to be checked
* \param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
* \return true if the packet with the given sequence number
* was ACKed in this BlockAck response, false otherwise
*/
bool IsPacketReceived (uint16_t seq, std::size_t index = 0) const;
/**
* Check if the packet with the given sequence number
* and fragment number was acknowledged in this BlockAck response.
*
* \param seq the sequence number
* \param frag the fragment number
* \return true if the packet with the given sequence number
* and sequence number was acknowledged in this BlockAck response,
* false otherwise
*/
bool IsFragmentReceived (uint16_t seq, uint8_t frag) const;
/**
* Return the value of the Starting Sequence Control subfield. For Multi-STA
* Block Acks, <i>index</i> identifies the Per AID TID Info subfield whose
* Starting Sequence Control subfield has to be returned.
*
* \param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
* \return the value of the Starting Sequence Control subfield
*/
uint16_t GetStartingSequenceControl (std::size_t index = 0) const;
/**
* Set the Starting Sequence Control subfield with the given sequence control
* value. For Multi-STA Block Acks, <i>index</i> identifies the Per AID TID Info
* subfield whose Starting Sequence Control subfield has to be set.
*
* \param seqControl the raw sequence control value
* \param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
*/
void SetStartingSequenceControl (uint16_t seqControl, std::size_t index = 0);
/**
* Return a const reference to the bitmap from the BlockAck response header.
* For Multi-STA Block Acks, return a const reference to the bitmap included
* in the Per AID TID Info subfield identified by <i>index</i>.
*
* \param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
* \return a const reference to the bitmap from the BlockAck response header
*/
const std::vector<uint8_t>& GetBitmap (std::size_t index = 0) const;
/**
* Reset the bitmap to 0. For Multi-STA Block Acks, reset the bitmap included
* in the Per AID TID Info subfield identified by <i>index</i>.
*
* \param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
*/
void ResetBitmap (std::size_t index = 0);
private:
/**
* Return the Block Ack control.
*
* \return the Block Ack control
*/
uint16_t GetBaControl (void) const;
/**
* Set the Block Ack control.
*
* \param ba the BA control to set
*/
void SetBaControl (uint16_t ba);
/**
* Serialize bitmap to the given buffer. For Multi-STA Block Acks, <i>index</i>
* identifies the Per AID TID Info subfield whose bitmap has to be serialized.
*
* \param start iterator pointing to the beginning of the buffer to write into.
* \param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
* \return Buffer::Iterator to the next available buffer
*/
Buffer::Iterator SerializeBitmap (Buffer::Iterator start, std::size_t index = 0) const;
/**
* Deserialize bitmap from the given buffer. For Multi-STA Block Acks, <i>index</i>
* identifies the Per AID TID Info subfield whose bitmap has to be deserialized.
*
* \param start iterator pointing to the beginning of the buffer to read from.
* \param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
* \return Buffer::Iterator to the next available buffer
*/
Buffer::Iterator DeserializeBitmap (Buffer::Iterator start, std::size_t index = 0);
/**
* This function is used to correctly index in both bitmap
* and compressed bitmap, one bit or one block of 16 bits respectively.
*
* for more details see 7.2.1.8 in IEEE 802.11n/D4.00
*
* \param seq the sequence number
* \param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
*
* \return If we are using basic block ack, return value represents index of
* block of 16 bits for packet having sequence number equals to <i>seq</i>.
* If we are using compressed block ack, return value represents bit
* to set to 1 in the compressed bitmap to indicate that packet having
* sequence number equals to <i>seq</i> was correctly received.
*/
uint16_t IndexInBitmap (uint16_t seq, std::size_t index = 0) const;
/**
* Check if sequence number <i>seq</i> can be acknowledged in the bitmap. For
* Multi-STA Block Acks, check if sequence number <i>seq</i> can be acknowledged
* in the bitmap included in the Per AID TID Info subfield identified by <i>index</i>.
*
* \param seq the sequence number
* \param index the index of the Per AID TID Info subfield (Multi-STA Block Ack only)
* \return true if the sequence number is concerned by the bitmap
*/
bool IsInBitmap (uint16_t seq, std::size_t index = 0) const;
/**
* The LSB bit of the BA control field is used only for the
* HT (High Throughput) delayed block ack configuration.
* For now only non HT immediate block ack is implemented so this field
* is here only for a future implementation of HT delayed variant.
*/
bool m_baAckPolicy; ///< BA Ack Policy
BlockAckType m_baType; ///< BA type
uint16_t m_tidInfo; ///< TID info (reserved if Multi-STA Block Ack)
/**
* The following structure can hold the BA Information field for the Basic and
* Compressed variants, one instance of the {Per TID Info, Block Ack Starting
* Sequence Control, Block Ack Bitmap} subfields for the Multi-TID variant or
* one instance of the Per AID TID Info subfield for the Multi-STA variant
* (which includes the AID TID Info, Block Ack Starting Sequence Control and
* Block Ack Bitmap subfields).
*/
struct BaInfoInstance
{
uint16_t m_aidTidInfo; //!< Reserved for Basic and Compressed
//!< Per TID Info subfield for Multi-TID
//!< AID TID Info subfield for Multi-STA
uint16_t m_startingSeq; //!< Block Ack Starting Sequence Control subfield
std::vector<uint8_t> m_bitmap; //!< block ack bitmap
Mac48Address m_ra; //!< RA subfield (address of an unassociated station)
//!< for Multi-STA; reserved for other variants
};
std::vector<BaInfoInstance> m_baInfo; //!< BA Information field
};
/**
* \ingroup wifi
* The different Trigger frame types.
*/
enum TriggerFrameType : uint8_t
{
BASIC_TRIGGER = 0, // Basic
BFRP_TRIGGER = 1, // Beamforming Report Poll
MU_BAR_TRIGGER = 2, // Multi-User Block Ack Request
MU_RTS_TRIGGER = 3, // Multi-User Request To Send
BSRP_TRIGGER = 4, // Buffer Status Report Poll
GCR_MU_BAR_TRIGGER = 5, // Groupcast with Retries MU-BAR
BQRP_TRIGGER = 6, // Bandwidth Query Report Poll
NFRP_TRIGGER = 7 // NDP Feedback Report Poll
};
/**
* \ingroup wifi
* \brief User Info field of Trigger frames.
*
* Trigger frames, introduced by 802.11ax amendment (see Section 9.3.1.23 of D3.0),
* include one or more User Info fields, each of which carries information about the
* HE TB PPDU that the addressed station sends in response to the Trigger frame.
*/
class CtrlTriggerUserInfoField
{
public:
/**
* Constructor
*
* \param triggerType the Trigger frame type
*/
CtrlTriggerUserInfoField (uint8_t triggerType);
/**
* Copy assignment operator.
*
* \param userInfo the User Info field to copy
* \return a reference to the copied object
*
* Checks that the given User Info fields is included in the same type
* of Trigger Frame.
*/
CtrlTriggerUserInfoField& operator= (const CtrlTriggerUserInfoField& userInfo);
/**
* Destructor
*/
~CtrlTriggerUserInfoField ();
/**
* Print the content of this User Info field
*
* \param os output stream
*/
void Print (std::ostream &os) const;
/**
* Get the expected size of this User Info field
*
* \return the expected size of this User Info field.
*/
uint32_t GetSerializedSize (void) const;
/**
* Serialize the User Info field to the given buffer.
*
* \param start an iterator which points to where the header should
* be written
* \return Buffer::Iterator to the next available buffer
*/
Buffer::Iterator Serialize (Buffer::Iterator start) const;
/**
* Deserialize the User Info field from the given buffer.
*
* \param start an iterator which points to where the header should
* read from
* \return Buffer::Iterator to the next available buffer
*/
Buffer::Iterator Deserialize (Buffer::Iterator start);
/**
* Get the type of the Trigger Frame this User Info field belongs to.
*
* \return the type of the Trigger Frame this User Info field belongs to
*/
TriggerFrameType GetType (void) const;
/**
* Set the AID12 subfield, which carries the 12 LSBs of the AID of the
* station for which this User Info field is intended. The whole AID can
* be passed, since the passed value is properly masked.
*
* \param aid the value for the AID12 subfield
*/
void SetAid12 (uint16_t aid);
/**
* Get the value of the AID12 subfield.
*
* \return the AID12 subfield
*/
uint16_t GetAid12 (void) const;
/**
* Check if this User Info field allocates a Random Access RU for stations
* associated with the AP that transmitted the Trigger frame.
*
* \return true if a Random Access RU for associated stations is allocated
*/
bool HasRaRuForAssociatedSta (void) const;
/**
* Check if this User Info field allocates a Random Access RU for stations
* not associated with the AP that transmitted the Trigger frame.
*
* \return true if a Random Access RU for unassociated stations is allocated
*/
bool HasRaRuForUnassociatedSta (void) const;
/**
* Set the RU Allocation subfield according to the specified RU.
*
* \param ru the RU this User Info field is allocating
*/
void SetRuAllocation (HeRu::RuSpec ru);
/**
* Get the RU specified by the RU Allocation subfield.
*
* \return the RU this User Info field is allocating
*/
HeRu::RuSpec GetRuAllocation (void) const;
/**
* Set the UL FEC Coding Type subfield, which indicates whether BCC or LDPC is used
*
* \param ldpc whether to use LDPC or not
*/
void SetUlFecCodingType (bool ldpc);
/**
* Get the UL FEC Coding Type subfield, which indicates whether BCC or LDPC is used
*
* \return true if LDPC is used
*/
bool GetUlFecCodingType (void) const;
/**
* Set the UL MCS subfield, which indicates the MCS of the solicited HE TB PPDU
*
* \param mcs the MCS index (a value between 0 and 11)
*/
void SetUlMcs (uint8_t mcs);
/**
* Get the UL MCS subfield, which indicates the MCS of the solicited HE TB PPDU
*
* \return the MCS index (a value between 0 and 11)
*/
uint8_t GetUlMcs (void) const;
/**
* Set the UL DCM subfield, which indicates whether or not DCM is used
*
* \param dcm whether to use DCM or not
*/
void SetUlDcm (bool dcm);
/**
* Get the UL DCM subfield, which indicates whether or not DCM is used
*
* \return true if DCM is used
*/
bool GetUlDcm (void) const;
/**
* Set the SS Allocation subfield, which is present when the AID12 subfield
* is neither 0 nor 2045. This method must be called after setting the AID12
* subfield to a value other than 0 and 2045.
*
* \param startingSs the starting spatial stream (a value from 1 to 8)
* \param nSs the number of spatial streams (a value from 1 to 8)
*/
void SetSsAllocation (uint8_t startingSs, uint8_t nSs);
/**
* Get the starting spatial stream.
*
* \return the starting spatial stream (a value between 1 and 8)
*/
uint8_t GetStartingSs (void) const;
/**
* Get the number of spatial streams.
*
* \return the number of spatial streams (a value between 1 and 8)
*/
uint8_t GetNss (void) const;
/**
* Set the RA-RU Information subfield, which is present when the AID12 subfield
* is 0 or 2045. This method must be called after setting the AID12 subfield to
* 0 or 2045.
*
* \param nRaRu the number (from 1 to 32) of contiguous RUs allocated for Random Access.
* \param moreRaRu whether RA-RUs are allocated in subsequent Trigger frames
*/
void SetRaRuInformation (uint8_t nRaRu, bool moreRaRu);
/**
* Get the number of contiguous RUs for Random Access. This method can only be
* called if the AID12 subfield has been set to 0 or 2045
*
* \return the number of contiguous RA-RUs (a value between 1 and 32)
*/
uint8_t GetNRaRus (void) const;
/**
* Return true if more RA-RUs are allocated in subsequent Trigger frames
* that are sent before the end of the current TXOP. This method can only be
* called if the AID12 subfield has been set to 0 or 2045
*
* \return true if more RA-RUs are allocated in subsequent Trigger frames
*/
bool GetMoreRaRu (void) const;
/**
* Set the UL Target RSSI subfield to indicate to the station to transmit an
* HE TB PPDU response at its maximum transmit power for the assigned MCS
*/
void SetUlTargetRssiMaxTxPower (void);
/**
* Set the UL Target RSSI subfield to indicate the expected receive signal
* power in dBm
*
* \param dBm the expected receive signal power (a value between -110 and -20)
*/
void SetUlTargetRssi (int8_t dBm);
/**
* Return true if the UL Target RSSI subfield indicates to the station to transmit
* an HE TB PPDU response at its maximum transmit power for the assigned MCS
*
* \return true if the UL Target RSSI subfield indicates to the station to transmit
* an HE TB PPDU response at its maximum transmit power for the assigned MCS
*/
bool IsUlTargetRssiMaxTxPower (void) const;
/**
* Get the expected receive signal power for the solicited HE TB PPDU. This
* method can only be called if IsUlTargetRssiMaxTxPower returns false.
*
* \return the expected receive signal power in dBm
*/
int8_t GetUlTargetRssi (void) const;
/**
* Set the Trigger Dependent User Info subfield for Basic Trigger frames.
*
* \param spacingFactor the MPDU MU spacing factor
* \param tidLimit the value for the TID Aggregation Limit subfield
* \param prefAc the lowest AC recommended for aggregation of MPDUs
*/
void SetBasicTriggerDepUserInfo (uint8_t spacingFactor, uint8_t tidLimit, AcIndex prefAc);
/**
* Get the MPDU MU spacing factor. This method can only be called if this
* User Info field is included in a Basic Trigger frame.
*
* \return the MPDU MU spacing factor
*/
uint8_t GetMpduMuSpacingFactor (void) const;
/**
* Get the TID Aggregation Limit. This method can only be called if this
* User Info field is included in a Basic Trigger frame.
*
* \return the TID Aggregation Limit
*/
uint8_t GetTidAggregationLimit (void) const;
/**
* Get the Preferred AC subfield. This method can only be called if this
* User Info field is included in a Basic Trigger frame.
*
* \return the Preferred AC subfield
*/
AcIndex GetPreferredAc (void) const;
/**
* Set the Trigger Dependent User Info subfield for the MU-BAR variant of
* Trigger frames, which includes a BAR Control subfield and a BAR Information
* subfield. The BAR Control subfield must indicate either a Compressed
* BlockAckReq variant or a Multi-TID BlockAckReq variant.
*
* \param bar the BlockAckRequest header object including the BAR Control
* subfield and the BAR Information subfield
*/
void SetMuBarTriggerDepUserInfo (const CtrlBAckRequestHeader& bar);
/**
* Get the Trigger Dependent User Info subfield for the MU-BAR variant of
* Trigger frames, which includes a BAR Control subfield and a BAR Information
* subfield. The BAR Control subfield must indicate either a Compressed
* BlockAckReq variant or a Multi-TID BlockAckReq variant.
*
* \return the BlockAckRequest header object including the BAR Control
* subfield and the BAR Information subfield
*/
const CtrlBAckRequestHeader& GetMuBarTriggerDepUserInfo (void) const;
private:
uint16_t m_aid12; //!< Association ID of the addressed station
uint8_t m_ruAllocation; //!< RU Allocation
bool m_ulFecCodingType; //!< UL FEC Coding Type
uint8_t m_ulMcs; //!< MCS to be used by the addressed station
bool m_ulDcm; //!< whether or not to use Dual Carrier Modulation
union
{
struct
{
uint8_t startingSs; //!< Starting spatial stream
uint8_t nSs; //!< Number of spatial streams
} ssAllocation; //!< Used when AID12 is neither 0 nor 2045
struct
{
uint8_t nRaRu; //!< Number of Random Access RUs
bool moreRaRu; //!< More RA-RU in subsequent Trigger frames
} raRuInformation; //!< Used when AID12 is 0 or 2045
} m_bits26To31; //!< Fields occupying bits 26-31 in the User Info field
uint8_t m_ulTargetRssi; //!< Expected receive signal power
uint8_t m_triggerType; //!< Trigger frame type
uint8_t m_basicTriggerDependentUserInfo; //!< Basic Trigger variant of Trigger Dependent User Info subfield
CtrlBAckRequestHeader m_muBarTriggerDependentUserInfo; //!< MU-BAR variant of Trigger Dependent User Info subfield
};
/**
* \ingroup wifi
* \brief Headers for Trigger frames.
*
* 802.11ax amendment defines eight types of Trigger frames (see Section 9.3.1.23 of D3.0):
* - Basic
* - Beamforming Report Poll (BFRP)
* - Multi-User Block Ack Request (MU-BAR)
* - Multi-User Request To Send (MU-RTS)
* - Buffer Status Report Poll (BSRP)
* - Groupcast with Retries (GCR) MU-BAR
* - Bandwidth Query Report Poll (BQRP)
* - NDP Feedback Report Poll (NFRP)
* For now only the Basic, MU-BAR, MU-RTS, BSRP and BQRP variants are supported.
* Basic Trigger is also the default variant.
*
* The Padding field is optional, given that other techniques (post-EOF A-MPDU
* padding, aggregating other MPDUs in the A-MPDU) are available to satisfy the
* minimum time requirement. Currently, however, a Padding field of the minimum
* length (2 octets) is appended to every Trigger frame that is transmitted. In
* such a way, deserialization stops when a User Info field with the AID12 subfield
* set to 4095 (which indicates the start of a Padding field) is encountered.
*/
class CtrlTriggerHeader : public Header
{
public:
CtrlTriggerHeader ();
/**
* \brief Constructor
*
* Construct a Trigger Frame of the given type from the values stored in the
* given TX vector. In particular:
* - the UL Bandwidth, UL Length and GI And LTF Type subfields of the Common Info
* field are set based on the values stored in the TX vector;
* - as many User Info fields as the number of entries in the HeMuUserInfoMap
* of the TX vector are added to the Trigger Frame. The AID12, RU Allocation,
* UL MCS and SS Allocation subfields of each User Info field are set based
* on the values stored in the corresponding entry of the HeMuUserInfoMap.
*
* \param type the Trigger frame type
* \param txVector the TX vector used to build this Trigger Frame
*/
CtrlTriggerHeader (TriggerFrameType type, const WifiTxVector& txVector);
~CtrlTriggerHeader ();
/**
* Copy assignment operator.
*
* \param trigger the Trigger frame to copy
* \return a reference to the copied object
*
* Ensure that the type of this Trigger Frame is set to the type of the given
* Trigger Frame before copying the User Info fields.
*/
CtrlTriggerHeader& operator= (const CtrlTriggerHeader& trigger);
/**
* \brief Get the type ID.
* \return the object TypeId
*/
static TypeId GetTypeId (void);
TypeId GetInstanceTypeId (void) const;
void Print (std::ostream &os) const;
uint32_t GetSerializedSize (void) const;
void Serialize (Buffer::Iterator start) const;
uint32_t Deserialize (Buffer::Iterator start);
/**
* Set the Trigger frame type.
*
* \param type the Trigger frame type
*/
void SetType (TriggerFrameType type);
/**
* Get the Trigger Frame type.
*
* \return the Trigger Frame type
*/
TriggerFrameType GetType (void) const;
/**
* Return a string corresponding to the Trigger Frame type.
*
* \returns a string corresponding to the Trigger Frame type.
*/
const char * GetTypeString (void) const;
/**
* Return a string corresponding to the given Trigger Frame type.
*
* \param type the Trigger Frame type
* \returns a string corresponding to the Trigger Frame type.
*/
static const char * GetTypeString (TriggerFrameType type);
/**
* Check if this is a Basic Trigger frame.
*
* \return true if this is a Basic Trigger frame,
* false otherwise
*/
bool IsBasic (void) const;
/**
* Check if this is a Beamforming Report Poll Trigger frame.
*
* \return true if this is a Beamforming Report Poll Trigger frame,
* false otherwise
*/
bool IsBfrp (void) const;
/**
* Check if this is a MU-BAR Trigger frame.
*
* \return true if this is a MU-BAR Trigger frame,
* false otherwise
*/
bool IsMuBar (void) const;
/**
* Check if this is a MU-RTS Trigger frame.
*
* \return true if this is a MU-RTS Trigger frame,
* false otherwise
*/
bool IsMuRts (void) const;
/**
* Check if this is a Buffer Status Report Poll Trigger frame.
*
* \return true if this is a Buffer Status Report Poll Trigger frame,
* false otherwise
*/
bool IsBsrp (void) const;
/**
* Check if this is a Groupcast with Retries (GCR) MU-BAR Trigger frame.
*
* \return true if this is a Groupcast with Retries (GCR) MU-BAR Trigger frame,
* false otherwise
*/
bool IsGcrMuBar (void) const;
/**
* Check if this is a Bandwidth Query Report Poll Trigger frame.
*
* \return true if this is a Bandwidth Query Report Poll Trigger frame,
* false otherwise
*/
bool IsBqrp (void) const;
/**
* Check if this is a NDP Feedback Report Poll Trigger frame.
*
* \return true if this is a NDP Feedback Report Poll Trigger frame,
* false otherwise
*/
bool IsNfrp (void) const;
/**
* Set the UL Length subfield of the Common Info field.
*
* \param len the value for the UL Length subfield
*/
void SetUlLength (uint16_t len);
/**
* Get the UL Length subfield of the Common Info field.
*
* \return the UL Length subfield
*/
uint16_t GetUlLength (void) const;
/**
* Get the TX vector that the station with the given STA-ID will use to send
* the HE TB PPDU solicited by this Trigger Frame. Note that the TX power
* level is not set by this method.
*
* \param staId the STA-ID of a station addressed by this Trigger Frame
* \return the TX vector of the solicited HE TB PPDU
*/
WifiTxVector GetHeTbTxVector (uint16_t staId) const;
/**
* Set the More TF subfield of the Common Info field.
*
* \param more the value for the More TF subfield
*/
void SetMoreTF (bool more);
/**
* Get the More TF subfield of the Common Info field.
*
* \return the More TF subfield
*/
bool GetMoreTF (void) const;
/**
* Set the CS Required subfield of the Common Info field.
*
* \param cs the value for the CS Required subfield
*/
void SetCsRequired (bool cs);
/**
* Get the CS Required subfield of the Common Info field.
*
* \return the CS Required subfield
*/
bool GetCsRequired (void) const;
/**
* Set the bandwidth of the solicited HE TB PPDU.
*
* \param bw bandwidth (allowed values: 20, 40, 80, 160)
*/
void SetUlBandwidth (uint16_t bw);
/**
* Get the bandwidth of the solicited HE TB PPDU.
*
* \return the bandwidth (20, 40, 80 or 160)
*/
uint16_t GetUlBandwidth (void) const;
/**
* Set the GI And LTF Type subfield of the Common Info field.
* Allowed combinations are:
* - 1x LTF + 1.6us GI
* - 2x LTF + 1.6us GI
* - 4x LTF + 3.2us GI
*
* \param guardInterval the guard interval duration (in nanoseconds)
* \param ltfType the HE-LTF type (1, 2 or 4)
*/
void SetGiAndLtfType (uint16_t guardInterval, uint8_t ltfType);
/**
* Get the guard interval duration (in nanoseconds) of the solicited HE TB PPDU.
*
* \return the guard interval duration (in nanoseconds) of the solicited HE TB PPDU
*/
uint16_t GetGuardInterval (void) const;
/**
* Get the LTF type of the solicited HE TB PPDU.
*
* \return the LTF type of the solicited HE TB PPDU
*/
uint8_t GetLtfType (void) const;
/**
* Set the AP TX Power subfield of the Common Info field.
*
* \param power the value (from -20 to 40) for the AP TX Power (dBm)
*/
void SetApTxPower (int8_t power);
/**
* Get the power value (dBm) indicated by the AP TX Power subfield of the
* Common Info field.
*
* \return the AP TX Power (dBm) per 20 MHz
*/
int8_t GetApTxPower (void) const;
/**
* Set the UL Spatial Reuse subfield of the Common Info field.
*
* \param sr the value for the UL Spatial Reuse subfield
*/
void SetUlSpatialReuse (uint16_t sr);
/**
* Get the UL Spatial Reuse subfield of the Common Info field.
*
* \return the UL Spatial Reuse subfield
*/
uint16_t GetUlSpatialReuse (void) const;
/**
* Get a copy of the Common Info field of this Trigger frame.
* Note that the User Info fields are excluded.
*
* \return a Trigger frame including a copy of the Common Info field of this frame.
*/
CtrlTriggerHeader GetCommonInfoField (void) const;
/**
* Append a new User Info field to this Trigger frame and return
* a non-const reference to it. Make sure to call this method after
* setting the type of the Trigger frame.
*
* \return a non-const reference to the newly added User Info field
*/
CtrlTriggerUserInfoField& AddUserInfoField (void);
/**
* Append the given User Info field to this Trigger frame and return
* a non-const reference to it. Make sure that the type of the given
* User Info field matches the type of this Trigger Frame.
*
* \param userInfo the User Info field to append to this Trigger Frame
* \return a non-const reference to the newly added User Info field
*/
CtrlTriggerUserInfoField& AddUserInfoField (const CtrlTriggerUserInfoField& userInfo);
/// User Info fields list const iterator
typedef std::list<CtrlTriggerUserInfoField>::const_iterator ConstIterator;
/// User Info fields list iterator
typedef std::list<CtrlTriggerUserInfoField>::iterator Iterator;
/**
* \brief Get a const iterator pointing to the first User Info field in the list.
*
* \return a const iterator pointing to the first User Info field in the list
*/
ConstIterator begin (void) const;
/**
* \brief Get a const iterator indicating past-the-last User Info field in the list.
*
* \return a const iterator indicating past-the-last User Info field in the list
*/
ConstIterator end (void) const;
/**
* \brief Get an iterator pointing to the first User Info field in the list.
*
* \return an iterator pointing to the first User Info field in the list
*/
Iterator begin (void);
/**
* \brief Get an iterator indicating past-the-last User Info field in the list.
*
* \return an iterator indicating past-the-last User Info field in the list
*/
Iterator end (void);
/**
* \brief Get the number of User Info fields in this Trigger Frame.
*
* \return the number of User Info fields in this Trigger Frame
*/
std::size_t GetNUserInfoFields (void) const;
/**
* Get a const iterator pointing to the first User Info field found (starting from
* the one pointed to by the given iterator) whose AID12 subfield is set to
* the given value.
*
* \param start a const iterator pointing to the User Info field to start the search from
* \param aid12 the value of the AID12 subfield to match
* \return a const iterator pointing to the User Info field matching the specified
* criterion, if any, or an iterator indicating past-the-last User Info field.
*/
ConstIterator FindUserInfoWithAid (ConstIterator start, uint16_t aid12) const;
/**
* Get a const iterator pointing to the first User Info field found whose AID12
* subfield is set to the given value.
*
* \param aid12 the value of the AID12 subfield to match
* \return a const iterator pointing to the User Info field matching the specified
* criterion, if any, or an iterator indicating past-the-last User Info field.
*/
ConstIterator FindUserInfoWithAid (uint16_t aid12) const;
/**
* Get a const iterator pointing to the first User Info field found (starting from
* the one pointed to by the given iterator) which allocates a Random Access
* RU for associated stations.
*
* \param start a const iterator pointing to the User Info field to start the search from
* \return a const iterator pointing to the User Info field matching the specified
* criterion, if any, or an iterator indicating past-the-last User Info field.
*/
ConstIterator FindUserInfoWithRaRuAssociated (ConstIterator start) const;
/**
* Get a const iterator pointing to the first User Info field found which allocates
* a Random Access RU for associated stations.
*
* \return a const iterator pointing to the User Info field matching the specified
* criterion, if any, or an iterator indicating past-the-last User Info field.
*/
ConstIterator FindUserInfoWithRaRuAssociated (void) const;
/**
* Get a const iterator pointing to the first User Info field found (starting from
* the one pointed to by the given iterator) which allocates a Random Access
* RU for unassociated stations.
*
* \param start a const iterator pointing to the User Info field to start the search from
* \return a const iterator pointing to the User Info field matching the specified
* criterion, if any, or an iterator indicating past-the-last User Info field.
*/
ConstIterator FindUserInfoWithRaRuUnassociated (ConstIterator start) const;
/**
* Get a const iterator pointing to the first User Info field found which allocates
* a Random Access RU for unassociated stations.
*
* \return a const iterator pointing to the User Info field matching the specified
* criterion, if any, or an iterator indicating past-the-last User Info field.
*/
ConstIterator FindUserInfoWithRaRuUnassociated (void) const;
/**
* Check the validity of this Trigger frame.
* TODO Implement the checks listed in Section 27.5.3.2.3 of 802.11ax amendment
* D3.0 (Allowed settings of the Trigger frame fields and TRS Control subfield).
*
* This function shall be invoked before transmitting and upon receiving
* a Trigger frame.
*
* \return true if the Trigger frame is valid, false otherwise.
*/
bool IsValid (void) const;
private:
/**
* Common Info field
*/
uint8_t m_triggerType; //!< Trigger type
uint16_t m_ulLength; //!< Value for the L-SIG Length field
bool m_moreTF; //!< True if a subsequent Trigger frame follows
bool m_csRequired; //!< Carrier Sense required
uint8_t m_ulBandwidth; //!< UL BW subfield
uint8_t m_giAndLtfType; //!< GI And LTF Type subfield
uint8_t m_apTxPower; //!< Tx Power used by AP to transmit the Trigger Frame
uint16_t m_ulSpatialReuse; //!< Value for the Spatial Reuse field in HE-SIG-A
/**
* List of User Info fields
*/
std::list<CtrlTriggerUserInfoField> m_userInfoFields; //!< list of User Info fields
};
} //namespace ns3
#endif /* CTRL_HEADERS_H */