A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
he-ppdu.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2020 Orange Labs
3 *
4 * SPDX-License-Identifier: GPL-2.0-only
5 *
6 * Author: Rediet <getachew.redieteab@orange.com>
7 * Muhammad Iqbal Rochman <muhiqbalcr@uchicago.edu>
8 * Sébastien Deronne <sebastien.deronne@gmail.com> (HeSigHeader)
9 */
10
11#ifndef HE_PPDU_H
12#define HE_PPDU_H
13
14#include "ns3/ofdm-ppdu.h"
15
16#include <variant>
17
18/**
19 * @file
20 * @ingroup wifi
21 * Declaration of ns3::HePpdu class.
22 */
23
24namespace ns3
25{
26
27/// HE SIG-B Content Channels
29
30class WifiPsdu;
31
32/**
33 * @brief HE PPDU (11ax)
34 * @ingroup wifi
35 *
36 * HePpdu stores a preamble, PHY headers and a map of PSDUs of a PPDU with HE header
37 */
38class HePpdu : public OfdmPpdu
39{
40 public:
41 /// User Specific Fields in HE-SIG-Bs.
43 {
44 uint16_t staId : 11; ///< STA-ID
45 uint8_t nss : 4; ///< number of spatial streams
46 uint8_t mcs : 4; ///< MCS index
47 };
48
49 /// HE SIG-B Content Channels
50 using HeSigBContentChannels = std::vector<std::vector<HeSigBUserSpecificField>>;
51
52 /**
53 * HE-SIG PHY header for HE SU PPDUs (HE-SIG-A1/A2)
54 */
56 {
57 uint8_t m_format{1}; ///< Format bit
58 uint8_t m_bssColor{0}; ///< BSS color field
59 uint8_t m_mcs{0}; ///< MCS field
60 uint8_t m_bandwidth{0}; ///< Bandwidth field
61 uint8_t m_giLtfSize{0}; ///< GI+LTF Size field
62 uint8_t m_nsts{0}; ///< NSTS
63 }; // struct HeSuSigHeader
64
65 /**
66 * HE-SIG PHY header for HE TB PPDUs (HE-SIG-A1/A2)
67 */
69 {
70 uint8_t m_format{0}; ///< Format bit
71 uint8_t m_bssColor{0}; ///< BSS color field
72 uint8_t m_bandwidth{0}; ///< Bandwidth field
73 }; // struct HeTbSigHeader
74
75 /**
76 * HE-SIG PHY header for HE MU PPDUs (HE-SIG-A1/A2/B)
77 */
79 {
80 // HE-SIG-A fields
81 uint8_t m_bssColor{0}; ///< BSS color field
82 uint8_t m_bandwidth{0}; ///< Bandwidth field
83 uint8_t m_sigBMcs{0}; ///< HE-SIG-B MCS
84 uint8_t m_muMimoUsers; ///< MU-MIMO users
85 uint8_t m_sigBCompression{0}; ///< SIG-B compression
86 uint8_t m_giLtfSize{0}; ///< GI+LTF Size field
87
88 // HE-SIG-B fields
89 RuAllocation m_ruAllocation; //!< RU allocations that are going to be carried in SIG-B
90 //!< common subfields
91 HeSigBContentChannels m_contentChannels; //!< HE SIG-B Content Channels
92 std::optional<Center26ToneRuIndication>
93 m_center26ToneRuIndication; //!< center 26 tone RU indication in SIG-B common subfields
94 }; // struct HeMuSigHeader
95
96 /// type of the HE-SIG PHY header
97 using HeSigHeader = std::variant<std::monostate, HeSuSigHeader, HeTbSigHeader, HeMuSigHeader>;
98
99 /**
100 * The transmit power spectral density flag, namely used
101 * to correctly build PSDs for pre-HE and HE portions.
102 */
104 {
105 PSD_NON_HE_PORTION, //!< Non-HE portion of an HE PPDU
106 PSD_HE_PORTION //!< HE portion of an HE PPDU
107 };
108
109 /**
110 * Create an SU HE PPDU, storing a PSDU.
111 *
112 * @param psdu the PHY payload (PSDU)
113 * @param txVector the TXVECTOR that was used for this PPDU
114 * @param channel the operating channel of the PHY used to transmit this PPDU
115 * @param ppduDuration the transmission duration of this PPDU
116 * @param uid the unique ID of this PPDU
117 */
119 const WifiTxVector& txVector,
120 const WifiPhyOperatingChannel& channel,
122 uint64_t uid);
123 /**
124 * Create an MU HE PPDU, storing a map of PSDUs.
125 *
126 * This PPDU can either be UL or DL.
127 *
128 * @param psdus the PHY payloads (PSDUs)
129 * @param txVector the TXVECTOR that was used for this PPDU
130 * @param channel the operating channel of the PHY used to transmit this PPDU
131 * @param ppduDuration the transmission duration of this PPDU
132 * @param uid the unique ID of this PPDU or of the triggering PPDU if this is an HE TB PPDU
133 * @param flag the flag indicating the type of Tx PSD to build
134 */
136 const WifiTxVector& txVector,
137 const WifiPhyOperatingChannel& channel,
139 uint64_t uid,
141
142 Time GetTxDuration() const override;
143 Ptr<WifiPpdu> Copy() const override;
144 WifiPpduType GetType() const override;
145 uint16_t GetStaId() const override;
146 MHz_u GetTxChannelWidth() const override;
147
148 /**
149 * Get the payload of the PPDU.
150 *
151 * @param bssColor the BSS color of the PHY calling this function.
152 * @param staId the STA-ID of the PHY calling this function.
153 * @return the PSDU
154 */
155 Ptr<const WifiPsdu> GetPsdu(uint8_t bssColor, uint16_t staId = SU_STA_ID) const;
156
157 /**
158 * @return the transmit PSD flag set for this PPDU
159 *
160 * @see TxPsdFlag
161 */
162 TxPsdFlag GetTxPsdFlag() const;
163
164 /**
165 * @param flag the transmit PSD flag set for this PPDU
166 *
167 * @see TxPsdFlag
168 */
169 void SetTxPsdFlag(TxPsdFlag flag) const;
170
171 /**
172 * Update the TXVECTOR for HE TB PPDUs, since the information to decode HE TB PPDUs
173 * is not available from the PHY headers but it requires information from the TRIGVECTOR
174 * of the AP expecting these HE TB PPDUs.
175 *
176 * @param trigVector the TRIGVECTOR or std::nullopt if no TRIGVECTOR is available at the caller
177 */
178 void UpdateTxVectorForUlMu(const std::optional<WifiTxVector>& trigVector) const;
179
180 /**
181 * Get the number of STAs per HE-SIG-B content channel.
182 * This is applicable only for MU.
183 * See section 27.3.10.8.3 of IEEE 802.11ax draft 4.0.
184 *
185 * @param channelWidth the channel width occupied by the PPDU
186 * @param ruAllocation 8 bit RU_ALLOCATION per 20 MHz
187 * @param sigBCompression flag whether SIG-B compression is used by the PPDU
188 * @param numMuMimoUsers the number of MU-MIMO users addressed by the PPDU
189 * @return a pair containing the number of RUs in each HE-SIG-B content channel (resp. 1 and 2)
190 */
191 static std::pair<std::size_t, std::size_t> GetNumRusPerHeSigBContentChannel(
192 MHz_u channelWidth,
194 bool sigBCompression,
195 uint8_t numMuMimoUsers);
196
197 /**
198 * Get the HE SIG-B content channels for a given PPDU
199 * IEEE 802.11ax-2021 27.3.11.8.2 HE-SIG-B content channels
200 *
201 * @param txVector the TXVECTOR used for the PPDU
202 * @param p20Index the index of the primary20 channel
203 * @return HE-SIG-B content channels
204 */
206 uint8_t p20Index);
207
208 /**
209 * Get variable length HE SIG-B field size
210 * @param channelWidth the channel width occupied by the PPDU
211 * @param ruAllocation 8 bit RU_ALLOCATION per 20 MHz
212 * @param sigBCompression flag whether SIG-B compression is used by the PPDU
213 * @param numMuMimoUsers the number of MU-MIMO users addressed by the PPDU
214 * @return field size in bytes
215 */
216 static uint32_t GetSigBFieldSize(MHz_u channelWidth,
218 bool sigBCompression,
219 std::size_t numMuMimoUsers);
220
221 protected:
222 /**
223 * Fill in the TXVECTOR from PHY headers.
224 *
225 * @param txVector the TXVECTOR to fill in
226 */
227 virtual void SetTxVectorFromPhyHeaders(WifiTxVector& txVector) const;
228
229 /**
230 * Reconstruct HeMuUserInfoMap from HE-SIG-B header.
231 *
232 * @param txVector the TXVECTOR to set its HeMuUserInfoMap
233 * @param ruAllocation the RU_ALLOCATION per 20 MHz
234 * @param contentChannels the HE-SIG-B content channels
235 * @param sigBCompression flag whether SIG-B compression is used by the PPDU
236 * @param numMuMimoUsers the number of MU-MIMO users addressed by the PPDU
237 */
238 void SetHeMuUserInfos(WifiTxVector& txVector,
241 bool sigBCompression,
242 uint8_t numMuMimoUsers) const;
243
244 /**
245 * Convert channel width expressed in MHz to bandwidth field encoding in HE-SIG-A.
246 *
247 * @param channelWidth the channel width in MHz
248 * @return the value used to encode the bandwidth field in HE-SIG-A
249 */
250 static uint8_t GetChannelWidthEncodingFromMhz(MHz_u channelWidth);
251
252 /**
253 * Convert number of spatial streams to NSTS field encoding in HE-SIG-A.
254 *
255 * @param nss the number of spatial streams
256 * @return the value used to encode the NSTS field in HE-SIG-A
257 */
258 static uint8_t GetNstsEncodingFromNss(uint8_t nss);
259
260 /**
261 * Convert guard interval and NLTF to its encoding in HE-SIG-A.
262 *
263 * @param guardInterval the guard interval
264 * @param nltf the the number of long training symbols
265 * @return the value used to encode the NSTS field in HE-SIG-A
266 */
268
269 /**
270 * Convert number of spatial streams from NSTS field encoding in HE-SIG-A.
271 *
272 * @param nsts the value of the NSTS field in HE-SIG-A
273 * @return the number of spatial streams
274 */
275 static uint8_t GetNssFromNstsEncoding(uint8_t nsts);
276
277 /**
278 * Convert channel width expressed in MHz from bandwidth field encoding in HE-SIG-A.
279 *
280 * @param bandwidth the value of the bandwidth field in HE-SIG-A
281 * @return the channel width in MHz
282 */
283 static MHz_u GetChannelWidthMhzFromEncoding(uint8_t bandwidth);
284
285 /**
286 * Convert guard interval from its encoding in HE-SIG-A.
287 *
288 * @param giAndNltfSize the value used to encode the guard interval and NLTF field in HE-SIG-A
289 * @return the guard interval
290 */
292
293 /**
294 * Convert number of MU-MIMO users to its encoding in HE-SIG-A.
295 *
296 * @param nUsers the number of MU-MIMO users
297 * @return the number of MU-MIMO users to its encoding in HE-SIG-A
298 */
299 static uint8_t GetMuMimoUsersEncoding(uint8_t nUsers);
300
301 /**
302 * Convert number of MU-MIMO users from its encoding in HE-SIG-A.
303 *
304 * @param encoding the number of MU-MIMO users encoded in HE-SIG-A
305 * @return the number of MU-MIMO users from its encoding in HE-SIG-A
306 */
307 static uint8_t GetMuMimoUsersFromEncoding(uint8_t encoding);
308
309 mutable TxPsdFlag m_txPsdFlag; //!< the transmit power spectral density flag
310
311 private:
312 std::string PrintPayload() const override;
313 WifiTxVector DoGetTxVector() const override;
314
315 /**
316 * Fill in the PHY headers.
317 *
318 * @param txVector the TXVECTOR that was used for this PPDU
319 * @param ppduDuration the transmission duration of this PPDU
320 */
321 void SetPhyHeaders(const WifiTxVector& txVector, Time ppduDuration);
322
323 /**
324 * Fill in the L-SIG header.
325 *
326 * @param ppduDuration the transmission duration of this PPDU
327 */
329
330 /**
331 * Fill in the HE-SIG header.
332 *
333 * @param txVector the TXVECTOR that was used for this PPDU
334 */
335 void SetHeSigHeader(const WifiTxVector& txVector);
336
337 /**
338 * Return true if the PPDU is a MU PPDU
339 * @return true if the PPDU is a MU PPDU
340 */
341 virtual bool IsMu() const;
342
343 /**
344 * Return true if the PPDU is a DL MU PPDU
345 * @return true if the PPDU is a DL MU PPDU
346 */
347 virtual bool IsDlMu() const;
348
349 /**
350 * Return true if the PPDU is an UL MU PPDU
351 * @return true if the PPDU is an UL MU PPDU
352 */
353 virtual bool IsUlMu() const;
354
355 HeSigHeader m_heSig; //!< the HE-SIG PHY header
356}; // class HePpdu
357
358/**
359 * @brief Stream insertion operator.
360 *
361 * @param os the stream
362 * @param flag the transmit power spectral density flag
363 * @returns a reference to the stream
364 */
365std::ostream& operator<<(std::ostream& os, const HePpdu::TxPsdFlag& flag);
366
367} // namespace ns3
368
369#endif /* HE_PPDU_H */
HE PPDU (11ax)
Definition he-ppdu.h:39
std::vector< std::vector< HeSigBUserSpecificField > > HeSigBContentChannels
HE SIG-B Content Channels.
Definition he-ppdu.h:50
HeSigHeader m_heSig
the HE-SIG PHY header
Definition he-ppdu.h:355
void SetTxPsdFlag(TxPsdFlag flag) const
Definition he-ppdu.cc:433
WifiTxVector DoGetTxVector() const override
Get the TXVECTOR used to send the PPDU.
Definition he-ppdu.cc:156
virtual void SetTxVectorFromPhyHeaders(WifiTxVector &txVector) const
Fill in the TXVECTOR from PHY headers.
Definition he-ppdu.cc:165
void UpdateTxVectorForUlMu(const std::optional< WifiTxVector > &trigVector) const
Update the TXVECTOR for HE TB PPDUs, since the information to decode HE TB PPDUs is not available fro...
Definition he-ppdu.cc:440
Ptr< WifiPpdu > Copy() const override
Copy this instance.
Definition he-ppdu.cc:325
MHz_u GetTxChannelWidth() const override
Get the channel width over which the PPDU will effectively be transmitted.
Definition he-ppdu.cc:407
TxPsdFlag
The transmit power spectral density flag, namely used to correctly build PSDs for pre-HE and HE porti...
Definition he-ppdu.h:104
@ PSD_HE_PORTION
HE portion of an HE PPDU.
Definition he-ppdu.h:106
@ PSD_NON_HE_PORTION
Non-HE portion of an HE PPDU.
Definition he-ppdu.h:105
virtual bool IsDlMu() const
Return true if the PPDU is a DL MU PPDU.
Definition he-ppdu.cc:351
Time GetTxDuration() const override
Get the total transmission duration of the PPDU.
Definition he-ppdu.cc:303
virtual bool IsUlMu() const
Return true if the PPDU is an UL MU PPDU.
Definition he-ppdu.cc:357
static uint32_t GetSigBFieldSize(MHz_u channelWidth, const RuAllocation &ruAllocation, bool sigBCompression, std::size_t numMuMimoUsers)
Get variable length HE SIG-B field size.
Definition he-ppdu.cc:629
static uint8_t GetNstsEncodingFromNss(uint8_t nss)
Convert number of spatial streams to NSTS field encoding in HE-SIG-A.
Definition he-ppdu.cc:768
void SetHeSigHeader(const WifiTxVector &txVector)
Fill in the HE-SIG header.
Definition he-ppdu.cc:110
static uint8_t GetNssFromNstsEncoding(uint8_t nsts)
Convert number of spatial streams from NSTS field encoding in HE-SIG-A.
Definition he-ppdu.cc:775
static Time GetGuardIntervalFromEncoding(uint8_t giAndNltfSize)
Convert guard interval from its encoding in HE-SIG-A.
Definition he-ppdu.cc:750
std::variant< std::monostate, HeSuSigHeader, HeTbSigHeader, HeMuSigHeader > HeSigHeader
type of the HE-SIG PHY header
Definition he-ppdu.h:97
void SetPhyHeaders(const WifiTxVector &txVector, Time ppduDuration)
Fill in the PHY headers.
Definition he-ppdu.cc:83
std::string PrintPayload() const override
Print the payload of the PPDU.
Definition he-ppdu.cc:670
uint16_t GetStaId() const override
Get the ID of the STA that transmitted the PPDU for UL MU, SU_STA_ID otherwise.
Definition he-ppdu.cc:400
static HeSigBContentChannels GetHeSigBContentChannels(const WifiTxVector &txVector, uint8_t p20Index)
Get the HE SIG-B content channels for a given PPDU IEEE 802.11ax-2021 27.3.11.8.2 HE-SIG-B content ch...
Definition he-ppdu.cc:544
void SetHeMuUserInfos(WifiTxVector &txVector, const RuAllocation &ruAllocation, const HeSigBContentChannels &contentChannels, bool sigBCompression, uint8_t numMuMimoUsers) const
Reconstruct HeMuUserInfoMap from HE-SIG-B header.
Definition he-ppdu.cc:214
WifiPpduType GetType() const override
Return the PPDU type (.
Definition he-ppdu.cc:331
static std::pair< std::size_t, std::size_t > GetNumRusPerHeSigBContentChannel(MHz_u channelWidth, const RuAllocation &ruAllocation, bool sigBCompression, uint8_t numMuMimoUsers)
Get the number of STAs per HE-SIG-B content channel.
Definition he-ppdu.cc:476
TxPsdFlag GetTxPsdFlag() const
Definition he-ppdu.cc:427
static uint8_t GetMuMimoUsersEncoding(uint8_t nUsers)
Convert number of MU-MIMO users to its encoding in HE-SIG-A.
Definition he-ppdu.cc:781
static MHz_u GetChannelWidthMhzFromEncoding(uint8_t bandwidth)
Convert channel width expressed in MHz from bandwidth field encoding in HE-SIG-A.
Definition he-ppdu.cc:707
virtual bool IsMu() const
Return true if the PPDU is a MU PPDU.
Definition he-ppdu.cc:345
static uint8_t GetChannelWidthEncodingFromMhz(MHz_u channelWidth)
Convert channel width expressed in MHz to bandwidth field encoding in HE-SIG-A.
Definition he-ppdu.cc:686
void SetLSigHeader(Time ppduDuration)
Fill in the L-SIG header.
Definition he-ppdu.cc:91
static uint8_t GetGuardIntervalAndNltfEncoding(Time guardInterval, uint8_t nltf)
Convert guard interval and NLTF to its encoding in HE-SIG-A.
Definition he-ppdu.cc:728
TxPsdFlag m_txPsdFlag
the transmit power spectral density flag
Definition he-ppdu.h:309
static uint8_t GetMuMimoUsersFromEncoding(uint8_t encoding)
Convert number of MU-MIMO users from its encoding in HE-SIG-A.
Definition he-ppdu.cc:788
OFDM PPDU (11a)
Definition ofdm-ppdu.h:36
Smart pointer class similar to boost::intrusive_ptr.
Definition ptr.h:66
Simulation virtual time values and global simulation resolution.
Definition nstime.h:94
Class that keeps track of all information about the current PHY operating channel.
Ptr< const WifiPsdu > GetPsdu() const
Get the payload of the PPDU.
Definition wifi-ppdu.cc:140
WifiPsdu stores an MPDU, S-MPDU or A-MPDU, by keeping header(s) and payload(s) separate for each cons...
Definition wifi-psdu.h:33
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
Ptr< T > Create(Ts &&... args)
Create class instances by constructors with varying numbers of arguments and return them by Ptr.
Definition ptr.h:436
WifiPpduType
The type of PPDU (SU, DL MU, or UL MU)
Every class exported by the ns3 library is enclosed in the ns3 namespace.
std::unordered_map< uint16_t, Ptr< const WifiPsdu > > WifiConstPsduMap
Map of const PSDUs indexed by STA-ID.
Definition wifi-ppdu.h:38
double MHz_u
MHz weak type.
Definition wifi-units.h:31
std::ostream & operator<<(std::ostream &os, const Angles &a)
Definition angles.cc:148
std::vector< uint16_t > RuAllocation
9 bits RU_ALLOCATION per 20 MHz
static constexpr uint16_t SU_STA_ID
STA_ID to identify a single user (SU)
Definition wifi-mode.h:24
constexpr size_t WIFI_MAX_NUM_HE_SIGB_CONTENT_CHANNELS
HE SIG-B Content Channels.
Definition he-ppdu.h:28
HE-SIG PHY header for HE MU PPDUs (HE-SIG-A1/A2/B)
Definition he-ppdu.h:79
uint8_t m_giLtfSize
GI+LTF Size field.
Definition he-ppdu.h:86
uint8_t m_bssColor
BSS color field.
Definition he-ppdu.h:81
HeSigBContentChannels m_contentChannels
HE SIG-B Content Channels.
Definition he-ppdu.h:91
RuAllocation m_ruAllocation
RU allocations that are going to be carried in SIG-B common subfields.
Definition he-ppdu.h:89
uint8_t m_sigBMcs
HE-SIG-B MCS.
Definition he-ppdu.h:83
uint8_t m_sigBCompression
SIG-B compression.
Definition he-ppdu.h:85
std::optional< Center26ToneRuIndication > m_center26ToneRuIndication
center 26 tone RU indication in SIG-B common subfields
Definition he-ppdu.h:93
uint8_t m_muMimoUsers
MU-MIMO users.
Definition he-ppdu.h:84
uint8_t m_bandwidth
Bandwidth field.
Definition he-ppdu.h:82
User Specific Fields in HE-SIG-Bs.
Definition he-ppdu.h:43
uint8_t nss
number of spatial streams
Definition he-ppdu.h:45
HE-SIG PHY header for HE SU PPDUs (HE-SIG-A1/A2)
Definition he-ppdu.h:56
uint8_t m_bssColor
BSS color field.
Definition he-ppdu.h:58
uint8_t m_mcs
MCS field.
Definition he-ppdu.h:59
uint8_t m_giLtfSize
GI+LTF Size field.
Definition he-ppdu.h:61
uint8_t m_bandwidth
Bandwidth field.
Definition he-ppdu.h:60
uint8_t m_format
Format bit.
Definition he-ppdu.h:57
HE-SIG PHY header for HE TB PPDUs (HE-SIG-A1/A2)
Definition he-ppdu.h:69
uint8_t m_format
Format bit.
Definition he-ppdu.h:70
uint8_t m_bandwidth
Bandwidth field.
Definition he-ppdu.h:72
uint8_t m_bssColor
BSS color field.
Definition he-ppdu.h:71