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

通讯编程

开发平台:

Visual C++

  1. // 
  2. // nr.cc         : Network Routing
  3. // authors       : Dan Coffin, John Heidemann, Dan Van Hook
  4. // authors       : Fabio Silva
  5. // 
  6. // Copyright (C) 2000-2003 by the University of Southern California
  7. // $Id: nr.cc,v 1.8 2005/09/13 04:53:50 tomh Exp $
  8. //
  9. // This program is free software; you can redistribute it and/or
  10. // modify it under the terms of the GNU General Public License,
  11. // version 2, as published by the Free Software Foundation.
  12. //
  13. // This program is distributed in the hope that it will be useful,
  14. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16. // GNU General Public License for more details.
  17. //
  18. // You should have received a copy of the GNU General Public License along
  19. // with this program; if not, write to the Free Software Foundation, Inc.,
  20. // 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
  21. //
  22. // Linking this file statically or dynamically with other modules is making
  23. // a combined work based on this file.  Thus, the terms and conditions of
  24. // the GNU General Public License cover the whole combination.
  25. //
  26. // In addition, as a special exception, the copyright holders of this file
  27. // give you permission to combine this file with free software programs or
  28. // libraries that are released under the GNU LGPL and with code included in
  29. // the standard release of ns-2 under the Apache 2.0 license or under
  30. // otherwise-compatible licenses with advertising requirements (or modified
  31. // versions of such code, with unchanged license).  You may copy and
  32. // distribute such a system following the terms of the GNU GPL for this
  33. // file and the licenses of the other code concerned, provided that you
  34. // include the source code of that other code when and as the GNU GPL
  35. // requires distribution of source code.
  36. //
  37. // Note that people who make modified versions of this file are not
  38. // obligated to grant this special exception for their modified versions;
  39. // it is their choice whether to do so.  The GNU General Public License
  40. // gives permission to release a modified version without this exception;
  41. // this exception also makes it possible to release a modified version
  42. // which carries forward this exception.
  43. #include <stdio.h>   // for null
  44. #include <string.h>  // for strdup
  45. #include <algorithm>  // for stl min
  46. #include "nr.hh"
  47. NRSimpleAttributeFactory<int> NRScopeAttr(NRAttribute::SCOPE_KEY,
  48.   NRAttribute::INT32_TYPE);
  49. NRSimpleAttributeFactory<int> NRClassAttr(NRAttribute::CLASS_KEY,
  50.   NRAttribute::INT32_TYPE);
  51. NRSimpleAttributeFactory<int> NRAlgorithmAttr(NRAttribute::ALGORITHM_KEY,
  52.       NRAttribute::INT32_TYPE);
  53. NRSimpleAttributeFactory<int> NRSubscriptionAttr(NRAttribute::SUBSCRIPTION_ID_KEY,
  54.  NRAttribute::INT32_TYPE);
  55. NRSimpleAttributeFactory<void *> NRFlowAttr(NRAttribute::FLOWS_KEY,
  56.     NRAttribute::BLOB_TYPE);
  57. NRSimpleAttributeFactory<float> LatitudeAttr(NRAttribute::LATITUDE_KEY,
  58.      NRAttribute::FLOAT32_TYPE);
  59. NRSimpleAttributeFactory<float> LongitudeAttr(NRAttribute::LONGITUDE_KEY,
  60.       NRAttribute::FLOAT32_TYPE);
  61. NRSimpleAttributeFactory<char *> RouteAttr(NRAttribute::ROUTE_KEY,
  62.    NRAttribute::STRING_TYPE);
  63. NRSimpleAttributeFactory<char *> SourceRouteAttr(NRAttribute::SOURCE_ROUTE_KEY,
  64.  NRAttribute::STRING_TYPE);
  65. NRSimpleAttributeFactory<void *> ReinforcementAttr(NRAttribute::REINFORCEMENT_KEY, NRAttribute::BLOB_TYPE);
  66. // RMST attribute factory definitions
  67. NRSimpleAttributeFactory<int> RmstIdAttr(NRAttribute::RMST_ID_KEY,
  68.  NRAttribute::INT32_TYPE);
  69. NRSimpleAttributeFactory<int> RmstFragAttr(NRAttribute::RMST_FRAG_KEY,
  70.    NRAttribute::INT32_TYPE);
  71. NRSimpleAttributeFactory<int> RmstMaxFragAttr(NRAttribute::RMST_MAX_FRAG_KEY,
  72.       NRAttribute::INT32_TYPE);
  73. NRSimpleAttributeFactory<void *> RmstDataAttr(NRAttribute::RMST_DATA_KEY,
  74.       NRAttribute::BLOB_TYPE);
  75. NRSimpleAttributeFactory<int> RmstTsprtCtlAttr(NRAttribute::RMST_TSPRT_CTL_KEY,
  76.        NRAttribute::INT32_TYPE);
  77. NRSimpleAttributeFactory<int> RmstPktsSentAttr(NRAttribute::RMST_PKTS_SENT_KEY,
  78.        NRAttribute::INT32_TYPE);
  79. NRSimpleAttributeFactory<char *> RmstTargetAttr(NRAttribute::RMST_TARGET_KEY,
  80. NRAttribute::STRING_TYPE);
  81. NRAttributeFactory *NRAttributeFactory::first_ = NULL;
  82. NRAttribute::NRAttribute(int key, int type, int op, int len, void *val)
  83.    : key_(key), type_(type), op_(op), len_(len)
  84. {
  85.    if (val != NULL){
  86.       val_ = (void *) new char[len_];
  87.       memcpy(val_, val, len_);
  88.    }
  89. }
  90. NRAttribute::NRAttribute() :    
  91.    key_(0), type_(0), op_(0), len_(0), val_(NULL) 
  92. {}
  93. NRAttribute::NRAttribute(const NRAttribute &rhs)
  94. {
  95.    key_ = rhs.key_;
  96.    type_ = rhs.type_;
  97.    op_ = rhs.op_;
  98.    len_ = rhs.len_;
  99.    val_ = new char[len_];
  100.    memcpy(val_, rhs.val_, len_);
  101. }
  102. NRAttribute::~NRAttribute()
  103. {
  104. }
  105. NRAttribute * NRAttribute::find_key_from(int key, NRAttrVec *attrs,
  106.  NRAttrVec::iterator start,
  107.  NRAttrVec::iterator *place) {
  108.    
  109.    NRAttrVec::iterator i;
  110.    
  111.    for (i = start; i != attrs->end(); ++i) {
  112.       if ((*i)->getKey() == key) {
  113.  if (place)
  114.     *place = i;
  115.  return (*i);
  116.       };
  117.    };
  118.    return NULL;
  119. }
  120. bool NRAttribute::isEQ(NRAttribute *attr) {
  121.    // Keys need to be the same
  122.    if (!isSameKey(attr))
  123.       abort();
  124.    switch (type_){
  125.    case INT32_TYPE:
  126.       return (*(int32_t *) val_ == *(int32_t *) attr->getGenericVal());
  127.       break;
  128.    case FLOAT32_TYPE:
  129.       return (*(float *) val_ == *(float *) attr->getGenericVal());
  130.       break;
  131.    case FLOAT64_TYPE:
  132.       return (*(double *) val_ == *(double *) attr->getGenericVal());
  133.       break;
  134.    case STRING_TYPE:
  135.       if (len_ != attr->getLen())
  136.         return false;
  137.       return (!strncmp((char *) val_, (char *) attr->getGenericVal(), len_));
  138.       break;
  139.    case BLOB_TYPE:
  140.       if (len_ != attr->getLen())
  141.         return false;
  142.       return (!memcmp((void *) val_, (void *) attr->getGenericVal(), len_));
  143.       break;
  144.    default:
  145.       abort();
  146.       break;
  147.    }
  148. }
  149. bool NRAttribute::isGT(NRAttribute *attr) {
  150.    int cmplen, cmp;  // must be here for initialization reasons
  151.    // Keys need to be the same
  152.    if (!isSameKey(attr))
  153.       abort();
  154.    switch (type_) {
  155.    case INT32_TYPE:
  156.       return (*(int32_t *) val_ > *(int32_t *) attr->getGenericVal());
  157.       break;
  158.    case FLOAT32_TYPE:
  159.       return (*(float *) val_ > *(float *) attr->getGenericVal());
  160.       break;
  161.    case FLOAT64_TYPE:
  162.       return (*(double *) val_ > *(double *) attr->getGenericVal());
  163.       break;
  164.    case STRING_TYPE:
  165.       return strncmp((char *) val_, (char *) attr->getGenericVal(),
  166.      min(len_, attr->getLen()));
  167.       break;
  168.    case BLOB_TYPE:
  169.       cmplen = min(len_, attr->getLen());
  170.       cmp = memcmp((void *) val_, (void *) attr->getGenericVal(), cmplen);
  171.       
  172.       // We are greater than attr
  173.       if (cmp > 0)
  174.  return true;
  175.       // We are equal to attr up to len_, but we are longer
  176.       if (cmp == 0 && (len_ > attr->getLen()))
  177.  return true;
  178.       return false;
  179.       break;
  180.    default:
  181.       abort();
  182.       break;
  183.    }
  184. }
  185. bool NRAttribute::isGE(NRAttribute *attr) {
  186.    int cmplen, cmp;  // must be here for initialization reasons
  187.    // Keys need to be the same
  188.    if (!isSameKey(attr))
  189.       abort();
  190.    switch (type_) {
  191.    case INT32_TYPE:
  192.       return (*(int32_t *) val_ >= *(int32_t *) attr->getGenericVal());
  193.       break;
  194.    case FLOAT32_TYPE:
  195.       return (*(float *) val_ >= *(float *) attr->getGenericVal());
  196.       break;
  197.    case FLOAT64_TYPE:
  198.       return (*(double *) val_ >= *(double *) attr->getGenericVal());
  199.       break;
  200.    case STRING_TYPE:
  201.       return (strcmp((char *) val_, (char *) attr->getGenericVal()) >= 0);
  202.       break;
  203.    case BLOB_TYPE:
  204.       cmplen = min(len_, attr->getLen());
  205.       cmp = memcmp((void *) val_, (void *) attr->getGenericVal(), cmplen);
  206.       
  207.       // We are greater or equal to attr
  208.       if (cmp >= 0)
  209.  return true;
  210.       return false;
  211.       break;
  212.    default:
  213.       abort();
  214.       break;
  215.    }
  216. }
  217. NRSimpleAttribute<char *>::NRSimpleAttribute(int key, int type, int op, char *val, int size) :
  218.    NRAttribute(key, type, op, (strlen(val) + 1))
  219. {
  220.    assert(type == STRING_TYPE);
  221.    val_ = NULL;
  222.    setVal(val);
  223. }
  224. void NRSimpleAttribute<char *>::setVal(char *value) {
  225.    delete [] (char *) val_;
  226.    len_ = strlen(value) + 1;
  227.    val_ = (void *) new char[len_ + 1];
  228.    memcpy(val_, value, len_);
  229. }
  230. NRSimpleAttribute<void *>::NRSimpleAttribute(int key, int type, int op, void *val, int size) :
  231.    NRAttribute(key, type, op, size)
  232. {
  233.    assert(type == BLOB_TYPE);
  234.    val_ = NULL;
  235.    setVal(val, len_);
  236. }
  237. void NRSimpleAttribute<void *>::setVal(void *value, int len) {
  238.    delete [] (char *) val_;
  239.    len_ = len;
  240.    val_ = (void *) new char[len_];
  241.    memcpy(val_, value, len_);
  242. }
  243. void NRAttributeFactory::verify_unique(NRAttributeFactory *baby) {
  244.    
  245.    NRAttributeFactory *i = first_, *last = NULL;
  246.    while (i) {
  247.       if (baby->key_ == i->key_) {
  248.  // identical factories are ok
  249.  assert(baby->type_ == i->type_);
  250.  return;  // don't enlist duplictates
  251.       }
  252.       last = i;
  253.       i = i->next_;
  254.    }
  255.    // must not exist, add it
  256.    if (last)
  257.       last->next_ = first_;
  258.    first_ = baby;
  259. }