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