00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "ns3/assert.h"
00021 #include "ns3/address-utils.h"
00022 #include "wifi-mac-header.h"
00023
00024 namespace ns3 {
00025
00026 NS_OBJECT_ENSURE_REGISTERED (WifiMacHeader);
00027
00028 enum {
00029 TYPE_MGT = 0,
00030 TYPE_CTL = 1,
00031 TYPE_DATA = 2
00032 };
00033
00034 enum {
00035 SUBTYPE_CTL_BACKREQ = 8,
00036 SUBTYPE_CTL_BACKRESP = 9,
00037 SUBTYPE_CTL_RTS = 11,
00038 SUBTYPE_CTL_CTS = 12,
00039 SUBTYPE_CTL_ACK = 13
00040 };
00041
00042 WifiMacHeader::WifiMacHeader ()
00043 : m_ctrlPwrMgt (0),
00044 m_ctrlMoreData (0),
00045 m_ctrlWep (0),
00046 m_ctrlOrder (1)
00047 {}
00048 WifiMacHeader::~WifiMacHeader ()
00049 {}
00050
00051 void
00052 WifiMacHeader::SetDsFrom (void)
00053 {
00054 m_ctrlFromDs = 1;
00055 }
00056 void
00057 WifiMacHeader::SetDsNotFrom (void)
00058 {
00059 m_ctrlFromDs = 0;
00060 }
00061 void
00062 WifiMacHeader::SetDsTo (void)
00063 {
00064 m_ctrlToDs = 1;
00065 }
00066 void
00067 WifiMacHeader::SetDsNotTo (void)
00068 {
00069 m_ctrlToDs = 0;
00070 }
00071
00072 void
00073 WifiMacHeader::SetAddr1 (Mac48Address address)
00074 {
00075 m_addr1 = address;
00076 }
00077 void
00078 WifiMacHeader::SetAddr2 (Mac48Address address)
00079 {
00080 m_addr2 = address;
00081 }
00082 void
00083 WifiMacHeader::SetAddr3 (Mac48Address address)
00084 {
00085 m_addr3 = address;
00086 }
00087 void
00088 WifiMacHeader::SetAddr4 (Mac48Address address)
00089 {
00090 m_addr4 = address;
00091 }
00092 void
00093 WifiMacHeader::SetAssocReq (void)
00094 {
00095 m_ctrlType = TYPE_MGT;
00096 m_ctrlSubtype = 0;
00097 }
00098 void
00099 WifiMacHeader::SetAssocResp (void)
00100 {
00101 m_ctrlType = TYPE_MGT;
00102 m_ctrlSubtype = 1;
00103 }
00104 void
00105 WifiMacHeader::SetProbeReq (void)
00106 {
00107 m_ctrlType = TYPE_MGT;
00108 m_ctrlSubtype = 4;
00109 }
00110 void
00111 WifiMacHeader::SetProbeResp (void)
00112 {
00113 m_ctrlType = TYPE_MGT;
00114 m_ctrlSubtype = 5;
00115 }
00116 void
00117 WifiMacHeader::SetBeacon (void)
00118 {
00119 m_ctrlType = TYPE_MGT;
00120 m_ctrlSubtype = 8;
00121 }
00122 void
00123 WifiMacHeader::SetTypeData (void)
00124 {
00125 m_ctrlType = TYPE_DATA;
00126 m_ctrlSubtype = 0;
00127 }
00128 void
00129 WifiMacHeader::SetType (enum WifiMacType_e type)
00130 {
00131 switch (type) {
00132 case WIFI_MAC_CTL_BACKREQ:
00133 m_ctrlType = TYPE_CTL;
00134 m_ctrlSubtype = SUBTYPE_CTL_BACKREQ;
00135 break;
00136 case WIFI_MAC_CTL_BACKRESP:
00137 m_ctrlType = TYPE_CTL;
00138 m_ctrlSubtype = SUBTYPE_CTL_BACKRESP;
00139 break;
00140 case WIFI_MAC_CTL_RTS:
00141 m_ctrlType = TYPE_CTL;
00142 m_ctrlSubtype = SUBTYPE_CTL_RTS;
00143 break;
00144 case WIFI_MAC_CTL_CTS:
00145 m_ctrlType = TYPE_CTL;
00146 m_ctrlSubtype = SUBTYPE_CTL_CTS;
00147 break;
00148 case WIFI_MAC_CTL_ACK:
00149 m_ctrlType = TYPE_CTL;
00150 m_ctrlSubtype = SUBTYPE_CTL_ACK;
00151 break;
00152 case WIFI_MAC_MGT_ASSOCIATION_REQUEST:
00153 m_ctrlType = TYPE_MGT;
00154 m_ctrlSubtype = 0;
00155 break;
00156 case WIFI_MAC_MGT_ASSOCIATION_RESPONSE:
00157 m_ctrlType = TYPE_MGT;
00158 m_ctrlSubtype = 1;
00159 break;
00160 case WIFI_MAC_MGT_REASSOCIATION_REQUEST:
00161 m_ctrlType = TYPE_MGT;
00162 m_ctrlSubtype = 2;
00163 break;
00164 case WIFI_MAC_MGT_REASSOCIATION_RESPONSE:
00165 m_ctrlType = TYPE_MGT;
00166 m_ctrlSubtype = 3;
00167 break;
00168 case WIFI_MAC_MGT_PROBE_REQUEST:
00169 m_ctrlType = TYPE_MGT;
00170 m_ctrlSubtype = 4;
00171 break;
00172 case WIFI_MAC_MGT_PROBE_RESPONSE:
00173 m_ctrlType = TYPE_MGT;
00174 m_ctrlSubtype = 5;
00175 break;
00176 case WIFI_MAC_MGT_BEACON:
00177 m_ctrlType = TYPE_MGT;
00178 m_ctrlSubtype = 8;
00179 break;
00180 case WIFI_MAC_MGT_DISASSOCIATION:
00181 m_ctrlType = TYPE_MGT;
00182 m_ctrlSubtype = 10;
00183 break;
00184 case WIFI_MAC_MGT_AUTHENTICATION:
00185 m_ctrlType = TYPE_MGT;
00186 m_ctrlSubtype = 11;
00187 break;
00188 case WIFI_MAC_MGT_DEAUTHENTICATION:
00189 m_ctrlType = TYPE_MGT;
00190 m_ctrlSubtype = 12;
00191 break;
00192
00193 case WIFI_MAC_DATA:
00194 m_ctrlType = TYPE_DATA;
00195 m_ctrlSubtype = 0;
00196 break;
00197 case WIFI_MAC_DATA_CFACK:
00198 m_ctrlType = TYPE_DATA;
00199 m_ctrlSubtype = 1;
00200 break;
00201 case WIFI_MAC_DATA_CFPOLL:
00202 m_ctrlType = TYPE_DATA;
00203 m_ctrlSubtype = 2;
00204 break;
00205 case WIFI_MAC_DATA_CFACK_CFPOLL:
00206 m_ctrlType = TYPE_DATA;
00207 m_ctrlSubtype = 3;
00208 break;
00209 case WIFI_MAC_DATA_NULL:
00210 m_ctrlType = TYPE_DATA;
00211 m_ctrlSubtype = 4;
00212 break;
00213 case WIFI_MAC_DATA_NULL_CFACK:
00214 m_ctrlType = TYPE_DATA;
00215 m_ctrlSubtype = 5;
00216 break;
00217 case WIFI_MAC_DATA_NULL_CFPOLL:
00218 m_ctrlType = TYPE_DATA;
00219 m_ctrlSubtype = 6;
00220 break;
00221 case WIFI_MAC_DATA_NULL_CFACK_CFPOLL:
00222 m_ctrlType = TYPE_DATA;
00223 m_ctrlSubtype = 7;
00224 break;
00225 case WIFI_MAC_QOSDATA:
00226 m_ctrlType = TYPE_DATA;
00227 m_ctrlSubtype = 8;
00228 break;
00229 case WIFI_MAC_QOSDATA_CFACK:
00230 m_ctrlType = TYPE_DATA;
00231 m_ctrlSubtype = 9;
00232 break;
00233 case WIFI_MAC_QOSDATA_CFPOLL:
00234 m_ctrlType = TYPE_DATA;
00235 m_ctrlSubtype = 10;
00236 break;
00237 case WIFI_MAC_QOSDATA_CFACK_CFPOLL:
00238 m_ctrlType = TYPE_DATA;
00239 m_ctrlSubtype = 11;
00240 break;
00241 case WIFI_MAC_QOSDATA_NULL:
00242 m_ctrlType = TYPE_DATA;
00243 m_ctrlSubtype = 12;
00244 break;
00245 case WIFI_MAC_QOSDATA_NULL_CFPOLL:
00246 m_ctrlType = TYPE_DATA;
00247 m_ctrlSubtype = 14;
00248 break;
00249 case WIFI_MAC_QOSDATA_NULL_CFACK_CFPOLL:
00250 m_ctrlType = TYPE_DATA;
00251 m_ctrlSubtype = 15;
00252 break;
00253 }
00254 m_ctrlToDs = 0;
00255 m_ctrlFromDs = 0;
00256 }
00257 void
00258 WifiMacHeader::SetRawDuration (uint16_t duration)
00259 {
00260 m_duration = duration;
00261 }
00262 void
00263 WifiMacHeader::SetDuration (Time duration)
00264 {
00265 int64_t duration_us = duration.GetMicroSeconds ();
00266 NS_ASSERT (duration_us >= 0 && duration_us <= 0x7fff);
00267 m_duration = static_cast<uint16_t> (duration_us);
00268 }
00269
00270 void WifiMacHeader::SetId (uint16_t id)
00271 {
00272 m_duration = id;
00273 }
00274 void WifiMacHeader::SetSequenceNumber (uint16_t seq)
00275 {
00276 m_seqSeq = seq;
00277 }
00278 void WifiMacHeader::SetFragmentNumber (uint8_t frag)
00279 {
00280 m_seqFrag = frag;
00281 }
00282 void WifiMacHeader::SetNoMoreFragments (void)
00283 {
00284 m_ctrlMoreFrag = 0;
00285 }
00286 void WifiMacHeader::SetMoreFragments (void)
00287 {
00288 m_ctrlMoreFrag = 1;
00289 }
00290 void WifiMacHeader::SetRetry (void)
00291 {
00292 m_ctrlRetry = 1;
00293 }
00294 void WifiMacHeader::SetNoRetry (void)
00295 {
00296 m_ctrlRetry = 0;
00297 }
00298 void WifiMacHeader::SetQosTid (uint8_t tid)
00299 {
00300 m_qosTid = tid;
00301 }
00302 void WifiMacHeader::SetQosTxopLimit (uint8_t txop)
00303 {
00304 m_qosStuff = txop;
00305 }
00306
00307 Mac48Address
00308 WifiMacHeader::GetAddr1 (void) const
00309 {
00310 return m_addr1;
00311 }
00312 Mac48Address
00313 WifiMacHeader::GetAddr2 (void) const
00314 {
00315 return m_addr2;
00316 }
00317 Mac48Address
00318 WifiMacHeader::GetAddr3 (void) const
00319 {
00320 return m_addr3;
00321 }
00322 Mac48Address
00323 WifiMacHeader::GetAddr4 (void) const
00324 {
00325 return m_addr4;
00326 }
00327 enum WifiMacType_e
00328 WifiMacHeader::GetType (void) const
00329 {
00330 switch (m_ctrlType) {
00331 case TYPE_MGT:
00332 switch (m_ctrlSubtype) {
00333 case 0:
00334 return WIFI_MAC_MGT_ASSOCIATION_REQUEST;
00335 break;
00336 case 1:
00337 return WIFI_MAC_MGT_ASSOCIATION_RESPONSE;
00338 break;
00339 case 2:
00340 return WIFI_MAC_MGT_REASSOCIATION_REQUEST;
00341 break;
00342 case 3:
00343 return WIFI_MAC_MGT_REASSOCIATION_RESPONSE;
00344 break;
00345 case 4:
00346 return WIFI_MAC_MGT_PROBE_REQUEST;
00347 break;
00348 case 5:
00349 return WIFI_MAC_MGT_PROBE_RESPONSE;
00350 break;
00351 case 8:
00352 return WIFI_MAC_MGT_BEACON;
00353 break;
00354 case 10:
00355 return WIFI_MAC_MGT_DISASSOCIATION;
00356 break;
00357 case 11:
00358 return WIFI_MAC_MGT_AUTHENTICATION;
00359 break;
00360 case 12:
00361 return WIFI_MAC_MGT_DEAUTHENTICATION;
00362 break;
00363
00364 }
00365 break;
00366 case TYPE_CTL:
00367 switch (m_ctrlSubtype) {
00368 case SUBTYPE_CTL_BACKREQ:
00369 return WIFI_MAC_CTL_BACKREQ;
00370 break;
00371 case SUBTYPE_CTL_BACKRESP:
00372 return WIFI_MAC_CTL_BACKRESP;
00373 break;
00374 case SUBTYPE_CTL_RTS:
00375 return WIFI_MAC_CTL_RTS;
00376 break;
00377 case SUBTYPE_CTL_CTS:
00378 return WIFI_MAC_CTL_CTS;
00379 break;
00380 case SUBTYPE_CTL_ACK:
00381 return WIFI_MAC_CTL_ACK;
00382 break;
00383 }
00384 break;
00385 case TYPE_DATA:
00386 switch (m_ctrlSubtype) {
00387 case 0:
00388 return WIFI_MAC_DATA;
00389 break;
00390 case 1:
00391 return WIFI_MAC_DATA_CFACK;
00392 break;
00393 case 2:
00394 return WIFI_MAC_DATA_CFPOLL;
00395 break;
00396 case 3:
00397 return WIFI_MAC_DATA_CFACK_CFPOLL;
00398 break;
00399 case 4:
00400 return WIFI_MAC_DATA_NULL;
00401 break;
00402 case 5:
00403 return WIFI_MAC_DATA_NULL_CFACK;
00404 break;
00405 case 6:
00406 return WIFI_MAC_DATA_NULL_CFPOLL;
00407 break;
00408 case 7:
00409 return WIFI_MAC_DATA_NULL_CFACK_CFPOLL;
00410 break;
00411 case 8:
00412 return WIFI_MAC_QOSDATA;
00413 break;
00414 case 9:
00415 return WIFI_MAC_QOSDATA_CFACK;
00416 break;
00417 case 10:
00418 return WIFI_MAC_QOSDATA_CFPOLL;
00419 break;
00420 case 11:
00421 return WIFI_MAC_QOSDATA_CFACK_CFPOLL;
00422 break;
00423 case 12:
00424 return WIFI_MAC_QOSDATA_NULL;
00425 break;
00426 case 14:
00427 return WIFI_MAC_QOSDATA_NULL_CFPOLL;
00428 break;
00429 case 15:
00430 return WIFI_MAC_QOSDATA_NULL_CFACK_CFPOLL;
00431 break;
00432
00433 }
00434 break;
00435 }
00436
00437 NS_ASSERT (false);
00438 return (enum WifiMacType_e)-1;
00439 }
00440 bool
00441 WifiMacHeader::IsFromDs (void) const
00442 {
00443 return m_ctrlFromDs == 1;
00444 }
00445 bool
00446 WifiMacHeader::IsToDs (void) const
00447 {
00448 return m_ctrlToDs == 1;
00449 }
00450
00451 bool
00452 WifiMacHeader::IsData (void) const
00453 {
00454 return (m_ctrlType == TYPE_DATA)?true:false;
00455
00456 }
00457 bool
00458 WifiMacHeader::IsQosData (void) const
00459 {
00460 return (m_ctrlType == TYPE_DATA && (m_ctrlSubtype & 0x08))?true:false;
00461 }
00462 bool
00463 WifiMacHeader::IsCtl (void) const
00464 {
00465 return (m_ctrlType == TYPE_CTL)?true:false;
00466 }
00467 bool
00468 WifiMacHeader::IsMgt (void) const
00469 {
00470 return (m_ctrlType == TYPE_MGT)?true:false;
00471 }
00472 bool
00473 WifiMacHeader::IsCfpoll (void) const
00474 {
00475 switch (GetType ()) {
00476 case WIFI_MAC_DATA_CFPOLL:
00477 case WIFI_MAC_DATA_CFACK_CFPOLL:
00478 case WIFI_MAC_DATA_NULL_CFPOLL:
00479 case WIFI_MAC_DATA_NULL_CFACK_CFPOLL:
00480 case WIFI_MAC_QOSDATA_CFPOLL:
00481 case WIFI_MAC_QOSDATA_CFACK_CFPOLL:
00482 case WIFI_MAC_QOSDATA_NULL_CFPOLL:
00483 case WIFI_MAC_QOSDATA_NULL_CFACK_CFPOLL:
00484 return true;
00485 break;
00486 default:
00487 return false;
00488 break;
00489 }
00490 }
00491 bool
00492 WifiMacHeader::IsRts (void) const
00493 {
00494 return (GetType () == WIFI_MAC_CTL_RTS)?true:false;
00495 }
00496 bool
00497 WifiMacHeader::IsCts (void) const
00498 {
00499 return (GetType () == WIFI_MAC_CTL_CTS)?true:false;
00500 }
00501 bool
00502 WifiMacHeader::IsAck (void) const
00503 {
00504 return (GetType () == WIFI_MAC_CTL_ACK)?true:false;
00505 }
00506 bool
00507 WifiMacHeader::IsAssocReq (void) const
00508 {
00509 return (GetType () == WIFI_MAC_MGT_ASSOCIATION_REQUEST)?true:false;
00510 }
00511 bool
00512 WifiMacHeader::IsAssocResp (void) const
00513 {
00514 return (GetType () == WIFI_MAC_MGT_ASSOCIATION_RESPONSE)?true:false;
00515 }
00516 bool
00517 WifiMacHeader::IsReassocReq (void) const
00518 {
00519 return (GetType () == WIFI_MAC_MGT_REASSOCIATION_REQUEST)?true:false;
00520 }
00521 bool
00522 WifiMacHeader::IsReassocResp (void) const
00523 {
00524 return (GetType () == WIFI_MAC_MGT_REASSOCIATION_RESPONSE)?true:false;
00525 }
00526 bool
00527 WifiMacHeader::IsProbeReq (void) const
00528 {
00529 return (GetType () == WIFI_MAC_MGT_PROBE_REQUEST)?true:false;
00530 }
00531 bool
00532 WifiMacHeader::IsProbeResp (void) const
00533 {
00534 return (GetType () == WIFI_MAC_MGT_PROBE_RESPONSE)?true:false;
00535 }
00536 bool
00537 WifiMacHeader::IsBeacon (void) const
00538 {
00539 return (GetType () == WIFI_MAC_MGT_BEACON)?true:false;
00540 }
00541 bool
00542 WifiMacHeader::IsDisassociation (void) const
00543 {
00544 return (GetType () == WIFI_MAC_MGT_DISASSOCIATION)?true:false;
00545 }
00546 bool
00547 WifiMacHeader::IsAuthentication (void) const
00548 {
00549 return (GetType () == WIFI_MAC_MGT_AUTHENTICATION)?true:false;
00550 }
00551 bool
00552 WifiMacHeader::IsDeauthentication (void) const
00553 {
00554 return (GetType () == WIFI_MAC_MGT_DEAUTHENTICATION)?true:false;
00555 }
00556
00557
00558 uint16_t
00559 WifiMacHeader::GetRawDuration (void) const
00560 {
00561 return m_duration;
00562 }
00563 Time
00564 WifiMacHeader::GetDuration (void) const
00565 {
00566 return MicroSeconds (m_duration);
00567 }
00568 uint16_t
00569 WifiMacHeader::GetSequenceControl (void) const
00570 {
00571 return (m_seqSeq << 4) | m_seqFrag;
00572 }
00573 uint16_t
00574 WifiMacHeader::GetSequenceNumber (void) const
00575 {
00576 return m_seqSeq;
00577 }
00578 uint16_t
00579 WifiMacHeader::GetFragmentNumber (void) const
00580 {
00581 return m_seqFrag;
00582 }
00583 bool
00584 WifiMacHeader::IsRetry (void) const
00585 {
00586 return (m_ctrlRetry == 1)?true:false;
00587 }
00588 bool
00589 WifiMacHeader::IsMoreFragments (void) const
00590 {
00591 return (m_ctrlMoreFrag == 1)?true:false;
00592 }
00593 bool
00594 WifiMacHeader::IsQosBlockAck (void) const
00595 {
00596 NS_ASSERT (IsQosData ());
00597 return (m_qosAckPolicy == 3)?true:false;
00598 }
00599 bool
00600 WifiMacHeader::IsQosNoAck (void) const
00601 {
00602 NS_ASSERT (IsQosData ());
00603 return (m_qosAckPolicy == 1)?true:false;
00604 }
00605 bool
00606 WifiMacHeader::IsQosAck (void) const
00607 {
00608 NS_ASSERT (IsQosData ());
00609 return (m_qosAckPolicy == 0)?true:false;
00610 }
00611 uint8_t
00612 WifiMacHeader::GetQosTid (void) const
00613 {
00614 NS_ASSERT (IsQosData ());
00615 return m_qosTid;
00616 }
00617 uint8_t
00618 WifiMacHeader::GetQosTxopLimit (void) const
00619 {
00620 NS_ASSERT (IsQosData ());
00621 return m_qosStuff;
00622 }
00623
00624 uint16_t
00625 WifiMacHeader::GetFrameControl (void) const
00626 {
00627 uint16_t val = 0;
00628 val |= (m_ctrlType << 2) & (0x3<<2);
00629 val |= (m_ctrlSubtype << 4) & (0xf<<4);
00630 val |= (m_ctrlToDs << 8) & (0x1<<8);
00631 val |= (m_ctrlFromDs << 9) & (0x1<<9);
00632 val |= (m_ctrlMoreFrag << 10) & (0x1<<10);
00633 val |= (m_ctrlRetry << 11) & (0x1<<11);
00634 val |= (m_ctrlMoreData << 13) & (0x1<<13);
00635 val |= (m_ctrlWep << 14) & (0x1<<14);
00636 val |= (m_ctrlOrder << 15) & (0x1<<15);
00637 return val;
00638 }
00639
00640 uint16_t
00641 WifiMacHeader::GetQosControl (void) const
00642 {
00643 uint16_t val = 0;
00644 val |= m_qosTid;
00645 val |= m_qosEosp << 4;
00646 val |= m_qosAckPolicy << 5;
00647 val |= m_qosStuff << 8;
00648 return val;
00649 }
00650
00651 void
00652 WifiMacHeader::SetFrameControl (uint16_t ctrl)
00653 {
00654 m_ctrlType = (ctrl >> 2) & 0x03;
00655 m_ctrlSubtype = (ctrl >> 4) & 0x0f;
00656 m_ctrlToDs = (ctrl >> 8) & 0x01;
00657 m_ctrlFromDs = (ctrl >> 9) & 0x01;
00658 m_ctrlMoreFrag = (ctrl >> 10) & 0x01;
00659 m_ctrlRetry = (ctrl >> 11) & 0x01;
00660 m_ctrlMoreData = (ctrl >> 13) & 0x01;
00661 m_ctrlWep = (ctrl >> 14) & 0x01;
00662 m_ctrlOrder = (ctrl >> 15) & 0x01;
00663 }
00664 void
00665 WifiMacHeader::SetSequenceControl (uint16_t seq)
00666 {
00667 m_seqFrag = seq & 0x0f;
00668 m_seqSeq = (seq >> 4) & 0x0fff;
00669 }
00670 void
00671 WifiMacHeader::SetQosControl (uint16_t qos)
00672 {
00673 m_qosTid = qos & 0x000f;
00674 m_qosEosp = (qos >> 4) & 0x0001;
00675 m_qosAckPolicy = (qos >> 5) & 0x0003;
00676 m_qosStuff = (qos >> 8) & 0x00ff;
00677 }
00678
00679 uint32_t
00680 WifiMacHeader::GetSize (void) const
00681 {
00682 uint32_t size = 0;
00683 switch (m_ctrlType) {
00684 case TYPE_MGT:
00685 size = 2+2+6+6+6+2;
00686 break;
00687 case TYPE_CTL:
00688 switch (m_ctrlSubtype) {
00689 case SUBTYPE_CTL_RTS:
00690 size = 2+2+6+6;
00691 break;
00692 case SUBTYPE_CTL_CTS:
00693 case SUBTYPE_CTL_ACK:
00694 size = 2+2+6;
00695 break;
00696 case SUBTYPE_CTL_BACKREQ:
00697 case SUBTYPE_CTL_BACKRESP:
00698
00699 NS_ASSERT (false);
00700 break;
00701 }
00702 break;
00703 case TYPE_DATA:
00704 size = 2+2+6+6+6+2;
00705 if (m_ctrlToDs && m_ctrlFromDs) {
00706 size += 6;
00707 }
00708 if (m_ctrlSubtype & 0x08) {
00709 size += 2;
00710 }
00711 break;
00712 }
00713 return size;
00714 }
00715 char const *
00716 WifiMacHeader::GetTypeString (void) const
00717 {
00718 #define FOO(x) \
00719 case WIFI_MAC_ ## x: \
00720 return #x; \
00721 break;
00722
00723 switch (GetType ()) {
00724 FOO (CTL_RTS);
00725 FOO (CTL_CTS);
00726 FOO (CTL_ACK);
00727 FOO (CTL_BACKREQ);
00728 FOO (CTL_BACKRESP);
00729
00730 FOO (MGT_BEACON);
00731 FOO (MGT_ASSOCIATION_REQUEST);
00732 FOO (MGT_ASSOCIATION_RESPONSE);
00733 FOO (MGT_DISASSOCIATION);
00734 FOO (MGT_REASSOCIATION_REQUEST);
00735 FOO (MGT_REASSOCIATION_RESPONSE);
00736 FOO (MGT_PROBE_REQUEST);
00737 FOO (MGT_PROBE_RESPONSE);
00738 FOO (MGT_AUTHENTICATION);
00739 FOO (MGT_DEAUTHENTICATION);
00740
00741 FOO (DATA);
00742 FOO (DATA_CFACK);
00743 FOO (DATA_CFPOLL);
00744 FOO (DATA_CFACK_CFPOLL);
00745 FOO (DATA_NULL);
00746 FOO (DATA_NULL_CFACK);
00747 FOO (DATA_NULL_CFPOLL);
00748 FOO (DATA_NULL_CFACK_CFPOLL);
00749 FOO (QOSDATA);
00750 FOO (QOSDATA_CFACK);
00751 FOO (QOSDATA_CFPOLL);
00752 FOO (QOSDATA_CFACK_CFPOLL);
00753 FOO (QOSDATA_NULL);
00754 FOO (QOSDATA_NULL_CFPOLL);
00755 FOO (QOSDATA_NULL_CFACK_CFPOLL);
00756 default:
00757 return "ERROR";
00758 }
00759 #undef FOO
00760
00761 return "BIG_ERROR";
00762 }
00763
00764 TypeId
00765 WifiMacHeader::GetTypeId (void)
00766 {
00767 static TypeId tid = TypeId ("ns3::WifiMacHeader")
00768 .SetParent<Header> ()
00769 .AddConstructor<WifiMacHeader> ()
00770 ;
00771 return tid;
00772 }
00773 TypeId
00774 WifiMacHeader::GetInstanceTypeId (void) const
00775 {
00776 return GetTypeId ();
00777 }
00778
00779 void
00780 WifiMacHeader::PrintFrameControl (std::ostream &os) const
00781 {
00782 os << "ToDS=" << m_ctrlToDs << ", FromDS=" << m_ctrlFromDs
00783 << ", MoreFrag=" << m_ctrlMoreFrag << ", Retry=" << m_ctrlRetry
00784 << ", MoreData=" << m_ctrlMoreData
00785 ;
00786 }
00787
00788 void
00789 WifiMacHeader::Print (std::ostream &os) const
00790 {
00791 os << GetTypeString () << " ";
00792 switch (GetType ())
00793 {
00794 case WIFI_MAC_CTL_RTS:
00795 os << "Duration/ID=" << m_duration << "us"
00796 << ", RA=" << m_addr1 << ", TA=" << m_addr2;
00797 break;
00798 case WIFI_MAC_CTL_CTS:
00799 case WIFI_MAC_CTL_ACK:
00800 os << "Duration/ID=" << m_duration << "us"
00801 << ", RA=" << m_addr1;
00802 break;
00803 case WIFI_MAC_CTL_BACKREQ:
00804 break;
00805 case WIFI_MAC_CTL_BACKRESP:
00806 break;
00807
00808 case WIFI_MAC_MGT_BEACON:
00809 case WIFI_MAC_MGT_ASSOCIATION_REQUEST:
00810 case WIFI_MAC_MGT_ASSOCIATION_RESPONSE:
00811 case WIFI_MAC_MGT_DISASSOCIATION:
00812 case WIFI_MAC_MGT_REASSOCIATION_REQUEST:
00813 case WIFI_MAC_MGT_REASSOCIATION_RESPONSE:
00814 case WIFI_MAC_MGT_PROBE_REQUEST:
00815 case WIFI_MAC_MGT_PROBE_RESPONSE:
00816 case WIFI_MAC_MGT_AUTHENTICATION:
00817 case WIFI_MAC_MGT_DEAUTHENTICATION:
00818 PrintFrameControl (os);
00819 os << " Duration/ID=" << m_duration << "us"
00820 << ", DA=" << m_addr1 << ", SA=" << m_addr2
00821 << ", BSSID=" << m_addr3 << ", FragNumber=" << m_seqFrag
00822 << ", SeqNumber=" << m_seqSeq;
00823 break;
00824 case WIFI_MAC_DATA:
00825 PrintFrameControl (os);
00826 os << " Duration/ID=" << m_duration << "us";
00827 if (!m_ctrlToDs && !m_ctrlFromDs)
00828 {
00829 os << "DA=" << m_addr1 << ", SA=" << m_addr2 << ", BSSID=" << m_addr3;
00830 }
00831 else if (!m_ctrlToDs && m_ctrlFromDs)
00832 {
00833 os << "DA=" << m_addr1 << ", SA=" << m_addr3 << ", BSSID=" << m_addr2;
00834 }
00835 else if (m_ctrlToDs && !m_ctrlFromDs)
00836 {
00837 os << "DA=" << m_addr3 << ", SA=" << m_addr2 << ", BSSID=" << m_addr1;
00838 }
00839 else if (m_ctrlToDs && m_ctrlFromDs)
00840 {
00841 os << "DA=" << m_addr3 << ", SA=" << m_addr4 << ", RA=" << m_addr1 << ", TA=" << m_addr2;
00842 }
00843 else
00844 {
00845 NS_ASSERT (false);
00846 }
00847 os << ", FragNumber=" << m_seqFrag
00848 << ", SeqNumber=" << m_seqSeq;
00849 break;
00850 case WIFI_MAC_DATA_CFACK:
00851 case WIFI_MAC_DATA_CFPOLL:
00852 case WIFI_MAC_DATA_CFACK_CFPOLL:
00853 case WIFI_MAC_DATA_NULL:
00854 case WIFI_MAC_DATA_NULL_CFACK:
00855 case WIFI_MAC_DATA_NULL_CFPOLL:
00856 case WIFI_MAC_DATA_NULL_CFACK_CFPOLL:
00857 case WIFI_MAC_QOSDATA:
00858 case WIFI_MAC_QOSDATA_CFACK:
00859 case WIFI_MAC_QOSDATA_CFPOLL:
00860 case WIFI_MAC_QOSDATA_CFACK_CFPOLL:
00861 case WIFI_MAC_QOSDATA_NULL:
00862 case WIFI_MAC_QOSDATA_NULL_CFPOLL:
00863 case WIFI_MAC_QOSDATA_NULL_CFACK_CFPOLL:
00864 break;
00865 }
00866 }
00867 uint32_t
00868 WifiMacHeader::GetSerializedSize (void) const
00869 {
00870 return GetSize ();
00871 }
00872 void
00873 WifiMacHeader::Serialize (Buffer::Iterator i) const
00874 {
00875 i.WriteHtolsbU16 (GetFrameControl ());
00876 i.WriteHtolsbU16 (m_duration);
00877 WriteTo (i, m_addr1);
00878 switch (m_ctrlType) {
00879 case TYPE_MGT:
00880 WriteTo (i, m_addr2);
00881 WriteTo (i, m_addr3);
00882 i.WriteHtolsbU16 (GetSequenceControl ());
00883 break;
00884 case TYPE_CTL:
00885 switch (m_ctrlSubtype) {
00886 case SUBTYPE_CTL_RTS:
00887 WriteTo (i, m_addr2);
00888 break;
00889 case SUBTYPE_CTL_CTS:
00890 case SUBTYPE_CTL_ACK:
00891 break;
00892 case SUBTYPE_CTL_BACKREQ:
00893 case SUBTYPE_CTL_BACKRESP:
00894
00895 NS_ASSERT (false);
00896 break;
00897 default:
00898
00899 NS_ASSERT (false);
00900 break;
00901 }
00902 break;
00903 case TYPE_DATA: {
00904 WriteTo (i, m_addr2);
00905 WriteTo (i, m_addr3);
00906 i.WriteHtolsbU16 (GetSequenceControl ());
00907 if (m_ctrlToDs && m_ctrlFromDs) {
00908 WriteTo (i, m_addr4);
00909 }
00910 if (m_ctrlSubtype & 0x08) {
00911 i.WriteHtolsbU16 (GetQosControl ());
00912 }
00913 } break;
00914 default:
00915
00916 NS_ASSERT (false);
00917 break;
00918 }
00919 }
00920 uint32_t
00921 WifiMacHeader::Deserialize (Buffer::Iterator start)
00922 {
00923 Buffer::Iterator i = start;
00924 uint16_t frame_control = i.ReadLsbtohU16 ();
00925 SetFrameControl (frame_control);
00926 m_duration = i.ReadLsbtohU16 ();
00927 ReadFrom (i, m_addr1);
00928 switch (m_ctrlType) {
00929 case TYPE_MGT:
00930 ReadFrom (i, m_addr2);
00931 ReadFrom (i, m_addr3);
00932 SetSequenceControl (i.ReadLsbtohU16 ());
00933 break;
00934 case TYPE_CTL:
00935 switch (m_ctrlSubtype) {
00936 case SUBTYPE_CTL_RTS:
00937 ReadFrom (i, m_addr2);
00938 break;
00939 case SUBTYPE_CTL_CTS:
00940 case SUBTYPE_CTL_ACK:
00941 break;
00942 case SUBTYPE_CTL_BACKREQ:
00943 case SUBTYPE_CTL_BACKRESP:
00944
00945 NS_ASSERT (false);
00946 break;
00947 }
00948 break;
00949 case TYPE_DATA:
00950 ReadFrom (i, m_addr2);
00951 ReadFrom (i, m_addr3);
00952 SetSequenceControl (i.ReadLsbtohU16 ());
00953 if (m_ctrlToDs && m_ctrlFromDs) {
00954 ReadFrom (i, m_addr4);
00955 }
00956 if (m_ctrlSubtype & 0x08) {
00957 SetQosControl (i.ReadLsbtohU16 ());
00958 }
00959 break;
00960 }
00961 return i.GetDistanceFrom (start);
00962 }
00963
00964 }