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 #ifndef _RED_ROUTER_H_
00027 #define _RED_ROUTER_H_
00028
00029 #include <assert.h>
00030 #include <stdio.h>
00031 #include <math.h>
00032
00033
00034 class RedRouter {
00035 double MinTh, MaxTh, MaxP;
00036 double Lambda_L;
00037 double Lambda_H;
00038
00039 void Populate();
00040 public:
00041 RedRouter(int mTh, int MTh, double MP) {
00042 MinTh = mTh;
00043 MaxTh = MTh;
00044 MaxP = MP;
00045 Populate();
00046 }
00047 double ComputeProbability(double Lambda, double &Delay);
00048 short Identical(int mTh, int MTh, double MP) {
00049 return (mTh == MinTh &&
00050 MTh == MaxTh &&
00051 MP == MaxP);
00052 }
00053 };
00054
00055 void RedRouter::Populate() {
00056
00057 Lambda_L = ((double)MinTh)/((double)(1+MinTh));
00058
00059
00060 if (MaxP < 1)
00061 Lambda_H = ((double)MaxTh)/((double)(1+MaxTh))/(1-MaxP);
00062 }
00063
00064
00065 double RedRouter::ComputeProbability(double Lambda, double &delay) {
00066 double p;
00067
00068 if (Lambda <= Lambda_L) {
00069 delay = Lambda/(1-Lambda);
00070 return 0;
00071 }
00072
00073 if (MaxP < 1 && Lambda > Lambda_H) {
00074 delay = MaxTh;
00075 p = (Lambda - Lambda_H*(1 - MaxP))/Lambda;
00076 return p;
00077 }
00078
00079
00080 double a, b, c;
00081 a = Lambda * (MaxTh - MinTh)/(MaxP);
00082 b = (MaxTh - MinTh)*(1-Lambda)/MaxP + MinTh * Lambda + Lambda;
00083 c = MinTh*(1-Lambda)-Lambda;
00084
00085 p = (-b + sqrt(b*b - 4 * a * c))/(2 * a);
00086 delay = Lambda*(1-p)/(1-(Lambda*(1-p)));
00087 return p;
00088 }
00089
00090
00091 #endif
00092
00093
00094
00095
00096
00097