src/devices/wifi/wifi-mac-header.cc
changeset 4401 427cec7079f3
parent 3661 07850bede91a
child 4414 44706d4a3c5e
--- a/src/devices/wifi/wifi-mac-header.cc	Fri Apr 24 09:04:39 2009 +0200
+++ b/src/devices/wifi/wifi-mac-header.cc	Fri Apr 24 09:07:00 2009 +0200
@@ -1,6 +1,7 @@
 /* -*-  Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2006 INRIA
+ * Copyright (c) 2006, 2009 INRIA
+ * Copyright (c) 2009 MIRKO BANCHI
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
@@ -16,6 +17,7 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ * Author: Mirko Banchi <mk.banchi@gmail.com>
  */
 #include "ns3/assert.h"
 #include "ns3/address-utils.h"
@@ -43,7 +45,8 @@
   : m_ctrlPwrMgt (0),
     m_ctrlMoreData (0),
     m_ctrlWep (0),
-    m_ctrlOrder (1)
+    m_ctrlOrder (1),
+    m_amsduPresent (0)
 {}
 WifiMacHeader::~WifiMacHeader ()
 {}
@@ -126,7 +129,7 @@
   m_ctrlSubtype = 0;
 }
 void 
-WifiMacHeader::SetType (enum WifiMacType_e type)
+WifiMacHeader::SetType (enum WifiMacType type)
 {
   switch (type) {
   case WIFI_MAC_CTL_BACKREQ:
@@ -299,6 +302,39 @@
 {
   m_qosTid = tid;
 }
+void WifiMacHeader::SetQosEosp ()
+{
+  m_qosEosp = 1;
+}
+void WifiMacHeader::SetQosNoEosp ()
+{
+  m_qosEosp = 0;
+}
+void WifiMacHeader::SetQosAckPolicy (enum QosAckPolicy policy)
+{
+  switch (policy) {
+  case NORMAL_ACK :
+    m_qosAckPolicy = 0;
+    break;
+  case NO_ACK :
+    m_qosAckPolicy = 2;
+    break;
+  case NO_EXPLICIT_ACK :
+    m_qosAckPolicy = 1;
+    break;
+  case BLOCK_ACK :
+    m_qosAckPolicy = 3;
+    break;
+  }
+}
+void WifiMacHeader::SetQosAmsdu (void)
+{
+  m_amsduPresent = 1;
+}
+void WifiMacHeader::SetQosNoAmsdu (void)
+{
+  m_amsduPresent = 0;
+}
 void WifiMacHeader::SetQosTxopLimit (uint8_t txop)
 {
   m_qosStuff = txop;
@@ -324,7 +360,8 @@
 {
   return m_addr4;
 }
-enum WifiMacType_e 
+
+enum WifiMacType 
 WifiMacHeader::GetType (void) const
 {
   switch (m_ctrlType) {
@@ -435,7 +472,7 @@
   }
   // NOTREACHED
   NS_ASSERT (false);
-  return (enum WifiMacType_e)-1;
+  return (enum WifiMacType)-1;
 }
 bool 
 WifiMacHeader::IsFromDs (void) const
@@ -608,12 +645,46 @@
   NS_ASSERT (IsQosData ());
   return (m_qosAckPolicy == 0)?true:false;
 }
+bool
+WifiMacHeader::IsQosEosp (void) const
+{
+  NS_ASSERT (IsQosData ());
+  return (m_qosEosp == 1)?true:false;
+}
+bool
+WifiMacHeader::IsQosAmsdu (void) const
+{
+  NS_ASSERT (IsQosData ());
+  return (m_amsduPresent == 1)?true:false;
+}
 uint8_t
 WifiMacHeader::GetQosTid (void) const
 {
   NS_ASSERT (IsQosData ());
   return m_qosTid;
 }
+enum WifiMacHeader::QosAckPolicy
+WifiMacHeader::GetQosAckPolicy (void) const
+{
+  switch (m_qosAckPolicy) {
+  case 0 :
+    return NORMAL_ACK;
+    break;
+  case 1 :
+    return NO_ACK;
+    break;
+  case 2 :
+    return NO_EXPLICIT_ACK;
+    break;
+  case 3 :
+    return BLOCK_ACK;
+    break;
+  }
+  // NOTREACHED
+  NS_ASSERT (false);
+  return (enum QosAckPolicy)-1;
+}
+
 uint8_t 
 WifiMacHeader::GetQosTxopLimit (void) const
 {
@@ -644,6 +715,7 @@
   val |= m_qosTid;
   val |= m_qosEosp << 4;
   val |= m_qosAckPolicy << 5;
+  val |= m_amsduPresent << 7;
   val |= m_qosStuff << 8;
   return val;
 }
@@ -673,6 +745,7 @@
   m_qosTid = qos & 0x000f;
   m_qosEosp = (qos >> 4) & 0x0001;
   m_qosAckPolicy = (qos >> 5) & 0x0003;
+  m_amsduPresent = (qos >> 7) & 0x0001;
   m_qosStuff = (qos >> 8) & 0x00ff;
 }
 
@@ -770,6 +843,7 @@
     ;
   return tid;
 }
+
 TypeId 
 WifiMacHeader::GetInstanceTypeId (void) const
 {