QoS in 802.11s implementation

This commit is contained in:
Kirill Andreev
2009-07-10 18:30:39 +04:00
parent 9ee9ec1c49
commit 7aaec2d39b
4 changed files with 26 additions and 11 deletions

View File

@@ -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());

View File

@@ -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

View File

@@ -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;

View File

@@ -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