traffic-control: (fixes #2537) Fix dead assignment on CoDel::DoDequeue

This commit is contained in:
Stefano Avallone
2017-01-27 18:02:38 +01:00
parent 5381e74815
commit 9f60774b59
3 changed files with 32 additions and 42 deletions

View File

@@ -46,6 +46,7 @@ Bugs fixed
- Bug 2533 - Provide a better 802.11n/ac PHY abstraction model for SIMO, MISO and MIMO
- Bug 2535 - memory leak in bench-simulator.cc
- Bug 2536 - fixed dead assignment and potential memory leak in wimax
- Bug 2537 - Dead assigment on CoDel::DoDequeue
- Bug 2538 - fixed dead assignment on tap-bridge
- Bug 2540 - fixed dead assignment on mesh/ie-dot11s-perr
- Bug 2541 - preamble not assigned correctly

View File

@@ -309,13 +309,19 @@ CoDelQueueDisc::DoEnqueue (Ptr<QueueDiscItem> item)
}
bool
CoDelQueueDisc::OkToDrop (Ptr<Packet> p, uint32_t now)
CoDelQueueDisc::OkToDrop (Ptr<QueueDiscItem> item, uint32_t now)
{
NS_LOG_FUNCTION (this);
CoDelTimestampTag tag;
bool okToDrop;
bool found = p->RemovePacketTag (tag);
if (!item)
{
m_firstAboveTime = 0;
return false;
}
bool found = item->GetPacket ()->RemovePacketTag (tag);
NS_ASSERT_MSG (found, "found a packet without an input timestamp tag");
NS_UNUSED (found); //silence compiler warning
Time delta = Simulator::Now () - tag.GetTxTime ();
@@ -340,8 +346,7 @@ CoDelQueueDisc::OkToDrop (Ptr<Packet> p, uint32_t now)
NS_LOG_LOGIC ("Sojourn time has just gone above target from below, need to stay above for at least q->interval before packet can be dropped. ");
m_firstAboveTime = now + Time2CoDel (m_interval);
}
else
if (CoDelTimeAfter (now, m_firstAboveTime))
else if (CoDelTimeAfter (now, m_firstAboveTime))
{
NS_LOG_LOGIC ("Sojourn time has been above target for at least q->interval; it's OK to (possibly) drop packet.");
okToDrop = true;
@@ -355,24 +360,22 @@ CoDelQueueDisc::DoDequeue (void)
{
NS_LOG_FUNCTION (this);
if (GetInternalQueue (0)->IsEmpty ())
Ptr<QueueDiscItem> item = StaticCast<QueueDiscItem> (GetInternalQueue (0)->Dequeue ());
if (!item)
{
// Leave dropping state when queue is empty
m_dropping = false;
m_firstAboveTime = 0;
NS_LOG_LOGIC ("Queue empty");
return 0;
}
uint32_t now = CoDelGetTime ();
Ptr<QueueDiscItem> item = StaticCast<QueueDiscItem> (GetInternalQueue (0)->Dequeue ());
Ptr<Packet> p = item->GetPacket ();
NS_LOG_LOGIC ("Popped " << item);
NS_LOG_LOGIC ("Number packets remaining " << GetInternalQueue (0)->GetNPackets ());
NS_LOG_LOGIC ("Number bytes remaining " << GetInternalQueue (0)->GetNBytes ());
// Determine if p should be dropped
bool okToDrop = OkToDrop (p, now);
// Determine if item should be dropped
bool okToDrop = OkToDrop (item, now);
if (m_dropping)
{ // In the dropping state (sojourn time has gone above target and hasn't come down yet)
@@ -384,8 +387,7 @@ CoDelQueueDisc::DoDequeue (void)
NS_LOG_LOGIC ("Sojourn time goes below target, it's OK to leave dropping state.");
m_dropping = false;
}
else
if (CoDelTimeAfterEq (now, m_dropNext))
else if (CoDelTimeAfterEq (now, m_dropNext))
{
m_state2++;
while (m_dropping && CoDelTimeAfterEq (now, m_dropNext))
@@ -396,27 +398,22 @@ CoDelQueueDisc::DoDequeue (void)
// A large amount of packets in queue might result in drop
// rates so high that the next drop should happen now,
// hence the while loop.
NS_LOG_LOGIC ("Sojourn time is still above target and it's time for next drop; dropping " << p);
NS_LOG_LOGIC ("Sojourn time is still above target and it's time for next drop; dropping " << item);
Drop (item);
++m_dropCount;
++m_count;
NewtonStep ();
if (GetInternalQueue (0)->IsEmpty ())
{
m_dropping = false;
NS_LOG_LOGIC ("Queue empty");
++m_states;
return 0;
}
item = StaticCast<QueueDiscItem> (GetInternalQueue (0)->Dequeue ());
p = item ->GetPacket ();
NS_LOG_LOGIC ("Popped " << item);
NS_LOG_LOGIC ("Number packets remaining " << GetInternalQueue (0)->GetNPackets ());
NS_LOG_LOGIC ("Number bytes remaining " << GetInternalQueue (0)->GetNBytes ());
if (item)
{
NS_LOG_LOGIC ("Popped " << item);
NS_LOG_LOGIC ("Number packets remaining " << GetInternalQueue (0)->GetNPackets ());
NS_LOG_LOGIC ("Number bytes remaining " << GetInternalQueue (0)->GetNBytes ());
}
if (!OkToDrop (p, now))
if (!OkToDrop (item, now))
{
/* leave dropping state */
NS_LOG_LOGIC ("Leaving dropping state");
@@ -440,29 +437,21 @@ CoDelQueueDisc::DoDequeue (void)
if (okToDrop)
{
// Drop the first packet and enter dropping state unless the queue is empty
NS_LOG_LOGIC ("Sojourn time goes above target, dropping the first packet " << p << " and entering the dropping state");
NS_LOG_LOGIC ("Sojourn time goes above target, dropping the first packet " << item << " and entering the dropping state");
++m_dropCount;
Drop (item);
if (GetInternalQueue (0)->IsEmpty ())
{
m_dropping = false;
okToDrop = false;
NS_LOG_LOGIC ("Queue empty");
++m_states;
}
else
{
item = StaticCast<QueueDiscItem> (GetInternalQueue (0)->Dequeue ());
p = item->GetPacket ();
item = StaticCast<QueueDiscItem> (GetInternalQueue (0)->Dequeue ());
if (item)
{
NS_LOG_LOGIC ("Popped " << item);
NS_LOG_LOGIC ("Number packets remaining " << GetInternalQueue (0)->GetNPackets ());
NS_LOG_LOGIC ("Number bytes remaining " << GetInternalQueue (0)->GetNBytes ());
okToDrop = OkToDrop (p, now);
m_dropping = true;
}
OkToDrop (item, now);
m_dropping = true;
++m_state3;
/*
* if min went above target close to when we last went below it

View File

@@ -182,11 +182,11 @@ private:
* \brief Determine whether a packet is OK to be dropped. The packet
* may not be actually dropped (depending on the drop state)
*
* \param p The packet that is considered
* \param item The packet that is considered
* \param now The current time represented as 32-bit unsigned integer (us)
* \returns True if it is OK to drop the packet (sojourn time above target for at least interval)
*/
bool OkToDrop (Ptr<Packet> p, uint32_t now);
bool OkToDrop (Ptr<QueueDiscItem> item, uint32_t now);
/**
* Check if CoDel time a is successive to b