keep track of the last time a backoff was updated.
--- a/src/devices/wifi/dcf-manager.cc Thu Nov 15 13:44:58 2007 +0100
+++ b/src/devices/wifi/dcf-manager.cc Thu Nov 15 14:21:48 2007 +0100
@@ -55,10 +55,11 @@
m_cw = cw;
}
void
-DcfState::UpdateBackoffSlotsNow (uint32_t nSlots)
+DcfState::UpdateBackoffSlotsNow (uint32_t nSlots, Time backoffUpdateBound)
{
uint32_t n = std::min (nSlots, m_backoffSlots);
m_backoffSlots -= n;
+ m_backoffStart = backoffUpdateBound;
}
void
@@ -319,7 +320,7 @@
if (backoffStart <= Simulator::Now ())
{
Scalar nSlots = (Simulator::Now () - backoffStart) / m_slotTime;
- uint32_t nIntSlots = lrint (nSlots.GetDouble ());
+ uint32_t nIntSlots = lrint (nSlots.GetDouble ());
/**
* For each DcfState, calculate how many backoff slots elapsed since
* the last time its backoff counter was updated. If the number of
@@ -329,7 +330,8 @@
if (nIntSlots > state->GetAifsn ())
{
MY_DEBUG ("dcf " << k << " dec backoff slots=" << nIntSlots);
- state->UpdateBackoffSlotsNow (nIntSlots);
+ Time backoffUpdateBound = backoffStart + Scalar (nIntSlots) * m_slotTime;
+ state->UpdateBackoffSlotsNow (nIntSlots, backoffUpdateBound);
}
}
}
--- a/src/devices/wifi/dcf-manager.h Thu Nov 15 13:44:58 2007 +0100
+++ b/src/devices/wifi/dcf-manager.h Thu Nov 15 14:21:48 2007 +0100
@@ -29,7 +29,7 @@
uint32_t GetBackoffSlots (void) const;
Time GetBackoffStart (void) const;
- void UpdateBackoffSlotsNow (uint32_t nSlots);
+ void UpdateBackoffSlotsNow (uint32_t nSlots, Time backoffUpdateBound);
virtual bool NeedsAccess (void) const = 0;
virtual void NotifyAccessGranted (void) = 0;