diff --git a/src/devices/mesh/mesh-wifi-interface-mac.cc b/src/devices/mesh/mesh-wifi-interface-mac.cc index e7c47aad1..e14312493 100644 --- a/src/devices/mesh/mesh-wifi-interface-mac.cc +++ b/src/devices/mesh/mesh-wifi-interface-mac.cc @@ -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 @@ MeshWifiInterfaceMac::ForwardDown (Ptr const_packet, Mac48Address { // copy packet to allow modifications Ptr packet = const_packet->Copy (); + packet->AddPacketTag (QosTag(6)); WifiMacHeader hdr; hdr.SetTypeData (); hdr.SetAddr2 (GetAddress ()); @@ -373,6 +375,11 @@ MeshWifiInterfaceMac::ForwardDown (Ptr const_packet, Mac48Address 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 @@ MeshWifiInterfaceMac::ForwardDown (Ptr const_packet, Mac48Address } 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 @@ MeshWifiInterfaceMac::Receive (Ptr packet, WifiMacHeader const *hdr) 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()); diff --git a/src/devices/wifi/qos-tag.cc b/src/devices/wifi/qos-tag.cc index 98bed65b6..2010be3c1 100644 --- a/src/devices/wifi/qos-tag.cc +++ b/src/devices/wifi/qos-tag.cc @@ -43,7 +43,11 @@ QosTag::GetInstanceTypeId (void) const return GetTypeId (); } -QosTag::QosTag() +QosTag::QosTag (): + m_tid (0) +{} +QosTag::QosTag (uint8_t tid): + m_tid (tid) {} uint32_t diff --git a/src/devices/wifi/qos-tag.h b/src/devices/wifi/qos-tag.h index 51f13a908..1e8ab9dac 100644 --- a/src/devices/wifi/qos-tag.h +++ b/src/devices/wifi/qos-tag.h @@ -33,6 +33,7 @@ public: 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; diff --git a/src/devices/wifi/qos-utils.cc b/src/devices/wifi/qos-utils.cc index 8effbe1ab..ff6c3a102 100644 --- a/src/devices/wifi/qos-utils.cc +++ b/src/devices/wifi/qos-utils.cc @@ -28,30 +28,23 @@ QosUtilsMapTidToAc (uint8_t tid) 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