src/network/utils/codel-queue.cc
author Dave Taht <dave.taht@bufferbloat.net>
Thu, 22 May 2014 14:42:47 -0500
changeset 10886 cb1f956ad928
permissions -rw-r--r--
Add Codel alogithm support --- src/network/utils/codel-queue.cc | 482 ++++++++++++++++++++++++++++++++++++++ src/network/utils/codel-queue.h | 130 ++++++++++ 2 files changed, 612 insertions(+), 0 deletions(-) create mode 100644 src/network/utils/codel-queue.cc create mode 100644 src/network/utils/codel-queue.h
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10886
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
     1
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
     2
/*
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
     3
 * Copyright (c) 2012 Andrew McGregor
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
     4
 *
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
     6
 * it under the terms of the GNU General Public License version 2 as
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
     7
 * published by the Free Software Foundation;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
     8
 *
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    12
 * GNU General Public License for more details.
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    13
 *
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    14
 * You should have received a copy of the GNU General Public License
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    15
 * along with this program; if not, write to the Free Software
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    16
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    17
 * 
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    18
 * Codel, the COntrolled DELay Queueing discipline
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    19
 * Based on ns2 simulation code presented by Kathie Nichols
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    20
 *
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    21
 * This port based on linux kernel code by
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    22
 * Authors:	Dave Täht <d@taht.net>
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    23
 *		Eric Dumazet <edumazet@google.com>
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    24
 *
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    25
 * Ported to ns-3 by: Andrew McGregor <andrewmcgr@gmail.com>
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    26
*/
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    27
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    28
#include "ns3/log.h"
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    29
#include "ns3/enum.h"
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    30
#include "ns3/uinteger.h"
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    31
#include "ns3/abort.h"
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    32
#include "codel-queue.h"
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    33
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    34
NS_LOG_COMPONENT_DEFINE ("CoDelQueue");
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    35
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    36
namespace ns3 {
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    37
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    38
#define BITS_PER_LONG (8 * sizeof (unsigned long))
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    39
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    40
/* borrowed from the linux kernel */
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    41
#define do_div(n,base)						\
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    42
({								\
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    43
	int __res;						\
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    44
	__res = ((unsigned long)n) % (unsigned int)base;	\
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    45
	n = ((unsigned long)n) / (unsigned int)base;		\
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    46
	__res;							\
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    47
})
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    48
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    49
static inline uint32_t reciprocal_divide(uint32_t A, uint32_t R)
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    50
{
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    51
	return (uint32_t)(((uint64_t)A * R) >> 32);
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    52
}
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    53
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    54
/* end kernel borrowings */
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    55
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    56
static codel_time_t codel_get_time(void)
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    57
{
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    58
  Time time = Simulator::Now ();
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    59
  uint64_t ns = time.GetNanoSeconds ();
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    60
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    61
  return ns >> CODEL_SHIFT;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    62
}
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    63
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    64
#define codel_time_after(a, b)	 ((int)(a) - (int)(b) > 0)
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    65
#define codel_time_after_eq(a, b) ((int)(a) - (int)(b) >= 0)
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    66
#define codel_time_before(a, b)	 ((int)(a) - (int)(b) < 0)
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    67
#define codel_time_before_eq(a, b) ((int)(a) - (int)(b) <= 0)
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    68
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    69
#define NSEC_PER_MSEC 1000000
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    70
#define NSEC_PER_USEC 1000
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    71
#define MS2TIME(a) ((a * NSEC_PER_MSEC) >> CODEL_SHIFT)
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    72
#define US2TIME(a) ((a * NSEC_PER_USEC) >> CODEL_SHIFT)
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    73
#define NS2TIME(a) ((a) >> CODEL_SHIFT)
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    74
#define TIME2CODEL(a) NS2TIME(a.GetNanoSeconds())
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    75
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    76
#define DEFAULT_CODEL_LIMIT 1000
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    77
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    78
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    79
class CoDelTimestampTag : public Tag
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    80
{
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    81
public:
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    82
  CoDelTimestampTag ();
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    83
  static TypeId GetTypeId (void);
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    84
  virtual TypeId GetInstanceTypeId (void) const;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    85
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    86
  virtual uint32_t GetSerializedSize (void) const;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    87
  virtual void Serialize (TagBuffer i) const;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    88
  virtual void Deserialize (TagBuffer i);
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    89
  virtual void Print (std::ostream &os) const;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    90
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    91
  Time GetTxTime (void) const;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    92
private:
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    93
  uint64_t m_creationTime;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    94
};
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    95
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    96
CoDelTimestampTag::CoDelTimestampTag ()
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    97
  : m_creationTime (Simulator::Now ().GetTimeStep ())
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    98
{
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
    99
}
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   100
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   101
TypeId
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   102
CoDelTimestampTag::GetTypeId (void)
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   103
{
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   104
  static TypeId tid = TypeId ("anon::CoDelTimestampTag")
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   105
    .SetParent<Tag> ()
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   106
    .AddConstructor<CoDelTimestampTag> ()
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   107
    .AddAttribute ("CreationTime",
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   108
                   "The time at which the timestamp was created",
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   109
                   StringValue ("0.0s"),
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   110
                   MakeTimeAccessor (&CoDelTimestampTag::GetTxTime),
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   111
                   MakeTimeChecker ())
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   112
  ;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   113
  return tid;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   114
}
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   115
TypeId
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   116
CoDelTimestampTag::GetInstanceTypeId (void) const
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   117
{
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   118
  return GetTypeId ();
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   119
}
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   120
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   121
uint32_t
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   122
CoDelTimestampTag::GetSerializedSize (void) const
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   123
{
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   124
  return 8;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   125
}
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   126
void
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   127
CoDelTimestampTag::Serialize (TagBuffer i) const
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   128
{
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   129
  i.WriteU64 (m_creationTime);
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   130
}
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   131
void
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   132
CoDelTimestampTag::Deserialize (TagBuffer i)
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   133
{
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   134
  m_creationTime = i.ReadU64 ();
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   135
}
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   136
void
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   137
CoDelTimestampTag::Print (std::ostream &os) const
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   138
{
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   139
  os << "CreationTime=" << m_creationTime;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   140
}
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   141
Time
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   142
CoDelTimestampTag::GetTxTime (void) const
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   143
{
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   144
  return TimeStep (m_creationTime);
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   145
}
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   146
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   147
NS_OBJECT_ENSURE_REGISTERED (CoDelQueue);
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   148
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   149
TypeId CoDelQueue::GetTypeId (void) 
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   150
{
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   151
  static TypeId tid = TypeId ("ns3::CoDelQueue")
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   152
    .SetParent<Queue> ()
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   153
    .AddConstructor<CoDelQueue> ()
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   154
    .AddAttribute ("Mode", 
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   155
                   "Whether to use Bytes (see MaxBytes) or Packets (see MaxPackets) as the maximum queue size metric.",
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   156
                   EnumValue (BYTES),
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   157
                   MakeEnumAccessor (&CoDelQueue::SetMode),
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   158
                   MakeEnumChecker (BYTES, "Bytes",
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   159
                                    PACKETS, "Packets"))
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   160
    .AddAttribute ("MaxPackets", 
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   161
                   "The maximum number of packets accepted by this CoDelQueue.",
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   162
                   UintegerValue (DEFAULT_CODEL_LIMIT),
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   163
                   MakeUintegerAccessor (&CoDelQueue::m_maxPackets),
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   164
                   MakeUintegerChecker<uint32_t> ())
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   165
    .AddAttribute ("MaxBytes", 
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   166
                   "The maximum number of bytes accepted by this CoDelQueue.",
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   167
                   UintegerValue (1500*DEFAULT_CODEL_LIMIT),
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   168
                   MakeUintegerAccessor (&CoDelQueue::m_maxBytes),
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   169
                   MakeUintegerChecker<uint32_t> ())
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   170
    .AddAttribute ("MinBytes", 
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   171
                   "The CoDel algorithm minbytes parameter.",
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   172
                   UintegerValue (1500),
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   173
                   MakeUintegerAccessor (&CoDelQueue::m_minbytes),
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   174
                   MakeUintegerChecker<uint32_t> ())
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   175
    .AddAttribute ("Interval",
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   176
                   "The CoDel algorithm interval",
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   177
                   StringValue ("100ms"),
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   178
                   MakeTimeAccessor (&CoDelQueue::m_Interval),
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   179
                   MakeTimeChecker ())
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   180
    .AddAttribute ("Target",
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   181
                   "The CoDel algorithm target queue delay",
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   182
                   StringValue ("5ms"),
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   183
                   MakeTimeAccessor (&CoDelQueue::m_Target),
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   184
                   MakeTimeChecker ())
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   185
    .AddTraceSource("count",
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   186
                    "CoDel count",
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   187
                    MakeTraceSourceAccessor(&CoDelQueue::m_count))
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   188
    .AddTraceSource("drop_count",
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   189
                    "CoDel drop count",
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   190
                    MakeTraceSourceAccessor(&CoDelQueue::m_drop_count))
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   191
    .AddTraceSource("last_count",
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   192
                    "CoDel lastcount",
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   193
                    MakeTraceSourceAccessor(&CoDelQueue::m_lastcount))
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   194
    // .AddTraceSource("bytesInQueue",
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   195
    //                 "Number of bytes in the queue",
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   196
    //                 MakeTraceSourceAccessor(&CoDelQueue::m_bytesInQueue))
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   197
  ;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   198
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   199
  return tid;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   200
}
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   201
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   202
CoDelQueue::CoDelQueue () :
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   203
  Queue (),
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   204
  m_packets (),
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   205
  m_maxBytes(),
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   206
  m_bytesInQueue(0),
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   207
  backlog(&m_bytesInQueue),
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   208
  m_count(0),
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   209
  m_drop_count(0),
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   210
  m_lastcount(0),
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   211
  m_dropping(false),
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   212
  m_rec_inv_sqrt(~0U >> REC_INV_SQRT_SHIFT),
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   213
  m_first_above_time(0),
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   214
  m_drop_next(0),
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   215
  m_state1(0),
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   216
  m_state2(0),
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   217
  m_state3(0),
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   218
  m_states(0),
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   219
  m_drop_overlimit(0)  
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   220
{
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   221
  NS_LOG_FUNCTION_NOARGS ();
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   222
}
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   223
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   224
CoDelQueue::~CoDelQueue ()
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   225
{
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   226
  NS_LOG_FUNCTION_NOARGS ();
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   227
}
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   228
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   229
void
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   230
CoDelQueue::NewtonStep(void)
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   231
{
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   232
  uint32_t invsqrt = ((uint32_t) m_rec_inv_sqrt) << REC_INV_SQRT_SHIFT;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   233
  uint32_t invsqrt2 = ((uint64_t) invsqrt*invsqrt) >> 32;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   234
  uint64_t val = (3ll<<32) - ((uint64_t) m_count * invsqrt2);
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   235
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   236
  val >>= 2; /* avoid overflow */
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   237
  val = (val * invsqrt) >> (32-2+1);
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   238
  m_rec_inv_sqrt = val >> REC_INV_SQRT_SHIFT;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   239
}
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   240
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   241
codel_time_t 
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   242
CoDelQueue::ControlLaw(codel_time_t t)
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   243
{
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   244
  return t + reciprocal_divide(TIME2CODEL(m_Interval), m_rec_inv_sqrt << REC_INV_SQRT_SHIFT);
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   245
}
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   246
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   247
void
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   248
CoDelQueue::SetMode (enum Mode mode)
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   249
{
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   250
  NS_LOG_FUNCTION (mode);
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   251
  m_mode = mode;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   252
}
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   253
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   254
CoDelQueue::Mode
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   255
CoDelQueue::GetMode (void)
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   256
{
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   257
  NS_LOG_FUNCTION_NOARGS ();
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   258
  return m_mode;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   259
}
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   260
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   261
bool 
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   262
CoDelQueue::DoEnqueue (Ptr<Packet> p)
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   263
{
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   264
  NS_LOG_FUNCTION (this << p);
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   265
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   266
  if (m_mode == PACKETS && (m_packets.size () >= m_maxPackets))
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   267
    {
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   268
      NS_LOG_LOGIC ("Queue full (at max packets) -- droppping pkt");
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   269
      Drop (p);
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   270
      ++m_drop_overlimit;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   271
      return false;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   272
    }
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   273
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   274
  if (m_mode == BYTES && (m_bytesInQueue + p->GetSize () >= m_maxBytes))
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   275
    {
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   276
      NS_LOG_LOGIC ("Queue full (packet would exceed max bytes) -- droppping pkt");
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   277
      Drop (p);
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   278
      ++m_drop_overlimit;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   279
      return false;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   280
    }
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   281
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   282
  CoDelTimestampTag tag;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   283
  p->AddByteTag (tag);
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   284
  m_bytesInQueue += p->GetSize ();
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   285
  m_packets.push (p);
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   286
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   287
  NS_LOG_LOGIC ("Number packets " << m_packets.size ());
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   288
  NS_LOG_LOGIC ("Number bytes " << m_bytesInQueue);
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   289
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   290
  return true;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   291
}
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   292
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   293
bool
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   294
CoDelQueue::ShouldDrop(Ptr<Packet> p, codel_time_t now)
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   295
{
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   296
  CoDelTimestampTag tag;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   297
  bool drop;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   298
  p->FindFirstMatchingByteTag (tag);
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   299
  Time delta = Simulator::Now () - tag.GetTxTime ();
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   300
  NS_LOG_INFO ("Sojourn time "<<delta.GetSeconds ());
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   301
  codel_time_t sojourn_time = TIME2CODEL(delta);
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   302
  
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   303
  if (codel_time_before(sojourn_time, TIME2CODEL(m_Target)) || 
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   304
      *backlog < m_minbytes)
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   305
    {
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   306
      /* went below so we'll stay below for at least q->interval */
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   307
      m_first_above_time = 0;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   308
      return false;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   309
    }
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   310
  drop = false;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   311
  if (m_first_above_time == 0) 
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   312
    {
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   313
      /* just went above from below. If we stay above
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   314
       * for at least q->interval we'll say it's ok to drop
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   315
       */
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   316
      m_first_above_time = now + TIME2CODEL(m_Interval);
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   317
    } 
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   318
  else 
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   319
    if (codel_time_after(now, m_first_above_time)) 
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   320
      {
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   321
        drop = true;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   322
        ++m_state1;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   323
      }
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   324
  if (!drop)
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   325
    Drop (p);
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   326
  return drop;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   327
}
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   328
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   329
Ptr<Packet>
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   330
CoDelQueue::DoDequeue (void)
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   331
{
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   332
  NS_LOG_FUNCTION (this);
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   333
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   334
  if (m_packets.empty ())
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   335
    {
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   336
      m_dropping = false;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   337
      m_first_above_time = 0;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   338
      NS_LOG_LOGIC ("Queue empty");
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   339
      return 0;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   340
    }
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   341
  codel_time_t now = codel_get_time();
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   342
  Ptr<Packet> p = m_packets.front ();
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   343
  m_packets.pop ();
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   344
  m_bytesInQueue -= p->GetSize ();
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   345
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   346
  NS_LOG_LOGIC ("Popped " << p);
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   347
  NS_LOG_LOGIC ("Number packets " << m_packets.size ());
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   348
  NS_LOG_LOGIC ("Number bytes " << m_bytesInQueue);
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   349
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   350
  bool drop = ShouldDrop(p, now);
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   351
  if (m_dropping)
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   352
    {
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   353
      if (!drop)
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   354
        {
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   355
          /* sojourn time below target - leave dropping state */    
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   356
          m_dropping = false;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   357
        }
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   358
      else
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   359
        if (codel_time_after_eq(now, m_drop_next))
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   360
          {
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   361
            m_state2++;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   362
            /* It's time for the next drop. Drop the current
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   363
             * packet and dequeue the next. The dequeue might 
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   364
             * take us out of dropping state. 
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   365
             * If not, schedule the next drop.
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   366
             * A large backlog might result in drop rates so high
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   367
             * that the next drop should happen now, 
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   368
             * hence the while loop.
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   369
             */  
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   370
            while (m_dropping && 
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   371
                   codel_time_after_eq(now, m_drop_next)) {
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   372
              Drop(p);
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   373
              ++m_drop_count;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   374
              ++m_count;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   375
              NewtonStep();
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   376
              if (m_packets.empty ())
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   377
                {
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   378
                  m_dropping = false;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   379
                  NS_LOG_LOGIC ("Queue empty");
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   380
                  ++m_states;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   381
                  return 0;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   382
                }
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   383
              p = m_packets.front ();
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   384
              m_packets.pop ();
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   385
              m_bytesInQueue -= p->GetSize ();
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   386
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   387
              NS_LOG_LOGIC ("Popped " << p);
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   388
              NS_LOG_LOGIC ("Number packets " << m_packets.size ());
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   389
              NS_LOG_LOGIC ("Number bytes " << m_bytesInQueue);
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   390
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   391
              if (!ShouldDrop(p, now)) 
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   392
                {
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   393
                  /* leave dropping state */
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   394
                  m_dropping = false;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   395
                }
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   396
              else 
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   397
                {
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   398
                  /* and schedule the next drop */
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   399
                  m_drop_next = ControlLaw(m_drop_next);
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   400
                }
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   401
            }
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   402
          }
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   403
    }
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   404
  else 
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   405
    if (drop &&
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   406
        (codel_time_before(now - m_drop_next,
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   407
                           TIME2CODEL(m_Interval)) ||
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   408
         codel_time_after_eq(now - m_first_above_time,
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   409
                             TIME2CODEL(m_Interval)))) 
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   410
      {
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   411
        ++m_drop_count;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   412
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   413
        NS_LOG_LOGIC ("Popped " << p);
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   414
        NS_LOG_LOGIC ("Number packets " << m_packets.size ());
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   415
        NS_LOG_LOGIC ("Number bytes " << m_bytesInQueue);
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   416
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   417
        drop = ShouldDrop(p, now);
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   418
        m_dropping = true;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   419
        ++m_state3;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   420
        /* 
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   421
         * if min went above target close to when we last went below it
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   422
         * assume that the drop rate that controlled the queue on the
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   423
         * last cycle is a good starting point to control it now.
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   424
         */
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   425
        int delta = m_count - m_lastcount;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   426
        if (delta > 1 && codel_time_after(now - m_drop_next, TIME2CODEL(m_Interval))) 
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   427
          {
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   428
            m_count = delta;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   429
            NewtonStep();
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   430
          } 
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   431
        else
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   432
          {
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   433
            m_count = 1;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   434
            m_rec_inv_sqrt = ~0U >> REC_INV_SQRT_SHIFT;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   435
          }
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   436
        m_lastcount = m_count;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   437
        m_drop_next = ControlLaw(now);
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   438
        p = NULL;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   439
      }
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   440
  ++m_states;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   441
  return p;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   442
}
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   443
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   444
uint32_t
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   445
CoDelQueue::GetQueueSize (void)
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   446
{
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   447
  NS_LOG_FUNCTION_NOARGS ();
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   448
  if (GetMode () == BYTES)
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   449
    {
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   450
      return m_bytesInQueue;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   451
    }
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   452
  else if (GetMode () == PACKETS)
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   453
    {
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   454
      return m_packets.size ();
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   455
    }
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   456
  else
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   457
    {
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   458
      NS_ABORT_MSG ("Unknown mode.");
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   459
    }
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   460
}
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   461
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   462
Ptr<const Packet>
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   463
CoDelQueue::DoPeek (void) const
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   464
{
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   465
  NS_LOG_FUNCTION (this);
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   466
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   467
  if (m_packets.empty ())
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   468
    {
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   469
      NS_LOG_LOGIC ("Queue empty");
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   470
      return 0;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   471
    }
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   472
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   473
  Ptr<Packet> p = m_packets.front ();
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   474
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   475
  NS_LOG_LOGIC ("Number packets " << m_packets.size ());
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   476
  NS_LOG_LOGIC ("Number bytes " << m_bytesInQueue);
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   477
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   478
  return p;
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   479
}
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   480
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   481
} // namespace ns3
cb1f956ad928 Add Codel alogithm support
Dave Taht <dave.taht@bufferbloat.net>
parents:
diff changeset
   482