A Discrete-Event Network Simulator
API
ht-ppdu.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2020 Orange Labs
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Author: Rediet <getachew.redieteab@orange.com>
19  * Muhammad Iqbal Rochman <muhiqbalcr@uchicago.edu>
20  * Sébastien Deronne <sebastien.deronne@gmail.com> (HtSigHeader)
21  */
22 
23 #include "ns3/wifi-phy.h"
24 #include "ns3/wifi-psdu.h"
25 #include "ns3/wifi-utils.h"
26 #include "ht-phy.h"
27 #include "ht-ppdu.h"
28 #include "ns3/log.h"
29 
30 namespace ns3 {
31 
32 NS_LOG_COMPONENT_DEFINE ("HtPpdu");
33 
34 HtPpdu::HtPpdu (Ptr<const WifiPsdu> psdu, const WifiTxVector& txVector, Time ppduDuration,
35  WifiPhyBand band, uint64_t uid)
36  : OfdmPpdu (psdu, txVector, band, uid, false) //don't instantiate LSigHeader of OfdmPpdu
37 {
38  NS_LOG_FUNCTION (this << psdu << txVector << ppduDuration << band << uid);
39  uint8_t sigExtension = 0;
41  {
42  sigExtension = 6;
43  }
44  uint16_t length = ((ceil ((static_cast<double> (ppduDuration.GetNanoSeconds () - (20 * 1000) - (sigExtension * 1000)) / 1000) / 4.0) * 3) - 3);
45  m_lSig.SetLength (length);
46  m_htSig.SetMcs (txVector.GetMode ().GetMcsValue ());
48  m_htSig.SetHtLength (psdu->GetSize ());
49  m_htSig.SetAggregation (txVector.IsAggregation ());
50  m_htSig.SetShortGuardInterval (txVector.GetGuardInterval () == 400);
51 }
52 
54 {
55 }
56 
59 {
60  WifiTxVector txVector;
61  txVector.SetPreambleType (m_preamble);
62  txVector.SetMode (HtPhy::GetHtMcs (m_htSig.GetMcs ()));
64  txVector.SetNss (1 + (m_htSig.GetMcs () / 8));
65  txVector.SetGuardInterval(m_htSig.GetShortGuardInterval () ? 400 : 800);
67  return txVector;
68 }
69 
70 Time
72 {
73  Time ppduDuration = Seconds (0);
74  const WifiTxVector& txVector = GetTxVector ();
75  ppduDuration = WifiPhy::CalculateTxDuration (m_htSig.GetHtLength (), txVector, m_band);
76  return ppduDuration;
77 }
78 
80 HtPpdu::Copy (void) const
81 {
82  return Create<HtPpdu> (GetPsdu (), GetTxVector (), GetTxDuration (), m_band, m_uid);
83 }
84 
86  : m_mcs (0),
87  m_cbw20_40 (0),
88  m_htLength (0),
89  m_aggregation (0),
90  m_sgi (0)
91 {
92 }
93 
95 {
96 }
97 
98 TypeId
100 {
101  static TypeId tid = TypeId ("ns3::HtSigHeader")
102  .SetParent<Header> ()
103  .SetGroupName ("Wifi")
104  .AddConstructor<HtSigHeader> ()
105  ;
106  return tid;
107 }
108 
109 TypeId
111 {
112  return GetTypeId ();
113 }
114 
115 void
116 HtPpdu::HtSigHeader::Print (std::ostream &os) const
117 {
118  os << "MCS=" << +m_mcs
119  << " HT_LENGTH=" << m_htLength
120  << " CHANNEL_WIDTH=" << GetChannelWidth ()
121  << " SGI=" << +m_sgi
122  << " AGGREGATION=" << +m_aggregation;
123 }
124 
125 uint32_t
127 {
128  return 6;
129 }
130 
131 void
133 {
134  NS_ASSERT (mcs <= 31);
135  m_mcs = mcs;
136 }
137 
138 uint8_t
140 {
141  return m_mcs;
142 }
143 
144 void
146 {
147  m_cbw20_40 = (channelWidth > 20) ? 1 : 0;
148 }
149 
150 uint16_t
152 {
153  return m_cbw20_40 ? 40 : 20;
154 }
155 
156 void
158 {
159  m_htLength = length;
160 }
161 
162 uint16_t
164 {
165  return m_htLength;
166 }
167 
168 void
170 {
171  m_aggregation = aggregation ? 1 : 0;
172 }
173 
174 bool
176 {
177  return m_aggregation ? true : false;
178 }
179 
180 void
182 {
183  m_sgi = sgi ? 1 : 0;
184 }
185 
186 bool
188 {
189  return m_sgi ? true : false;
190 }
191 
192 void
194 {
195  uint8_t byte = m_mcs;
196  byte |= ((m_cbw20_40 & 0x01) << 7);
197  start.WriteU8 (byte);
198  start.WriteU16 (m_htLength);
199  byte = (0x01 << 2); //Set Reserved bit #2 to 1
200  byte |= ((m_aggregation & 0x01) << 3);
201  byte |= ((m_sgi & 0x01) << 7);
202  start.WriteU8 (byte);
203  start.WriteU16 (0);
204 }
205 
206 uint32_t
208 {
210  uint8_t byte = i.ReadU8 ();
211  m_mcs = byte & 0x7f;
212  m_cbw20_40 = ((byte >> 7) & 0x01);
213  m_htLength = i.ReadU16 ();
214  byte = i.ReadU8 ();
215  m_aggregation = ((byte >> 3) & 0x01);
216  m_sgi = ((byte >> 7) & 0x01);
217  i.ReadU16 ();
218  return i.GetDistanceFrom (start);
219 }
220 
221 } //namespace ns3
uint16_t ReadU16(void)
Definition: buffer.h:1029
Protocol header serialization and deserialization.
Definition: header.h:42
bool IsAggregation(void) const
Checks whether the PSDU contains A-MPDU.
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:103
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
void SetChannelWidth(uint16_t channelWidth)
Sets the selected channelWidth (in MHz)
Ptr< const WifiPsdu > GetPsdu(void) const
Get the payload of the PPDU.
Definition: wifi-ppdu.cc:79
Ptr< WifiPpdu > Copy(void) const override
Copy this instance.
Definition: ht-ppdu.cc:80
def start()
Definition: core.py:1855
LSigHeader m_lSig
the L-SIG PHY header
Definition: ofdm-ppdu.h:128
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
Definition: assert.h:67
WifiTxVector GetTxVector(void) const
Get the TXVECTOR used to send the PPDU.
Definition: wifi-ppdu.cc:63
uint64_t m_uid
the unique ID of this PPDU
Definition: wifi-ppdu.h:182
WifiTxVector DoGetTxVector(void) const override
Get the TXVECTOR used to send the PPDU.
Definition: ht-ppdu.cc:58
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
HtSigHeader m_htSig
the HT-SIG PHY header
Definition: ht-ppdu.h:161
uint32_t GetSerializedSize(void) const override
Definition: ht-ppdu.cc:126
uint16_t GetGuardInterval(void) const
virtual ~HtSigHeader()
Definition: ht-ppdu.cc:94
bool GetShortGuardInterval(void) const
Return the short guard interval field of HT-SIG.
Definition: ht-ppdu.cc:187
WifiPhyBand m_band
the WifiPhyBand used to transmit that PPDU
Definition: ofdm-ppdu.h:126
iterator in a Buffer instance
Definition: buffer.h:98
uint32_t GetSize(void) const
Return the size of the PSDU in bytes.
Definition: wifi-psdu.cc:260
WifiMode GetMode(uint16_t staId=SU_STA_ID) const
If this TX vector is associated with an SU PPDU, return the selected payload transmission mode...
uint32_t GetDistanceFrom(Iterator const &o) const
Definition: buffer.cc:783
static Time CalculateTxDuration(uint32_t size, const WifiTxVector &txVector, WifiPhyBand band, uint16_t staId=SU_STA_ID)
Definition: wifi-phy.cc:1610
HT PHY header (HT-SIG1/2).
Definition: ht-ppdu.h:52
void SetGuardInterval(uint16_t guardInterval)
Sets the guard interval duration (in nanoseconds)
WifiPreamble m_preamble
the PHY preamble
Definition: wifi-ppdu.h:179
uint8_t GetMcs(void) const
Return the MCS field of HT-SIG.
Definition: ht-ppdu.cc:139
static TypeId GetTypeId(void)
Get the type ID.
Definition: ht-ppdu.cc:99
void SetNss(uint8_t nss)
Sets the number of Nss.
uint16_t GetChannelWidth(void) const
Return the channel width (in MHz).
Definition: ht-ppdu.cc:151
OFDM PPDU (11a)OfdmPpdu stores a preamble, PHY headers and a PSDU of a PPDU with non-HT header...
Definition: ofdm-ppdu.h:47
Declaration of ns3::HtPhy class.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Time GetTxDuration(void) const override
Get the total transmission duration of the PPDU.
Definition: ht-ppdu.cc:71
int64_t GetNanoSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
Definition: nstime.h:392
void SetAggregation(bool aggregation)
Sets if PSDU contains A-MPDU.
void SetPreambleType(WifiPreamble preamble)
Sets the preamble type.
HtPpdu(Ptr< const WifiPsdu > psdu, const WifiTxVector &txVector, Time ppduDuration, WifiPhyBand band, uint64_t uid)
Create an HT PPDU.
Definition: ht-ppdu.cc:34
void SetChannelWidth(uint16_t channelWidth)
Fill the channel width field of HT-SIG (in MHz).
Definition: ht-ppdu.cc:145
void Print(std::ostream &os) const override
Definition: ht-ppdu.cc:116
The 2.4 GHz band.
Definition: wifi-phy-band.h:35
void SetHtLength(uint16_t length)
Fill the HT length field of HT-SIG (in bytes).
Definition: ht-ppdu.cc:157
void SetAggregation(bool aggregation)
Fill the aggregation field of HT-SIG.
Definition: ht-ppdu.cc:169
void SetMode(WifiMode mode)
Sets the selected payload transmission mode.
TypeId GetInstanceTypeId(void) const override
Get the most derived TypeId for this Object.
Definition: ht-ppdu.cc:110
WifiPhyBand
Identifies the PHY band.
Definition: wifi-phy-band.h:32
uint32_t Deserialize(Buffer::Iterator start) override
Definition: ht-ppdu.cc:207
void Serialize(Buffer::Iterator start) const override
Definition: ht-ppdu.cc:193
virtual ~HtPpdu()
Destructor for HtPpdu.
Definition: ht-ppdu.cc:53
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1289
uint8_t ReadU8(void)
Definition: buffer.h:1021
void SetMcs(uint8_t mcs)
Fill the MCS field of HT-SIG.
Definition: ht-ppdu.cc:132
void SetLength(uint16_t length)
Fill the LENGTH field of L-SIG (in bytes).
Definition: ofdm-ppdu.cc:218
void SetShortGuardInterval(bool sgi)
Fill the short guard interval field of HT-SIG.
Definition: ht-ppdu.cc:181
Declaration of ns3::HtPpdu class.
uint8_t GetMcsValue(void) const
Definition: wifi-mode.cc:137
a unique identifier for an interface.
Definition: type-id.h:58
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:923
uint16_t GetHtLength(void) const
Return the HT length field of HT-SIG (in bytes).
Definition: ht-ppdu.cc:163
uint16_t m_channelWidth
the channel width used to transmit that PPDU in MHz
Definition: ofdm-ppdu.h:127
static WifiMode GetHtMcs(uint8_t index)
Return the HT MCS corresponding to the provided index.
Definition: ht-phy.cc:456
bool GetAggregation(void) const
Return the aggregation field of HT-SIG.
Definition: ht-ppdu.cc:175