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

通讯编程

开发平台:

Visual C++

  1. #include "agg-spec.h"
  2. /* -*-  Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  3. /*
  4.  * Copyright (c) 2000  International Computer Science Institute
  5.  * All rights reserved.
  6.  *
  7.  * Redistribution and use in source and binary forms, with or without
  8.  * modification, are permitted provided that the following conditions
  9.  * are met:
  10.  * 1. Redistributions of source code must retain the above copyright
  11.  *    notice, this list of conditions and the following disclaimer.
  12.  * 2. Redistributions in binary form must reproduce the above copyright
  13.  *    notice, this list of conditions and the following disclaimer in the
  14.  *    documentation and/or other materials provided with the distribution.
  15.  * 3. All advertising materials mentioning features or use of this software
  16.  *    must display the following acknowledgement:
  17.  * This product includes software developed by ACIRI, the AT&T 
  18.  *      Center for Internet Research at ICSI (the International Computer
  19.  *      Science Institute).
  20.  * 4. Neither the name of ACIRI nor of ICSI may be used
  21.  *    to endorse or promote products derived from this software without
  22.  *    specific prior written permission.
  23.  *
  24.  * THIS SOFTWARE IS PROVIDED BY ICSI AND CONTRIBUTORS ``AS IS'' AND
  25.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  26.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  27.  * ARE DISCLAIMED.  IN NO EVENT SHALL ICSI OR CONTRIBUTORS BE LIABLE
  28.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  29.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  30.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  31.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  32.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  33.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  34.  * SUCH DAMAGE.
  35.  *
  36.  * @(#) $Header: /cvsroot/nsnam/ns-2/pushback/agg-spec.cc,v 1.6 2001/01/20 21:41:45 sfloyd Exp $ (ACIRI)
  37.  */
  38. #include "ip.h"
  39. #include "ident-tree.h"
  40. AggSpec::AggSpec(int dstON, int dstPrefix, int dstBits) {
  41.   dstON_ = dstON;
  42.   dstPrefix_ = dstPrefix;
  43.   dstBits_ = dstBits;
  44.   
  45.   ptype_=-1;
  46.   ptypeShare_=0;
  47. }
  48. AggSpec::AggSpec(AggSpec * orig) {
  49.   dstON_ = orig->dstON_;
  50.   dstPrefix_ = orig->dstPrefix_;
  51.   dstBits_ = orig->dstBits_;
  52.   ptype_ = orig->ptype_;
  53.   ptypeShare_=orig->ptypeShare_;
  54. }
  55. int
  56. AggSpec::member(Packet * pkt) {
  57.   
  58.   hdr_ip * iph = hdr_ip::access(pkt);
  59.   ns_addr_t dst = iph->dst();
  60.   int fid = iph->flowid();
  61.   if (dstON_) {
  62.     int prefix;
  63.     if (AGGREGATE_CLASSIFICATION_MODE_FID) 
  64.       prefix = getPrefix(fid);
  65.     else 
  66.       prefix = getPrefix(dst.addr_);
  67.     if (prefix == dstPrefix_) {
  68.       return 1;
  69.     }
  70.   }
  71. #ifdef DEBUG_AS
  72.   printf("AS: non-member packet with dst %d at %g. Agg: ", dst.addr_, Scheduler::instance().clock());
  73.   print();
  74. #endif
  75.   return 0;
  76. }
  77. int 
  78. AggSpec::getPrefix(int addr) {
  79.   
  80.   int andAgent = ((1 << dstBits_) - 1) << (NO_BITS - dstBits_);
  81.   return (addr &  andAgent);
  82. }
  83.  
  84. int 
  85. AggSpec::equals(AggSpec * another) {
  86.   
  87.   return (dstON_ == another->dstON_ && dstPrefix_ == another->dstPrefix_ && 
  88.   dstBits_ == another->dstBits_);
  89. }
  90. int 
  91. AggSpec::contains(AggSpec * another) {
  92.   
  93.   if (another->dstBits_ < dstBits_) return 0; 
  94.   if (dstON_ != another->dstON_) return 0;
  95.   int prefix1 = PrefixTree::getPrefixBits(dstPrefix_, dstBits_);
  96.   int prefix2 = PrefixTree::getPrefixBits(another->dstPrefix_, dstBits_);
  97.   
  98.   return (prefix1 == prefix2);
  99. }
  100. void 
  101. AggSpec::expand(int prefix, int bits) {
  102.   
  103.   dstPrefix_ = prefix;
  104.   dstBits_ = bits;
  105. }
  106. int 
  107. AggSpec::subsetOfDst(int prefix, int bits) {
  108.   
  109.   if (!dstON_ || dstBits_ < bits) return 0;
  110.   int myPrefix = PrefixTree::getPrefixBits(dstPrefix_, bits);
  111.   return (prefix==myPrefix);
  112. }
  113. AggSpec *
  114. AggSpec::clone() {
  115.   return new AggSpec(this);
  116. }
  117. int 
  118. AggSpec::getSampleAddress() {
  119.   
  120.   //for now, return the prefix itself
  121.   if (AGGREGATE_CLASSIFICATION_MODE_FID) 
  122.     return 1;
  123.   else 
  124.     return dstPrefix_;
  125. }
  126. int 
  127. AggSpec::prefixBitsForMerger(AggSpec * agg1, AggSpec * agg2) {
  128.   
  129.   int bitsNow = (agg1->dstBits_ < agg2->dstBits_)? agg1->dstBits_: agg2->dstBits_;
  130.   for (int i=bitsNow; i>=0; i--) {
  131.     int prefix1 = PrefixTree::getPrefixBits(agg1->dstPrefix_, i);
  132.     int prefix2 = PrefixTree::getPrefixBits(agg2->dstPrefix_, i);
  133.     if (prefix1==prefix2) {
  134.       return i;
  135.     }
  136.   }
  137.   printf("AS: Error: Should never come heren");
  138.   exit(-1);
  139. }
  140. void 
  141. AggSpec::print() {
  142.   //printf("Prefix = %d Bits = %dn", dstPrefix_, dstBits_);
  143. }
  144.