src/devices/wifi/wifi-mac-header.cc
changeset 4401 427cec7079f3
parent 3661 07850bede91a
child 4414 44706d4a3c5e
equal deleted inserted replaced
4400:18ba3459e177 4401:427cec7079f3
     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 INRIA
     3  * Copyright (c) 2006, 2009 INRIA
       
     4  * Copyright (c) 2009 MIRKO BANCHI
     4  *
     5  *
     5  * 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
     6  * 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
     7  * published by the Free Software Foundation;
     8  * published by the Free Software Foundation;
     8  *
     9  *
    14  * You should have received a copy of the GNU General Public License
    15  * You should have received a copy of the GNU General Public License
    15  * along with this program; if not, write to the Free Software
    16  * along with this program; if not, write to the Free Software
    16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    17  *
    18  *
    18  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
    19  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
       
    20  * Author: Mirko Banchi <mk.banchi@gmail.com>
    19  */
    21  */
    20 #include "ns3/assert.h"
    22 #include "ns3/assert.h"
    21 #include "ns3/address-utils.h"
    23 #include "ns3/address-utils.h"
    22 #include "wifi-mac-header.h"
    24 #include "wifi-mac-header.h"
    23 
    25 
    41 
    43 
    42 WifiMacHeader::WifiMacHeader ()
    44 WifiMacHeader::WifiMacHeader ()
    43   : m_ctrlPwrMgt (0),
    45   : m_ctrlPwrMgt (0),
    44     m_ctrlMoreData (0),
    46     m_ctrlMoreData (0),
    45     m_ctrlWep (0),
    47     m_ctrlWep (0),
    46     m_ctrlOrder (1)
    48     m_ctrlOrder (1),
       
    49     m_amsduPresent (0)
    47 {}
    50 {}
    48 WifiMacHeader::~WifiMacHeader ()
    51 WifiMacHeader::~WifiMacHeader ()
    49 {}
    52 {}
    50 
    53 
    51 void 
    54 void 
   124 {
   127 {
   125   m_ctrlType = TYPE_DATA;
   128   m_ctrlType = TYPE_DATA;
   126   m_ctrlSubtype = 0;
   129   m_ctrlSubtype = 0;
   127 }
   130 }
   128 void 
   131 void 
   129 WifiMacHeader::SetType (enum WifiMacType_e type)
   132 WifiMacHeader::SetType (enum WifiMacType type)
   130 {
   133 {
   131   switch (type) {
   134   switch (type) {
   132   case WIFI_MAC_CTL_BACKREQ:
   135   case WIFI_MAC_CTL_BACKREQ:
   133     m_ctrlType = TYPE_CTL;
   136     m_ctrlType = TYPE_CTL;
   134     m_ctrlSubtype = SUBTYPE_CTL_BACKREQ;
   137     m_ctrlSubtype = SUBTYPE_CTL_BACKREQ;
   297 }
   300 }
   298 void WifiMacHeader::SetQosTid (uint8_t tid)
   301 void WifiMacHeader::SetQosTid (uint8_t tid)
   299 {
   302 {
   300   m_qosTid = tid;
   303   m_qosTid = tid;
   301 }
   304 }
       
   305 void WifiMacHeader::SetQosEosp ()
       
   306 {
       
   307   m_qosEosp = 1;
       
   308 }
       
   309 void WifiMacHeader::SetQosNoEosp ()
       
   310 {
       
   311   m_qosEosp = 0;
       
   312 }
       
   313 void WifiMacHeader::SetQosAckPolicy (enum QosAckPolicy policy)
       
   314 {
       
   315   switch (policy) {
       
   316   case NORMAL_ACK :
       
   317     m_qosAckPolicy = 0;
       
   318     break;
       
   319   case NO_ACK :
       
   320     m_qosAckPolicy = 2;
       
   321     break;
       
   322   case NO_EXPLICIT_ACK :
       
   323     m_qosAckPolicy = 1;
       
   324     break;
       
   325   case BLOCK_ACK :
       
   326     m_qosAckPolicy = 3;
       
   327     break;
       
   328   }
       
   329 }
       
   330 void WifiMacHeader::SetQosAmsdu (void)
       
   331 {
       
   332   m_amsduPresent = 1;
       
   333 }
       
   334 void WifiMacHeader::SetQosNoAmsdu (void)
       
   335 {
       
   336   m_amsduPresent = 0;
       
   337 }
   302 void WifiMacHeader::SetQosTxopLimit (uint8_t txop)
   338 void WifiMacHeader::SetQosTxopLimit (uint8_t txop)
   303 {
   339 {
   304   m_qosStuff = txop;
   340   m_qosStuff = txop;
   305 }
   341 }
   306 
   342 
   322 Mac48Address 
   358 Mac48Address 
   323 WifiMacHeader::GetAddr4 (void) const
   359 WifiMacHeader::GetAddr4 (void) const
   324 {
   360 {
   325   return m_addr4;
   361   return m_addr4;
   326 }
   362 }
   327 enum WifiMacType_e 
   363 
       
   364 enum WifiMacType 
   328 WifiMacHeader::GetType (void) const
   365 WifiMacHeader::GetType (void) const
   329 {
   366 {
   330   switch (m_ctrlType) {
   367   switch (m_ctrlType) {
   331   case TYPE_MGT:
   368   case TYPE_MGT:
   332     switch (m_ctrlSubtype) {
   369     switch (m_ctrlSubtype) {
   433     }
   470     }
   434     break;
   471     break;
   435   }
   472   }
   436   // NOTREACHED
   473   // NOTREACHED
   437   NS_ASSERT (false);
   474   NS_ASSERT (false);
   438   return (enum WifiMacType_e)-1;
   475   return (enum WifiMacType)-1;
   439 }
   476 }
   440 bool 
   477 bool 
   441 WifiMacHeader::IsFromDs (void) const
   478 WifiMacHeader::IsFromDs (void) const
   442 {
   479 {
   443   return m_ctrlFromDs == 1;
   480   return m_ctrlFromDs == 1;
   606 WifiMacHeader::IsQosAck (void) const
   643 WifiMacHeader::IsQosAck (void) const
   607 {
   644 {
   608   NS_ASSERT (IsQosData ());
   645   NS_ASSERT (IsQosData ());
   609   return (m_qosAckPolicy == 0)?true:false;
   646   return (m_qosAckPolicy == 0)?true:false;
   610 }
   647 }
       
   648 bool
       
   649 WifiMacHeader::IsQosEosp (void) const
       
   650 {
       
   651   NS_ASSERT (IsQosData ());
       
   652   return (m_qosEosp == 1)?true:false;
       
   653 }
       
   654 bool
       
   655 WifiMacHeader::IsQosAmsdu (void) const
       
   656 {
       
   657   NS_ASSERT (IsQosData ());
       
   658   return (m_amsduPresent == 1)?true:false;
       
   659 }
   611 uint8_t
   660 uint8_t
   612 WifiMacHeader::GetQosTid (void) const
   661 WifiMacHeader::GetQosTid (void) const
   613 {
   662 {
   614   NS_ASSERT (IsQosData ());
   663   NS_ASSERT (IsQosData ());
   615   return m_qosTid;
   664   return m_qosTid;
   616 }
   665 }
       
   666 enum WifiMacHeader::QosAckPolicy
       
   667 WifiMacHeader::GetQosAckPolicy (void) const
       
   668 {
       
   669   switch (m_qosAckPolicy) {
       
   670   case 0 :
       
   671     return NORMAL_ACK;
       
   672     break;
       
   673   case 1 :
       
   674     return NO_ACK;
       
   675     break;
       
   676   case 2 :
       
   677     return NO_EXPLICIT_ACK;
       
   678     break;
       
   679   case 3 :
       
   680     return BLOCK_ACK;
       
   681     break;
       
   682   }
       
   683   // NOTREACHED
       
   684   NS_ASSERT (false);
       
   685   return (enum QosAckPolicy)-1;
       
   686 }
       
   687 
   617 uint8_t 
   688 uint8_t 
   618 WifiMacHeader::GetQosTxopLimit (void) const
   689 WifiMacHeader::GetQosTxopLimit (void) const
   619 {
   690 {
   620   NS_ASSERT (IsQosData ());
   691   NS_ASSERT (IsQosData ());
   621   return m_qosStuff;
   692   return m_qosStuff;
   642 {
   713 {
   643   uint16_t val = 0;
   714   uint16_t val = 0;
   644   val |= m_qosTid;
   715   val |= m_qosTid;
   645   val |= m_qosEosp << 4;
   716   val |= m_qosEosp << 4;
   646   val |= m_qosAckPolicy << 5;
   717   val |= m_qosAckPolicy << 5;
       
   718   val |= m_amsduPresent << 7;
   647   val |= m_qosStuff << 8;
   719   val |= m_qosStuff << 8;
   648   return val;
   720   return val;
   649 }
   721 }
   650 
   722 
   651 void
   723 void
   671 WifiMacHeader::SetQosControl (uint16_t qos)
   743 WifiMacHeader::SetQosControl (uint16_t qos)
   672 {
   744 {
   673   m_qosTid = qos & 0x000f;
   745   m_qosTid = qos & 0x000f;
   674   m_qosEosp = (qos >> 4) & 0x0001;
   746   m_qosEosp = (qos >> 4) & 0x0001;
   675   m_qosAckPolicy = (qos >> 5) & 0x0003;
   747   m_qosAckPolicy = (qos >> 5) & 0x0003;
       
   748   m_amsduPresent = (qos >> 7) & 0x0001;
   676   m_qosStuff = (qos >> 8) & 0x00ff;
   749   m_qosStuff = (qos >> 8) & 0x00ff;
   677 }
   750 }
   678 
   751 
   679 uint32_t 
   752 uint32_t 
   680 WifiMacHeader::GetSize (void) const
   753 WifiMacHeader::GetSize (void) const
   768     .SetParent<Header> ()
   841     .SetParent<Header> ()
   769     .AddConstructor<WifiMacHeader> ()
   842     .AddConstructor<WifiMacHeader> ()
   770     ;
   843     ;
   771   return tid;
   844   return tid;
   772 }
   845 }
       
   846 
   773 TypeId 
   847 TypeId 
   774 WifiMacHeader::GetInstanceTypeId (void) const
   848 WifiMacHeader::GetInstanceTypeId (void) const
   775 {
   849 {
   776   return GetTypeId ();
   850   return GetTypeId ();
   777 }
   851 }