A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
wifi-mac-header.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2006, 2009 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  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
20  * Author: Mirko Banchi <mk.banchi@gmail.com>
21  */
22 #include "ns3/assert.h"
23 #include "ns3/address-utils.h"
24 #include "wifi-mac-header.h"
25 
26 namespace ns3 {
27 
28 NS_OBJECT_ENSURE_REGISTERED (WifiMacHeader);
29 
30 enum
31 {
32  TYPE_MGT = 0,
33  TYPE_CTL = 1,
35 };
36 
37 enum
38 {
45 
46 };
47 
49  :
50  m_ctrlMoreData (0),
51  m_ctrlWep (0),
52  m_ctrlOrder (1),
53  m_amsduPresent (0)
54 {
55 }
57 {
58 }
59 
60 void
62 {
63  m_ctrlFromDs = 1;
64 }
65 void
67 {
68  m_ctrlFromDs = 0;
69 }
70 void
72 {
73  m_ctrlToDs = 1;
74 }
75 void
77 {
78  m_ctrlToDs = 0;
79 }
80 
81 void
83 {
84  m_addr1 = address;
85 }
86 void
88 {
89  m_addr2 = address;
90 }
91 void
93 {
94  m_addr3 = address;
95 }
96 void
98 {
99  m_addr4 = address;
100 }
101 void
103 {
105  m_ctrlSubtype = 0;
106 }
107 void
109 {
111  m_ctrlSubtype = 1;
112 }
113 void
115 {
117  m_ctrlSubtype = 4;
118 }
119 void
121 {
123  m_ctrlSubtype = 5;
124 }
125 void
127 {
129  m_ctrlSubtype = 8;
130 }
131 void
133 {
135  m_ctrlSubtype = 8;
136 }
137 void
139 {
141  m_ctrlSubtype = 9;
142 }
143 
144 void
146 {
148  m_ctrlSubtype = 0;
149 }
150 void
152 {
154  m_ctrlSubtype = 0x0D;
155 }
156 void
158 {
160  m_ctrlSubtype = 0x0F;
161 }
162 void
164 {
165  switch (type)
166  {
170  break;
174  break;
175  case WIFI_MAC_CTL_RTS:
178  break;
179  case WIFI_MAC_CTL_CTS:
182  break;
183  case WIFI_MAC_CTL_ACK:
186  break;
190  break;
193  m_ctrlSubtype = 0;
194  break;
197  m_ctrlSubtype = 1;
198  break;
201  m_ctrlSubtype = 2;
202  break;
205  m_ctrlSubtype = 3;
206  break;
209  m_ctrlSubtype = 4;
210  break;
213  m_ctrlSubtype = 5;
214  break;
215  case WIFI_MAC_MGT_BEACON:
217  m_ctrlSubtype = 8;
218  break;
221  m_ctrlSubtype = 10;
222  break;
225  m_ctrlSubtype = 11;
226  break;
229  m_ctrlSubtype = 12;
230  break;
231  case WIFI_MAC_MGT_ACTION:
233  m_ctrlSubtype = 13;
234  break;
237  m_ctrlSubtype = 14;
238  break;
241  m_ctrlSubtype = 15;
242  break;
243 
244  case WIFI_MAC_DATA:
246  m_ctrlSubtype = 0;
247  break;
248  case WIFI_MAC_DATA_CFACK:
250  m_ctrlSubtype = 1;
251  break;
254  m_ctrlSubtype = 2;
255  break;
258  m_ctrlSubtype = 3;
259  break;
260  case WIFI_MAC_DATA_NULL:
262  m_ctrlSubtype = 4;
263  break;
266  m_ctrlSubtype = 5;
267  break;
270  m_ctrlSubtype = 6;
271  break;
274  m_ctrlSubtype = 7;
275  break;
276  case WIFI_MAC_QOSDATA:
278  m_ctrlSubtype = 8;
279  break;
282  m_ctrlSubtype = 9;
283  break;
286  m_ctrlSubtype = 10;
287  break;
290  m_ctrlSubtype = 11;
291  break;
294  m_ctrlSubtype = 12;
295  break;
298  m_ctrlSubtype = 14;
299  break;
302  m_ctrlSubtype = 15;
303  break;
304  }
305  m_ctrlToDs = 0;
306  m_ctrlFromDs = 0;
307 }
308 void
309 WifiMacHeader::SetRawDuration (uint16_t duration)
310 {
311  m_duration = duration;
312 }
313 void
315 {
316  int64_t duration_us = duration.GetMicroSeconds ();
317  NS_ASSERT (duration_us >= 0 && duration_us <= 0x7fff);
318  m_duration = static_cast<uint16_t> (duration_us);
319 }
320 
321 void WifiMacHeader::SetId (uint16_t id)
322 {
323  m_duration = id;
324 }
326 {
327  m_seqSeq = seq;
328 }
330 {
331  m_seqFrag = frag;
332 }
334 {
335  m_ctrlMoreFrag = 0;
336 }
338 {
339  m_ctrlMoreFrag = 1;
340 }
342 {
343  m_ctrlOrder = 1;
344 }
346 {
347  m_ctrlOrder = 0;
348 }
350 {
351  m_ctrlRetry = 1;
352 }
354 {
355  m_ctrlRetry = 0;
356 }
357 void WifiMacHeader::SetQosTid (uint8_t tid)
358 {
359  m_qosTid = tid;
360 }
362 {
363  m_qosEosp = 1;
364 }
366 {
367  m_qosEosp = 0;
368 }
370 {
371  switch (policy)
372  {
373  case NORMAL_ACK:
374  m_qosAckPolicy = 0;
375  break;
376  case NO_ACK:
377  m_qosAckPolicy = 1;
378  break;
379  case NO_EXPLICIT_ACK:
380  m_qosAckPolicy = 2;
381  break;
382  case BLOCK_ACK:
383  m_qosAckPolicy = 3;
384  break;
385  }
386 }
387 void
389 {
390  m_qosAckPolicy = 0;
391 }
392 void
394 {
395  m_qosAckPolicy = 3;
396 }
397 void
399 {
400  m_qosAckPolicy = 1;
401 }
403 {
404  m_amsduPresent = 1;
405 }
407 {
408  m_amsduPresent = 0;
409 }
411 {
412  m_qosStuff = txop;
413 }
414 
417 {
418  return m_addr1;
419 }
422 {
423  return m_addr2;
424 }
427 {
428  return m_addr3;
429 }
432 {
433  return m_addr4;
434 }
435 
436 enum WifiMacType
438 {
439  switch (m_ctrlType)
440  {
441  case TYPE_MGT:
442  switch (m_ctrlSubtype)
443  {
444  case 0:
446  break;
447  case 1:
449  break;
450  case 2:
452  break;
453  case 3:
455  break;
456  case 4:
458  break;
459  case 5:
461  break;
462  case 8:
463  return WIFI_MAC_MGT_BEACON;
464  break;
465  case 10:
467  break;
468  case 11:
470  break;
471  case 12:
473  break;
474  case 13:
475  return WIFI_MAC_MGT_ACTION;
476  break;
477  case 14:
479  break;
480  case 15:
482  break;
483 
484  }
485  break;
486  case TYPE_CTL:
487  switch (m_ctrlSubtype)
488  {
489  case SUBTYPE_CTL_BACKREQ:
490  return WIFI_MAC_CTL_BACKREQ;
491  break;
493  return WIFI_MAC_CTL_BACKRESP;
494  break;
495  case SUBTYPE_CTL_RTS:
496  return WIFI_MAC_CTL_RTS;
497  break;
498  case SUBTYPE_CTL_CTS:
499  return WIFI_MAC_CTL_CTS;
500  break;
501  case SUBTYPE_CTL_ACK:
502  return WIFI_MAC_CTL_ACK;
503  break;
504  }
505  break;
506  case TYPE_DATA:
507  switch (m_ctrlSubtype)
508  {
509  case 0:
510  return WIFI_MAC_DATA;
511  break;
512  case 1:
513  return WIFI_MAC_DATA_CFACK;
514  break;
515  case 2:
516  return WIFI_MAC_DATA_CFPOLL;
517  break;
518  case 3:
520  break;
521  case 4:
522  return WIFI_MAC_DATA_NULL;
523  break;
524  case 5:
526  break;
527  case 6:
529  break;
530  case 7:
532  break;
533  case 8:
534  return WIFI_MAC_QOSDATA;
535  break;
536  case 9:
537  return WIFI_MAC_QOSDATA_CFACK;
538  break;
539  case 10:
541  break;
542  case 11:
544  break;
545  case 12:
546  return WIFI_MAC_QOSDATA_NULL;
547  break;
548  case 14:
550  break;
551  case 15:
553  break;
554 
555  }
556  break;
557  }
558  // NOTREACHED
559  NS_ASSERT (false);
560  return (enum WifiMacType)-1;
561 }
562 bool
564 {
565  return m_ctrlFromDs == 1;
566 }
567 bool
569 {
570  return m_ctrlToDs == 1;
571 }
572 
573 bool
575 {
576  return (m_ctrlType == TYPE_DATA);
577 
578 }
579 bool
581 {
582  return (m_ctrlType == TYPE_DATA && (m_ctrlSubtype & 0x08));
583 }
584 bool
586 {
587  return (m_ctrlType == TYPE_CTL);
588 }
589 bool
591 {
592  return (m_ctrlType == TYPE_MGT);
593 }
594 bool
596 {
597  switch (GetType ())
598  {
607  return true;
608  break;
609  default:
610  return false;
611  break;
612  }
613 }
614 bool
616 {
617  return (GetType () == WIFI_MAC_CTL_RTS);
618 }
619 bool
621 {
622  return (GetType () == WIFI_MAC_CTL_CTS);
623 }
624 bool
626 {
627  return (GetType () == WIFI_MAC_CTL_ACK);
628 }
629 bool
631 {
633 }
634 bool
636 {
638 }
639 bool
641 {
643 }
644 bool
646 {
648 }
649 bool
651 {
652  return (GetType () == WIFI_MAC_MGT_PROBE_REQUEST);
653 }
654 bool
656 {
657  return (GetType () == WIFI_MAC_MGT_PROBE_RESPONSE);
658 }
659 bool
661 {
662  return (GetType () == WIFI_MAC_MGT_BEACON);
663 }
664 bool
666 {
667  return (GetType () == WIFI_MAC_MGT_DISASSOCIATION);
668 }
669 bool
671 {
672  return (GetType () == WIFI_MAC_MGT_AUTHENTICATION);
673 }
674 bool
676 {
677  return (GetType () == WIFI_MAC_MGT_DEAUTHENTICATION);
678 }
679 bool
681 {
682  return (GetType () == WIFI_MAC_MGT_ACTION);
683 }
684 bool
686 {
687  return (GetType () == WIFI_MAC_MGT_MULTIHOP_ACTION);
688 }
689 bool
691 {
692  return (GetType () == WIFI_MAC_CTL_BACKREQ) ? true : false;
693 }
694 bool
696 {
697  return (GetType () == WIFI_MAC_CTL_BACKRESP) ? true : false;
698 }
699 
700 
701 uint16_t
703 {
704  return m_duration;
705 }
706 Time
708 {
709  return MicroSeconds (m_duration);
710 }
711 uint16_t
713 {
714  return (m_seqSeq << 4) | m_seqFrag;
715 }
716 uint16_t
718 {
719  return m_seqSeq;
720 }
721 uint16_t
723 {
724  return m_seqFrag;
725 }
726 bool
728 {
729  return (m_ctrlRetry == 1);
730 }
731 bool
733 {
734  return (m_ctrlMoreFrag == 1);
735 }
736 bool
738 {
739  NS_ASSERT (IsQosData ());
740  return (m_qosAckPolicy == 3);
741 }
742 bool
744 {
745  NS_ASSERT (IsQosData ());
746  return (m_qosAckPolicy == 1);
747 }
748 bool
750 {
751  NS_ASSERT (IsQosData ());
752  return (m_qosAckPolicy == 0);
753 }
754 bool
756 {
757  NS_ASSERT (IsQosData ());
758  return (m_qosEosp == 1);
759 }
760 bool
762 {
763  NS_ASSERT (IsQosData ());
764  return (m_amsduPresent == 1);
765 }
766 uint8_t
768 {
769  NS_ASSERT (IsQosData ());
770  return m_qosTid;
771 }
774 {
775  switch (m_qosAckPolicy)
776  {
777  case 0:
778  return NORMAL_ACK;
779  break;
780  case 1:
781  return NO_ACK;
782  break;
783  case 2:
784  return NO_EXPLICIT_ACK;
785  break;
786  case 3:
787  return BLOCK_ACK;
788  break;
789  }
790  // NOTREACHED
791  NS_ASSERT (false);
792  return (enum QosAckPolicy)-1;
793 }
794 
795 uint8_t
797 {
798  NS_ASSERT (IsQosData ());
799  return m_qosStuff;
800 }
801 
802 uint16_t
804 {
805  uint16_t val = 0;
806  val |= (m_ctrlType << 2) & (0x3 << 2);
807  val |= (m_ctrlSubtype << 4) & (0xf << 4);
808  val |= (m_ctrlToDs << 8) & (0x1 << 8);
809  val |= (m_ctrlFromDs << 9) & (0x1 << 9);
810  val |= (m_ctrlMoreFrag << 10) & (0x1 << 10);
811  val |= (m_ctrlRetry << 11) & (0x1 << 11);
812  val |= (m_ctrlMoreData << 13) & (0x1 << 13);
813  val |= (m_ctrlWep << 14) & (0x1 << 14);
814  val |= (m_ctrlOrder << 15) & (0x1 << 15);
815  return val;
816 }
817 
818 uint16_t
820 {
821  uint16_t val = 0;
822  val |= m_qosTid;
823  val |= m_qosEosp << 4;
824  val |= m_qosAckPolicy << 5;
825  val |= m_amsduPresent << 7;
826  val |= m_qosStuff << 8;
827  return val;
828 }
829 
830 void
832 {
833  m_ctrlType = (ctrl >> 2) & 0x03;
834  m_ctrlSubtype = (ctrl >> 4) & 0x0f;
835  m_ctrlToDs = (ctrl >> 8) & 0x01;
836  m_ctrlFromDs = (ctrl >> 9) & 0x01;
837  m_ctrlMoreFrag = (ctrl >> 10) & 0x01;
838  m_ctrlRetry = (ctrl >> 11) & 0x01;
839  m_ctrlMoreData = (ctrl >> 13) & 0x01;
840  m_ctrlWep = (ctrl >> 14) & 0x01;
841  m_ctrlOrder = (ctrl >> 15) & 0x01;
842 }
843 void
845 {
846  m_seqFrag = seq & 0x0f;
847  m_seqSeq = (seq >> 4) & 0x0fff;
848 }
849 void
851 {
852  m_qosTid = qos & 0x000f;
853  m_qosEosp = (qos >> 4) & 0x0001;
854  m_qosAckPolicy = (qos >> 5) & 0x0003;
855  m_amsduPresent = (qos >> 7) & 0x0001;
856  m_qosStuff = (qos >> 8) & 0x00ff;
857 }
858 
859 uint32_t
861 {
862  uint32_t size = 0;
863  switch (m_ctrlType)
864  {
865  case TYPE_MGT:
866  size = 2 + 2 + 6 + 6 + 6 + 2;
867  break;
868  case TYPE_CTL:
869  switch (m_ctrlSubtype)
870  {
871  case SUBTYPE_CTL_RTS:
872  size = 2 + 2 + 6 + 6;
873  break;
874  case SUBTYPE_CTL_CTS:
875  case SUBTYPE_CTL_ACK:
876  size = 2 + 2 + 6;
877  break;
878  case SUBTYPE_CTL_BACKREQ:
880  size = 2 + 2 + 6 + 6;
881  break;
883  size = 2 +2 +6 +2 +4;
884  break;
885  }
886  break;
887  case TYPE_DATA:
888  size = 2 + 2 + 6 + 6 + 6 + 2;
889  if (m_ctrlToDs && m_ctrlFromDs)
890  {
891  size += 6;
892  }
893  if (m_ctrlSubtype & 0x08)
894  {
895  size += 2;
896  }
897  break;
898  }
899  return size;
900 }
901 const char *
903 {
904 #define FOO(x) \
905 case WIFI_MAC_ ## x: \
906  return # x; \
907  break;
908 
909  switch (GetType ())
910  {
911  FOO (CTL_RTS);
912  FOO (CTL_CTS);
913  FOO (CTL_ACK);
914  FOO (CTL_BACKREQ);
915  FOO (CTL_BACKRESP);
916 
917  FOO (MGT_BEACON);
918  FOO (MGT_ASSOCIATION_REQUEST);
919  FOO (MGT_ASSOCIATION_RESPONSE);
920  FOO (MGT_DISASSOCIATION);
921  FOO (MGT_REASSOCIATION_REQUEST);
922  FOO (MGT_REASSOCIATION_RESPONSE);
923  FOO (MGT_PROBE_REQUEST);
924  FOO (MGT_PROBE_RESPONSE);
925  FOO (MGT_AUTHENTICATION);
926  FOO (MGT_DEAUTHENTICATION);
927  FOO (MGT_ACTION);
928  FOO (MGT_ACTION_NO_ACK);
929  FOO (MGT_MULTIHOP_ACTION);
930 
931  FOO (DATA);
932  FOO (DATA_CFACK);
933  FOO (DATA_CFPOLL);
934  FOO (DATA_CFACK_CFPOLL);
935  FOO (DATA_NULL);
936  FOO (DATA_NULL_CFACK);
937  FOO (DATA_NULL_CFPOLL);
938  FOO (DATA_NULL_CFACK_CFPOLL);
939  FOO (QOSDATA);
940  FOO (QOSDATA_CFACK);
941  FOO (QOSDATA_CFPOLL);
942  FOO (QOSDATA_CFACK_CFPOLL);
943  FOO (QOSDATA_NULL);
944  FOO (QOSDATA_NULL_CFPOLL);
945  FOO (QOSDATA_NULL_CFACK_CFPOLL);
946  default:
947  return "ERROR";
948  }
949 #undef FOO
950  // needed to make gcc 4.0.1 ppc darwin happy.
951  return "BIG_ERROR";
952 }
953 
954 TypeId
956 {
957  static TypeId tid = TypeId ("ns3::WifiMacHeader")
958  .SetParent<Header> ()
959  .AddConstructor<WifiMacHeader> ()
960  ;
961  return tid;
962 }
963 
964 TypeId
966 {
967  return GetTypeId ();
968 }
969 
970 void
971 WifiMacHeader::PrintFrameControl (std::ostream &os) const
972 {
973  os << "ToDS=" << std::hex << (int) m_ctrlToDs << ", FromDS=" << std::hex << (int) m_ctrlFromDs
974  << ", MoreFrag=" << std::hex << (int) m_ctrlMoreFrag << ", Retry=" << std::hex << (int) m_ctrlRetry
975  << ", MoreData=" << std::hex << (int) m_ctrlMoreData << std::dec
976  ;
977 }
978 
979 void
980 WifiMacHeader::Print (std::ostream &os) const
981 {
982  os << GetTypeString () << " ";
983  switch (GetType ())
984  {
985  case WIFI_MAC_CTL_RTS:
986  os << "Duration/ID=" << m_duration << "us"
987  << ", RA=" << m_addr1 << ", TA=" << m_addr2;
988  break;
989  case WIFI_MAC_CTL_CTS:
990  case WIFI_MAC_CTL_ACK:
991  os << "Duration/ID=" << m_duration << "us"
992  << ", RA=" << m_addr1;
993  break;
995  break;
997  break;
999  break;
1000 
1001  case WIFI_MAC_MGT_BEACON:
1011  PrintFrameControl (os);
1012  os << " Duration/ID=" << m_duration << "us"
1013  << ", DA=" << m_addr1 << ", SA=" << m_addr2
1014  << ", BSSID=" << m_addr3 << ", FragNumber=" << std::hex << (int) m_seqFrag << std::dec
1015  << ", SeqNumber=" << m_seqSeq;
1016  break;
1017  case WIFI_MAC_MGT_ACTION:
1019  PrintFrameControl (os);
1020  os << " Duration/ID=" << m_duration << "us"
1021  << "DA=" << m_addr1 << ", SA=" << m_addr2 << ", BSSID=" << m_addr3
1022  << ", FragNumber=" << std::hex << (int) m_seqFrag << std::dec << ", SeqNumber=" << m_seqSeq;
1023  break;
1025  os << " Duration/ID=" << m_duration << "us"
1026  << "RA=" << m_addr1 << ", TA=" << m_addr2 << ", DA=" << m_addr3
1027  << ", FragNumber=" << std::hex << (int) m_seqFrag << std::dec << ", SeqNumber=" << m_seqSeq;
1028  break;
1029  case WIFI_MAC_DATA:
1030  PrintFrameControl (os);
1031  os << " Duration/ID=" << m_duration << "us";
1032  if (!m_ctrlToDs && !m_ctrlFromDs)
1033  {
1034  os << "DA=" << m_addr1 << ", SA=" << m_addr2 << ", BSSID=" << m_addr3;
1035  }
1036  else if (!m_ctrlToDs && m_ctrlFromDs)
1037  {
1038  os << "DA=" << m_addr1 << ", SA=" << m_addr3 << ", BSSID=" << m_addr2;
1039  }
1040  else if (m_ctrlToDs && !m_ctrlFromDs)
1041  {
1042  os << "DA=" << m_addr3 << ", SA=" << m_addr2 << ", BSSID=" << m_addr1;
1043  }
1044  else if (m_ctrlToDs && m_ctrlFromDs)
1045  {
1046  os << "DA=" << m_addr3 << ", SA=" << m_addr4 << ", RA=" << m_addr1 << ", TA=" << m_addr2;
1047  }
1048  else
1049  {
1050  NS_FATAL_ERROR ("Impossible ToDs and FromDs flags combination");
1051  }
1052  os << ", FragNumber=" << std::hex << (int) m_seqFrag << std::dec
1053  << ", SeqNumber=" << m_seqSeq;
1054  break;
1055  case WIFI_MAC_DATA_CFACK:
1056  case WIFI_MAC_DATA_CFPOLL:
1058  case WIFI_MAC_DATA_NULL:
1062  case WIFI_MAC_QOSDATA:
1066  case WIFI_MAC_QOSDATA_NULL:
1069  break;
1070  }
1071 }
1072 uint32_t
1074 {
1075  return GetSize ();
1076 }
1077 void
1079 {
1082  WriteTo (i, m_addr1);
1083  switch (m_ctrlType)
1084  {
1085  case TYPE_MGT:
1086  WriteTo (i, m_addr2);
1087  WriteTo (i, m_addr3);
1089  break;
1090  case TYPE_CTL:
1091  switch (m_ctrlSubtype)
1092  {
1093  case SUBTYPE_CTL_RTS:
1094  WriteTo (i, m_addr2);
1095  break;
1096  case SUBTYPE_CTL_CTS:
1097  case SUBTYPE_CTL_ACK:
1098  break;
1099  case SUBTYPE_CTL_BACKREQ:
1100  case SUBTYPE_CTL_BACKRESP:
1101  WriteTo (i, m_addr2);
1102  break;
1103  default:
1104  //NOTREACHED
1105  NS_ASSERT (false);
1106  break;
1107  }
1108  break;
1109  case TYPE_DATA:
1110  {
1111  WriteTo (i, m_addr2);
1112  WriteTo (i, m_addr3);
1114  if (m_ctrlToDs && m_ctrlFromDs)
1115  {
1116  WriteTo (i, m_addr4);
1117  }
1118  if (m_ctrlSubtype & 0x08)
1119  {
1121  }
1122  } break;
1123  default:
1124  //NOTREACHED
1125  NS_ASSERT (false);
1126  break;
1127  }
1128 }
1129 uint32_t
1131 {
1132  Buffer::Iterator i = start;
1133  uint16_t frame_control = i.ReadLsbtohU16 ();
1134  SetFrameControl (frame_control);
1135  m_duration = i.ReadLsbtohU16 ();
1136  ReadFrom (i, m_addr1);
1137  switch (m_ctrlType)
1138  {
1139  case TYPE_MGT:
1140  ReadFrom (i, m_addr2);
1141  ReadFrom (i, m_addr3);
1143  break;
1144  case TYPE_CTL:
1145  switch (m_ctrlSubtype)
1146  {
1147  case SUBTYPE_CTL_RTS:
1148  ReadFrom (i, m_addr2);
1149  break;
1150  case SUBTYPE_CTL_CTS:
1151  case SUBTYPE_CTL_ACK:
1152  break;
1153  case SUBTYPE_CTL_BACKREQ:
1154  case SUBTYPE_CTL_BACKRESP:
1155  ReadFrom (i, m_addr2);
1156  break;
1157  }
1158  break;
1159  case TYPE_DATA:
1160  ReadFrom (i, m_addr2);
1161  ReadFrom (i, m_addr3);
1163  if (m_ctrlToDs && m_ctrlFromDs)
1164  {
1165  ReadFrom (i, m_addr4);
1166  }
1167  if (m_ctrlSubtype & 0x08)
1168  {
1170  }
1171  break;
1172  }
1173  return i.GetDistanceFrom (start);
1174 }
1175 
1176 } // namespace ns3
Protocol header serialization and deserialization.
Definition: header.h:42
bool IsBeacon(void) const
void SetMoreFragments(void)
keep track of time values and allow control of global simulation resolution
Definition: nstime.h:81
uint32_t GetSize(void) const
uint16_t GetFragmentNumber(void) const
void SetRawDuration(uint16_t duration)
void SetFrameControl(uint16_t control)
bool IsReassocResp(void) const
uint16_t GetRawDuration(void) const
void SetDuration(Time duration)
bool IsAction() const
void ReadFrom(Buffer::Iterator &i, Ipv4Address &ad)
Mac48Address m_addr2
Mac48Address GetAddr3(void) const
void SetNoMoreFragments(void)
Mac48Address GetAddr4(void) const
#define NS_ASSERT(condition)
Definition: assert.h:64
void WriteTo(Buffer::Iterator &i, Ipv4Address ad)
enum WifiMacType GetType(void) const
void SetId(uint16_t id)
bool IsAssocReq(void) const
uint16_t GetQosControl(void) const
bool IsBlockAck(void) const
bool IsAssocResp(void) const
void SetQosControl(uint16_t qos)
uint16_t GetFrameControl(void) const
bool IsCtl(void) const
bool IsQosAmsdu(void) const
bool IsProbeResp(void) const
Mac48Address m_addr1
uint32_t GetDistanceFrom(Iterator const &o) const
Definition: buffer.cc:807
#define NS_FATAL_ERROR(msg)
fatal error handling
Definition: fatal-error.h:72
Mac48Address m_addr3
iterator in a Buffer instance
Definition: buffer.h:98
void SetQosAckPolicy(enum QosAckPolicy)
bool IsCfpoll(void) const
bool IsMoreFragments(void) const
Time GetDuration(void) const
uint8_t GetQosTid(void) const
bool IsReassocReq(void) const
virtual uint32_t GetSerializedSize(void) const
uint8_t GetQosTxopLimit(void) const
void SetAddr1(Mac48Address address)
int64_t GetMicroSeconds(void) const
Definition: nstime.h:283
void SetAddr3(Mac48Address address)
void SetAddr4(Mac48Address address)
uint16_t GetSequenceControl(void) const
bool IsProbeReq(void) const
virtual void Print(std::ostream &os) const
NS_OBJECT_ENSURE_REGISTERED(AntennaModel)
bool IsAuthentication(void) const
bool IsQosBlockAck(void) const
Mac48Address m_addr4
bool IsMgt(void) const
void SetQosTid(uint8_t tid)
virtual TypeId GetInstanceTypeId(void) const
void SetSequenceControl(uint16_t seq)
bool IsToDs(void) const
bool IsDisassociation(void) const
void SetAddr2(Mac48Address address)
an EUI-48 address
Definition: mac48-address.h:41
void PrintFrameControl(std::ostream &os) const
const char * GetTypeString(void) const
#define FOO(x)
void WriteHtolsbU16(uint16_t data)
Definition: buffer.cc:935
void SetQosTxopLimit(uint8_t txop)
void SetSequenceNumber(uint16_t seq)
bool IsData(void) const
bool IsQosData(void) const
bool IsBlockAckReq(void) const
void SetQosNormalAck(void)
virtual void Serialize(Buffer::Iterator start) const
bool IsFromDs(void) const
bool IsQosEosp(void) const
virtual uint32_t Deserialize(Buffer::Iterator start)
uint16_t ReadLsbtohU16(void)
Definition: buffer.cc:1090
bool IsMultihopAction() const
void SetType(enum WifiMacType type)
bool IsCts(void) const
Mac48Address GetAddr1(void) const
tuple address
Definition: first.py:37
bool IsDeauthentication(void) const
bool IsRts(void) const
bool IsAck(void) const
static TypeId GetTypeId(void)
void SetFragmentNumber(uint8_t frag)
a unique identifier for an interface.
Definition: type-id.h:49
TypeId SetParent(TypeId tid)
Definition: type-id.cc:610
enum QosAckPolicy GetQosAckPolicy(void) const
bool IsRetry(void) const
Mac48Address GetAddr2(void) const
bool IsQosNoAck(void) const
bool IsQosAck(void) const
uint16_t GetSequenceNumber(void) const