00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #ifndef ns_rate_limit_strategy_h
00038 #define ns_rate_limit_strategy_h
00039
00040 #include "pushback-constants.h"
00041 #include "packet.h"
00042 #include "rate-estimator.h"
00043 #include "timer-handler.h"
00044
00045
00046 class RateLimiter {
00047 public:
00048 virtual ~RateLimiter () {}
00049 virtual int rateLimit(Packet * p, double estRate, double targetRate,
00050 int mine, int lowDemand)=0;
00051 virtual void reset()=0;
00052 };
00053
00054 class PacketTypeLog;
00055
00056 class RateLimitStrategy {
00057 public:
00058 double target_rate_;
00059 double reset_time_;
00060
00061 RateEstimator * rateEstimator_;
00062 RateLimiter * rateLimiter_;
00063
00064 int ptype_;
00065 double ptype_share_;
00066 RateEstimator * ptypeRateEstimator_;
00067 RateLimiter * ptypeRateLimiter_;
00068
00069 PacketTypeLog * ptypeLog_;
00070
00071 RateLimitStrategy(double rate, int ptype, double share, double estimate);
00072 ~RateLimitStrategy();
00073 double process(Packet * p, int mine, int lowDemand);
00074 void restrictPacketType(int type, double share, double actual);
00075
00076 double getDropRate();
00077 double getArrivalRate();
00078 void reset();
00079 };
00080
00081 class PacketTypeLog : public TimerHandler {
00082
00083 public:
00084 int count_;
00085 int typeCount_[MAX_PACKET_TYPES];
00086 RateLimitStrategy * rlStrategy_;
00087 PacketTypeLog(RateLimitStrategy *);
00088 virtual ~PacketTypeLog();
00089
00090 void log(Packet *);
00091 static int mapTypeToIndex(int type);
00092 static int mapIndexToType(int index);
00093 static double mapTypeToShare(int type);
00094
00095 protected:
00096 void expire(Event *e);
00097
00098 };
00099
00100 class TokenBucketRateLimiter: public RateLimiter {
00101 public:
00102
00103 double bucket_depth_;
00104
00105
00106 double tbucket_;
00107 double time_last_token_;
00108 double total_passed_;
00109 double total_dropped_;
00110
00111 TokenBucketRateLimiter();
00112 virtual ~TokenBucketRateLimiter () {}
00113 int rateLimit(Packet * p, double estRate, double targetRate, int mine, int lowDemand);
00114 void reset();
00115 };
00116
00117 class PrefDropRateLimiter : public RateLimiter {
00118 public:
00119
00120
00121
00122
00123
00124
00125 };
00126
00127
00128 #endif