OLD | NEW |
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ | 1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ |
2 /* | 2 /* |
3 * Copyright (c) 2006, 2009 INRIA | 3 * Copyright (c) 2006, 2009 INRIA |
4 * Copyright (c) 2009 MIRKO BANCHI | 4 * Copyright (c) 2009 MIRKO BANCHI |
5 * | 5 * |
6 * This program is free software; you can redistribute it and/or modify | 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 | 7 * it under the terms of the GNU General Public License version 2 as |
8 * published by the Free Software Foundation; | 8 * published by the Free Software Foundation; |
9 * | 9 * |
10 * This program is distributed in the hope that it will be useful, | 10 * This program is distributed in the hope that it will be useful, |
(...skipping 26 matching lines...) Expand all Loading... |
37 | 37 |
38 /// subtype enumeration | 38 /// subtype enumeration |
39 enum | 39 enum |
40 { | 40 { |
41 //Reserved: 0 - 6 | 41 //Reserved: 0 - 6 |
42 SUBTYPE_CTL_CTLWRAPPER = 7, | 42 SUBTYPE_CTL_CTLWRAPPER = 7, |
43 SUBTYPE_CTL_BACKREQ = 8, | 43 SUBTYPE_CTL_BACKREQ = 8, |
44 SUBTYPE_CTL_BACKRESP = 9, | 44 SUBTYPE_CTL_BACKRESP = 9, |
45 SUBTYPE_CTL_RTS = 11, | 45 SUBTYPE_CTL_RTS = 11, |
46 SUBTYPE_CTL_CTS = 12, | 46 SUBTYPE_CTL_CTS = 12, |
47 SUBTYPE_CTL_ACK = 13 | 47 SUBTYPE_CTL_ACK = 13, |
| 48 SUBTYPE_CTL_END = 14, |
| 49 SUBTYPE_CTL_END_ACK = 15 |
48 }; | 50 }; |
49 | 51 |
50 WifiMacHeader::WifiMacHeader () | 52 WifiMacHeader::WifiMacHeader () |
51 : m_ctrlMoreData (0), | 53 : m_ctrlMoreData (0), |
52 m_ctrlWep (0), | 54 m_ctrlWep (0), |
53 m_ctrlOrder (1), | 55 m_ctrlOrder (1), |
54 m_amsduPresent (0) | 56 m_amsduPresent (0) |
55 { | 57 { |
56 } | 58 } |
57 | 59 |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
101 m_addr3 = address; | 103 m_addr3 = address; |
102 } | 104 } |
103 | 105 |
104 void | 106 void |
105 WifiMacHeader::SetAddr4 (Mac48Address address) | 107 WifiMacHeader::SetAddr4 (Mac48Address address) |
106 { | 108 { |
107 m_addr4 = address; | 109 m_addr4 = address; |
108 } | 110 } |
109 | 111 |
110 void | 112 void |
111 WifiMacHeader::SetType (WifiMacType type) | 113 WifiMacHeader::SetType (WifiMacType type, bool resetToDsFromDs) |
112 { | 114 { |
113 switch (type) | 115 switch (type) |
114 { | 116 { |
115 case WIFI_MAC_CTL_CTLWRAPPER: | 117 case WIFI_MAC_CTL_CTLWRAPPER: |
116 m_ctrlType = TYPE_CTL; | 118 m_ctrlType = TYPE_CTL; |
117 m_ctrlSubtype = SUBTYPE_CTL_CTLWRAPPER; | 119 m_ctrlSubtype = SUBTYPE_CTL_CTLWRAPPER; |
118 break; | 120 break; |
119 case WIFI_MAC_CTL_BACKREQ: | 121 case WIFI_MAC_CTL_BACKREQ: |
120 m_ctrlType = TYPE_CTL; | 122 m_ctrlType = TYPE_CTL; |
121 m_ctrlSubtype = SUBTYPE_CTL_BACKREQ; | 123 m_ctrlSubtype = SUBTYPE_CTL_BACKREQ; |
122 break; | 124 break; |
123 case WIFI_MAC_CTL_BACKRESP: | 125 case WIFI_MAC_CTL_BACKRESP: |
124 m_ctrlType = TYPE_CTL; | 126 m_ctrlType = TYPE_CTL; |
125 m_ctrlSubtype = SUBTYPE_CTL_BACKRESP; | 127 m_ctrlSubtype = SUBTYPE_CTL_BACKRESP; |
126 break; | 128 break; |
127 case WIFI_MAC_CTL_RTS: | 129 case WIFI_MAC_CTL_RTS: |
128 m_ctrlType = TYPE_CTL; | 130 m_ctrlType = TYPE_CTL; |
129 m_ctrlSubtype = SUBTYPE_CTL_RTS; | 131 m_ctrlSubtype = SUBTYPE_CTL_RTS; |
130 break; | 132 break; |
131 case WIFI_MAC_CTL_CTS: | 133 case WIFI_MAC_CTL_CTS: |
132 m_ctrlType = TYPE_CTL; | 134 m_ctrlType = TYPE_CTL; |
133 m_ctrlSubtype = SUBTYPE_CTL_CTS; | 135 m_ctrlSubtype = SUBTYPE_CTL_CTS; |
134 break; | 136 break; |
135 case WIFI_MAC_CTL_ACK: | 137 case WIFI_MAC_CTL_ACK: |
136 m_ctrlType = TYPE_CTL; | 138 m_ctrlType = TYPE_CTL; |
137 m_ctrlSubtype = SUBTYPE_CTL_ACK; | 139 m_ctrlSubtype = SUBTYPE_CTL_ACK; |
138 break; | 140 break; |
| 141 case WIFI_MAC_CTL_END: |
| 142 m_ctrlType = TYPE_CTL; |
| 143 m_ctrlSubtype = SUBTYPE_CTL_END; |
| 144 break; |
| 145 case WIFI_MAC_CTL_END_ACK: |
| 146 m_ctrlType = TYPE_CTL; |
| 147 m_ctrlSubtype = SUBTYPE_CTL_END_ACK; |
| 148 break; |
139 case WIFI_MAC_MGT_ASSOCIATION_REQUEST: | 149 case WIFI_MAC_MGT_ASSOCIATION_REQUEST: |
140 m_ctrlType = TYPE_MGT; | 150 m_ctrlType = TYPE_MGT; |
141 m_ctrlSubtype = 0; | 151 m_ctrlSubtype = 0; |
142 break; | 152 break; |
143 case WIFI_MAC_MGT_ASSOCIATION_RESPONSE: | 153 case WIFI_MAC_MGT_ASSOCIATION_RESPONSE: |
144 m_ctrlType = TYPE_MGT; | 154 m_ctrlType = TYPE_MGT; |
145 m_ctrlSubtype = 1; | 155 m_ctrlSubtype = 1; |
146 break; | 156 break; |
147 case WIFI_MAC_MGT_REASSOCIATION_REQUEST: | 157 case WIFI_MAC_MGT_REASSOCIATION_REQUEST: |
148 m_ctrlType = TYPE_MGT; | 158 m_ctrlType = TYPE_MGT; |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
242 break; | 252 break; |
243 case WIFI_MAC_QOSDATA_NULL_CFPOLL: | 253 case WIFI_MAC_QOSDATA_NULL_CFPOLL: |
244 m_ctrlType = TYPE_DATA; | 254 m_ctrlType = TYPE_DATA; |
245 m_ctrlSubtype = 14; | 255 m_ctrlSubtype = 14; |
246 break; | 256 break; |
247 case WIFI_MAC_QOSDATA_NULL_CFACK_CFPOLL: | 257 case WIFI_MAC_QOSDATA_NULL_CFACK_CFPOLL: |
248 m_ctrlType = TYPE_DATA; | 258 m_ctrlType = TYPE_DATA; |
249 m_ctrlSubtype = 15; | 259 m_ctrlSubtype = 15; |
250 break; | 260 break; |
251 } | 261 } |
252 m_ctrlToDs = 0; | 262 if (resetToDsFromDs) |
253 m_ctrlFromDs = 0; | 263 { |
| 264 m_ctrlToDs = 0; |
| 265 m_ctrlFromDs = 0; |
| 266 } |
254 } | 267 } |
255 | 268 |
256 void | 269 void |
| 270 WifiMacHeader::SetRawDuration (uint16_t duration) |
| 271 { |
| 272 m_duration = duration; |
| 273 } |
| 274 |
| 275 void |
257 WifiMacHeader::SetDuration (Time duration) | 276 WifiMacHeader::SetDuration (Time duration) |
258 { | 277 { |
259 int64_t duration_us = ceil (static_cast<double> (duration.GetNanoSeconds ()) /
1000); | 278 int64_t duration_us = ceil (static_cast<double> (duration.GetNanoSeconds ()) /
1000); |
260 NS_ASSERT (duration_us >= 0 && duration_us <= 0x7fff); | 279 NS_ASSERT (duration_us >= 0 && duration_us <= 0x7fff); |
261 m_duration = static_cast<uint16_t> (duration_us); | 280 m_duration = static_cast<uint16_t> (duration_us); |
262 } | 281 } |
263 | 282 |
264 void WifiMacHeader::SetId (uint16_t id) | 283 void WifiMacHeader::SetId (uint16_t id) |
265 { | 284 { |
266 m_duration = id; | 285 m_duration = id; |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
436 case SUBTYPE_CTL_BACKREQ: | 455 case SUBTYPE_CTL_BACKREQ: |
437 return WIFI_MAC_CTL_BACKREQ; | 456 return WIFI_MAC_CTL_BACKREQ; |
438 case SUBTYPE_CTL_BACKRESP: | 457 case SUBTYPE_CTL_BACKRESP: |
439 return WIFI_MAC_CTL_BACKRESP; | 458 return WIFI_MAC_CTL_BACKRESP; |
440 case SUBTYPE_CTL_RTS: | 459 case SUBTYPE_CTL_RTS: |
441 return WIFI_MAC_CTL_RTS; | 460 return WIFI_MAC_CTL_RTS; |
442 case SUBTYPE_CTL_CTS: | 461 case SUBTYPE_CTL_CTS: |
443 return WIFI_MAC_CTL_CTS; | 462 return WIFI_MAC_CTL_CTS; |
444 case SUBTYPE_CTL_ACK: | 463 case SUBTYPE_CTL_ACK: |
445 return WIFI_MAC_CTL_ACK; | 464 return WIFI_MAC_CTL_ACK; |
| 465 case SUBTYPE_CTL_END: |
| 466 return WIFI_MAC_CTL_END; |
| 467 case SUBTYPE_CTL_END_ACK: |
| 468 return WIFI_MAC_CTL_END_ACK; |
446 } | 469 } |
447 break; | 470 break; |
448 case TYPE_DATA: | 471 case TYPE_DATA: |
449 switch (m_ctrlSubtype) | 472 switch (m_ctrlSubtype) |
450 { | 473 { |
451 case 0: | 474 case 0: |
452 return WIFI_MAC_DATA; | 475 return WIFI_MAC_DATA; |
453 case 1: | 476 case 1: |
454 return WIFI_MAC_DATA_CFACK; | 477 return WIFI_MAC_DATA_CFACK; |
455 case 2: | 478 case 2: |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
517 return (m_ctrlType == TYPE_CTL); | 540 return (m_ctrlType == TYPE_CTL); |
518 } | 541 } |
519 | 542 |
520 bool | 543 bool |
521 WifiMacHeader::IsMgt (void) const | 544 WifiMacHeader::IsMgt (void) const |
522 { | 545 { |
523 return (m_ctrlType == TYPE_MGT); | 546 return (m_ctrlType == TYPE_MGT); |
524 } | 547 } |
525 | 548 |
526 bool | 549 bool |
527 WifiMacHeader::IsCfpoll (void) const | 550 WifiMacHeader::IsCfPoll (void) const |
528 { | 551 { |
529 switch (GetType ()) | 552 switch (GetType ()) |
530 { | 553 { |
531 case WIFI_MAC_DATA_CFPOLL: | 554 case WIFI_MAC_DATA_CFPOLL: |
532 case WIFI_MAC_DATA_CFACK_CFPOLL: | 555 case WIFI_MAC_DATA_CFACK_CFPOLL: |
533 case WIFI_MAC_DATA_NULL_CFPOLL: | 556 case WIFI_MAC_DATA_NULL_CFPOLL: |
534 case WIFI_MAC_DATA_NULL_CFACK_CFPOLL: | 557 case WIFI_MAC_DATA_NULL_CFACK_CFPOLL: |
535 case WIFI_MAC_QOSDATA_CFPOLL: | 558 case WIFI_MAC_QOSDATA_CFPOLL: |
536 case WIFI_MAC_QOSDATA_CFACK_CFPOLL: | 559 case WIFI_MAC_QOSDATA_CFACK_CFPOLL: |
537 case WIFI_MAC_QOSDATA_NULL_CFPOLL: | 560 case WIFI_MAC_QOSDATA_NULL_CFPOLL: |
538 case WIFI_MAC_QOSDATA_NULL_CFACK_CFPOLL: | 561 case WIFI_MAC_QOSDATA_NULL_CFACK_CFPOLL: |
539 return true; | 562 return true; |
540 default: | 563 default: |
541 return false; | 564 return false; |
542 } | 565 } |
543 } | 566 } |
544 | 567 |
545 bool | 568 bool |
| 569 WifiMacHeader::IsCfEnd (void) const |
| 570 { |
| 571 switch (GetType ()) |
| 572 { |
| 573 case WIFI_MAC_CTL_END: |
| 574 case WIFI_MAC_CTL_END_ACK: |
| 575 return true; |
| 576 default: |
| 577 return false; |
| 578 } |
| 579 } |
| 580 |
| 581 bool |
| 582 WifiMacHeader::IsCfAck (void) const |
| 583 { |
| 584 switch (GetType ()) |
| 585 { |
| 586 case WIFI_MAC_DATA_CFACK: |
| 587 case WIFI_MAC_DATA_CFACK_CFPOLL: |
| 588 case WIFI_MAC_DATA_NULL_CFACK: |
| 589 case WIFI_MAC_DATA_NULL_CFACK_CFPOLL: |
| 590 case WIFI_MAC_CTL_END_ACK: |
| 591 return true; |
| 592 default: |
| 593 return false; |
| 594 break; |
| 595 } |
| 596 } |
| 597 |
| 598 bool· |
| 599 WifiMacHeader::HasData (void) const |
| 600 { |
| 601 switch (GetType ()) |
| 602 { |
| 603 case WIFI_MAC_DATA: |
| 604 case WIFI_MAC_DATA_CFACK: |
| 605 case WIFI_MAC_DATA_CFPOLL: |
| 606 case WIFI_MAC_DATA_CFACK_CFPOLL: |
| 607 case WIFI_MAC_QOSDATA: |
| 608 case WIFI_MAC_QOSDATA_CFACK: |
| 609 case WIFI_MAC_QOSDATA_CFPOLL: |
| 610 case WIFI_MAC_QOSDATA_CFACK_CFPOLL: |
| 611 return true; |
| 612 default: |
| 613 return false; |
| 614 } |
| 615 } |
| 616 |
| 617 bool |
546 WifiMacHeader::IsRts (void) const | 618 WifiMacHeader::IsRts (void) const |
547 { | 619 { |
548 return (GetType () == WIFI_MAC_CTL_RTS); | 620 return (GetType () == WIFI_MAC_CTL_RTS); |
549 } | 621 } |
550 | 622 |
551 bool | 623 bool |
552 WifiMacHeader::IsCts (void) const | 624 WifiMacHeader::IsCts (void) const |
553 { | 625 { |
554 return (GetType () == WIFI_MAC_CTL_CTS); | 626 return (GetType () == WIFI_MAC_CTL_CTS); |
555 } | 627 } |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
637 { | 709 { |
638 return (GetType () == WIFI_MAC_CTL_BACKREQ) ? true : false; | 710 return (GetType () == WIFI_MAC_CTL_BACKREQ) ? true : false; |
639 } | 711 } |
640 | 712 |
641 bool | 713 bool |
642 WifiMacHeader::IsBlockAck (void) const | 714 WifiMacHeader::IsBlockAck (void) const |
643 { | 715 { |
644 return (GetType () == WIFI_MAC_CTL_BACKRESP) ? true : false; | 716 return (GetType () == WIFI_MAC_CTL_BACKRESP) ? true : false; |
645 } | 717 } |
646 | 718 |
| 719 uint16_t |
| 720 WifiMacHeader::GetRawDuration (void) const |
| 721 { |
| 722 return m_duration; |
| 723 } |
| 724 |
647 Time | 725 Time |
648 WifiMacHeader::GetDuration (void) const | 726 WifiMacHeader::GetDuration (void) const |
649 { | 727 { |
650 return MicroSeconds (m_duration); | 728 return MicroSeconds (m_duration); |
651 } | 729 } |
652 | 730 |
653 uint16_t | 731 uint16_t |
654 WifiMacHeader::GetSequenceControl (void) const | 732 WifiMacHeader::GetSequenceControl (void) const |
655 { | 733 { |
656 return (m_seqSeq << 4) | m_seqFrag; | 734 return (m_seqSeq << 4) | m_seqFrag; |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
785 uint32_t size = 0; | 863 uint32_t size = 0; |
786 switch (m_ctrlType) | 864 switch (m_ctrlType) |
787 { | 865 { |
788 case TYPE_MGT: | 866 case TYPE_MGT: |
789 size = 2 + 2 + 6 + 6 + 6 + 2; | 867 size = 2 + 2 + 6 + 6 + 6 + 2; |
790 break; | 868 break; |
791 case TYPE_CTL: | 869 case TYPE_CTL: |
792 switch (m_ctrlSubtype) | 870 switch (m_ctrlSubtype) |
793 { | 871 { |
794 case SUBTYPE_CTL_RTS: | 872 case SUBTYPE_CTL_RTS: |
| 873 case SUBTYPE_CTL_BACKREQ: |
| 874 case SUBTYPE_CTL_BACKRESP: |
| 875 case SUBTYPE_CTL_END: |
| 876 case SUBTYPE_CTL_END_ACK: |
795 size = 2 + 2 + 6 + 6; | 877 size = 2 + 2 + 6 + 6; |
796 break; | 878 break; |
797 case SUBTYPE_CTL_CTS: | 879 case SUBTYPE_CTL_CTS: |
798 case SUBTYPE_CTL_ACK: | 880 case SUBTYPE_CTL_ACK: |
799 size = 2 + 2 + 6; | 881 size = 2 + 2 + 6; |
800 break; | 882 break; |
801 case SUBTYPE_CTL_BACKREQ: | |
802 case SUBTYPE_CTL_BACKRESP: | |
803 size = 2 + 2 + 6 + 6; | |
804 break; | |
805 case SUBTYPE_CTL_CTLWRAPPER: | 883 case SUBTYPE_CTL_CTLWRAPPER: |
806 size = 2 + 2 + 6 + 2 + 4; | 884 size = 2 + 2 + 6 + 2 + 4; |
807 break; | 885 break; |
808 } | 886 } |
809 break; | 887 break; |
810 case TYPE_DATA: | 888 case TYPE_DATA: |
811 size = 2 + 2 + 6 + 6 + 6 + 2; | 889 size = 2 + 2 + 6 + 6 + 6 + 2; |
812 if (m_ctrlToDs && m_ctrlFromDs) | 890 if (m_ctrlToDs && m_ctrlFromDs) |
813 { | 891 { |
814 size += 6; | 892 size += 6; |
(...skipping 15 matching lines...) Expand all Loading... |
830 return # x; \ | 908 return # x; \ |
831 break; | 909 break; |
832 | 910 |
833 switch (GetType ()) | 911 switch (GetType ()) |
834 { | 912 { |
835 FOO (CTL_RTS); | 913 FOO (CTL_RTS); |
836 FOO (CTL_CTS); | 914 FOO (CTL_CTS); |
837 FOO (CTL_ACK); | 915 FOO (CTL_ACK); |
838 FOO (CTL_BACKREQ); | 916 FOO (CTL_BACKREQ); |
839 FOO (CTL_BACKRESP); | 917 FOO (CTL_BACKRESP); |
| 918 FOO (CTL_END); |
| 919 FOO (CTL_END_ACK); |
840 | 920 |
841 FOO (MGT_BEACON); | 921 FOO (MGT_BEACON); |
842 FOO (MGT_ASSOCIATION_REQUEST); | 922 FOO (MGT_ASSOCIATION_REQUEST); |
843 FOO (MGT_ASSOCIATION_RESPONSE); | 923 FOO (MGT_ASSOCIATION_RESPONSE); |
844 FOO (MGT_DISASSOCIATION); | 924 FOO (MGT_DISASSOCIATION); |
845 FOO (MGT_REASSOCIATION_REQUEST); | 925 FOO (MGT_REASSOCIATION_REQUEST); |
846 FOO (MGT_REASSOCIATION_RESPONSE); | 926 FOO (MGT_REASSOCIATION_RESPONSE); |
847 FOO (MGT_PROBE_REQUEST); | 927 FOO (MGT_PROBE_REQUEST); |
848 FOO (MGT_PROBE_RESPONSE); | 928 FOO (MGT_PROBE_RESPONSE); |
849 FOO (MGT_AUTHENTICATION); | 929 FOO (MGT_AUTHENTICATION); |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
909 { | 989 { |
910 case WIFI_MAC_CTL_RTS: | 990 case WIFI_MAC_CTL_RTS: |
911 os << "Duration/ID=" << m_duration << "us" | 991 os << "Duration/ID=" << m_duration << "us" |
912 << ", RA=" << m_addr1 << ", TA=" << m_addr2; | 992 << ", RA=" << m_addr1 << ", TA=" << m_addr2; |
913 break; | 993 break; |
914 case WIFI_MAC_CTL_CTS: | 994 case WIFI_MAC_CTL_CTS: |
915 case WIFI_MAC_CTL_ACK: | 995 case WIFI_MAC_CTL_ACK: |
916 os << "Duration/ID=" << m_duration << "us" | 996 os << "Duration/ID=" << m_duration << "us" |
917 << ", RA=" << m_addr1; | 997 << ", RA=" << m_addr1; |
918 break; | 998 break; |
919 case WIFI_MAC_CTL_BACKREQ: | |
920 case WIFI_MAC_CTL_BACKRESP: | |
921 case WIFI_MAC_CTL_CTLWRAPPER: | |
922 break; | |
923 case WIFI_MAC_MGT_BEACON: | 999 case WIFI_MAC_MGT_BEACON: |
924 case WIFI_MAC_MGT_ASSOCIATION_REQUEST: | 1000 case WIFI_MAC_MGT_ASSOCIATION_REQUEST: |
925 case WIFI_MAC_MGT_ASSOCIATION_RESPONSE: | 1001 case WIFI_MAC_MGT_ASSOCIATION_RESPONSE: |
926 case WIFI_MAC_MGT_DISASSOCIATION: | 1002 case WIFI_MAC_MGT_DISASSOCIATION: |
927 case WIFI_MAC_MGT_REASSOCIATION_REQUEST: | 1003 case WIFI_MAC_MGT_REASSOCIATION_REQUEST: |
928 case WIFI_MAC_MGT_REASSOCIATION_RESPONSE: | 1004 case WIFI_MAC_MGT_REASSOCIATION_RESPONSE: |
929 case WIFI_MAC_MGT_PROBE_REQUEST: | 1005 case WIFI_MAC_MGT_PROBE_REQUEST: |
930 case WIFI_MAC_MGT_PROBE_RESPONSE: | 1006 case WIFI_MAC_MGT_PROBE_RESPONSE: |
931 case WIFI_MAC_MGT_AUTHENTICATION: | 1007 case WIFI_MAC_MGT_AUTHENTICATION: |
932 case WIFI_MAC_MGT_DEAUTHENTICATION: | 1008 case WIFI_MAC_MGT_DEAUTHENTICATION: |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
967 { | 1043 { |
968 os << ", DA=" << m_addr3 << ", SA=" << m_addr4 << ", RA=" << m_addr1 <
< ", TA=" << m_addr2; | 1044 os << ", DA=" << m_addr3 << ", SA=" << m_addr4 << ", RA=" << m_addr1 <
< ", TA=" << m_addr2; |
969 } | 1045 } |
970 else | 1046 else |
971 { | 1047 { |
972 NS_FATAL_ERROR ("Impossible ToDs and FromDs flags combination"); | 1048 NS_FATAL_ERROR ("Impossible ToDs and FromDs flags combination"); |
973 } | 1049 } |
974 os << ", FragNumber=" << std::hex << (int) m_seqFrag << std::dec | 1050 os << ", FragNumber=" << std::hex << (int) m_seqFrag << std::dec |
975 << ", SeqNumber=" << m_seqSeq; | 1051 << ", SeqNumber=" << m_seqSeq; |
976 break; | 1052 break; |
| 1053 case WIFI_MAC_CTL_BACKREQ: |
| 1054 case WIFI_MAC_CTL_BACKRESP: |
| 1055 case WIFI_MAC_CTL_CTLWRAPPER: |
| 1056 case WIFI_MAC_CTL_END: |
| 1057 case WIFI_MAC_CTL_END_ACK: |
977 case WIFI_MAC_DATA_CFACK: | 1058 case WIFI_MAC_DATA_CFACK: |
978 case WIFI_MAC_DATA_CFPOLL: | 1059 case WIFI_MAC_DATA_CFPOLL: |
979 case WIFI_MAC_DATA_CFACK_CFPOLL: | 1060 case WIFI_MAC_DATA_CFACK_CFPOLL: |
980 case WIFI_MAC_DATA_NULL: | 1061 case WIFI_MAC_DATA_NULL: |
981 case WIFI_MAC_DATA_NULL_CFACK: | 1062 case WIFI_MAC_DATA_NULL_CFACK: |
982 case WIFI_MAC_DATA_NULL_CFPOLL: | 1063 case WIFI_MAC_DATA_NULL_CFPOLL: |
983 case WIFI_MAC_DATA_NULL_CFACK_CFPOLL: | 1064 case WIFI_MAC_DATA_NULL_CFACK_CFPOLL: |
984 case WIFI_MAC_QOSDATA: | 1065 case WIFI_MAC_QOSDATA: |
985 case WIFI_MAC_QOSDATA_CFACK: | 1066 case WIFI_MAC_QOSDATA_CFACK: |
986 case WIFI_MAC_QOSDATA_CFPOLL: | 1067 case WIFI_MAC_QOSDATA_CFPOLL: |
987 case WIFI_MAC_QOSDATA_CFACK_CFPOLL: | 1068 case WIFI_MAC_QOSDATA_CFACK_CFPOLL: |
988 case WIFI_MAC_QOSDATA_NULL: | 1069 case WIFI_MAC_QOSDATA_NULL: |
989 case WIFI_MAC_QOSDATA_NULL_CFPOLL: | 1070 case WIFI_MAC_QOSDATA_NULL_CFPOLL: |
990 case WIFI_MAC_QOSDATA_NULL_CFACK_CFPOLL: | 1071 case WIFI_MAC_QOSDATA_NULL_CFACK_CFPOLL: |
| 1072 default: |
991 break; | 1073 break; |
992 } | 1074 } |
993 } | 1075 } |
994 | 1076 |
995 uint32_t | 1077 uint32_t |
996 WifiMacHeader::GetSerializedSize (void) const | 1078 WifiMacHeader::GetSerializedSize (void) const |
997 { | 1079 { |
998 return GetSize (); | 1080 return GetSize (); |
999 } | 1081 } |
1000 | 1082 |
1001 void | 1083 void |
1002 WifiMacHeader::Serialize (Buffer::Iterator i) const | 1084 WifiMacHeader::Serialize (Buffer::Iterator i) const |
1003 { | 1085 { |
1004 i.WriteHtolsbU16 (GetFrameControl ()); | 1086 i.WriteHtolsbU16 (GetFrameControl ()); |
1005 i.WriteHtolsbU16 (m_duration); | 1087 i.WriteHtolsbU16 (m_duration); |
1006 WriteTo (i, m_addr1); | 1088 WriteTo (i, m_addr1); |
1007 switch (m_ctrlType) | 1089 switch (m_ctrlType) |
1008 { | 1090 { |
1009 case TYPE_MGT: | 1091 case TYPE_MGT: |
1010 WriteTo (i, m_addr2); | 1092 WriteTo (i, m_addr2); |
1011 WriteTo (i, m_addr3); | 1093 WriteTo (i, m_addr3); |
1012 i.WriteHtolsbU16 (GetSequenceControl ()); | 1094 i.WriteHtolsbU16 (GetSequenceControl ()); |
1013 break; | 1095 break; |
1014 case TYPE_CTL: | 1096 case TYPE_CTL: |
1015 switch (m_ctrlSubtype) | 1097 switch (m_ctrlSubtype) |
1016 { | 1098 { |
1017 case SUBTYPE_CTL_RTS: | 1099 case SUBTYPE_CTL_RTS: |
| 1100 case SUBTYPE_CTL_BACKREQ: |
| 1101 case SUBTYPE_CTL_BACKRESP: |
| 1102 case SUBTYPE_CTL_END: |
| 1103 case SUBTYPE_CTL_END_ACK: |
1018 WriteTo (i, m_addr2); | 1104 WriteTo (i, m_addr2); |
1019 break; | 1105 break; |
1020 case SUBTYPE_CTL_CTS: | 1106 case SUBTYPE_CTL_CTS: |
1021 case SUBTYPE_CTL_ACK: | 1107 case SUBTYPE_CTL_ACK: |
1022 break; | 1108 break; |
1023 case SUBTYPE_CTL_BACKREQ: | |
1024 case SUBTYPE_CTL_BACKRESP: | |
1025 WriteTo (i, m_addr2); | |
1026 break; | |
1027 default: | 1109 default: |
1028 //NOTREACHED | 1110 //NOTREACHED |
1029 NS_ASSERT (false); | 1111 NS_ASSERT (false); |
1030 break; | 1112 break; |
1031 } | 1113 } |
1032 break; | 1114 break; |
1033 case TYPE_DATA: | 1115 case TYPE_DATA: |
1034 { | 1116 { |
1035 WriteTo (i, m_addr2); | 1117 WriteTo (i, m_addr2); |
1036 WriteTo (i, m_addr3); | 1118 WriteTo (i, m_addr3); |
(...skipping 26 matching lines...) Expand all Loading... |
1063 { | 1145 { |
1064 case TYPE_MGT: | 1146 case TYPE_MGT: |
1065 ReadFrom (i, m_addr2); | 1147 ReadFrom (i, m_addr2); |
1066 ReadFrom (i, m_addr3); | 1148 ReadFrom (i, m_addr3); |
1067 SetSequenceControl (i.ReadLsbtohU16 ()); | 1149 SetSequenceControl (i.ReadLsbtohU16 ()); |
1068 break; | 1150 break; |
1069 case TYPE_CTL: | 1151 case TYPE_CTL: |
1070 switch (m_ctrlSubtype) | 1152 switch (m_ctrlSubtype) |
1071 { | 1153 { |
1072 case SUBTYPE_CTL_RTS: | 1154 case SUBTYPE_CTL_RTS: |
| 1155 case SUBTYPE_CTL_BACKREQ: |
| 1156 case SUBTYPE_CTL_BACKRESP: |
| 1157 case SUBTYPE_CTL_END: |
| 1158 case SUBTYPE_CTL_END_ACK: |
1073 ReadFrom (i, m_addr2); | 1159 ReadFrom (i, m_addr2); |
1074 break; | 1160 break; |
1075 case SUBTYPE_CTL_CTS: | 1161 case SUBTYPE_CTL_CTS: |
1076 case SUBTYPE_CTL_ACK: | 1162 case SUBTYPE_CTL_ACK: |
1077 break; | 1163 break; |
1078 case SUBTYPE_CTL_BACKREQ: | |
1079 case SUBTYPE_CTL_BACKRESP: | |
1080 ReadFrom (i, m_addr2); | |
1081 break; | |
1082 } | 1164 } |
1083 break; | 1165 break; |
1084 case TYPE_DATA: | 1166 case TYPE_DATA: |
1085 ReadFrom (i, m_addr2); | 1167 ReadFrom (i, m_addr2); |
1086 ReadFrom (i, m_addr3); | 1168 ReadFrom (i, m_addr3); |
1087 SetSequenceControl (i.ReadLsbtohU16 ()); | 1169 SetSequenceControl (i.ReadLsbtohU16 ()); |
1088 if (m_ctrlToDs && m_ctrlFromDs) | 1170 if (m_ctrlToDs && m_ctrlFromDs) |
1089 { | 1171 { |
1090 ReadFrom (i, m_addr4); | 1172 ReadFrom (i, m_addr4); |
1091 } | 1173 } |
1092 if (m_ctrlSubtype & 0x08) | 1174 if (m_ctrlSubtype & 0x08) |
1093 { | 1175 { |
1094 SetQosControl (i.ReadLsbtohU16 ()); | 1176 SetQosControl (i.ReadLsbtohU16 ()); |
1095 } | 1177 } |
1096 break; | 1178 break; |
1097 } | 1179 } |
1098 return i.GetDistanceFrom (start); | 1180 return i.GetDistanceFrom (start); |
1099 } | 1181 } |
1100 | 1182 |
1101 } //namespace ns3 | 1183 } //namespace ns3 |
OLD | NEW |