QoS in 802.11s implementation
authorKirill Andreev <andreev@iitp.ru>
Fri, 10 Jul 2009 18:30:39 +0400
changeset 5115 7cdd24c28d4e
parent 5114 505e762ea818
child 5116 90567719db39
QoS in 802.11s implementation
src/devices/mesh/mesh-wifi-interface-mac.cc
src/devices/wifi/qos-tag.cc
src/devices/wifi/qos-tag.h
src/devices/wifi/qos-utils.cc
--- a/src/devices/mesh/mesh-wifi-interface-mac.cc	Fri Jul 10 17:59:20 2009 +0400
+++ b/src/devices/mesh/mesh-wifi-interface-mac.cc	Fri Jul 10 18:30:39 2009 +0400
@@ -31,6 +31,7 @@
 #include "ns3/simulator.h"
 #include "ns3/yans-wifi-phy.h"
 #include "ns3/pointer.h"
+#include "ns3/qos-tag.h"
 
 
 NS_LOG_COMPONENT_DEFINE ("MeshWifiInterfaceMac");
@@ -366,6 +367,7 @@
 {
   // copy packet to allow modifications
   Ptr<Packet> packet = const_packet->Copy ();
+  packet->AddPacketTag (QosTag(6));
   WifiMacHeader hdr;
   hdr.SetTypeData ();
   hdr.SetAddr2 (GetAddress ());
@@ -373,6 +375,11 @@
   hdr.SetAddr4 (from);
   hdr.SetDsFrom ();
   hdr.SetDsTo ();
+  // Fill QoS fields:
+  hdr.SetQosAckPolicy (WifiMacHeader::NORMAL_ACK);
+  hdr.SetQosNoEosp ();
+  hdr.SetQosNoAmsdu ();
+  hdr.SetQosTxopLimit (0);
 
   // Address 1 is unknwon here. Routing plugin is responsible to correctly set it.
   hdr.SetAddr1 (Mac48Address ());
@@ -400,9 +407,16 @@
         }
       destination->RecordDisassociated ();
     }
+  //Classify: application sets a tag, which is removed here
+  // Get Qos tag:
+  AccessClass ac = AC_BE;
+  QosTag tag;
+  if(packet->RemovePacketTag (tag))
+    ac = QosUtilsMapTidToAc (tag.Get ());
   m_stats.sentFrames ++;
   m_stats.sentBytes += packet->GetSize ();
-  m_queues[AC_BK]->Queue (packet, hdr);
+  NS_ASSERT(m_queues.find(ac) != m_queues.end ());
+  m_queues[ac]->Queue (packet, hdr);
 }
 
 void
@@ -597,6 +611,9 @@
       if (drop) return; // plugin drops frame
     }
 
+  // Check if QoS tag exists and add it:
+  if (hdr->IsQosData ())
+    packet->AddPacketTag (QosTag (hdr->GetQosTid ()));
   // Forward data up
   if (hdr->IsData ())
       ForwardUp (packet, hdr->GetAddr4(), hdr->GetAddr3());
--- a/src/devices/wifi/qos-tag.cc	Fri Jul 10 17:59:20 2009 +0400
+++ b/src/devices/wifi/qos-tag.cc	Fri Jul 10 18:30:39 2009 +0400
@@ -43,7 +43,11 @@
   return GetTypeId ();
 }
 
-QosTag::QosTag()
+QosTag::QosTag ():
+  m_tid (0)
+{}
+QosTag::QosTag (uint8_t tid):
+  m_tid (tid)
 {}
 
 uint32_t 
--- a/src/devices/wifi/qos-tag.h	Fri Jul 10 17:59:20 2009 +0400
+++ b/src/devices/wifi/qos-tag.h	Fri Jul 10 18:30:39 2009 +0400
@@ -33,6 +33,7 @@
   virtual TypeId GetInstanceTypeId (void) const;
   
   QosTag ();
+  QosTag (uint8_t tid);
   virtual void Serialize (TagBuffer i) const;
   virtual void Deserialize (TagBuffer i);
   virtual uint32_t GetSerializedSize () const;
--- a/src/devices/wifi/qos-utils.cc	Fri Jul 10 17:59:20 2009 +0400
+++ b/src/devices/wifi/qos-utils.cc	Fri Jul 10 18:30:39 2009 +0400
@@ -28,30 +28,23 @@
   switch (tid) {
   case 0 :
     return AC_BE;
-    break;
   case 1 :
     return AC_BK;
-    break;
   case 2 :
     return AC_BK;
-    break;
   case 3 :
     return AC_BE;
-    break;
   case 4 :
     return AC_VI;
-    break;
   case 5 :
     return AC_VI;
-    break;
   case 6 :
     return AC_VO;
-    break;
   case 7 : 
     return AC_VO;
-    break;
+  default:
+    return AC_BE;
   }
-  return AC_UNDEF;
 }
 
 uint8_t