1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2006 INRIA
4  * Copyright (c) 2009 MIRKO BANCHI
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  * Authors: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
20  *          Mirko Banchi <mk.banchi@gmail.com>
21  */
22 
23 #include "ns3/simulator.h"
24 #include "ns3/address-utils.h"
25 #include "mgt-headers.h"
26 
27 namespace ns3 {
28 
29 /***********************************************************
30  *          Probe Request
31  ***********************************************************/
32 
33 NS_OBJECT_ENSURE_REGISTERED (MgtProbeRequestHeader);
34 
~MgtProbeRequestHeader()35 MgtProbeRequestHeader::~MgtProbeRequestHeader ()
36 {
37 }
38 
39 void
SetSsid(Ssid ssid)40 MgtProbeRequestHeader::SetSsid (Ssid ssid)
41 {
42   m_ssid = ssid;
43 }
44 
45 Ssid
GetSsid(void) const46 MgtProbeRequestHeader::GetSsid (void) const
47 {
48   return m_ssid;
49 }
50 
51 void
SetSupportedRates(SupportedRates rates)52 MgtProbeRequestHeader::SetSupportedRates (SupportedRates rates)
53 {
54   m_rates = rates;
55 }
56 
57 void
SetExtendedCapabilities(ExtendedCapabilities extendedCapabilities)58 MgtProbeRequestHeader::SetExtendedCapabilities (ExtendedCapabilities extendedCapabilities)
59 {
60   m_extendedCapability = extendedCapabilities;
61 }
62 
63 ExtendedCapabilities
GetExtendedCapabilities(void) const64 MgtProbeRequestHeader::GetExtendedCapabilities (void) const
65 {
66   return m_extendedCapability;
67 }
68 
69 void
SetHtCapabilities(HtCapabilities htCapabilities)70 MgtProbeRequestHeader::SetHtCapabilities (HtCapabilities htCapabilities)
71 {
72   m_htCapability = htCapabilities;
73 }
74 
75 HtCapabilities
GetHtCapabilities(void) const76 MgtProbeRequestHeader::GetHtCapabilities (void) const
77 {
78   return m_htCapability;
79 }
80 
81 void
SetVhtCapabilities(VhtCapabilities vhtCapabilities)82 MgtProbeRequestHeader::SetVhtCapabilities (VhtCapabilities vhtCapabilities)
83 {
84   m_vhtCapability = vhtCapabilities;
85 }
86 
87 VhtCapabilities
GetVhtCapabilities(void) const88 MgtProbeRequestHeader::GetVhtCapabilities (void) const
89 {
90   return m_vhtCapability;
91 }
92 
93 void
SetHeCapabilities(HeCapabilities heCapabilities)94 MgtProbeRequestHeader::SetHeCapabilities (HeCapabilities heCapabilities)
95 {
96   m_heCapability = heCapabilities;
97 }
98 
99 HeCapabilities
GetHeCapabilities(void) const100 MgtProbeRequestHeader::GetHeCapabilities (void) const
101 {
102   return m_heCapability;
103 }
104 
105 SupportedRates
GetSupportedRates(void) const106 MgtProbeRequestHeader::GetSupportedRates (void) const
107 {
108   return m_rates;
109 }
110 
111 uint32_t
GetSerializedSize(void) const112 MgtProbeRequestHeader::GetSerializedSize (void) const
113 {
114   uint32_t size = 0;
115   size += m_ssid.GetSerializedSize ();
116   size += m_rates.GetSerializedSize ();
117   size += m_rates.extended.GetSerializedSize ();
118   size += m_extendedCapability.GetSerializedSize ();
119   size += m_htCapability.GetSerializedSize ();
120   size += m_vhtCapability.GetSerializedSize ();
121   size += m_heCapability.GetSerializedSize ();
122   return size;
123 }
124 
125 TypeId
GetTypeId(void)126 MgtProbeRequestHeader::GetTypeId (void)
127 {
128   static TypeId tid = TypeId ("ns3::MgtProbeRequestHeader")
129     .SetParent<Header> ()
130     .SetGroupName ("Wifi")
131     .AddConstructor<MgtProbeRequestHeader> ()
132   ;
133   return tid;
134 }
135 
136 TypeId
GetInstanceTypeId(void) const137 MgtProbeRequestHeader::GetInstanceTypeId (void) const
138 {
139   return GetTypeId ();
140 }
141 
142 void
Print(std::ostream & os) const143 MgtProbeRequestHeader::Print (std::ostream &os) const
144 {
145   os << "ssid=" << m_ssid << ", "
146      << "rates=" << m_rates << ", "
147      << "Extended Capabilities=" << m_extendedCapability << " , "
148      << "HT Capabilities=" << m_htCapability << " , "
149      << "VHT Capabilities=" << m_vhtCapability << " , "
150      << "HE Capabilities=" << m_heCapability;
151 }
152 
153 void
Serialize(Buffer::Iterator start) const154 MgtProbeRequestHeader::Serialize (Buffer::Iterator start) const
155 {
156   Buffer::Iterator i = start;
157   i = m_ssid.Serialize (i);
158   i = m_rates.Serialize (i);
159   i = m_rates.extended.Serialize (i);
160   i = m_extendedCapability.Serialize (i);
161   i = m_htCapability.Serialize (i);
162   i = m_vhtCapability.Serialize (i);
163   i = m_heCapability.Serialize (i);
164 }
165 
166 uint32_t
Deserialize(Buffer::Iterator start)167 MgtProbeRequestHeader::Deserialize (Buffer::Iterator start)
168 {
169   Buffer::Iterator i = start;
170   i = m_ssid.Deserialize (i);
171   i = m_rates.Deserialize (i);
172   i = m_rates.extended.DeserializeIfPresent (i);
173   i = m_extendedCapability.DeserializeIfPresent (i);
174   i = m_htCapability.DeserializeIfPresent (i);
175   i = m_vhtCapability.DeserializeIfPresent (i);
176   i = m_heCapability.DeserializeIfPresent (i);
177   return i.GetDistanceFrom (start);
178 }
179 
180 
181 /***********************************************************
182  *          Probe Response
183  ***********************************************************/
184 
185 NS_OBJECT_ENSURE_REGISTERED (MgtProbeResponseHeader);
186 
MgtProbeResponseHeader()187 MgtProbeResponseHeader::MgtProbeResponseHeader ()
188 {
189 }
190 
~MgtProbeResponseHeader()191 MgtProbeResponseHeader::~MgtProbeResponseHeader ()
192 {
193 }
194 
195 uint64_t
GetTimestamp()196 MgtProbeResponseHeader::GetTimestamp ()
197 {
198   return m_timestamp;
199 }
200 
201 Ssid
GetSsid(void) const202 MgtProbeResponseHeader::GetSsid (void) const
203 {
204   return m_ssid;
205 }
206 
207 uint64_t
GetBeaconIntervalUs(void) const208 MgtProbeResponseHeader::GetBeaconIntervalUs (void) const
209 {
210   return m_beaconInterval;
211 }
212 
213 SupportedRates
GetSupportedRates(void) const214 MgtProbeResponseHeader::GetSupportedRates (void) const
215 {
216   return m_rates;
217 }
218 
219 void
SetCapabilities(CapabilityInformation capabilities)220 MgtProbeResponseHeader::SetCapabilities (CapabilityInformation capabilities)
221 {
222   m_capability = capabilities;
223 }
224 
225 CapabilityInformation
GetCapabilities(void) const226 MgtProbeResponseHeader::GetCapabilities (void) const
227 {
228   return m_capability;
229 }
230 
231 void
SetExtendedCapabilities(ExtendedCapabilities extendedCapabilities)232 MgtProbeResponseHeader::SetExtendedCapabilities (ExtendedCapabilities extendedCapabilities)
233 {
234   m_extendedCapability = extendedCapabilities;
235 }
236 
237 ExtendedCapabilities
GetExtendedCapabilities(void) const238 MgtProbeResponseHeader::GetExtendedCapabilities (void) const
239 {
240   return m_extendedCapability;
241 }
242 
243 void
SetHtCapabilities(HtCapabilities htCapabilities)244 MgtProbeResponseHeader::SetHtCapabilities (HtCapabilities htCapabilities)
245 {
246   m_htCapability = htCapabilities;
247 }
248 
249 HtCapabilities
GetHtCapabilities(void) const250 MgtProbeResponseHeader::GetHtCapabilities (void) const
251 {
252   return m_htCapability;
253 }
254 
255 void
SetHtOperation(HtOperation htOperation)256 MgtProbeResponseHeader::SetHtOperation (HtOperation htOperation)
257 {
258   m_htOperation = htOperation;
259 }
260 
261 HtOperation
GetHtOperation(void) const262 MgtProbeResponseHeader::GetHtOperation (void) const
263 {
264   return m_htOperation;
265 }
266 
267 void
SetVhtCapabilities(VhtCapabilities vhtCapabilities)268 MgtProbeResponseHeader::SetVhtCapabilities (VhtCapabilities vhtCapabilities)
269 {
270   m_vhtCapability = vhtCapabilities;
271 }
272 
273 VhtCapabilities
GetVhtCapabilities(void) const274 MgtProbeResponseHeader::GetVhtCapabilities (void) const
275 {
276   return m_vhtCapability;
277 }
278 
279 void
SetVhtOperation(VhtOperation vhtOperation)280 MgtProbeResponseHeader::SetVhtOperation (VhtOperation vhtOperation)
281 {
282   m_vhtOperation = vhtOperation;
283 }
284 
285 VhtOperation
GetVhtOperation(void) const286 MgtProbeResponseHeader::GetVhtOperation (void) const
287 {
288   return m_vhtOperation;
289 }
290 
291 void
SetHeCapabilities(HeCapabilities heCapabilities)292 MgtProbeResponseHeader::SetHeCapabilities (HeCapabilities heCapabilities)
293 {
294   m_heCapability = heCapabilities;
295 }
296 
297 HeCapabilities
GetHeCapabilities(void) const298 MgtProbeResponseHeader::GetHeCapabilities (void) const
299 {
300   return m_heCapability;
301 }
302 
303 void
SetHeOperation(HeOperation heOperation)304 MgtProbeResponseHeader::SetHeOperation (HeOperation heOperation)
305 {
306   m_heOperation = heOperation;
307 }
308 
309 HeOperation
GetHeOperation(void) const310 MgtProbeResponseHeader::GetHeOperation (void) const
311 {
312   return m_heOperation;
313 }
314 
315 void
SetSsid(Ssid ssid)316 MgtProbeResponseHeader::SetSsid (Ssid ssid)
317 {
318   m_ssid = ssid;
319 }
320 
321 void
SetBeaconIntervalUs(uint64_t us)322 MgtProbeResponseHeader::SetBeaconIntervalUs (uint64_t us)
323 {
324   m_beaconInterval = us;
325 }
326 
327 void
SetSupportedRates(SupportedRates rates)328 MgtProbeResponseHeader::SetSupportedRates (SupportedRates rates)
329 {
330   m_rates = rates;
331 }
332 
333 void
SetDsssParameterSet(DsssParameterSet dsssParameterSet)334 MgtProbeResponseHeader::SetDsssParameterSet (DsssParameterSet dsssParameterSet)
335 {
336   m_dsssParameterSet = dsssParameterSet;
337 }
338 
339 DsssParameterSet
GetDsssParameterSet(void) const340 MgtProbeResponseHeader::GetDsssParameterSet (void) const
341 {
342   return m_dsssParameterSet;
343 }
344 
345 void
SetErpInformation(ErpInformation erpInformation)346 MgtProbeResponseHeader::SetErpInformation (ErpInformation erpInformation)
347 {
348   m_erpInformation = erpInformation;
349 }
350 
351 ErpInformation
GetErpInformation(void) const352 MgtProbeResponseHeader::GetErpInformation (void) const
353 {
354   return m_erpInformation;
355 }
356 
357 void
SetEdcaParameterSet(EdcaParameterSet edcaParameters)358 MgtProbeResponseHeader::SetEdcaParameterSet (EdcaParameterSet edcaParameters)
359 {
360   m_edcaParameterSet = edcaParameters;
361 }
362 
363 void
SetMuEdcaParameterSet(MuEdcaParameterSet muEdcaParameters)364 MgtProbeResponseHeader::SetMuEdcaParameterSet (MuEdcaParameterSet muEdcaParameters)
365 {
366   m_muEdcaParameterSet = muEdcaParameters;
367 }
368 
369 EdcaParameterSet
GetEdcaParameterSet(void) const370 MgtProbeResponseHeader::GetEdcaParameterSet (void) const
371 {
372   return m_edcaParameterSet;
373 }
374 
375 MuEdcaParameterSet
GetMuEdcaParameterSet(void) const376 MgtProbeResponseHeader::GetMuEdcaParameterSet (void) const
377 {
378   return m_muEdcaParameterSet;
379 }
380 
381 TypeId
GetTypeId(void)382 MgtProbeResponseHeader::GetTypeId (void)
383 {
384   static TypeId tid = TypeId ("ns3::MgtProbeResponseHeader")
385     .SetParent<Header> ()
386     .SetGroupName ("Wifi")
387     .AddConstructor<MgtProbeResponseHeader> ()
388   ;
389   return tid;
390 }
391 
392 TypeId
GetInstanceTypeId(void) const393 MgtProbeResponseHeader::GetInstanceTypeId (void) const
394 {
395   return GetTypeId ();
396 }
397 
398 uint32_t
GetSerializedSize(void) const399 MgtProbeResponseHeader::GetSerializedSize (void) const
400 {
401   uint32_t size = 0;
402   size += 8; //timestamp
403   size += 2; //beacon interval
404   size += m_capability.GetSerializedSize ();
405   size += m_ssid.GetSerializedSize ();
406   size += m_rates.GetSerializedSize ();
407   size += m_dsssParameterSet.GetSerializedSize ();
408   size += m_erpInformation.GetSerializedSize ();
409   size += m_rates.extended.GetSerializedSize ();
410   size += m_edcaParameterSet.GetSerializedSize ();
411   size += m_extendedCapability.GetSerializedSize ();
412   size += m_htCapability.GetSerializedSize ();
413   size += m_htOperation.GetSerializedSize ();
414   size += m_vhtCapability.GetSerializedSize ();
415   size += m_vhtOperation.GetSerializedSize ();
416   size += m_heCapability.GetSerializedSize ();
417   size += m_heOperation.GetSerializedSize ();
418   size += m_muEdcaParameterSet.GetSerializedSize ();
419   return size;
420 }
421 
422 void
Print(std::ostream & os) const423 MgtProbeResponseHeader::Print (std::ostream &os) const
424 {
425   os << "ssid=" << m_ssid << ", "
426      << "rates=" << m_rates << ", "
427      << "ERP information=" << m_erpInformation << ", "
428      << "Extended Capabilities=" << m_extendedCapability << " , "
429      << "HT Capabilities=" << m_htCapability << " , "
430      << "HT Operation=" << m_htOperation << " , "
431      << "VHT Capabilities=" << m_vhtCapability << " , "
432      << "VHT Operation=" << m_vhtOperation << " , "
433      << "HE Capabilities=" << m_heCapability << " , "
434      << "HE Operation=" << m_heOperation;
435 }
436 
437 void
Serialize(Buffer::Iterator start) const438 MgtProbeResponseHeader::Serialize (Buffer::Iterator start) const
439 {
440   //timestamp
441   //beacon interval
442   //capability information
443   //SSID
444   //supported rates
445   //FH parameter set
446   //DS parameter set
447   //CF parameter set
448   //IBSS parameter set
449   Buffer::Iterator i = start;
450   i.WriteHtolsbU64 (Simulator::Now ().GetMicroSeconds ());
451   i.WriteHtolsbU16 (static_cast<uint16_t> (m_beaconInterval / 1024));
452   i = m_capability.Serialize (i);
453   i = m_ssid.Serialize (i);
454   i = m_rates.Serialize (i);
455   i = m_dsssParameterSet.Serialize (i);
456   i = m_erpInformation.Serialize (i);
457   i = m_rates.extended.Serialize (i);
458   i = m_edcaParameterSet.Serialize (i);
459   i = m_extendedCapability.Serialize (i);
460   i = m_htCapability.Serialize (i);
461   i = m_htOperation.Serialize (i);
462   i = m_vhtCapability.Serialize (i);
463   i = m_vhtOperation.Serialize (i);
464   i = m_heCapability.Serialize (i);
465   i = m_heOperation.Serialize (i);
466   i = m_muEdcaParameterSet.Serialize (i);
467 }
468 
469 uint32_t
Deserialize(Buffer::Iterator start)470 MgtProbeResponseHeader::Deserialize (Buffer::Iterator start)
471 {
472   Buffer::Iterator i = start;
473   m_timestamp = i.ReadLsbtohU64 ();
474   m_beaconInterval = i.ReadLsbtohU16 ();
475   m_beaconInterval *= 1024;
476   i = m_capability.Deserialize (i);
477   i = m_ssid.Deserialize (i);
478   i = m_rates.Deserialize (i);
479   i = m_dsssParameterSet.DeserializeIfPresent (i);
480   i = m_erpInformation.DeserializeIfPresent (i);
481   i = m_rates.extended.DeserializeIfPresent (i);
482   i = m_edcaParameterSet.DeserializeIfPresent (i);
483   i = m_extendedCapability.DeserializeIfPresent (i);
484   i = m_htCapability.DeserializeIfPresent (i);
485   i = m_htOperation.DeserializeIfPresent (i);
486   i = m_vhtCapability.DeserializeIfPresent (i);
487   i = m_vhtOperation.DeserializeIfPresent (i);
488   i = m_heCapability.DeserializeIfPresent (i);
489   i = m_heOperation.DeserializeIfPresent (i);
490   i = m_muEdcaParameterSet.DeserializeIfPresent (i);
491   return i.GetDistanceFrom (start);
492 }
493 
494 
495 /***********************************************************
496  *          Beacons
497  ***********************************************************/
498 
499 NS_OBJECT_ENSURE_REGISTERED (MgtBeaconHeader);
500 
501 /* static */
502 TypeId
GetTypeId(void)503 MgtBeaconHeader::GetTypeId (void)
504 {
505   static TypeId tid = TypeId ("ns3::MgtBeaconHeader")
506     .SetParent<MgtProbeResponseHeader> ()
507     .SetGroupName ("Wifi")
508     .AddConstructor<MgtBeaconHeader> ()
509   ;
510   return tid;
511 }
512 
513 
514 /***********************************************************
515  *          Assoc Request
516  ***********************************************************/
517 
518 NS_OBJECT_ENSURE_REGISTERED (MgtAssocRequestHeader);
519 
MgtAssocRequestHeader()520 MgtAssocRequestHeader::MgtAssocRequestHeader ()
521   : m_listenInterval (0)
522 {
523 }
524 
~MgtAssocRequestHeader()525 MgtAssocRequestHeader::~MgtAssocRequestHeader ()
526 {
527 }
528 
529 void
SetSsid(Ssid ssid)530 MgtAssocRequestHeader::SetSsid (Ssid ssid)
531 {
532   m_ssid = ssid;
533 }
534 
535 void
SetSupportedRates(SupportedRates rates)536 MgtAssocRequestHeader::SetSupportedRates (SupportedRates rates)
537 {
538   m_rates = rates;
539 }
540 
541 void
SetListenInterval(uint16_t interval)542 MgtAssocRequestHeader::SetListenInterval (uint16_t interval)
543 {
544   m_listenInterval = interval;
545 }
546 
547 void
SetCapabilities(CapabilityInformation capabilities)548 MgtAssocRequestHeader::SetCapabilities (CapabilityInformation capabilities)
549 {
550   m_capability = capabilities;
551 }
552 
553 CapabilityInformation
GetCapabilities(void) const554 MgtAssocRequestHeader::GetCapabilities (void) const
555 {
556   return m_capability;
557 }
558 
559 void
SetExtendedCapabilities(ExtendedCapabilities extendedCapabilities)560 MgtAssocRequestHeader::SetExtendedCapabilities (ExtendedCapabilities extendedCapabilities)
561 {
562   m_extendedCapability = extendedCapabilities;
563 }
564 
565 ExtendedCapabilities
GetExtendedCapabilities(void) const566 MgtAssocRequestHeader::GetExtendedCapabilities (void) const
567 {
568   return m_extendedCapability;
569 }
570 
571 void
SetHtCapabilities(HtCapabilities htCapabilities)572 MgtAssocRequestHeader::SetHtCapabilities (HtCapabilities htCapabilities)
573 {
574   m_htCapability = htCapabilities;
575 }
576 
577 HtCapabilities
GetHtCapabilities(void) const578 MgtAssocRequestHeader::GetHtCapabilities (void) const
579 {
580   return m_htCapability;
581 }
582 
583 void
SetVhtCapabilities(VhtCapabilities vhtCapabilities)584 MgtAssocRequestHeader::SetVhtCapabilities (VhtCapabilities vhtCapabilities)
585 {
586   m_vhtCapability = vhtCapabilities;
587 }
588 
589 VhtCapabilities
GetVhtCapabilities(void) const590 MgtAssocRequestHeader::GetVhtCapabilities (void) const
591 {
592   return m_vhtCapability;
593 }
594 
595 void
SetHeCapabilities(HeCapabilities heCapabilities)596 MgtAssocRequestHeader::SetHeCapabilities (HeCapabilities heCapabilities)
597 {
598   m_heCapability = heCapabilities;
599 }
600 
601 HeCapabilities
GetHeCapabilities(void) const602 MgtAssocRequestHeader::GetHeCapabilities (void) const
603 {
604   return m_heCapability;
605 }
606 
607 Ssid
GetSsid(void) const608 MgtAssocRequestHeader::GetSsid (void) const
609 {
610   return m_ssid;
611 }
612 
613 SupportedRates
GetSupportedRates(void) const614 MgtAssocRequestHeader::GetSupportedRates (void) const
615 {
616   return m_rates;
617 }
618 
619 uint16_t
GetListenInterval(void) const620 MgtAssocRequestHeader::GetListenInterval (void) const
621 {
622   return m_listenInterval;
623 }
624 
625 TypeId
GetTypeId(void)626 MgtAssocRequestHeader::GetTypeId (void)
627 {
628   static TypeId tid = TypeId ("ns3::MgtAssocRequestHeader")
629     .SetParent<Header> ()
630     .SetGroupName ("Wifi")
631     .AddConstructor<MgtAssocRequestHeader> ()
632   ;
633   return tid;
634 }
635 
636 TypeId
GetInstanceTypeId(void) const637 MgtAssocRequestHeader::GetInstanceTypeId (void) const
638 {
639   return GetTypeId ();
640 }
641 
642 uint32_t
GetSerializedSize(void) const643 MgtAssocRequestHeader::GetSerializedSize (void) const
644 {
645   uint32_t size = 0;
646   size += m_capability.GetSerializedSize ();
647   size += 2;
648   size += m_ssid.GetSerializedSize ();
649   size += m_rates.GetSerializedSize ();
650   size += m_rates.extended.GetSerializedSize ();
651   size += m_extendedCapability.GetSerializedSize ();
652   size += m_htCapability.GetSerializedSize ();
653   size += m_vhtCapability.GetSerializedSize ();
654   size += m_heCapability.GetSerializedSize ();
655   return size;
656 }
657 
658 void
Print(std::ostream & os) const659 MgtAssocRequestHeader::Print (std::ostream &os) const
660 {
661   os << "ssid=" << m_ssid << ", "
662      << "rates=" << m_rates << ", "
663      << "Extended Capabilities=" << m_extendedCapability << " , "
664      << "HT Capabilities=" << m_htCapability << " , "
665      << "VHT Capabilities=" << m_vhtCapability << " , "
666      << "HE Capabilities=" << m_heCapability;
667 }
668 
669 void
Serialize(Buffer::Iterator start) const670 MgtAssocRequestHeader::Serialize (Buffer::Iterator start) const
671 {
672   Buffer::Iterator i = start;
673   i = m_capability.Serialize (i);
674   i.WriteHtolsbU16 (m_listenInterval);
675   i = m_ssid.Serialize (i);
676   i = m_rates.Serialize (i);
677   i = m_rates.extended.Serialize (i);
678   i = m_extendedCapability.Serialize (i);
679   i = m_htCapability.Serialize (i);
680   i = m_vhtCapability.Serialize (i);
681   i = m_heCapability.Serialize (i);
682 }
683 
684 uint32_t
Deserialize(Buffer::Iterator start)685 MgtAssocRequestHeader::Deserialize (Buffer::Iterator start)
686 {
687   Buffer::Iterator i = start;
688   i = m_capability.Deserialize (i);
689   m_listenInterval = i.ReadLsbtohU16 ();
690   i = m_ssid.Deserialize (i);
691   i = m_rates.Deserialize (i);
692   i = m_rates.extended.DeserializeIfPresent (i);
693   i = m_extendedCapability.DeserializeIfPresent (i);
694   i = m_htCapability.DeserializeIfPresent (i);
695   i = m_vhtCapability.DeserializeIfPresent (i);
696   i = m_heCapability.DeserializeIfPresent (i);
697   return i.GetDistanceFrom (start);
698 }
699 
700 
701 /***********************************************************
702  *          Ressoc Request
703  ***********************************************************/
704 
705 NS_OBJECT_ENSURE_REGISTERED (MgtReassocRequestHeader);
706 
MgtReassocRequestHeader()707 MgtReassocRequestHeader::MgtReassocRequestHeader ()
708   : m_currentApAddr (Mac48Address ())
709 {
710 }
711 
~MgtReassocRequestHeader()712 MgtReassocRequestHeader::~MgtReassocRequestHeader ()
713 {
714 }
715 
716 void
SetSsid(Ssid ssid)717 MgtReassocRequestHeader::SetSsid (Ssid ssid)
718 {
719   m_ssid = ssid;
720 }
721 
722 void
SetSupportedRates(SupportedRates rates)723 MgtReassocRequestHeader::SetSupportedRates (SupportedRates rates)
724 {
725   m_rates = rates;
726 }
727 
728 void
SetListenInterval(uint16_t interval)729 MgtReassocRequestHeader::SetListenInterval (uint16_t interval)
730 {
731   m_listenInterval = interval;
732 }
733 
734 void
SetCapabilities(CapabilityInformation capabilities)735 MgtReassocRequestHeader::SetCapabilities (CapabilityInformation capabilities)
736 {
737   m_capability = capabilities;
738 }
739 
740 CapabilityInformation
GetCapabilities(void) const741 MgtReassocRequestHeader::GetCapabilities (void) const
742 {
743   return m_capability;
744 }
745 
746 void
SetExtendedCapabilities(ExtendedCapabilities extendedCapabilities)747 MgtReassocRequestHeader::SetExtendedCapabilities (ExtendedCapabilities extendedCapabilities)
748 {
749   m_extendedCapability = extendedCapabilities;
750 }
751 
752 ExtendedCapabilities
GetExtendedCapabilities(void) const753 MgtReassocRequestHeader::GetExtendedCapabilities (void) const
754 {
755   return m_extendedCapability;
756 }
757 
758 void
SetHtCapabilities(HtCapabilities htCapabilities)759 MgtReassocRequestHeader::SetHtCapabilities (HtCapabilities htCapabilities)
760 {
761   m_htCapability = htCapabilities;
762 }
763 
764 HtCapabilities
GetHtCapabilities(void) const765 MgtReassocRequestHeader::GetHtCapabilities (void) const
766 {
767   return m_htCapability;
768 }
769 
770 void
SetVhtCapabilities(VhtCapabilities vhtCapabilities)771 MgtReassocRequestHeader::SetVhtCapabilities (VhtCapabilities vhtCapabilities)
772 {
773   m_vhtCapability = vhtCapabilities;
774 }
775 
776 VhtCapabilities
GetVhtCapabilities(void) const777 MgtReassocRequestHeader::GetVhtCapabilities (void) const
778 {
779   return m_vhtCapability;
780 }
781 
782 void
SetHeCapabilities(HeCapabilities heCapabilities)783 MgtReassocRequestHeader::SetHeCapabilities (HeCapabilities heCapabilities)
784 {
785   m_heCapability = heCapabilities;
786 }
787 
788 HeCapabilities
GetHeCapabilities(void) const789 MgtReassocRequestHeader::GetHeCapabilities (void) const
790 {
791   return m_heCapability;
792 }
793 
794 Ssid
GetSsid(void) const795 MgtReassocRequestHeader::GetSsid (void) const
796 {
797   return m_ssid;
798 }
799 
800 SupportedRates
GetSupportedRates(void) const801 MgtReassocRequestHeader::GetSupportedRates (void) const
802 {
803   return m_rates;
804 }
805 
806 uint16_t
GetListenInterval(void) const807 MgtReassocRequestHeader::GetListenInterval (void) const
808 {
809   return m_listenInterval;
810 }
811 
812 void
SetCurrentApAddress(Mac48Address currentApAddr)813 MgtReassocRequestHeader::SetCurrentApAddress (Mac48Address currentApAddr)
814 {
815   m_currentApAddr = currentApAddr;
816 }
817 
818 TypeId
GetTypeId(void)819 MgtReassocRequestHeader::GetTypeId (void)
820 {
821   static TypeId tid = TypeId ("ns3::MgtReassocRequestHeader")
822     .SetParent<Header> ()
823     .SetGroupName ("Wifi")
824     .AddConstructor<MgtReassocRequestHeader> ()
825   ;
826   return tid;
827 }
828 
829 TypeId
GetInstanceTypeId(void) const830 MgtReassocRequestHeader::GetInstanceTypeId (void) const
831 {
832   return GetTypeId ();
833 }
834 
835 uint32_t
GetSerializedSize(void) const836 MgtReassocRequestHeader::GetSerializedSize (void) const
837 {
838   uint32_t size = 0;
839   size += m_capability.GetSerializedSize ();
840   size += 2; //listen interval
841   size += 6; //current AP address
842   size += m_ssid.GetSerializedSize ();
843   size += m_rates.GetSerializedSize ();
844   size += m_rates.extended.GetSerializedSize ();
845   size += m_extendedCapability.GetSerializedSize ();
846   size += m_htCapability.GetSerializedSize ();
847   size += m_vhtCapability.GetSerializedSize ();
848   size += m_heCapability.GetSerializedSize ();
849   return size;
850 }
851 
852 void
Print(std::ostream & os) const853 MgtReassocRequestHeader::Print (std::ostream &os) const
854 {
855   os << "current AP address=" << m_currentApAddr << ", "
856      << "ssid=" << m_ssid << ", "
857      << "rates=" << m_rates << ", "
858      << "Extended Capabilities=" << m_extendedCapability << " , "
859      << "HT Capabilities=" << m_htCapability << " , "
860      << "VHT Capabilities=" << m_vhtCapability << " , "
861      << "HE Capabilities=" << m_heCapability;
862 }
863 
864 void
Serialize(Buffer::Iterator start) const865 MgtReassocRequestHeader::Serialize (Buffer::Iterator start) const
866 {
867   Buffer::Iterator i = start;
868   i = m_capability.Serialize (i);
869   i.WriteHtolsbU16 (m_listenInterval);
870   WriteTo (i, m_currentApAddr);
871   i = m_ssid.Serialize (i);
872   i = m_rates.Serialize (i);
873   i = m_rates.extended.Serialize (i);
874   i = m_extendedCapability.Serialize (i);
875   i = m_htCapability.Serialize (i);
876   i = m_vhtCapability.Serialize (i);
877   i = m_heCapability.Serialize (i);
878 }
879 
880 uint32_t
Deserialize(Buffer::Iterator start)881 MgtReassocRequestHeader::Deserialize (Buffer::Iterator start)
882 {
883   Buffer::Iterator i = start;
884   i = m_capability.Deserialize (i);
885   m_listenInterval = i.ReadLsbtohU16 ();
886   ReadFrom (i, m_currentApAddr);
887   i = m_ssid.Deserialize (i);
888   i = m_rates.Deserialize (i);
889   i = m_rates.extended.DeserializeIfPresent (i);
890   i = m_extendedCapability.DeserializeIfPresent (i);
891   i = m_htCapability.DeserializeIfPresent (i);
892   i = m_vhtCapability.DeserializeIfPresent (i);
893   i = m_heCapability.DeserializeIfPresent (i);
894   return i.GetDistanceFrom (start);
895 }
896 
897 
898 /***********************************************************
899  *          Assoc/Reassoc Response
900  ***********************************************************/
901 
902 NS_OBJECT_ENSURE_REGISTERED (MgtAssocResponseHeader);
903 
MgtAssocResponseHeader()904 MgtAssocResponseHeader::MgtAssocResponseHeader ()
905   : m_aid (0)
906 {
907 }
908 
~MgtAssocResponseHeader()909 MgtAssocResponseHeader::~MgtAssocResponseHeader ()
910 {
911 }
912 
913 StatusCode
GetStatusCode(void)914 MgtAssocResponseHeader::GetStatusCode (void)
915 {
916   return m_code;
917 }
918 
919 SupportedRates
GetSupportedRates(void)920 MgtAssocResponseHeader::GetSupportedRates (void)
921 {
922   return m_rates;
923 }
924 
925 void
SetStatusCode(StatusCode code)926 MgtAssocResponseHeader::SetStatusCode (StatusCode code)
927 {
928   m_code = code;
929 }
930 
931 void
SetSupportedRates(SupportedRates rates)932 MgtAssocResponseHeader::SetSupportedRates (SupportedRates rates)
933 {
934   m_rates = rates;
935 }
936 
937 void
SetCapabilities(CapabilityInformation capabilities)938 MgtAssocResponseHeader::SetCapabilities (CapabilityInformation capabilities)
939 {
940   m_capability = capabilities;
941 }
942 
943 CapabilityInformation
GetCapabilities(void) const944 MgtAssocResponseHeader::GetCapabilities (void) const
945 {
946   return m_capability;
947 }
948 
949 void
SetExtendedCapabilities(ExtendedCapabilities extendedCapabilities)950 MgtAssocResponseHeader::SetExtendedCapabilities (ExtendedCapabilities extendedCapabilities)
951 {
952   m_extendedCapability = extendedCapabilities;
953 }
954 
955 ExtendedCapabilities
GetExtendedCapabilities(void) const956 MgtAssocResponseHeader::GetExtendedCapabilities (void) const
957 {
958   return m_extendedCapability;
959 }
960 
961 void
SetHtCapabilities(HtCapabilities htCapabilities)962 MgtAssocResponseHeader::SetHtCapabilities (HtCapabilities htCapabilities)
963 {
964   m_htCapability = htCapabilities;
965 }
966 
967 HtCapabilities
GetHtCapabilities(void) const968 MgtAssocResponseHeader::GetHtCapabilities (void) const
969 {
970   return m_htCapability;
971 }
972 
973 void
SetHtOperation(HtOperation htOperation)974 MgtAssocResponseHeader::SetHtOperation (HtOperation htOperation)
975 {
976   m_htOperation = htOperation;
977 }
978 
979 HtOperation
GetHtOperation(void) const980 MgtAssocResponseHeader::GetHtOperation (void) const
981 {
982   return m_htOperation;
983 }
984 
985 void
SetVhtCapabilities(VhtCapabilities vhtCapabilities)986 MgtAssocResponseHeader::SetVhtCapabilities (VhtCapabilities vhtCapabilities)
987 {
988   m_vhtCapability = vhtCapabilities;
989 }
990 
991 VhtCapabilities
GetVhtCapabilities(void) const992 MgtAssocResponseHeader::GetVhtCapabilities (void) const
993 {
994   return m_vhtCapability;
995 }
996 
997 void
SetVhtOperation(VhtOperation vhtOperation)998 MgtAssocResponseHeader::SetVhtOperation (VhtOperation vhtOperation)
999 {
1000   m_vhtOperation = vhtOperation;
1001 }
1002 
1003 VhtOperation
GetVhtOperation(void) const1004 MgtAssocResponseHeader::GetVhtOperation (void) const
1005 {
1006   return m_vhtOperation;
1007 }
1008 
1009 void
SetHeCapabilities(HeCapabilities heCapabilities)1010 MgtAssocResponseHeader::SetHeCapabilities (HeCapabilities heCapabilities)
1011 {
1012   m_heCapability = heCapabilities;
1013 }
1014 
1015 HeCapabilities
GetHeCapabilities(void) const1016 MgtAssocResponseHeader::GetHeCapabilities (void) const
1017 {
1018   return m_heCapability;
1019 }
1020 
1021 void
SetHeOperation(HeOperation heOperation)1022 MgtAssocResponseHeader::SetHeOperation (HeOperation heOperation)
1023 {
1024   m_heOperation = heOperation;
1025 }
1026 
1027 HeOperation
GetHeOperation(void) const1028 MgtAssocResponseHeader::GetHeOperation (void) const
1029 {
1030   return m_heOperation;
1031 }
1032 
1033 void
SetAssociationId(uint16_t aid)1034 MgtAssocResponseHeader::SetAssociationId (uint16_t aid)
1035 {
1036   m_aid = aid;
1037 }
1038 
1039 uint16_t
GetAssociationId(void) const1040 MgtAssocResponseHeader::GetAssociationId (void) const
1041 {
1042   return m_aid;
1043 }
1044 
1045 void
SetErpInformation(ErpInformation erpInformation)1046 MgtAssocResponseHeader::SetErpInformation (ErpInformation erpInformation)
1047 {
1048   m_erpInformation = erpInformation;
1049 }
1050 
1051 ErpInformation
GetErpInformation(void) const1052 MgtAssocResponseHeader::GetErpInformation (void) const
1053 {
1054   return m_erpInformation;
1055 }
1056 
1057 void
SetEdcaParameterSet(EdcaParameterSet edcaparameters)1058 MgtAssocResponseHeader::SetEdcaParameterSet (EdcaParameterSet edcaparameters)
1059 {
1060   m_edcaParameterSet = edcaparameters;
1061 }
1062 
1063 void
SetMuEdcaParameterSet(MuEdcaParameterSet muEdcaParameters)1064 MgtAssocResponseHeader::SetMuEdcaParameterSet (MuEdcaParameterSet muEdcaParameters)
1065 {
1066   m_muEdcaParameterSet = muEdcaParameters;
1067 }
1068 
1069 EdcaParameterSet
GetEdcaParameterSet(void) const1070 MgtAssocResponseHeader::GetEdcaParameterSet (void) const
1071 {
1072   return m_edcaParameterSet;
1073 }
1074 
1075 MuEdcaParameterSet
GetMuEdcaParameterSet(void) const1076 MgtAssocResponseHeader::GetMuEdcaParameterSet (void) const
1077 {
1078   return m_muEdcaParameterSet;
1079 }
1080 
1081 TypeId
GetTypeId(void)1082 MgtAssocResponseHeader::GetTypeId (void)
1083 {
1084   static TypeId tid = TypeId ("ns3::MgtAssocResponseHeader")
1085     .SetParent<Header> ()
1086     .SetGroupName ("Wifi")
1087     .AddConstructor<MgtAssocResponseHeader> ()
1088   ;
1089   return tid;
1090 }
1091 
1092 TypeId
GetInstanceTypeId(void) const1093 MgtAssocResponseHeader::GetInstanceTypeId (void) const
1094 {
1095   return GetTypeId ();
1096 }
1097 
1098 uint32_t
GetSerializedSize(void) const1099 MgtAssocResponseHeader::GetSerializedSize (void) const
1100 {
1101   uint32_t size = 0;
1102   size += m_capability.GetSerializedSize ();
1103   size += m_code.GetSerializedSize ();
1104   size += 2; //aid
1105   size += m_rates.GetSerializedSize ();
1106   size += m_erpInformation.GetSerializedSize ();
1107   size += m_rates.extended.GetSerializedSize ();
1108   size += m_edcaParameterSet.GetSerializedSize ();
1109   size += m_extendedCapability.GetSerializedSize ();
1110   size += m_htCapability.GetSerializedSize ();
1111   size += m_htOperation.GetSerializedSize ();
1112   size += m_vhtCapability.GetSerializedSize ();
1113   size += m_vhtOperation.GetSerializedSize ();
1114   size += m_heCapability.GetSerializedSize ();
1115   size += m_heOperation.GetSerializedSize ();
1116   size += m_muEdcaParameterSet.GetSerializedSize ();
1117   return size;
1118 }
1119 
1120 void
Print(std::ostream & os) const1121 MgtAssocResponseHeader::Print (std::ostream &os) const
1122 {
1123   os << "status code=" << m_code << ", "
1124      << "aid=" << m_aid << ", "
1125      << "rates=" << m_rates << ", "
1126      << "ERP information=" << m_erpInformation << ", "
1127      << "Extended Capabilities=" << m_extendedCapability << " , "
1128      << "HT Capabilities=" << m_htCapability << " , "
1129      << "HT Operation=" << m_htOperation << " , "
1130      << "VHT Capabilities=" << m_vhtCapability << " , "
1131      << "VHT Operation=" << m_vhtOperation << " , "
1132      << "HE Capabilities=" << m_heCapability << " , "
1133      << "HE Operation=" << m_heOperation;
1134 }
1135 
1136 void
Serialize(Buffer::Iterator start) const1137 MgtAssocResponseHeader::Serialize (Buffer::Iterator start) const
1138 {
1139   Buffer::Iterator i = start;
1140   i = m_capability.Serialize (i);
1141   i = m_code.Serialize (i);
1142   i.WriteHtolsbU16 (m_aid);
1143   i = m_rates.Serialize (i);
1144   i = m_erpInformation.Serialize (i);
1145   i = m_rates.extended.Serialize (i);
1146   i = m_edcaParameterSet.Serialize (i);
1147   i = m_extendedCapability.Serialize (i);
1148   i = m_htCapability.Serialize (i);
1149   i = m_htOperation.Serialize (i);
1150   i = m_vhtCapability.Serialize (i);
1151   i = m_vhtOperation.Serialize (i);
1152   i = m_heCapability.Serialize (i);
1153   i = m_heOperation.Serialize (i);
1154   i = m_muEdcaParameterSet.Serialize (i);
1155 }
1156 
1157 uint32_t
Deserialize(Buffer::Iterator start)1158 MgtAssocResponseHeader::Deserialize (Buffer::Iterator start)
1159 {
1160   Buffer::Iterator i = start;
1161   i = m_capability.Deserialize (i);
1162   i = m_code.Deserialize (i);
1163   m_aid = i.ReadLsbtohU16 ();
1164   i = m_rates.Deserialize (i);
1165   i = m_erpInformation.DeserializeIfPresent (i);
1166   i = m_rates.extended.DeserializeIfPresent (i);
1167   i = m_edcaParameterSet.DeserializeIfPresent (i);
1168   i = m_extendedCapability.DeserializeIfPresent (i);
1169   i = m_htCapability.DeserializeIfPresent (i);
1170   i = m_htOperation.DeserializeIfPresent (i);
1171   i = m_vhtCapability.DeserializeIfPresent (i);
1172   i = m_vhtOperation.DeserializeIfPresent (i);
1173   i = m_heCapability.DeserializeIfPresent (i);
1174   i = m_heOperation.DeserializeIfPresent (i);
1175   i = m_muEdcaParameterSet.DeserializeIfPresent (i);
1176   return i.GetDistanceFrom (start);
1177 }
1178 
1179 
1180 /**********************************************************
1181  *   ActionFrame
1182  **********************************************************/
WifiActionHeader()1183 WifiActionHeader::WifiActionHeader ()
1184 {
1185 }
1186 
~WifiActionHeader()1187 WifiActionHeader::~WifiActionHeader ()
1188 {
1189 }
1190 
1191 void
SetAction(WifiActionHeader::CategoryValue type,WifiActionHeader::ActionValue action)1192 WifiActionHeader::SetAction (WifiActionHeader::CategoryValue type,
1193                              WifiActionHeader::ActionValue action)
1194 {
1195   m_category = static_cast<uint8_t> (type);
1196   switch (type)
1197     {
1198     case BLOCK_ACK:
1199       {
1200         m_actionValue = static_cast<uint8_t> (action.blockAck);
1201         break;
1202       }
1203     case MESH:
1204       {
1205         m_actionValue = static_cast<uint8_t> (action.meshAction);
1206         break;
1207       }
1208     case MULTIHOP:
1209       {
1210         m_actionValue = static_cast<uint8_t> (action.multihopAction);
1211         break;
1212       }
1213     case SELF_PROTECTED:
1214       {
1215         m_actionValue = static_cast<uint8_t> (action.selfProtectedAction);
1216         break;
1217       }
1218     case VENDOR_SPECIFIC_ACTION:
1219       {
1220         break;
1221       }
1222     }
1223 }
1224 
1225 WifiActionHeader::CategoryValue
GetCategory()1226 WifiActionHeader::GetCategory ()
1227 {
1228   switch (m_category)
1229     {
1230     case BLOCK_ACK:
1231       return BLOCK_ACK;
1232     case MESH:
1233       return MESH;
1234     case MULTIHOP:
1235       return MULTIHOP;
1236     case SELF_PROTECTED:
1237       return SELF_PROTECTED;
1238     case VENDOR_SPECIFIC_ACTION:
1239       return VENDOR_SPECIFIC_ACTION;
1240     default:
1241       NS_FATAL_ERROR ("Unknown action value");
1242       return SELF_PROTECTED;
1243     }
1244 }
1245 
1246 WifiActionHeader::ActionValue
GetAction()1247 WifiActionHeader::GetAction ()
1248 {
1249   ActionValue retval;
1250   retval.selfProtectedAction = PEER_LINK_OPEN; //Needs to be initialized to something to quiet valgrind in default cases
1251   switch (m_category)
1252     {
1253     case BLOCK_ACK:
1254       switch (m_actionValue)
1255         {
1256         case BLOCK_ACK_ADDBA_REQUEST:
1257           retval.blockAck = BLOCK_ACK_ADDBA_REQUEST;
1258           break;
1259         case BLOCK_ACK_ADDBA_RESPONSE:
1260           retval.blockAck = BLOCK_ACK_ADDBA_RESPONSE;
1261           break;
1262         case BLOCK_ACK_DELBA:
1263           retval.blockAck = BLOCK_ACK_DELBA;
1264           break;
1265         }
1266       break;
1267 
1268     case SELF_PROTECTED:
1269       switch (m_actionValue)
1270         {
1271         case PEER_LINK_OPEN:
1272           retval.selfProtectedAction = PEER_LINK_OPEN;
1273           break;
1274         case PEER_LINK_CONFIRM:
1275           retval.selfProtectedAction = PEER_LINK_CONFIRM;
1276           break;
1277         case PEER_LINK_CLOSE:
1278           retval.selfProtectedAction = PEER_LINK_CLOSE;
1279           break;
1280         case GROUP_KEY_INFORM:
1281           retval.selfProtectedAction = GROUP_KEY_INFORM;
1282           break;
1283         case GROUP_KEY_ACK:
1284           retval.selfProtectedAction = GROUP_KEY_ACK;
1285           break;
1286         default:
1287           NS_FATAL_ERROR ("Unknown mesh peering management action code");
1288           retval.selfProtectedAction = PEER_LINK_OPEN; /* quiet compiler */
1289         }
1290       break;
1291 
1292     case MESH:
1293       switch (m_actionValue)
1294         {
1295         case LINK_METRIC_REPORT:
1296           retval.meshAction = LINK_METRIC_REPORT;
1297           break;
1298         case PATH_SELECTION:
1299           retval.meshAction = PATH_SELECTION;
1300           break;
1301         case PORTAL_ANNOUNCEMENT:
1302           retval.meshAction = PORTAL_ANNOUNCEMENT;
1303           break;
1304         case CONGESTION_CONTROL_NOTIFICATION:
1305           retval.meshAction = CONGESTION_CONTROL_NOTIFICATION;
1306           break;
1307         case MDA_SETUP_REQUEST:
1308           retval.meshAction = MDA_SETUP_REQUEST;
1309           break;
1310         case MDA_SETUP_REPLY:
1311           retval.meshAction = MDA_SETUP_REPLY;
1312           break;
1313         case MDAOP_ADVERTISMENT_REQUEST:
1314           retval.meshAction = MDAOP_ADVERTISMENT_REQUEST;
1315           break;
1316         case MDAOP_ADVERTISMENTS:
1317           retval.meshAction = MDAOP_ADVERTISMENTS;
1318           break;
1319         case MDAOP_SET_TEARDOWN:
1320           retval.meshAction = MDAOP_SET_TEARDOWN;
1321           break;
1322         case TBTT_ADJUSTMENT_REQUEST:
1323           retval.meshAction = TBTT_ADJUSTMENT_REQUEST;
1324           break;
1325         case TBTT_ADJUSTMENT_RESPONSE:
1326           retval.meshAction = TBTT_ADJUSTMENT_RESPONSE;
1327           break;
1328         default:
1329           NS_FATAL_ERROR ("Unknown mesh peering management action code");
1330           retval.selfProtectedAction = PEER_LINK_OPEN; /* quiet compiler */
1331         }
1332       break;
1333 
1334     case MULTIHOP: //not yet supported
1335       switch (m_actionValue)
1336         {
1337         case PROXY_UPDATE: //not used so far
1338           retval.multihopAction = PROXY_UPDATE;
1339           break;
1340         case PROXY_UPDATE_CONFIRMATION: //not used so far
1341           retval.multihopAction = PROXY_UPDATE;
1342           break;
1343         default:
1344           NS_FATAL_ERROR ("Unknown mesh peering management action code");
1345           retval.selfProtectedAction = PEER_LINK_OPEN; /* quiet compiler */
1346         }
1347       break;
1348     default:
1349       NS_FATAL_ERROR ("Unsupported mesh action");
1350       retval.selfProtectedAction = PEER_LINK_OPEN; /* quiet compiler */
1351     }
1352   return retval;
1353 }
1354 
1355 TypeId
GetTypeId()1356 WifiActionHeader::GetTypeId ()
1357 {
1358   static TypeId tid = TypeId ("ns3::WifiActionHeader")
1359     .SetParent<Header> ()
1360     .SetGroupName ("Wifi")
1361     .AddConstructor<WifiActionHeader> ()
1362   ;
1363   return tid;
1364 }
1365 
1366 TypeId
GetInstanceTypeId() const1367 WifiActionHeader::GetInstanceTypeId () const
1368 {
1369   return GetTypeId ();
1370 }
1371 
1372 std::string
CategoryValueToString(CategoryValue value) const1373 WifiActionHeader::CategoryValueToString (CategoryValue value) const
1374 {
1375   if (value == BLOCK_ACK)
1376     {
1377       return "BlockAck";
1378     }
1379   else if (value == MESH)
1380     {
1381       return "Mesh";
1382     }
1383   else if (value == SELF_PROTECTED)
1384     {
1385       return "SelfProtected";
1386     }
1387   else if (value == VENDOR_SPECIFIC_ACTION)
1388     {
1389       return "VendorSpecificAction";
1390     }
1391   else
1392     {
1393       std::ostringstream convert;
1394       convert << value;
1395       return convert.str ();
1396     }
1397 }
1398 std::string
SelfProtectedActionValueToString(SelfProtectedActionValue value) const1399 WifiActionHeader::SelfProtectedActionValueToString (SelfProtectedActionValue value) const
1400 {
1401   if (value == PEER_LINK_OPEN)
1402     {
1403       return "PeerLinkOpen";
1404     }
1405   else if (value == PEER_LINK_CONFIRM)
1406     {
1407       return "PeerLinkConfirm";
1408     }
1409   else if (value == PEER_LINK_CLOSE)
1410     {
1411       return "PeerLinkClose";
1412     }
1413   else if (value == GROUP_KEY_INFORM)
1414     {
1415       return "GroupKeyInform";
1416     }
1417   else if (value == GROUP_KEY_ACK)
1418     {
1419       return "GroupKeyAck";
1420     }
1421   else
1422     {
1423       std::ostringstream convert;
1424       convert << value;
1425       return convert.str ();
1426     }
1427 }
1428 
1429 void
Print(std::ostream & os) const1430 WifiActionHeader::Print (std::ostream &os) const
1431 {
1432   os << "category=" << CategoryValueToString ((CategoryValue) m_category)
1433      << ", value=" << SelfProtectedActionValueToString ((SelfProtectedActionValue) m_actionValue);
1434 }
1435 
1436 uint32_t
GetSerializedSize() const1437 WifiActionHeader::GetSerializedSize () const
1438 {
1439   return 2;
1440 }
1441 
1442 void
Serialize(Buffer::Iterator start) const1443 WifiActionHeader::Serialize (Buffer::Iterator start) const
1444 {
1445   start.WriteU8 (m_category);
1446   start.WriteU8 (m_actionValue);
1447 }
1448 
1449 uint32_t
Deserialize(Buffer::Iterator start)1450 WifiActionHeader::Deserialize (Buffer::Iterator start)
1451 {
1452   Buffer::Iterator i = start;
1453   m_category = i.ReadU8 ();
1454   m_actionValue = i.ReadU8 ();
1455   return i.GetDistanceFrom (start);
1456 }
1457 
1458 
1459 /***************************************************
1460 *                 ADDBARequest
1461 ****************************************************/
1462 
1463 NS_OBJECT_ENSURE_REGISTERED (MgtAddBaRequestHeader);
1464 
MgtAddBaRequestHeader()1465 MgtAddBaRequestHeader::MgtAddBaRequestHeader ()
1466   : m_dialogToken (1),
1467     m_amsduSupport (1),
1468     m_bufferSize (0)
1469 {
1470 }
1471 
1472 TypeId
GetTypeId(void)1473 MgtAddBaRequestHeader::GetTypeId (void)
1474 {
1475   static TypeId tid = TypeId ("ns3::MgtAddBaRequestHeader")
1476     .SetParent<Header> ()
1477     .SetGroupName ("Wifi")
1478     .AddConstructor<MgtAddBaRequestHeader> ()
1479   ;
1480   return tid;
1481 }
1482 
1483 TypeId
GetInstanceTypeId(void) const1484 MgtAddBaRequestHeader::GetInstanceTypeId (void) const
1485 {
1486   return GetTypeId ();
1487 }
1488 
1489 void
Print(std::ostream & os) const1490 MgtAddBaRequestHeader::Print (std::ostream &os) const
1491 {
1492 }
1493 
1494 uint32_t
GetSerializedSize(void) const1495 MgtAddBaRequestHeader::GetSerializedSize (void) const
1496 {
1497   uint32_t size = 0;
1498   size += 1; //Dialog token
1499   size += 2; //Block ack parameter set
1500   size += 2; //Block ack timeout value
1501   size += 2; //Starting sequence control
1502   return size;
1503 }
1504 
1505 void
Serialize(Buffer::Iterator start) const1506 MgtAddBaRequestHeader::Serialize (Buffer::Iterator start) const
1507 {
1508   Buffer::Iterator i = start;
1509   i.WriteU8 (m_dialogToken);
1510   i.WriteHtolsbU16 (GetParameterSet ());
1511   i.WriteHtolsbU16 (m_timeoutValue);
1512   i.WriteHtolsbU16 (GetStartingSequenceControl ());
1513 }
1514 
1515 uint32_t
Deserialize(Buffer::Iterator start)1516 MgtAddBaRequestHeader::Deserialize (Buffer::Iterator start)
1517 {
1518   Buffer::Iterator i = start;
1519   m_dialogToken = i.ReadU8 ();
1520   SetParameterSet (i.ReadLsbtohU16 ());
1521   m_timeoutValue = i.ReadLsbtohU16 ();
1522   SetStartingSequenceControl (i.ReadLsbtohU16 ());
1523   return i.GetDistanceFrom (start);
1524 }
1525 
1526 void
SetDelayedBlockAck()1527 MgtAddBaRequestHeader::SetDelayedBlockAck ()
1528 {
1529   m_policy = 0;
1530 }
1531 
1532 void
SetImmediateBlockAck()1533 MgtAddBaRequestHeader::SetImmediateBlockAck ()
1534 {
1535   m_policy = 1;
1536 }
1537 
1538 void
SetTid(uint8_t tid)1539 MgtAddBaRequestHeader::SetTid (uint8_t tid)
1540 {
1541   NS_ASSERT (tid < 16);
1542   m_tid = tid;
1543 }
1544 
1545 void
SetTimeout(uint16_t timeout)1546 MgtAddBaRequestHeader::SetTimeout (uint16_t timeout)
1547 {
1548   m_timeoutValue = timeout;
1549 }
1550 
1551 void
SetBufferSize(uint16_t size)1552 MgtAddBaRequestHeader::SetBufferSize (uint16_t size)
1553 {
1554   m_bufferSize = size;
1555 }
1556 
1557 void
SetStartingSequence(uint16_t seq)1558 MgtAddBaRequestHeader::SetStartingSequence (uint16_t seq)
1559 {
1560   m_startingSeq = seq;
1561 }
1562 
1563 void
SetStartingSequenceControl(uint16_t seqControl)1564 MgtAddBaRequestHeader::SetStartingSequenceControl (uint16_t seqControl)
1565 {
1566   m_startingSeq = (seqControl >> 4) & 0x0fff;
1567 }
1568 
1569 void
SetAmsduSupport(bool supported)1570 MgtAddBaRequestHeader::SetAmsduSupport (bool supported)
1571 {
1572   m_amsduSupport = supported;
1573 }
1574 
1575 uint8_t
GetTid(void) const1576 MgtAddBaRequestHeader::GetTid (void) const
1577 {
1578   return m_tid;
1579 }
1580 
1581 bool
IsImmediateBlockAck(void) const1582 MgtAddBaRequestHeader::IsImmediateBlockAck (void) const
1583 {
1584   return (m_policy == 1) ? true : false;
1585 }
1586 
1587 uint16_t
GetTimeout(void) const1588 MgtAddBaRequestHeader::GetTimeout (void) const
1589 {
1590   return m_timeoutValue;
1591 }
1592 
1593 uint16_t
GetBufferSize(void) const1594 MgtAddBaRequestHeader::GetBufferSize (void) const
1595 {
1596   return m_bufferSize;
1597 }
1598 
1599 bool
IsAmsduSupported(void) const1600 MgtAddBaRequestHeader::IsAmsduSupported (void) const
1601 {
1602   return (m_amsduSupport == 1) ? true : false;
1603 }
1604 
1605 uint16_t
GetStartingSequence(void) const1606 MgtAddBaRequestHeader::GetStartingSequence (void) const
1607 {
1608   return m_startingSeq;
1609 }
1610 
1611 uint16_t
GetStartingSequenceControl(void) const1612 MgtAddBaRequestHeader::GetStartingSequenceControl (void) const
1613 {
1614   return (m_startingSeq << 4) & 0xfff0;
1615 }
1616 
1617 uint16_t
GetParameterSet(void) const1618 MgtAddBaRequestHeader::GetParameterSet (void) const
1619 {
1620   uint16_t res = 0;
1621   res |= m_amsduSupport;
1622   res |= m_policy << 1;
1623   res |= m_tid << 2;
1624   res |= m_bufferSize << 6;
1625   return res;
1626 }
1627 
1628 void
SetParameterSet(uint16_t params)1629 MgtAddBaRequestHeader::SetParameterSet (uint16_t params)
1630 {
1631   m_amsduSupport = (params) & 0x01;
1632   m_policy = (params >> 1) & 0x01;
1633   m_tid = (params >> 2) & 0x0f;
1634   m_bufferSize = (params >> 6) & 0x03ff;
1635 }
1636 
1637 
1638 /***************************************************
1639 *                 ADDBAResponse
1640 ****************************************************/
1641 
1642 NS_OBJECT_ENSURE_REGISTERED (MgtAddBaResponseHeader);
1643 
MgtAddBaResponseHeader()1644 MgtAddBaResponseHeader::MgtAddBaResponseHeader ()
1645   : m_dialogToken (1),
1646     m_amsduSupport (1),
1647     m_bufferSize (0)
1648 {
1649 }
1650 
1651 TypeId
GetTypeId()1652 MgtAddBaResponseHeader::GetTypeId ()
1653 {
1654   static TypeId tid = TypeId ("ns3::MgtAddBaResponseHeader")
1655     .SetParent<Header> ()
1656     .SetGroupName ("Wifi")
1657     .AddConstructor<MgtAddBaResponseHeader> ()
1658   ;
1659   return tid;
1660 }
1661 
1662 TypeId
GetInstanceTypeId(void) const1663 MgtAddBaResponseHeader::GetInstanceTypeId (void) const
1664 {
1665   return GetTypeId ();
1666 }
1667 
1668 void
Print(std::ostream & os) const1669 MgtAddBaResponseHeader::Print (std::ostream &os) const
1670 {
1671   os << "status code=" << m_code;
1672 }
1673 
1674 uint32_t
GetSerializedSize(void) const1675 MgtAddBaResponseHeader::GetSerializedSize (void) const
1676 {
1677   uint32_t size = 0;
1678   size += 1; //Dialog token
1679   size += m_code.GetSerializedSize (); //Status code
1680   size += 2; //Block ack parameter set
1681   size += 2; //Block ack timeout value
1682   return size;
1683 }
1684 
1685 void
Serialize(Buffer::Iterator start) const1686 MgtAddBaResponseHeader::Serialize (Buffer::Iterator start) const
1687 {
1688   Buffer::Iterator i = start;
1689   i.WriteU8 (m_dialogToken);
1690   i = m_code.Serialize (i);
1691   i.WriteHtolsbU16 (GetParameterSet ());
1692   i.WriteHtolsbU16 (m_timeoutValue);
1693 }
1694 
1695 uint32_t
Deserialize(Buffer::Iterator start)1696 MgtAddBaResponseHeader::Deserialize (Buffer::Iterator start)
1697 {
1698   Buffer::Iterator i = start;
1699   m_dialogToken = i.ReadU8 ();
1700   i = m_code.Deserialize (i);
1701   SetParameterSet (i.ReadLsbtohU16 ());
1702   m_timeoutValue = i.ReadLsbtohU16 ();
1703   return i.GetDistanceFrom (start);
1704 }
1705 
1706 void
SetDelayedBlockAck()1707 MgtAddBaResponseHeader::SetDelayedBlockAck ()
1708 {
1709   m_policy = 0;
1710 }
1711 
1712 void
SetImmediateBlockAck()1713 MgtAddBaResponseHeader::SetImmediateBlockAck ()
1714 {
1715   m_policy = 1;
1716 }
1717 
1718 void
SetTid(uint8_t tid)1719 MgtAddBaResponseHeader::SetTid (uint8_t tid)
1720 {
1721   NS_ASSERT (tid < 16);
1722   m_tid = tid;
1723 }
1724 
1725 void
SetTimeout(uint16_t timeout)1726 MgtAddBaResponseHeader::SetTimeout (uint16_t timeout)
1727 {
1728   m_timeoutValue = timeout;
1729 }
1730 
1731 void
SetBufferSize(uint16_t size)1732 MgtAddBaResponseHeader::SetBufferSize (uint16_t size)
1733 {
1734   m_bufferSize = size;
1735 }
1736 
1737 void
SetStatusCode(StatusCode code)1738 MgtAddBaResponseHeader::SetStatusCode (StatusCode code)
1739 {
1740   m_code = code;
1741 }
1742 
1743 void
SetAmsduSupport(bool supported)1744 MgtAddBaResponseHeader::SetAmsduSupport (bool supported)
1745 {
1746   m_amsduSupport = supported;
1747 }
1748 
1749 StatusCode
GetStatusCode(void) const1750 MgtAddBaResponseHeader::GetStatusCode (void) const
1751 {
1752   return m_code;
1753 }
1754 
1755 uint8_t
GetTid(void) const1756 MgtAddBaResponseHeader::GetTid (void) const
1757 {
1758   return m_tid;
1759 }
1760 
1761 bool
IsImmediateBlockAck(void) const1762 MgtAddBaResponseHeader::IsImmediateBlockAck (void) const
1763 {
1764   return (m_policy == 1) ? true : false;
1765 }
1766 
1767 uint16_t
GetTimeout(void) const1768 MgtAddBaResponseHeader::GetTimeout (void) const
1769 {
1770   return m_timeoutValue;
1771 }
1772 
1773 uint16_t
GetBufferSize(void) const1774 MgtAddBaResponseHeader::GetBufferSize (void) const
1775 {
1776   return m_bufferSize;
1777 }
1778 
1779 bool
IsAmsduSupported(void) const1780 MgtAddBaResponseHeader::IsAmsduSupported (void) const
1781 {
1782   return (m_amsduSupport == 1) ? true : false;
1783 }
1784 
1785 uint16_t
GetParameterSet(void) const1786 MgtAddBaResponseHeader::GetParameterSet (void) const
1787 {
1788   uint16_t res = 0;
1789   res |= m_amsduSupport;
1790   res |= m_policy << 1;
1791   res |= m_tid << 2;
1792   res |= m_bufferSize << 6;
1793   return res;
1794 }
1795 
1796 void
SetParameterSet(uint16_t params)1797 MgtAddBaResponseHeader::SetParameterSet (uint16_t params)
1798 {
1799   m_amsduSupport = (params) & 0x01;
1800   m_policy = (params >> 1) & 0x01;
1801   m_tid = (params >> 2) & 0x0f;
1802   m_bufferSize = (params >> 6) & 0x03ff;
1803 }
1804 
1805 
1806 /***************************************************
1807 *                     DelBa
1808 ****************************************************/
1809 
1810 NS_OBJECT_ENSURE_REGISTERED (MgtDelBaHeader);
1811 
MgtDelBaHeader()1812 MgtDelBaHeader::MgtDelBaHeader ()
1813   : m_reasonCode (1)
1814 {
1815 }
1816 
1817 TypeId
GetTypeId(void)1818 MgtDelBaHeader::GetTypeId (void)
1819 {
1820   static TypeId tid = TypeId ("ns3::MgtDelBaHeader")
1821     .SetParent<Header> ()
1822     .SetGroupName ("Wifi")
1823     .AddConstructor<MgtDelBaHeader> ()
1824   ;
1825   return tid;
1826 }
1827 
1828 TypeId
GetInstanceTypeId(void) const1829 MgtDelBaHeader::GetInstanceTypeId (void) const
1830 {
1831   return GetTypeId ();
1832 }
1833 
1834 void
Print(std::ostream & os) const1835 MgtDelBaHeader::Print (std::ostream &os) const
1836 {
1837 }
1838 
1839 uint32_t
GetSerializedSize(void) const1840 MgtDelBaHeader::GetSerializedSize (void) const
1841 {
1842   uint32_t size = 0;
1843   size += 2; //DelBa parameter set
1844   size += 2; //Reason code
1845   return size;
1846 }
1847 
1848 void
Serialize(Buffer::Iterator start) const1849 MgtDelBaHeader::Serialize (Buffer::Iterator start) const
1850 {
1851   Buffer::Iterator i = start;
1852   i.WriteHtolsbU16 (GetParameterSet ());
1853   i.WriteHtolsbU16 (m_reasonCode);
1854 }
1855 
1856 uint32_t
Deserialize(Buffer::Iterator start)1857 MgtDelBaHeader::Deserialize (Buffer::Iterator start)
1858 {
1859   Buffer::Iterator i = start;
1860   SetParameterSet (i.ReadLsbtohU16 ());
1861   m_reasonCode = i.ReadLsbtohU16 ();
1862   return i.GetDistanceFrom (start);
1863 }
1864 
1865 bool
IsByOriginator(void) const1866 MgtDelBaHeader::IsByOriginator (void) const
1867 {
1868   return (m_initiator == 1) ? true : false;
1869 }
1870 
1871 uint8_t
GetTid(void) const1872 MgtDelBaHeader::GetTid (void) const
1873 {
1874   NS_ASSERT (m_tid < 16);
1875   uint8_t tid = static_cast<uint8_t> (m_tid);
1876   return tid;
1877 }
1878 
1879 void
SetByOriginator(void)1880 MgtDelBaHeader::SetByOriginator (void)
1881 {
1882   m_initiator = 1;
1883 }
1884 
1885 void
SetByRecipient(void)1886 MgtDelBaHeader::SetByRecipient (void)
1887 {
1888   m_initiator = 0;
1889 }
1890 
1891 void
SetTid(uint8_t tid)1892 MgtDelBaHeader::SetTid (uint8_t tid)
1893 {
1894   NS_ASSERT (tid < 16);
1895   m_tid = static_cast<uint16_t> (tid);
1896 }
1897 
1898 uint16_t
GetParameterSet(void) const1899 MgtDelBaHeader::GetParameterSet (void) const
1900 {
1901   uint16_t res = 0;
1902   res |= m_initiator << 11;
1903   res |= m_tid << 12;
1904   return res;
1905 }
1906 
1907 void
SetParameterSet(uint16_t params)1908 MgtDelBaHeader::SetParameterSet (uint16_t params)
1909 {
1910   m_initiator = (params >> 11) & 0x01;
1911   m_tid = (params >> 12) & 0x0f;
1912 }
1913 
1914 } //namespace ns3
1915