A Discrete-Event Network Simulator
API
vht-operation.cc
Go to the documentation of this file.
1 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2016 Sébastien Deronne
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: Sébastien Deronne <sebastien.deronne@gmail.com>
19  */
20 
21 #include "vht-operation.h"
22 
23 namespace ns3 {
24 
26  : m_channelWidth (0),
27  m_channelCenterFrequencySegment0 (0),
28  m_channelCenterFrequencySegment1 (0),
29  m_basicVhtMcsAndNssSet (0),
30  m_vhtSupported (0)
31 {
32 }
33 
36 {
37  return IE_VHT_OPERATION;
38 }
39 
40 void
41 VhtOperation::SetVhtSupported (uint8_t vhtSupported)
42 {
43  m_vhtSupported = vhtSupported;
44 }
45 
46 uint8_t
48 {
49  //we should not be here if VHT is not supported
51  return 5;
52 }
53 
54 void
55 VhtOperation::SetChannelWidth (uint8_t channelWidth)
56 {
57  m_channelWidth = channelWidth;
58 }
59 
60 void
61 VhtOperation::SetChannelCenterFrequencySegment0 (uint8_t channelCenterFrequencySegment0)
62 {
63  m_channelCenterFrequencySegment0 = channelCenterFrequencySegment0;
64 }
65 
66 void
67 VhtOperation::SetChannelCenterFrequencySegment1 (uint8_t channelCenterFrequencySegment1)
68 {
69  m_channelCenterFrequencySegment1 = channelCenterFrequencySegment1;
70 }
71 
72 void
73 VhtOperation::SetMaxVhtMcsPerNss (uint8_t nss, uint8_t maxVhtMcs)
74 {
75  NS_ASSERT ((maxVhtMcs == 0 || (maxVhtMcs >= 7 && maxVhtMcs <= 9)) && (nss >= 1 && nss <= 8));
76  if (maxVhtMcs != 0)
77  {
78  m_basicVhtMcsAndNssSet |= (((maxVhtMcs - 7) & 0x03) << ((nss - 1) * 2));
79  }
80  else
81  {
82  m_basicVhtMcsAndNssSet |= (3 << ((nss - 1) * 2));
83  }
84 }
85 
86 void
87 VhtOperation::SetBasicVhtMcsAndNssSet (uint16_t basicVhtMcsAndNssSet)
88 {
89  m_basicVhtMcsAndNssSet = basicVhtMcsAndNssSet;
90 }
91 
92 uint8_t
94 {
95  return m_channelWidth;
96 }
97 
98 uint8_t
100 {
102 }
103 
104 uint8_t
106 {
108 }
109 
110 uint16_t
112 {
113  return m_basicVhtMcsAndNssSet;
114 }
115 
118 {
119  if (m_vhtSupported < 1)
120  {
121  return i;
122  }
124 }
125 
126 uint16_t
128 {
129  if (m_vhtSupported < 1)
130  {
131  return 0;
132  }
134 }
135 
136 void
138 {
139  if (m_vhtSupported == 1)
140  {
141  //write the corresponding value for each bit
142  start.WriteU8 (GetChannelWidth ());
145  start.WriteU16 (GetBasicVhtMcsAndNssSet ());
146  }
147 }
148 
149 uint8_t
151 {
153  uint8_t channelWidth = i.ReadU8 ();
154  uint8_t channelCenterFrequencySegment0 = i.ReadU8 ();
155  uint8_t channelCenterFrequencySegment1 = i.ReadU8 ();
156  uint16_t basicVhtMcsAndNssSet = i.ReadU16 ();
157  SetChannelWidth (channelWidth);
158  SetChannelCenterFrequencySegment0 (channelCenterFrequencySegment0);
159  SetChannelCenterFrequencySegment1 (channelCenterFrequencySegment1);
160  SetBasicVhtMcsAndNssSet (basicVhtMcsAndNssSet);
161  return length;
162 }
163 
164 std::ostream &
165 operator << (std::ostream &os, const VhtOperation &VhtOperation)
166 {
167  os << +VhtOperation.GetChannelWidth () << "|"
171  return os;
172 }
173 
174 } //namespace ns3
uint16_t ReadU16(void)
Definition: buffer.h:1029
uint16_t GetBasicVhtMcsAndNssSet(void) const
Return the Basic VHT-MCS And Nss field in the VHT Operation information element.
virtual Buffer::Iterator Serialize(Buffer::Iterator i) const
Serialize entire IE including Element ID and length fields.
void SetMaxVhtMcsPerNss(uint8_t nss, uint8_t maxVhtMcs)
Set the Basic VHT-MCS and NSS field in the VHT Operation information element by specifying the tuple ...
def start()
Definition: core.py:1855
The VHT Operation Information ElementThis class knows how to serialise and deserialise the VHT Operat...
Definition: vht-operation.h:35
#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
uint8_t m_channelWidth
channel width
WifiInformationElementId ElementId() const override
uint8_t DeserializeInformationField(Buffer::Iterator start, uint8_t length) override
Deserialize information (i.e., the body of the IE, not including the Element ID and length octets) ...
iterator in a Buffer instance
Definition: buffer.h:98
std::ostream & operator<<(std::ostream &os, const Angles &a)
Definition: angles.cc:137
uint8_t m_channelCenterFrequencySegment0
channel center frequency segment 0
uint8_t m_vhtSupported
This is used to decide whether this element should be added to the frame or not.
void SetVhtSupported(uint8_t vhtSupported)
Set the VHT supported information element.
void SetChannelCenterFrequencySegment1(uint8_t channelCenterFrequencySegment1)
Set the Channel Center Frequency Segment 1 field in the VHT Operation information element...
uint8_t GetChannelCenterFrequencySegment0(void) const
Return the Channel Center Frequency Segment 0 field in the VHT Operation information element...
uint8_t GetInformationFieldSize() const override
Length of serialized information (i.e., the length of the body of the IE, not including the Element I...
Every class exported by the ns3 library is enclosed in the ns3 namespace.
uint8_t GetChannelWidth(void) const
Return the Channel Width field in the VHT Operation information element.
virtual uint16_t GetSerializedSize() const
Get the size of the serialized IE including Element ID and length fields.
void SetChannelCenterFrequencySegment0(uint8_t channelCenterFrequencySegment0)
Set the Channel Center Frequency Segment 0 field in the VHT Operation information element...
uint16_t m_basicVhtMcsAndNssSet
basic VHT MCS NSS set
#define IE_VHT_OPERATION
uint16_t GetSerializedSize() const override
Get the size of the serialized IE including Element ID and length fields.
void SetBasicVhtMcsAndNssSet(uint16_t basicVhtMcsAndNssSet)
Set the Basic VHT-MCS and NSS field in the VHT Operation information element.
uint8_t ReadU8(void)
Definition: buffer.h:1021
void SerializeInformationField(Buffer::Iterator start) const override
Serialize information (i.e., the body of the IE, not including the Element ID and length octets) ...
uint8_t WifiInformationElementId
This type is used to represent an Information Element ID.
uint8_t m_channelCenterFrequencySegment1
channel center frequency segment 1
Buffer::Iterator Serialize(Buffer::Iterator start) const override
Serialize entire IE including Element ID and length fields.
void SetChannelWidth(uint8_t channelWidth)
Set the Channel Width field in the VHT Operation information element.
uint8_t GetChannelCenterFrequencySegment1(void) const
Return the Channel Center Frequency Segment 1 field in the VHT Operation information element...