QoS in 802.11s implementation
This commit is contained in:
@@ -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> const_packet, Mac48Address
|
||||
{
|
||||
// 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 @@ MeshWifiInterfaceMac::ForwardDown (Ptr<const Packet> 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> 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> 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());
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user