ew.h
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:10k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * ew.h
  3.  * Copyright (C) 1999 by the University of Southern California
  4.  * $Id: ew.h,v 1.6 2005/08/25 18:58:03 johnh Exp $
  5.  *
  6.  * This program is free software; you can redistribute it and/or
  7.  * modify it under the terms of the GNU General Public License,
  8.  * version 2, as published by the Free Software Foundation.
  9.  *
  10.  * This program is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  * GNU General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU General Public License along
  16.  * with this program; if not, write to the Free Software Foundation, Inc.,
  17.  * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
  18.  *
  19.  *
  20.  * The copyright of this module includes the following
  21.  * linking-with-specific-other-licenses addition:
  22.  *
  23.  * In addition, as a special exception, the copyright holders of
  24.  * this module give you permission to combine (via static or
  25.  * dynamic linking) this module with free software programs or
  26.  * libraries that are released under the GNU LGPL and with code
  27.  * included in the standard release of ns-2 under the Apache 2.0
  28.  * license or under otherwise-compatible licenses with advertising
  29.  * requirements (or modified versions of such code, with unchanged
  30.  * license).  You may copy and distribute such a system following the
  31.  * terms of the GNU GPL for this module and the licenses of the
  32.  * other code concerned, provided that you include the source code of
  33.  * that other code when and as the GNU GPL requires distribution of
  34.  * source code.
  35.  *
  36.  * Note that people who make modified versions of this module
  37.  * are not obligated to grant this special exception for their
  38.  * modified versions; it is their choice whether to do so.  The GNU
  39.  * General Public License gives permission to release a modified
  40.  * version without this exception; this exception also makes it
  41.  * possible to release a modified version which carries forward this
  42.  * exception.
  43.  *
  44.  */
  45. //
  46. // ew.h (Network early warning system)
  47. //   by Xuan Chen (xuanc@isi.edu), USC/ISI
  48. #ifndef EW_H
  49. #define EW_H
  50. #include "packet.h"
  51. #include "dsPolicy.h"
  52. #define EW_MAX_WIN 8
  53. #define EW_SWIN_SIZE 4
  54. // tolerance of changes for detection and release
  55. #define EW_DETECT_RANGE 0.1
  56. #define EW_RELEASE_RANGE 0.1
  57. // the max and min dropping probability
  58. #define EW_MIN_DROP_P 0.1
  59. #define EW_MAX_DROP_P 0.9
  60. #define EW_FLOW_TIME_OUT 10.0
  61. #define EW_SAMPLE_INTERVAL 240
  62. #define EW_DETECT_INTERVAL 60
  63. #define EW_MIN_SAMPLE_INTERVAL 60
  64. #define EW_MIN_DETECT_INTERVAL 15
  65. // HLF's alpha
  66. #define ALPHA 0.875
  67. #define PKT_ARRIVAL 1001
  68. #define PKT_DEPT 1002
  69. #define PKT_DROP 1003
  70. #define EW_DT_INV 240
  71. #define EW_DB_INV EW_DT_INV
  72. #define EW_UNCHANGE -1
  73. // The default tocken-bucket size and tocken rate (in packet/byte)
  74. #define DEFAULT_TB_SIZE 50
  75. #define DEFAULT_TB_RATE_P 5
  76. #define DEFAULT_TB_RATE_B 1000
  77. // EW
  78. // Record the number of packet arrived, departured, and dropped
  79. struct PktRec {
  80.   int arrival, dept, drop;
  81. };
  82. // Record the detection result
  83. struct AListEntry {
  84.   int src_id;
  85.   int dst_id;
  86.   int f_id;
  87.   double last_update;
  88.   double avg_rate;
  89.   double t_front;
  90.   double win_length;
  91.   struct AListEntry *next;
  92. };
  93. // List of detection result for aggregates
  94. struct AList {
  95.   struct AListEntry *head, *tail;
  96.   int count;
  97. };
  98. // Record the request ratio
  99. struct SWinEntry {
  100.   float weight;
  101.   int rate;
  102.   struct SWinEntry *next;
  103. };
  104. // Data structure for sliding window
  105. struct SWin {
  106.   // counter of entries in the sliding window
  107.   int count;
  108.   // current running average
  109.   int ravg;
  110.   // List of SWin Entries
  111.   struct SWinEntry *head;
  112.   struct SWinEntry *tail;
  113. };
  114. // Data structure for High-low filter
  115. // high(t) = alpha * high(t-1) + (1 - alpha) * o(t)
  116. // low(t) = (1 - alpha) * low(t-1) + alpha * o(t)
  117. class HLF {
  118.  public:
  119.   HLF();
  120.   // configure the HLF
  121.   void setAlpha(double);
  122.   void reset(double value);
  123.   void reset();
  124.   // Get the output of HLF
  125.   double getHigh();
  126.   double getLow();
  127.   // update high-low filter
  128.   void update(double);
  129.  private:
  130.   double alpha;
  131.   
  132.   // the estimated value for the high-pass/low-pass filters
  133.   double high, low;
  134. };
  135. // Definition for a token-bucket rate limitor
  136. class TBrateLimitor {
  137.  public:
  138.   TBrateLimitor();
  139.   TBrateLimitor(double);
  140.   // set the rate
  141.   void setRate(double);
  142.   // adjust the rate
  143.   void adjustRate();
  144.   // parameters for a token bucket
  145.   // the size of the token bucket (in bytes or packets)
  146.   double bucket_size;             
  147.   // number of tokens in the bucket (in bytes or packets)
  148.   double token_num;
  149.   // the rate to generate tokens
  150.   double token_rate, ini_token_rate, last_token_rate;
  151.   // last time when updating states
  152.   double last_time;
  153.   // in packet or byte mode (packet mode, by default)
  154.   int pkt_mode;
  155.   int run(double);
  156.   int run(double, double); 
  157.   // states to determine the direction of increasing/decreasing rate
  158.   int n_score, p_score;
  159.   // High-low filter
  160.   HLF hlf;
  161.   // adjust the score for increasing or decreasing scores
  162.   void resetScore();
  163.   void adjustScore(int);
  164. };
  165. // Definition for the EW detector
  166. class EWdetector {
  167.  public:
  168.   EWdetector();
  169.   virtual ~EWdetector() {}
  170.   // Enable detecting and debugging rate (eg: pkt or bit rate)
  171.   void setDb(int);
  172.   void setDt(int);
  173.   void setLink(int, int);
  174.   // set and clean alarm
  175.   void setAlarm();
  176.   void resetAlarm();
  177.   int testAlarm();
  178.   void setChange();
  179.   void resetChange();
  180.   //private:
  181.   // The nodes connected by EW
  182.   int ew_src, ew_dst;
  183.   // The current time
  184.   double now;
  185.   // The timer for detection and debugging
  186.   int db_timer, dt_timer;
  187.   // Detecting interval
  188.   int dt_inv, db_inv;
  189.   // Current rate and long term average
  190.   double cur_rate, avg_rate;
  191.   // The alarm flag and proposed dropping probability
  192.   int alarm;
  193.   int change;
  194.   // High-low filter
  195.   HLF hlf;
  196.   // Detecting engine
  197.   void run(Packet *);
  198.   // Conduct measurement
  199.   virtual void measure(Packet *) = 0;
  200.   // Detect changes
  201.   virtual void detect() = 0;
  202.   // Update current measurement 
  203.   virtual void updateCur() = 0;
  204.   // Update long term average
  205.   void updateAvg();
  206.   // Trace function
  207.   virtual void trace() = 0;
  208. };
  209. class EWdetectorP : public EWdetector {
  210.  public:
  211.   EWdetectorP();
  212.   virtual ~EWdetectorP();
  213.   // update packet stats
  214.   void updateStats(int);
  215.   // get the current request rate
  216.   double getRate();
  217.  private:
  218.   // keep the packet rate stats
  219.   PktRec cur_p, last_p, last_p_db;
  220.   // Conduct measurement
  221.   void measure(Packet *);
  222.   // Detect changes
  223.   void detect();
  224.   // Update current measurement 
  225.   void updateCur();
  226.   // Update long term average
  227.   void updateAvg();
  228.   // Trace function
  229.   void trace();
  230. };
  231. // EW
  232. class EWdetectorB : public EWdetector {
  233.  public:
  234.   EWdetectorB();
  235.   virtual ~EWdetectorB();
  236.   // Initialize EW
  237.   void init(int);
  238.   // Check if the packet belongs to existing flow
  239.   int exFlow(Packet *);
  240.  private:
  241.   // Adjustor
  242.   float adjustor;
  243.   float drop_p;
  244.   // keep the count of flows for ARR
  245.   int arr_count;
  246.   // List to keep the detection results
  247.   struct AList alist;
  248.   // The sliding window for running average on the aggregated response rate
  249.   struct SWin swin;
  250.   
  251.   // Conduct measurement
  252.   void measure(Packet *);
  253.   // Update current measurement 
  254.   void updateCur();
  255.   // Update long term average
  256.   void updateAvg();
  257.   // Change detection:
  258.   // detect the traffic change in aggregated response rate
  259.   void detect();
  260.   
  261.   // Measurement:
  262.   // Conduct the measurement and update AList
  263.   void updateAList(Packet *);
  264.   // Find the max value in AList
  265.   struct AListEntry *getMaxAList();
  266.   // Sort AList based on the avg_rate
  267.   void sortAList();
  268.   // Timeout AList entries
  269.   void timeoutAList();
  270.   // Find the matched AList entry
  271.   struct AListEntry * searchAList(int, int, int);
  272.   // Add new entry to AList
  273.   struct AListEntry * newAListEntry(int, int, int);
  274.   // Get the median of AList
  275.   int getMedianAList(int, int);
  276.   // Get the rate given the index in the list
  277.   int getRateAList(int);
  278.   // Reset AList
  279.   void resetAList();
  280.   // Print one entry in AList
  281.   void printAListEntry(struct AListEntry *, int);
  282.   // output contents in AList
  283.   void printAList();
  284.   // Calculate the aggragated response rate for high-bandwidth flows
  285.   int computeARR();
  286.   // Determine the dropping probability based on current measurement
  287.   void computeDropP();
  288.   // Increase/decrease the sample interval to adjust the detection latency.
  289.   void decSInv();
  290.   void incSInv();
  291.   // Trace bit rate (resp rate)
  292.   void trace();
  293.   // update swin with the latest measurement for one HTab entry.
  294.   void updateSWin(int);
  295.   // compute the running average on the sliding window
  296.   void ravgSWin();
  297.   // Reset SWin
  298.   void resetSWin();
  299.   // output contents in SWin
  300.   void printSWin();
  301.   // Print one entry in SWin
  302.   void printSWinEntry(struct SWinEntry *, int);
  303. };
  304. // Eearly warning policy: 
  305. //  basically queueing stuffs
  306. class EWPolicy : public Policy {
  307.  public:
  308.   EWPolicy();
  309.   ~EWPolicy();
  310.   void init(int, int, int);
  311.   
  312.   // Metering and policing methods:
  313.   void applyMeter(policyTableEntry *policy, Packet *pkt);
  314.   int applyPolicer(policyTableEntry *policy, policerTableEntry *policer, Packet *pkt);
  315.   //  make packet drop decisions
  316.   int dropPacket(Packet *);
  317.   // detect if there is an alarm triggered
  318.   void detect(Packet *pkt);
  319.   
  320.   // Enable detecting and debugging packet rate (eg: req rate)
  321.   void detectPr();
  322.   void detectPr(int);
  323.   void detectPr(int, int);
  324.   // Enable detecting and debugging bit rate (eg: resp rate)
  325.   void detectBr();
  326.   void detectBr(int);
  327.   void detectBr(int, int);
  328.  
  329.   // Rate limitor: packet rate
  330.   void limitPr();
  331.   void limitPr(double);
  332.   // Rate limitor: bit rate
  333.   void limitBr();
  334.   void limitBr(double);
  335.   // couple EW detector
  336.   void coupleEW(EWPolicy *);
  337.   void coupleEW(EWPolicy *, double);
  338.   //protected:
  339.   EWdetectorB *ewB, *cewB;
  340.   EWdetectorP *ewP, *cewP;
  341.   TBrateLimitor *rlP, *rlB;
  342.   
  343.  private:
  344.   // The current time
  345.   double now;
  346.   
  347.   // indicator for detecting and debugging
  348.   int ew_adj, qsrc, qdst;
  349.   // rate limits
  350.   int max_p, max_b;
  351.   // ew alarm
  352.   int alarm, pre_alarm;
  353.   int change;
  354. };
  355. #endif