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 DS_POLICY_H
00038 #define DS_POLICY_H
00039 #include "dsred.h"
00040
00041 #define ANY_HOST -1 // Add to enable point to multipoint policy
00042 #define FLOW_TIME_OUT 5.0 // The flow does not exist already.
00043 #define MAX_POLICIES 20 // Max. size of Policy Table.
00044
00045 #define Null 0
00046 #define TSW2CM 1
00047 #define TSW3CM 2
00048 #define TB 3
00049 #define SRTCM 4
00050 #define TRTCM 5
00051 #define SFD 6
00052 #define EW 7
00053 #define DEWP 8
00054
00055 enum policerType {nullPolicer, TSW2CMPolicer, TSW3CMPolicer, tokenBucketPolicer, srTCMPolicer, trTCMPolicer, SFDPolicer, EWPolicer, DEWPPolicer};
00056
00057 enum meterType {nullMeter, tswTagger, tokenBucketMeter, srTCMMeter, trTCMMeter, sfdTagger, ewTagger, dewpTagger};
00058
00059 class Policy;
00060 class TBPolicy;
00061
00062
00063 struct policyTableEntry {
00064 nsaddr_t sourceNode, destNode;
00065 int policy_index;
00066 policerType policer;
00067 meterType meter;
00068 int codePt;
00069 double cir;
00070 double cbs;
00071 double cBucket;
00072 double ebs;
00073 double eBucket;
00074 double pir;
00075 double pbs;
00076 double pBucket;
00077 double arrivalTime;
00078 double avgRate, winLen;
00079 };
00080
00081
00082
00083 struct policerTableEntry {
00084 policerType policer;
00085 int initialCodePt;
00086 int downgrade1;
00087 int downgrade2;
00088 int policy_index;
00089 };
00090
00091
00092 class PolicyClassifier : public TclObject {
00093 public:
00094 PolicyClassifier();
00095 void addPolicyEntry(int argc, const char*const* argv);
00096 void addPolicerEntry(int argc, const char*const* argv);
00097 void updatePolicyRTT(int argc, const char*const* argv);
00098 double getCBucket(const char*const* argv);
00099 int mark(Packet *pkt);
00100
00101
00102 void printPolicyTable();
00103 void printPolicerTable();
00104
00105
00106
00107 Policy *policy_pool[MAX_POLICIES];
00108
00109 protected:
00110
00111 policyTableEntry policyTable[MAX_POLICIES];
00112 int policyTableSize;
00113
00114 policerTableEntry policerTable[MAX_CP];
00115 int policerTableSize;
00116
00117 policyTableEntry* getPolicyTableEntry(nsaddr_t source, nsaddr_t dest);
00118 policerTableEntry* getPolicerTableEntry(int policy_index, int oldCodePt);
00119 };
00120
00121
00122
00123 class Policy : public TclObject {
00124 public:
00125 Policy(){};
00126
00127
00128
00129
00130 virtual void applyMeter(policyTableEntry *policy, Packet *pkt) = 0;
00131 virtual int applyPolicer(policyTableEntry *policy, policerTableEntry *policer, Packet *pkt) = 0;
00132 };
00133
00134
00135
00136 class NullPolicy : public Policy {
00137 public:
00138 NullPolicy() : Policy(){};
00139
00140
00141 void applyMeter(policyTableEntry *policy, Packet *pkt);
00142 int applyPolicer(policyTableEntry *policy, policerTableEntry *policer, Packet *pkt);
00143 };
00144
00145 class TSW2CMPolicy : public Policy {
00146 public:
00147 TSW2CMPolicy() : Policy(){};
00148
00149
00150
00151 void applyMeter(policyTableEntry *policy, Packet *pkt);
00152 int applyPolicer(policyTableEntry *policy, policerTableEntry *policer, Packet *pkt);
00153 };
00154
00155 class TSW3CMPolicy : public Policy {
00156 public:
00157 TSW3CMPolicy() : Policy(){};
00158
00159
00160 void applyMeter(policyTableEntry *policy, Packet *pkt);
00161 int applyPolicer(policyTableEntry *policy, policerTableEntry *policer, Packet *pkt);
00162 };
00163
00164 class TBPolicy : public Policy {
00165 public:
00166 TBPolicy() : Policy(){};
00167
00168
00169
00170 void applyMeter(policyTableEntry *policy, Packet *pkt);
00171 int applyPolicer(policyTableEntry *policy, policerTableEntry *policer, Packet *pkt);
00172 };
00173
00174 class SRTCMPolicy : public Policy {
00175 public:
00176 SRTCMPolicy() : Policy(){};
00177
00178
00179 void applyMeter(policyTableEntry *policy, Packet *pkt);
00180 int applyPolicer(policyTableEntry *policy, policerTableEntry *policer, Packet *pkt);
00181 };
00182
00183 class TRTCMPolicy : public Policy {
00184 public:
00185 TRTCMPolicy() : Policy(){};
00186
00187
00188 void applyMeter(policyTableEntry *policy, Packet *pkt);
00189 int applyPolicer(policyTableEntry *policy, policerTableEntry *policer, Packet *pkt);
00190 };
00191
00192 struct flow_entry {
00193 int fid;
00194 int src_id;
00195 int dst_id;
00196 double last_update;
00197 int bytes_sent;
00198 int count;
00199 struct flow_entry *next;
00200 };
00201
00202 struct flow_list {
00203 struct flow_entry *head;
00204 struct flow_entry *tail;
00205 };
00206
00207 class SFDPolicy : public Policy {
00208 public:
00209 SFDPolicy();
00210 ~SFDPolicy();
00211
00212
00213 void applyMeter(policyTableEntry *policy, Packet *pkt);
00214 int applyPolicer(policyTableEntry *policy, policerTableEntry *policer, Packet *pkt);
00215
00216 void printFlowTable();
00217
00218 protected:
00219
00220 struct flow_list flow_table;
00221 };
00222
00223 #endif