A Discrete-Event Network Simulator
API
ocb-wifi-mac.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2008 INRIA
4  * Copyright (c) 2013 Dalian University of Technology
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation;
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18  *
19  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
20  * Junling Bu <linlinjavaer@gmail.com>
21  */
22 
23 #include "ns3/event-id.h"
24 #include "ns3/pointer.h"
25 #include "ns3/log.h"
26 #include "ns3/string.h"
27 #include "ns3/mac-rx-middle.h"
28 #include "ns3/ht-capabilities.h"
29 #include "ns3/vht-capabilities.h"
30 #include "wave-mac-low.h"
31 #include "ocb-wifi-mac.h"
32 #include "vendor-specific-action.h"
33 #include "higher-tx-tag.h"
34 
35 namespace ns3 {
36 
37 NS_LOG_COMPONENT_DEFINE ("OcbWifiMac");
38 
39 NS_OBJECT_ENSURE_REGISTERED (OcbWifiMac);
40 
43 
44 TypeId
46 {
47  static TypeId tid = TypeId ("ns3::OcbWifiMac")
49  .SetGroupName ("Wave")
50  .AddConstructor<OcbWifiMac> ()
51  ;
52  return tid;
53 }
54 
56 {
57  NS_LOG_FUNCTION (this);
58  // Let the lower layers know that we are acting as an OCB node
60  // BSSID is still needed in the low part of MAC
62 }
63 
65 {
66  NS_LOG_FUNCTION (this);
67 }
68 
69 void
71 {
72  NS_LOG_FUNCTION (this << vsc << peer << oi);
73  WifiMacHeader hdr;
75  hdr.SetAddr1 (peer);
76  hdr.SetAddr2 (GetAddress ());
78  hdr.SetDsNotFrom ();
79  hdr.SetDsNotTo ();
82  vsc->AddHeader (vsa);
83 
84  if (GetQosSupported ())
85  {
86  uint8_t tid = QosUtilsGetTidForPacket (vsc);
87  tid = tid > 7 ? 0 : tid;
88  m_edca[QosUtilsMapTidToAc (tid)]->Queue (vsc, hdr);
89  }
90  else
91  {
92  m_txop->Queue (vsc, hdr);
93  }
94 }
95 
96 void
98 {
99  NS_LOG_FUNCTION (this << oi << &cb);
101 }
102 
103 void
105 {
106  NS_LOG_FUNCTION (this << oi);
108 }
109 
110 void
112 {
113  NS_LOG_WARN ("in OCB mode we should not call SetSsid");
114 }
115 
116 Ssid
118 {
119  NS_LOG_WARN ("in OCB mode we should not call GetSsid");
120  // we really do not want to return ssid, however we have to provide
121  return RegularWifiMac::GetSsid ();
122 }
123 
124 
125 void
127 {
128  NS_LOG_WARN ("in OCB mode we should not call SetBsid");
129 }
130 
133 {
134  NS_LOG_WARN ("in OCB mode we should not call GetBssid");
135  return WILDCARD_BSSID;
136 }
137 
138 void
140 {
141  NS_LOG_FUNCTION (this << &linkUp);
143 
144  // The approach taken here is that, from the point of view of a STA
145  // in OCB mode, the link is always up, so we immediately invoke the
146  // callback if one is set
147  linkUp ();
148 }
149 
150 void
152 {
153  NS_LOG_FUNCTION (this << &linkDown);
155  NS_LOG_WARN ("in OCB mode the like will never down, so linkDown will never be called");
156 }
157 
158 void
160 {
161  NS_LOG_FUNCTION (this << packet << to);
162  if (m_stationManager->IsBrandNew (to))
163  {
164  //In ad hoc mode, we assume that every destination supports all
165  //the rates we support.
166  if (GetHtSupported () || GetVhtSupported ())
167  {
170  }
171  if (GetVhtSupported ())
172  {
174  }
177  }
178 
179  WifiMacHeader hdr;
180 
181  // If we are not a QoS STA then we definitely want to use AC_BE to
182  // transmit the packet. A TID of zero will map to AC_BE (through \c
183  // QosUtilsMapTidToAc()), so we use that as our default here.
184  uint8_t tid = 0;
185 
186  if (GetQosSupported ())
187  {
190  hdr.SetQosNoEosp ();
191  hdr.SetQosNoAmsdu ();
192  // About transmission of multiple frames,
193  // in Ad-hoc mode TXOP is not supported for now, so TxopLimit=0;
194  // however in OCB mode, 802.11p do not allow transmit multiple frames
195  // so TxopLimit must equal 0
196  hdr.SetQosTxopLimit (0);
197 
198  // Fill in the QoS control field in the MAC header
199  tid = QosUtilsGetTidForPacket (packet);
200  // Any value greater than 7 is invalid and likely indicates that
201  // the packet had no QoS tag, so we revert to zero, which'll
202  // mean that AC_BE is used.
203  if (tid > 7)
204  {
205  tid = 0;
206  }
207  hdr.SetQosTid (tid);
208  }
209  else
210  {
211  hdr.SetType (WIFI_MAC_DATA);
212  }
213 
214  if (GetHtSupported () || GetVhtSupported ())
215  {
216  hdr.SetNoOrder (); // explicitly set to 0 for the time being since HT/VHT/HE control field is not yet implemented (set it to 1 when implemented)
217  }
218  hdr.SetAddr1 (to);
219  hdr.SetAddr2 (GetAddress ());
220  hdr.SetAddr3 (WILDCARD_BSSID);
221  hdr.SetDsNotFrom ();
222  hdr.SetDsNotTo ();
223 
224  if (GetQosSupported ())
225  {
226  // Sanity check that the TID is valid
227  NS_ASSERT (tid < 8);
228  m_edca[QosUtilsMapTidToAc (tid)]->Queue (packet, hdr);
229  }
230  else
231  {
232  m_txop->Queue (packet, hdr);
233  }
234 }
235 
236 /*
237  * see 802.11p-2010 chapter 11.19
238  * here we only care about data packet and vsa management frame
239  */
240 void
242 {
243  NS_LOG_FUNCTION (this << packet << hdr);
244  NS_ASSERT (!hdr->IsCtl ());
245  NS_ASSERT (hdr->GetAddr3 () == WILDCARD_BSSID);
246 
247  Mac48Address from = hdr->GetAddr2 ();
248  Mac48Address to = hdr->GetAddr1 ();
249 
250  if (m_stationManager->IsBrandNew (from))
251  {
252  //In ad hoc mode, we assume that every destination supports all
253  //the rates we support.
254  if (GetHtSupported () || GetVhtSupported ())
255  {
258  }
259  if (GetVhtSupported ())
260  {
262  }
265  }
266 
267  if (hdr->IsData ())
268  {
269  if (hdr->IsQosData () && hdr->IsQosAmsdu ())
270  {
271  NS_LOG_DEBUG ("Received A-MSDU from" << from);
272  DeaggregateAmsduAndForward (packet, hdr);
273  }
274  else
275  {
276  ForwardUp (packet, from, to);
277  }
278  return;
279  }
280 
281  // why put check here, not before "if (hdr->IsData ())" ?
282  // because WifiNetDevice::ForwardUp needs to m_promiscRx data packet
283  // and will filter data packet for itself
284  // so we need to filter management frame
285  if (to != GetAddress () && !to.IsGroup ())
286  {
287  NS_LOG_LOGIC ("the management frame is not for us");
288  NotifyRxDrop (packet);
289  return;
290  }
291 
292  if (hdr->IsMgt () && hdr->IsAction ())
293  {
294  // yes, we only care about VendorSpecificAction frame in OCB mode
295  // other management frames will be handled by RegularWifiMac::Receive
297  packet->PeekHeader (vsaHdr);
298  if (vsaHdr.GetCategory () == CATEGORY_OF_VSA)
299  {
301  packet->RemoveHeader (vsa);
304 
305  if (cb.IsNull ())
306  {
307  NS_LOG_DEBUG ("cannot find VscCallback for OrganizationIdentifier=" << oi);
308  return;
309  }
310  bool succeed = cb (this, oi,packet, from);
311 
312  if (!succeed)
313  {
314  NS_LOG_DEBUG ("vsc callback could not handle the packet successfully");
315  }
316 
317  return;
318  }
319  }
320  // Invoke the receive handler of our parent class to deal with any
321  // other frames. Specifically, this will handle Block Ack-related
322  // Management Action frames.
323  RegularWifiMac::Receive (packet, hdr);
324 }
325 
326 void
327 OcbWifiMac::ConfigureEdca (uint32_t cwmin, uint32_t cwmax, uint32_t aifsn, enum AcIndex ac)
328 {
329  NS_LOG_FUNCTION (this << cwmin << cwmax << aifsn << ac);
330  Ptr<Txop> dcf;
331  switch (ac)
332  {
333  case AC_VO:
335  dcf->SetMinCw ((cwmin + 1) / 4 - 1);
336  dcf->SetMaxCw ((cwmin + 1) / 2 - 1);
337  dcf->SetAifsn (aifsn);
338  break;
339  case AC_VI:
341  dcf->SetMinCw ((cwmin + 1) / 2 - 1);
342  dcf->SetMaxCw (cwmin);
343  dcf->SetAifsn (aifsn);
344  break;
345  case AC_BE:
347  dcf->SetMinCw (cwmin);
348  dcf->SetMaxCw (cwmax);
349  dcf->SetAifsn (aifsn);
350  break;
351  case AC_BK:
353  dcf->SetMinCw (cwmin);
354  dcf->SetMaxCw (cwmax);
355  dcf->SetAifsn (aifsn);
356  break;
357  case AC_BE_NQOS:
358  dcf = RegularWifiMac::GetTxop ();
359  dcf->SetMinCw (cwmin);
360  dcf->SetMaxCw (cwmax);
361  dcf->SetAifsn (aifsn);
362  break;
363  case AC_UNDEF:
364  NS_FATAL_ERROR ("I don't know what to do with this");
365  break;
366  }
367 }
368 
369 void
371 {
372  NS_LOG_FUNCTION (this << standard);
374  || (standard == WIFI_PHY_STANDARD_80211a));
375 
376  uint32_t cwmin = 15;
377  uint32_t cwmax = 1023;
378 
379  // The special value of AC_BE_NQOS which exists in the Access
380  // Category enumeration allows us to configure plain old DCF.
381  ConfigureEdca (cwmin, cwmax, 2, AC_BE_NQOS);
382 
383  // Now we configure the EDCA functions
384  // see IEEE802.11p-2010 section 7.3.2.29
385  // Wave CCH and SCHs set default 802.11p EDCA
386  ConfigureEdca (cwmin, cwmax, 2, AC_VO);
387  ConfigureEdca (cwmin, cwmax, 3, AC_VI);
388  ConfigureEdca (cwmin, cwmax, 6, AC_BE);
389  ConfigureEdca (cwmin, cwmax, 9, AC_BK);
390 }
391 
392 
393 void
395 {
396  NS_LOG_FUNCTION (this);
398  m_low->NotifySleepNow ();
399 }
400 
401 void
403 {
404  NS_LOG_FUNCTION (this);
405  // wake-up operation is not required in m_low object
407 }
408 
409 void
411 {
412  NS_LOG_FUNCTION (this << duration);
414 }
415 
416 void
418 {
419  NS_LOG_FUNCTION (this << ac);
420  Ptr<QosTxop> queue = m_edca.find (ac)->second;
421  NS_ASSERT (queue != 0);
422  // reset and flush queue
423  queue->NotifyChannelSwitching ();
424 }
425 
426 void
428 {
429  NS_LOG_FUNCTION (this);
430  // The switching event is used to notify MAC entity reset its operation.
433 }
434 
435 void
437 {
438  NS_LOG_FUNCTION (this << device);
439  // To extend current OcbWifiMac for WAVE 1609.4, we shall use WaveMacLow instead of MacLow
440  m_low = CreateObject<WaveMacLow> ();
441  (DynamicCast<WaveMacLow> (m_low))->SetWaveNetDevice (device);
445  for (EdcaQueues::iterator i = m_edca.begin (); i != m_edca.end (); ++i)
446  {
447  i->second->SetMacLow (m_low);
448  i->second->CompleteConfig ();
449  }
450 }
451 } // namespace ns3
uint32_t RemoveHeader(Header &header)
Deserialize and remove the header from the internal buffer.
Definition: packet.cc:280
virtual Ssid GetSsid(void) const
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:102
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
void ConfigureEdca(uint32_t cwmin, uint32_t cwmax, uint32_t aifsn, enum AcIndex ac)
Callback template class.
Definition: callback.h:1176
void RegisterVscCallback(OrganizationIdentifier oi, VscCallback cb)
Ptr< Txop > m_txop
This holds a pointer to the TXOP instance for this WifiMac - used for transmission of frames to non-Q...
virtual void FinishConfigureStandard(enum WifiPhyStandard standard)
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition: object-base.h:45
void AddAllSupportedMcs(Mac48Address address)
Invoked in a STA or AP to store all of the MCS supported by a destination which is also supported loc...
bool IsCtl(void) const
Return true if the Type is Control.
bool GetQosSupported() const
Return whether the device supports QoS.
virtual ~OcbWifiMac(void)
Definition: ocb-wifi-mac.cc:64
EdcaQueues m_edca
This is a map from Access Category index to the corresponding channel access function.
Mac48Address GetAddr1(void) const
Return the address in the Address 1 field.
void CancleTx(enum AcIndex ac)
#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
void SendVsc(Ptr< Packet > vsc, Mac48Address peer, OrganizationIdentifier oi)
Definition: ocb-wifi-mac.cc:70
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:202
void NotifyMaybeCcaBusyStartNow(Time duration)
void NotifySleepNow(void)
This method is typically invoked by the PhyMacLowListener to notify the MAC layer that the device has...
Definition: mac-low.cc:658
OFDM PHY for the 5 GHz band (Clause 17 with 10 MHz channel bandwidth)
virtual Mac48Address GetBssid(void) const
This method shall not be used in WAVE environment and here it will overloaded to log warn message...
VendorSpecificContentManager m_vscManager
VSC manager.
Definition: ocb-wifi-mac.h:181
virtual void Receive(Ptr< Packet > packet, const WifiMacHeader *hdr)
This method acts as the MacRxMiddle receive callback and is invoked to notify us that a frame has bee...
void EnableForWave(Ptr< WaveNetDevice > device)
void NotifyRxDrop(Ptr< const Packet > packet)
Definition: wifi-mac.cc:242
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:162
See IEEE 802.11-2007 chapter 7.3.1.11 and 7.4.5 also IEEE 802.11p-2010 chapter 7.4.5 Although WifiActionHeader has been defined in wifi mgt-header.h/.cc, it is not a good way to inherit from it or add vendor specific action support.
static const Mac48Address WILDCARD_BSSID
Wildcard BSSID.
Definition: ocb-wifi-mac.cc:42
virtual void DeaggregateAmsduAndForward(Ptr< Packet > aggregatedPacket, const WifiMacHeader *hdr)
This method can be called to de-aggregate an A-MSDU and forward the constituent packets up the stack...
void SetLinkDownCallback(Callback< void > linkDown)
Ptr< ChannelAccessManager > m_channelAccessManager
channel access manager
Video.
Definition: qos-utils.h:44
Voice.
Definition: qos-utils.h:46
Best Effort.
Definition: qos-utils.h:40
virtual void Receive(Ptr< Packet > packet, const WifiMacHeader *hdr)
This method acts as the MacRxMiddle receive callback and is invoked to notify us that a frame has bee...
void Receive(Ptr< Packet > packet, const WifiMacHeader *hdr)
Receive a packet.
uint8_t QosUtilsGetTidForPacket(Ptr< const Packet > packet)
If a qos tag is attached to the packet, returns a value < 8.
Definition: qos-utils.cc:57
void DeregisterVscCallback(OrganizationIdentifier &oi)
void RecordDisassociated(Mac48Address address)
Records that the STA was disassociated.
virtual void SetLinkUpCallback(Callback< void > linkUp)
SetLinkUpCallback and SetLinkDownCallback will be overloaded In OCB mode, stations can send packets d...
void SetBssid(Mac48Address bssid)
uint8_t GetCategory(void) const
the category field shall be CATEGORY_OF_VSA
Background.
Definition: qos-utils.h:42
void ForwardUp(Ptr< Packet > packet, Mac48Address from, Mac48Address to)
Forward the packet up to the device.
WifiPhyStandard
Identifies the PHY specification that a Wifi device is configured to use.
base class for all MAC-level wifi objects.
void SetAddr1(Mac48Address address)
Fill the Address 1 field with the given address.
void SetTypeOfStation(TypeOfStation type)
This method is invoked by a subclass to specify what type of station it is implementing.
void SetDsNotTo(void)
Un-set the To DS bit in the Frame Control field.
bool IsQosAmsdu(void) const
Check if the A-MSDU present bit is set in the QoS control field.
void SetAddr3(Mac48Address address)
Fill the Address 3 field with the given address.
bool GetVhtSupported() const
Return whether the device supports VHT.
static TypeId GetTypeId(void)
Get the type ID.
Definition: ocb-wifi-mac.cc:45
void SetOrganizationIdentifier(OrganizationIdentifier oi)
the organization identifier is a public organizationally unique identifier assigned by the IEEE...
ssid
Definition: third.py:93
void AddStationHtCapabilities(Mac48Address from, HtCapabilities htcapabilities)
Records HT capabilities of the remote station.
Mac48Address GetAddr3(void) const
Return the address in the Address 3 field.
void Suspend(void)
To support MAC extension for multiple channel operation, Suspend the activity in current MAC entity...
AcIndex QosUtilsMapTidToAc(uint8_t tid)
Maps TID (Traffic ID) to Access classes.
Definition: qos-utils.cc:31
void MakeVirtualBusy(Time duration)
static Mac48Address GetBroadcast(void)
uint32_t PeekHeader(Header &header) const
Deserialize but does not remove the header from the internal buffer.
Definition: packet.cc:290
Ptr< MacRxMiddle > m_rxMiddle
RX middle (de-fragmentation etc.)
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
Definition: callback.h:1489
Ptr< QosTxop > GetVOQueue(void) const
Accessor for the AC_VO channel access function.
void NotifySleepNow(void)
Notify the DCF that the device has been put in sleep mode.
void NotifySwitchingStartNow(Time duration)
Definition: mac-low.cc:642
Ptr< MacLow > m_low
MacLow (RTS, CTS, DATA, ACK etc.)
Mac48Address GetAddr2(void) const
Return the address in the Address 2 field.
void SetQosTid(uint8_t tid)
Set the TID for the QoS header.
void RemoveReceiveVscCallback(OrganizationIdentifier oi)
void SetLinkUpCallback(Callback< void > linkUp)
OFDM PHY for the 5 GHz band (Clause 17)
Every class exported by the ns3 library is enclosed in the ns3 namespace.
bool IsData(void) const
Return true if the Type is DATA.
void SetAddr2(Mac48Address address)
Fill the Address 2 field with the given address.
an EUI-48 address
Definition: mac48-address.h:43
void SetMacLow(const Ptr< MacLow > low)
Set MacLow associated with this Txop.
Definition: txop.cc:123
Ssid GetSsid(void) const
Ptr< QosTxop > GetVIQueue(void) const
Accessor for the AC_VI channel access function.
virtual void NotifyChannelSwitching(void)
When a channel switching occurs, enqueued packets are removed.
Definition: txop.cc:527
virtual void SetLinkDownCallback(Callback< void > linkDown)
bool IsGroup(void) const
NS_LOG_LOGIC("Net device "<< nd<< " is not bridged")
The IEEE 802.11 SSID Information Element.
Definition: ssid.h:35
Mac48Address GetAddress(void) const
virtual void SetSsid(Ssid ssid)
void SetType(WifiMacType type, bool resetToDsFromDs=true)
Set Type/Subtype values with the correct values depending on the given type.
VscCallback FindVscCallback(OrganizationIdentifier &oi)
static const uint8_t CATEGORY_OF_VSA
see IEEE 802.11-2007 chapter 7.3.1.11 Table 7-24—Category values
Ptr< QosTxop > GetBEQueue(void) const
Accessor for the AC_BE channel access function.
Ptr< Txop > GetTxop(void) const
Accessor for the DCF object.
void SetQosTxopLimit(uint8_t txop)
Set TXOP limit in the QoS control field.
virtual void Queue(Ptr< const Packet > packet, const WifiMacHeader &hdr)
Definition: txop.cc:296
bool IsMgt(void) const
Return true if the Type is Management.
OrganizationIdentifier GetOrganizationIdentifier(void) const
void SetMinCw(uint32_t minCw)
Set the minimum contention window size.
Definition: txop.cc:175
void SetMaxCw(uint32_t maxCw)
Set the maximum contention window size.
Definition: txop.cc:187
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN.
Definition: log.h:262
bool GetHtSupported() const
Return whether the device supports HT.
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition: log.h:270
Total number of ACs.
Definition: qos-utils.h:48
void SetQosNoAmsdu(void)
Set that A-MSDU is not present.
void NotifySwitchingStartNow(Time duration)
virtual void SetBssid(Mac48Address bssid)
void SetNoOrder(void)
Unset order bit in the frame control field.
bool IsQosData(void) const
Return true if the Type is DATA and Subtype is one of the possible values for QoS DATA...
bool IsAction() const
Return true if the header is an Action header.
void SetAifsn(uint8_t aifsn)
Set the number of slots that make up an AIFS.
Definition: txop.cc:257
virtual void Enqueue(Ptr< const Packet > packet, Mac48Address to)
Ptr< QosTxop > GetBKQueue(void) const
Accessor for the AC_BK channel access function.
Ptr< WifiRemoteStationManager > m_stationManager
Remote station manager (rate control, RTS/CTS/fragmentation thresholds etc.)
void SetQosNoEosp()
Un-set the end of service period (EOSP) bit in the QoS control field.
bool IsNull(void) const
Check for null implementation.
Definition: callback.h:1270
void Reset(void)
To support MAC extension for multiple channel operation, Reset current MAC entity and flush its inter...
void AddAllSupportedModes(Mac48Address address)
Invoked in a STA or AP to store all of the modes supported by a destination which is also supported l...
VhtCapabilities GetVhtCapabilities(void) const
Return the VHT capabilities of the device.
void SetupLow(Ptr< MacLow > low)
Set up listener for MacLow events.
bool IsBrandNew(Mac48Address address) const
Return whether the station state is brand new.
a unique identifier for an interface.
Definition: type-id.h:58
void SetRxCallback(Callback< void, Ptr< Packet >, const WifiMacHeader *> callback)
Definition: mac-low.cc:450
void Resume(void)
To support MAC extension for multiple channel operation, Resume the activity of suspended MAC entity...
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:915
AcIndex
This enumeration defines the Access Categories as an enumeration with values corresponding to the AC ...
Definition: qos-utils.h:37
void AddReceiveVscCallback(OrganizationIdentifier oi, VscCallback cb)
Definition: ocb-wifi-mac.cc:97
void NotifyWakeupNow(void)
Notify the DCF that the device has been resumed from sleep mode.
void AddHeader(const Header &header)
Add header to this packet.
Definition: packet.cc:256
void AddStationVhtCapabilities(Mac48Address from, VhtCapabilities vhtcapabilities)
Records VHT capabilities of the remote station.
Implements the IEEE 802.11 MAC header.
HtCapabilities GetHtCapabilities(void) const
Return the HT capabilities of the device.
STAs communicate with each directly outside the context of a BSSIn OCB mac mode,synchronization, association, dis-association and authentication of normal wifi are not used for wireless access in vehicular environments.
Definition: ocb-wifi-mac.h:49
void SetDsNotFrom(void)
Un-set the From DS bit in the Frame Control field.
void SetQosAckPolicy(QosAckPolicy policy)
Set the QoS ACK policy in the QoS control field.