INET Framework for OMNeT++/OMNEST
inet::queueing::TokenBucket Class Reference

#include <TokenBucket.h>

Inheritance diagram for inet::queueing::TokenBucket:
inet::queueing::ITokenStorage

Public Member Functions

 TokenBucket ()
 
 TokenBucket (double numTokens, double maxNumTokens, double tokenProductionRate, ITokenStorage *excessTokenStorage)
 
virtual ITokenStoragegetExcessTokenStorage () const
 
virtual double getNumTokens () const override
 
virtual void addTokens (double numTokens) override
 
virtual void removeTokens (double numTokens) override
 
virtual void addTokenProductionRate (double tokenRate) override
 
virtual void removeTokenProductionRate (double tokenRate) override
 
virtual simtime_t getOverflowTime ()
 Returns the simulation time when the token bucket becomes full with the current rate of token production. More...
 
- Public Member Functions inherited from inet::queueing::ITokenStorage
virtual ~ITokenStorage ()
 

Protected Member Functions

void updateNumTokens ()
 

Protected Attributes

double numTokens = 0
 
double maxNumTokens = -1
 
double tokenProductionRate = 0
 
double excessTokenProductionRate = 0
 
ITokenStorageexcessTokenStorage = nullptr
 
simtime_t lastUpdate
 

Constructor & Destructor Documentation

◆ TokenBucket() [1/2]

inet::queueing::TokenBucket::TokenBucket ( )
inline
32 {}

◆ TokenBucket() [2/2]

inet::queueing::TokenBucket::TokenBucket ( double  numTokens,
double  maxNumTokens,
double  tokenProductionRate,
ITokenStorage excessTokenStorage 
)

Member Function Documentation

◆ addTokenProductionRate()

void inet::queueing::TokenBucket::addTokenProductionRate ( double  tokenRate)
overridevirtual

Implements inet::queueing::ITokenStorage.

63 {
64  ASSERT(tokenRate >= 0);
65  if (tokenRate > 0) {
66  EV_TRACE << " Adding rate: tokenProductionRate = " << tokenProductionRate << ", excessTokenProductionRate = " << excessTokenProductionRate << ", tokenRate = " << tokenRate << std::endl;
67  if (numTokens == maxNumTokens) {
68  if (excessTokenStorage != nullptr) {
71  excessTokenProductionRate += tokenRate;
72  }
73  }
74  tokenProductionRate += tokenRate;
75  ASSERT(tokenProductionRate >= 0);
76  EV_TRACE << " Added rate: tokenProductionRate = " << tokenProductionRate << ", excessTokenProductionRate = " << excessTokenProductionRate << ", tokenRate = " << tokenRate << std::endl;
77  }
78 }

Referenced by inet::queueing::TokenBucketMixin< PacketClassifierBase >::addTokenProductionRate().

◆ addTokens()

void inet::queueing::TokenBucket::addTokens ( double  numTokens)
overridevirtual

Implements inet::queueing::ITokenStorage.

28 {
29  ASSERT(addedNumTokens >= 0);
30  if (addedNumTokens > 0) {
31  EV_TRACE << " Adding tokens: numTokens = " << numTokens << ", addedNumTokens = " << addedNumTokens << std::endl;
32  numTokens += addedNumTokens;
33  if (maxNumTokens > 0 && numTokens >= maxNumTokens) {
34  if (excessTokenStorage != nullptr) {
38  }
40  }
41  EV_TRACE << " Added tokens: numTokens = " << numTokens << ", addedNumTokens = " << addedNumTokens << std::endl;
42  }
43 }

Referenced by inet::queueing::TokenBucketMixin< PacketClassifierBase >::addTokens(), TokenBucket(), and updateNumTokens().

◆ getExcessTokenStorage()

virtual ITokenStorage* inet::queueing::TokenBucket::getExcessTokenStorage ( ) const
inlinevirtual

◆ getNumTokens()

◆ getOverflowTime()

simtime_t inet::queueing::TokenBucket::getOverflowTime ( )
virtual

Returns the simulation time when the token bucket becomes full with the current rate of token production.

99 {
100  double numTokens = getNumTokens();
101  if (maxNumTokens > 0 && maxNumTokens != numTokens) {
102  simtime_t overflowTime = simTime() + (maxNumTokens - numTokens) / tokenProductionRate;
103  return SimTime::fromRaw(overflowTime.raw() + 1);
104  }
105  else
106  return -1;
107 }

Referenced by inet::queueing::TokenBucketMixin< PacketClassifierBase >::rescheduleOverflowTimer().

◆ removeTokenProductionRate()

void inet::queueing::TokenBucket::removeTokenProductionRate ( double  tokenRate)
overridevirtual

Implements inet::queueing::ITokenStorage.

81 {
82  ASSERT(tokenRate >= 0);
83  if (tokenRate > 0) {
84  EV_TRACE << " Removing rate: tokenProductionRate = " << tokenProductionRate << ", excessTokenProductionRate = " << excessTokenProductionRate << ", tokenRate = " << tokenRate << std::endl;
85  if (numTokens == maxNumTokens) {
86  if (excessTokenStorage != nullptr) {
89  excessTokenProductionRate -= tokenRate;
90  }
91  }
92  tokenProductionRate -= tokenRate;
93  ASSERT(tokenProductionRate >= 0);
94  EV_TRACE << " Removed rate: tokenProductionRate = " << tokenProductionRate << ", excessTokenProductionRate = " << excessTokenProductionRate << ", tokenRate = " << tokenRate << std::endl;
95  }
96 }

Referenced by inet::queueing::TokenBucketMixin< PacketClassifierBase >::removeTokenProductionRate().

◆ removeTokens()

void inet::queueing::TokenBucket::removeTokens ( double  numTokens)
overridevirtual

Implements inet::queueing::ITokenStorage.

46 {
47  ASSERT(removedNumTokens >= 0);
48  if (removedNumTokens > 0) {
49  EV_TRACE << " Removing tokens: numTokens = " << numTokens << ", removedNumTokens = " << removedNumTokens << std::endl;
50  if (numTokens == maxNumTokens && excessTokenStorage != nullptr) {
54  }
55  if (numTokens < removedNumTokens)
56  throw cRuntimeError("Insufficient number of tokens");
57  numTokens -= removedNumTokens;
58  EV_TRACE << " Removed tokens: numTokens = " << numTokens << ", removedNumTokens = " << removedNumTokens << std::endl;
59  }
60 }

Referenced by inet::queueing::TokenBucketClassifier::classifyPacket(), inet::queueing::TokenBucketMeter::meterPacket(), and inet::queueing::TokenBucketMixin< PacketClassifierBase >::removeTokens().

◆ updateNumTokens()

void inet::queueing::TokenBucket::updateNumTokens ( )
protected
110 {
111  simtime_t now = simTime();
112  simtime_t elapsedTime = now - lastUpdate;
113  addTokens(tokenProductionRate * elapsedTime.dbl());
114  lastUpdate = now;
115 }

Referenced by getNumTokens().

Member Data Documentation

◆ excessTokenProductionRate

double inet::queueing::TokenBucket::excessTokenProductionRate = 0
protected

◆ excessTokenStorage

ITokenStorage* inet::queueing::TokenBucket::excessTokenStorage = nullptr
protected

◆ lastUpdate

simtime_t inet::queueing::TokenBucket::lastUpdate
protected

Referenced by updateNumTokens().

◆ maxNumTokens

double inet::queueing::TokenBucket::maxNumTokens = -1
protected

◆ numTokens

double inet::queueing::TokenBucket::numTokens = 0
protected

◆ tokenProductionRate

double inet::queueing::TokenBucket::tokenProductionRate = 0
protected

The documentation for this class was generated from the following files:
inet::queueing::ITokenStorage::removeTokenProductionRate
virtual void removeTokenProductionRate(double tokenRate)=0
inet::queueing::TokenBucket::tokenProductionRate
double tokenProductionRate
Definition: TokenBucket.h:22
inet::queueing::TokenBucket::numTokens
double numTokens
Definition: TokenBucket.h:20
inet::queueing::TokenBucket::updateNumTokens
void updateNumTokens()
Definition: TokenBucket.cc:109
inet::queueing::TokenBucket::addTokens
virtual void addTokens(double numTokens) override
Definition: TokenBucket.cc:27
inet::queueing::TokenBucket::excessTokenProductionRate
double excessTokenProductionRate
Definition: TokenBucket.h:23
inet::queueing::TokenBucket::maxNumTokens
double maxNumTokens
Definition: TokenBucket.h:21
inet::queueing::TokenBucket::lastUpdate
simtime_t lastUpdate
Definition: TokenBucket.h:26
inet::queueing::ITokenStorage::addTokens
virtual void addTokens(double numTokens)=0
inet::queueing::ITokenStorage::addTokenProductionRate
virtual void addTokenProductionRate(double tokenRate)=0
inet::queueing::TokenBucket::getNumTokens
virtual double getNumTokens() const override
Definition: TokenBucket.cc:21
inet::queueing::TokenBucket::TokenBucket
TokenBucket()
Definition: TokenBucket.h:32
inet::queueing::TokenBucket::excessTokenStorage
ITokenStorage * excessTokenStorage
Definition: TokenBucket.h:24