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

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * dewp.cc
  3.  * Copyright (C) 1999 by the University of Southern California
  4.  * $Id: dewp.cc,v 1.2 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. // dewp.h (Early worm propagation detection)
  47. //   by Xuan Chen (xuanc@isi.edu), USC/ISI
  48. #include "ip.h"
  49. #include "tcp.h"
  50. #include "tcp-full.h"
  51. #include "random.h"
  52. #include "dewp.h"
  53. BPEntry *DEWPPolicy::bport_list = NULL;
  54. // Initialize parameters
  55. double DEWPPolicy::dt_inv_ = DT_INV;
  56. double DEWPPolicy::beta = 0.5;
  57. double DEWPPolicy::alpha = 0.125;
  58. // num per second
  59. int DEWPPolicy::anum_th = 50;
  60. // EW Policy: deal with queueing stuffs.
  61. //Constructor.  
  62. DEWPPolicy::DEWPPolicy() : Policy() {
  63.   // Initialize detectors
  64.   cdewp = NULL;
  65.   bport_list = new BPEntry[P_LEN];
  66.   for (int i = 0; i < P_LEN; i++) {
  67.     dport_list[i] = 0;
  68.     bport_list[i].s = bport_list[i].b = 0;
  69.     bport_list[i].anum = bport_list[i].last_anum = bport_list[i].avg_anum = 0;
  70.     bport_list[i].last_time = 0;
  71.     bport_list[i].aset = NULL;
  72.   }
  73. }
  74. //Deconstructor.
  75. DEWPPolicy::~DEWPPolicy(){
  76.   if (cdewp)
  77.     free(cdewp);
  78.   for (int i = 0; i < P_LEN; i++) {
  79.     if (bport_list[i].aset) {
  80.       AddrEntry * p = bport_list[i].aset;
  81.       AddrEntry * q;
  82.       while (p) {
  83.         q = p->next;
  84.         free(p);
  85.         p = q;
  86.       }
  87.     }
  88.   }
  89. }
  90. // Initialize the DEWP parameters
  91. void DEWPPolicy::init(double dt_inv) {
  92.   dt_inv_ = dt_inv;
  93.   //printf("%fn", dt_inv_);
  94. }
  95. // DEWP meter: do nothing.
  96. //  measurement is done in policer: we need to know whether the packet is
  97. //    dropped or not.
  98. void DEWPPolicy::applyMeter(policyTableEntry *policy, Packet *pkt) {
  99.   hdr_ip* iph = hdr_ip::access(pkt);
  100.   dport_list[iph->dport()] = Scheduler::instance().clock();
  101.   return;
  102. }
  103. // DEWP Policer
  104. //  1. do measurement: P: both arrival and departure; B: only departure
  105. //  2. make packet drop decisions
  106. int DEWPPolicy::applyPolicer(policyTableEntry *policy, policerTableEntry *policer, Packet *pkt) {
  107.   //printf("enter applyPolicer ");
  108.   // can't count/penalize ACKs:
  109.   //   with resp: may cause inaccurate calculation with TSW(??)
  110.   //   with req:  may cause resp retransmission.
  111.   // just pass them through
  112.   hdr_ip* iph = hdr_ip::access(pkt);
  113.   detect(pkt);
  114.   if (bport_list[iph->dport()].b) {
  115.     //printf("downgrade!n");
  116.     return(policer->downgrade1);
  117.   } else {
  118.     //printf("initial!n");
  119.     return(policer->initialCodePt);
  120.   }
  121. }
  122. // detect if there is alarm triggered
  123. void DEWPPolicy::detect(Packet *pkt) {
  124.   // it is not for outbound traffic
  125.   if (!cdewp)
  126.     return;
  127.   // get the current time
  128.   now = Scheduler::instance().clock();
  129.   // get IP header
  130.   hdr_ip* iph = hdr_ip::access(pkt);
  131.   int dport = iph->dport();
  132.   unsigned int daddr = iph->daddr();
  133.   // use dport matching to find suspects
  134.   if (dport_list[dport] > 0 && (cdewp->dport_list[dport]) > 0 &&
  135.       now - dport_list[dport]< dt_inv_ &&
  136.       now - cdewp->dport_list[dport] < dt_inv_) {
  137. if (bport_list[dport].s == 0) {
  138.       printf("S %.2f %dn", now, dport);
  139.       bport_list[dport].s = 1;
  140.     }
  141.   }
  142.   // count outbound traffic only
  143.   if (bport_list[dport].s == 1 && daddr > 0) {
  144.     AddrEntry * p = bport_list[dport].aset; 
  145.     
  146.     while (p) {
  147.       if (p->addr == daddr) {
  148.         break;
  149.       }
  150.       p = p->next;
  151.     }
  152.     
  153.     if (!p) {
  154.       AddrEntry * new_addr = new AddrEntry;
  155.       
  156.       new_addr->addr = daddr;
  157.       new_addr->next = NULL;
  158.       
  159.       if (bport_list[dport].aset) {
  160.         new_addr->next = bport_list[dport].aset;
  161.       };
  162.       bport_list[dport].aset = new_addr;
  163.     }
  164.     bport_list[dport].anum++;
  165.    
  166.     /* debug purpose only
  167.     p = bport_list[dport].aset;
  168.     printf("[%d] ", dport);
  169.     while (p) {
  170.       printf("%u ", p->addr);
  171.       p = p->next;
  172.     }
  173.     printf("n");
  174.     */
  175.     if (now - bport_list[dport].last_time > dt_inv_) {
  176.           //printf("DT %f %d %d %dn", now, dport, bport_list[dport].anum, bport_list[dport].avg_anum);
  177.       if (bport_list[dport].anum > anum_th * dt_inv_ &&
  178.           bport_list[dport].avg_anum > 0 &&
  179.           bport_list[dport].anum > (1 + beta) * bport_list[dport].avg_anum) {
  180.         if (bport_list[dport].b == 0) {
  181.           bport_list[dport].b = 1;
  182.           printf("B %.2f %d %d %dn", now, dport, bport_list[dport].anum, bport_list[dport].avg_anum);
  183.         }
  184.       }
  185.       
  186.       bport_list[dport].avg_anum = (int) (alpha * bport_list[dport].avg_anum + 
  187.                                        (1 - alpha) * bport_list[dport].anum);
  188.       if (bport_list[dport].avg_anum == 0 && bport_list[dport].anum > 0)
  189.        bport_list[dport].avg_anum = bport_list[dport].anum;
  190.       bport_list[dport].last_anum = bport_list[dport].anum;
  191.       bport_list[dport].anum = 0;
  192.       bport_list[dport].last_time = now;
  193.     }
  194.     
  195.   }
  196.   
  197. }
  198. //  make packet drop decisions
  199. int DEWPPolicy::dropPacket(Packet *pkt) {
  200.  
  201.   return(0);
  202. }
  203. // couple DEWP detector
  204. void DEWPPolicy::couple(DEWPPolicy *ewpc) {
  205.   cdewp = ewpc;
  206. }
  207. // End of DEWP