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