allow rate control algorithms to control more per-packet parameters.
--- a/src/devices/wifi/dca-txop.cc Fri Feb 22 23:16:51 2008 +0100
+++ b/src/devices/wifi/dca-txop.cc Fri Feb 22 23:28:01 2008 +0100
@@ -177,6 +177,12 @@
StartAccessIfNeeded ();
}
+MacStation *
+DcaTxop::GetStation (Mac48Address ad) const
+{
+ return m_stations->Lookup (ad);
+}
+
void
DcaTxop::RestartAccessIfNeeded (void)
{
@@ -216,34 +222,22 @@
bool
DcaTxop::NeedRts (void)
{
- if (m_currentPacket->GetSize () > Parameters ()->GetRtsCtsThreshold ())
- {
- return true;
- }
- else
- {
- return false;
- }
+ MacStation *station = GetStation (m_currentHdr.GetAddr1 ());
+ return station->NeedRts (m_currentPacket);
}
bool
DcaTxop::NeedFragmentation (void)
{
- if (m_currentPacket->GetSize () > Parameters ()->GetFragmentationThreshold ())
- {
- return true;
- }
- else
- {
- return false;
- }
+ MacStation *station = GetStation (m_currentHdr.GetAddr1 ());
+ return station->NeedFragmentation (m_currentPacket);
}
uint32_t
DcaTxop::GetNFragments (void)
{
- uint32_t nFragments = m_currentPacket->GetSize () / Parameters ()->GetFragmentationThreshold () + 1;
- return nFragments;
+ MacStation *station = GetStation (m_currentHdr.GetAddr1 ());
+ return station->GetNFragments (m_currentPacket);
}
void
DcaTxop::NextFragment (void)
@@ -252,48 +246,23 @@
}
uint32_t
-DcaTxop::GetLastFragmentSize (void)
-{
- uint32_t lastFragmentSize = m_currentPacket->GetSize () %
- Parameters ()->GetFragmentationThreshold ();
- return lastFragmentSize;
-}
-
-uint32_t
DcaTxop::GetFragmentSize (void)
{
- return Parameters ()->GetFragmentationThreshold ();
+ MacStation *station = GetStation (m_currentHdr.GetAddr1 ());
+ return station->GetFragmentSize (m_currentPacket, m_fragmentNumber);
}
bool
DcaTxop::IsLastFragment (void)
{
- if (m_fragmentNumber == (GetNFragments () - 1))
- {
- return true;
- }
- else
- {
- return false;
- }
+ MacStation *station = GetStation (m_currentHdr.GetAddr1 ());
+ return station->IsLastFragment (m_currentPacket, m_fragmentNumber);
}
uint32_t
DcaTxop::GetNextFragmentSize (void)
{
- if (IsLastFragment ())
- {
- return 0;
- }
-
- uint32_t nextFragmentNumber = m_fragmentNumber + 1;
- if (nextFragmentNumber == (GetNFragments () - 1))
- {
- return GetLastFragmentSize ();
- }
- else
- {
- return GetFragmentSize ();
- }
+ MacStation *station = GetStation (m_currentHdr.GetAddr1 ());
+ return station->GetFragmentSize (m_currentPacket, m_fragmentNumber + 1);
}
Ptr<Packet>
@@ -306,18 +275,29 @@
if (IsLastFragment ())
{
hdr->SetNoMoreFragments ();
- fragment = m_currentPacket->CreateFragment (startOffset,
- GetLastFragmentSize ());
}
else
{
hdr->SetMoreFragments ();
- fragment = m_currentPacket->CreateFragment (startOffset,
- GetFragmentSize ());
}
+ fragment = m_currentPacket->CreateFragment (startOffset,
+ GetFragmentSize ());
return fragment;
}
+uint32_t
+DcaTxop::GetMaxSsrc (void) const
+{
+ MacStation *station = GetStation (m_currentHdr.GetAddr1 ());
+ return station->GetMaxSsrc (m_currentPacket);
+}
+uint32_t
+DcaTxop::GetMaxSlrc (void) const
+{
+ MacStation *station = GetStation (m_currentHdr.GetAddr1 ());
+ return station->GetMaxSlrc (m_currentPacket);
+}
+
bool
DcaTxop::NeedsAccess (void) const
{
@@ -429,7 +409,7 @@
MY_DEBUG ("missed cts");
m_ssrc++;
m_ctstimeoutTrace (m_ssrc);
- if (m_ssrc > Parameters ()->GetMaxSsrc ())
+ if (m_ssrc > GetMaxSsrc ())
{
MacStation *station = m_stations->Lookup (m_currentHdr.GetAddr1 ());
station->ReportFinalRtsFailed ();
@@ -476,7 +456,7 @@
MY_DEBUG ("missed ack");
m_slrc++;
m_acktimeoutTrace (m_slrc);
- if (m_slrc > Parameters ()->GetMaxSlrc ())
+ if (m_slrc > GetMaxSlrc ())
{
MacStation *station = m_stations->Lookup (m_currentHdr.GetAddr1 ());
station->ReportFinalDataFailed ();
--- a/src/devices/wifi/dca-txop.h Fri Feb 22 23:16:51 2008 +0100
+++ b/src/devices/wifi/dca-txop.h Fri Feb 22 23:28:01 2008 +0100
@@ -38,6 +38,7 @@
class MacParameters;
class MacTxMiddle;
class RandomStream;
+class MacStation;
class MacStations;
/**
@@ -135,9 +136,11 @@
bool NeedRts (void);
bool NeedFragmentation (void);
uint32_t GetNFragments (void);
- uint32_t GetLastFragmentSize (void);
uint32_t GetNextFragmentSize (void);
uint32_t GetFragmentSize (void);
+ MacStation *GetStation (Mac48Address to) const;
+ uint32_t GetMaxSsrc (void) const;
+ uint32_t GetMaxSlrc (void) const;
bool IsLastFragment (void);
void NextFragment (void);
Ptr<Packet> GetFragmentPacket (WifiMacHeader *hdr);
--- a/src/devices/wifi/mac-stations.cc Fri Feb 22 23:16:51 2008 +0100
+++ b/src/devices/wifi/mac-stations.cc Fri Feb 22 23:28:01 2008 +0100
@@ -20,6 +20,7 @@
#include "mac-stations.h"
#include "wifi-default-parameters.h"
+#include "mac-parameters.h"
#include "ns3/assert.h"
#include "ns3/log.h"
#include "ns3/tag.h"
@@ -151,6 +152,7 @@
}
MacStation *station = CreateStation ();
station->Reset ();
+ station->SetParameters (m_parameters);
m_stations.push_back (std::make_pair (address, station));
return station;
}
@@ -216,6 +218,11 @@
{
return m_isLowLatency;
}
+void
+MacStations::SetParameters (MacParameters *parameters)
+{
+ m_parameters = parameters;
+}
} // namespace ns3
@@ -301,6 +308,12 @@
MacStation::~MacStation ()
{}
+void
+MacStation::SetParameters (MacParameters *parameters)
+{
+ m_parameters = parameters;
+}
+
bool
MacStation::IsBrandNew (void) const
{
@@ -469,6 +482,80 @@
return tag.GetRtsMode ();
}
+bool
+MacStation::NeedRts (Ptr<const Packet> packet)
+{
+ if (packet->GetSize () > m_parameters->GetRtsCtsThreshold ())
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+uint32_t
+MacStation::GetMaxSsrc (Ptr<const Packet> packet)
+{
+ return m_parameters->GetMaxSsrc ();
+}
+
+uint32_t
+MacStation::GetMaxSlrc (Ptr<const Packet> packet)
+{
+ return m_parameters->GetMaxSlrc ();
+}
+
+bool
+MacStation::NeedFragmentation (Ptr<const Packet> packet)
+{
+ if (packet->GetSize () > m_parameters->GetFragmentationThreshold ())
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+uint32_t
+MacStation::GetNFragments (Ptr<const Packet> packet)
+{
+ uint32_t nFragments = packet->GetSize () / m_parameters->GetFragmentationThreshold () + 1;
+ return nFragments;
+}
+
+uint32_t
+MacStation::GetFragmentSize (Ptr<const Packet> packet, uint32_t fragmentNumber)
+{
+ uint32_t nFragment = GetNFragments (packet);
+ if (fragmentNumber >= nFragment)
+ {
+ return 0;
+ }
+ if (fragmentNumber == nFragment - 1)
+ {
+ uint32_t lastFragmentSize = packet->GetSize () % m_parameters->GetFragmentationThreshold ();
+ return lastFragmentSize;
+ }
+ else
+ {
+ return m_parameters->GetFragmentationThreshold ();
+ }
+}
+
+bool
+MacStation::IsLastFragment (Ptr<const Packet> packet, uint32_t fragmentNumber)
+{
+ if (fragmentNumber == (GetNFragments (packet) - 1))
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
} // namespace ns3
--- a/src/devices/wifi/mac-stations.h Fri Feb 22 23:16:51 2008 +0100
+++ b/src/devices/wifi/mac-stations.h Fri Feb 22 23:28:01 2008 +0100
@@ -30,6 +30,7 @@
class MacStation;
class NonUnicastMacStation;
+class MacParameters;
class MacStations
{
@@ -40,6 +41,7 @@
MacStations (WifiMode defaultTxMode);
virtual ~MacStations ();
+ void SetParameters (MacParameters *parameters);
// Invoked in a STA upon dis-association
// or in an AP upon reboot
@@ -69,6 +71,7 @@
NonUnicastMacStation *m_nonUnicast;
BasicModes m_basicModes;
bool m_isLowLatency;
+ MacParameters *m_parameters;
};
} // namespace ns3
@@ -89,6 +92,7 @@
// The set of supported modes includes
// the BSSBasicRateSet.
void AddSupportedMode (WifiMode mode);
+ void SetParameters (MacParameters *parameters);
bool IsBrandNew (void) const;
bool IsAssociated (void) const;
@@ -112,6 +116,13 @@
virtual void ReportDataOk (double ackSnr, WifiMode ackMode, double dataSnr) = 0;
virtual void ReportFinalRtsFailed (void) = 0;
virtual void ReportFinalDataFailed (void) = 0;
+ virtual bool NeedRts (Ptr<const Packet> packet);
+ virtual uint32_t GetMaxSsrc (Ptr<const Packet> packet);
+ virtual uint32_t GetMaxSlrc (Ptr<const Packet> packet);
+ virtual bool NeedFragmentation (Ptr<const Packet> packet);
+ virtual uint32_t GetNFragments (Ptr<const Packet> packet);
+ virtual uint32_t GetFragmentSize (Ptr<const Packet> packet, uint32_t fragmentNumber);
+ virtual bool IsLastFragment (Ptr<const Packet> packet, uint32_t fragmentNumber);
WifiMode GetCtsMode (WifiMode rtsMode);
WifiMode GetAckMode (WifiMode dataMode);
@@ -134,6 +145,7 @@
GOT_ASSOC_TX_OK
} m_state;
SupportedModes m_modes;
+ MacParameters *m_parameters;
};
} // namespace ns3
--- a/src/devices/wifi/wifi-net-device.cc Fri Feb 22 23:16:51 2008 +0100
+++ b/src/devices/wifi/wifi-net-device.cc Fri Feb 22 23:28:01 2008 +0100
@@ -234,6 +234,7 @@
Time ackDelay = m_phy->CalculateTxDuration (hdr.GetSize () + 4, m_phy->GetMode (0), WIFI_PREAMBLE_LONG);
parameters->Initialize (ctsDelay, ackDelay);
m_parameters = parameters;
+ m_stations->SetParameters (m_parameters);
// the MacLow
MacLow *low = new MacLow ();