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

通讯编程

开发平台:

Visual C++

  1. #ifndef ident_tree_h
  2. #define ident_tree_h
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include "address.h"
  6. #include "packet.h"
  7. #include "ip.h"
  8. #include "tcl.h"
  9. #include "math.h"
  10. #include "pushback-constants.h"
  11. class AggSpec;
  12. struct cluster {
  13.   int prefix_;
  14.   int bits_;
  15.   int count_;
  16. };
  17. class AggReturn {
  18.  public:
  19.   cluster * clusterList_;
  20.   double limit_;
  21.   int finalIndex_;
  22.   int totalCount_;
  23.   AggReturn(cluster * clusterList, double bottom, int finalIndex, int totalCount) {
  24.     clusterList_ = clusterList;
  25.     limit_ = bottom;
  26.     finalIndex_ = finalIndex;
  27.     totalCount_=totalCount;
  28.   }
  29.   ~AggReturn() {
  30.     free(clusterList_);
  31.   }
  32. };
  33. class DropHashTable {
  34.  public:
  35.   Tcl_HashTable * hashTable_;
  36.   int count_;
  37.   char key[200];   //generous space for key
  38.   DropHashTable():count_(0) {
  39.     hashTable_ = new Tcl_HashTable;
  40.     Tcl_InitHashTable(hashTable_, TCL_STRING_KEYS);
  41.   }
  42.   
  43.   void 
  44.   packetToKey(Packet *p) {
  45.     hdr_ip * iph = hdr_ip::access(p);
  46.     ns_addr_t src = iph->src();
  47.     ns_addr_t dst = iph->dst();
  48.     int fid = iph->flowid();
  49.     sprintf(key,"%d.%d %d.%d %d",src.addr_, src.port_, dst.addr_, dst.port_, fid);
  50.   }
  51.     
  52.   void 
  53.   insert(Packet *p, int size) {
  54.     count_+=size;
  55.     int new_entry;
  56.     long oldValue;
  57.     packetToKey(p);
  58.     Tcl_HashEntry* he = Tcl_CreateHashEntry(hashTable_, (char*) key, &new_entry);
  59.     if (new_entry) 
  60.       oldValue = 0;
  61.     else 
  62.       oldValue = (long)Tcl_GetHashValue(he);
  63.     
  64.     //printf("old value = %d", oldValue);
  65.     oldValue+=size;
  66.     Tcl_SetHashValue(he, oldValue);
  67.   }
  68.    
  69.   void 
  70.   traverse() {
  71.     printf("DropHash count = %dn", count_);
  72.     Tcl_HashSearch searchPtr;
  73.     Tcl_HashEntry * he = Tcl_FirstHashEntry(hashTable_, &searchPtr);
  74.     while (he != NULL) {
  75.       char * key = Tcl_GetHashKey(hashTable_, he);
  76.       long value = (long)Tcl_GetHashValue(he);
  77.       printf("%s = %ldn", key, value);
  78.       he = Tcl_NextHashEntry(&searchPtr);
  79.     }
  80.   }
  81.    
  82.   void
  83.   reset() {
  84.     count_=0;
  85.     Tcl_DeleteHashTable(hashTable_);
  86.     Tcl_InitHashTable(hashTable_, TCL_STRING_KEYS);
  87.   }
  88. };
  89.   
  90. class PrefixTree {
  91.  public:
  92.   int countArray[(1 << (NO_BITS+1)) - 1];
  93.     
  94.   PrefixTree();
  95.   void reset();
  96.   void traverse();
  97.   void registerDrop(int address, int size);
  98.   
  99.   static int getLastIndex() {return (1 << (NO_BITS+1)) - 2;}
  100.   static int getMaxAddress();
  101.   static int getBitI(int address, int i);
  102.   static int getIndexFromPrefix(int prefix, int noBits);
  103.   static int getIndexFromAddress(int address, int noBits);
  104.   static int getPrefixFromIndex(int index);
  105.   static int getNoBitsFromIndex(int index);
  106.   static int getFirstIndexOfBit(int noBits);
  107.   static int getLastIndexOfBit(int noBits);
  108.   static int getPrefixBits(int prefix, int noBits);
  109.   AggReturn * identifyAggregate(double arrRate, double linkBW);
  110.   void insertCluster(cluster * clusterList, int index, int count, int noBits);
  111.   void goDownCluster(cluster * clusterList, int index);
  112.   void sortCluster(cluster * clusterList, int lastIndex);
  113.   void swapCluster(cluster * clusterList, int id1, int id2);
  114.   AggReturn * calculateLowerBound(); 
  115. };
  116. class IdentStruct {
  117.  public:
  118.   PrefixTree * dstTree_;
  119.   PrefixTree * srcTree_;
  120.   DropHashTable* dropHash_;
  121.   
  122.   double lowerBound_;
  123.   void setLowerBound(double newBound, int averageIt);
  124.   AggReturn * calculateLowerBound();
  125.   
  126.   IdentStruct();
  127.   
  128.   void reset();
  129.   void traverse();
  130.   
  131.   void registerDrop(Packet *);
  132.   
  133.   static unsigned int getMaxAddress();
  134.   static int getBitI(unsigned int, int);
  135.  
  136.   AggReturn * identifyAggregate(double arrRate, double linkBW);
  137.   
  138. };
  139. #endif