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

通讯编程

开发平台:

Visual C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  2. /*
  3.  * Copyright (c) 1991-1994 Regents of the University of California.
  4.  * All rights reserved.
  5.  *
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  * 1. Redistributions of source code must retain the above copyright
  10.  *    notice, this list of conditions and the following disclaimer.
  11.  * 2. Redistributions in binary form must reproduce the above copyright
  12.  *    notice, this list of conditions and the following disclaimer in the
  13.  *    documentation and/or other materials provided with the distribution.
  14.  * 3. All advertising materials mentioning features or use of this software
  15.  *    must display the following acknowledgement:
  16.  * This product includes software developed by the University of
  17.  * California, Berkeley and the Network Research Group at
  18.  * Lawrence Berkeley Laboratory.
  19.  * 4. Neither the name of the University nor of the Laboratory may be used
  20.  *    to endorse or promote products derived from this software without
  21.  *    specific prior written permission.
  22.  *
  23.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  24.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  25.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  26.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  27.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  28.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  29.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  30.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  31.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  32.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  33.  * SUCH DAMAGE.
  34.  *
  35.  * Routing code for general topologies based on min-cost routing algorithm in
  36.  * Bertsekas' book.  Written originally by S. Keshav, 7/18/88
  37.  * (his work covered by identical UC Copyright)
  38.  *
  39.  * @(#) $Header: /cvsroot/nsnam/ns-2/routing/route.h,v 1.9 2002/10/09 03:47:01 difa Exp $
  40.  *
  41.  */
  42. #ifndef ns_route_h
  43. #define ns_route_h
  44. #undef INFINITY
  45. #define INFINITY 0x3fff
  46. #define INDEX(i, j, N) ((N) * (i) + (j))
  47. /*** definitions for hierarchical routing support 
  48. right now implemented for 3 levels of hierarchy --> should
  49. be able to extend it for n levels of hierarchy in the future ***/
  50. #define HIER_LEVEL 3
  51. #define N_N_INDEX(i, j, a, b, c) (((i) * (a+b+c)) + (j))
  52. #define N_C_INDEX(i, j, a, b, c) (((i) * (a+b+c)) + (a+j))
  53. #define N_D_INDEX(i, j, a, b, c) (((i) * (a+b+c)) + (a+(b-1)+j))
  54. #define C_C_INDEX(i, j, a, b, c) (((a+i) * (a+b+c)) + (a+j))
  55. #define C_D_INDEX(i, j, a, b, c) (((a+i) * (a+b+c)) + (a+(b-1)+j))
  56. #define D_D_INDEX(i, j, a, b, c) (((a+(b-1)+i) * (a+b+c)) + (a+(b-1)+j))
  57. struct adj_entry {
  58. double cost;
  59. void* entry;
  60. };
  61. struct route_entry {
  62. public:
  63. int next_hop;
  64. void* entry;
  65. };
  66. class RouteLogic : public TclObject {
  67. public:
  68. RouteLogic();
  69. ~RouteLogic();
  70. int command(int argc, const char*const* argv);
  71. virtual int lookup_flat(char* asrc, char* adst, int&result);
  72. virtual int lookup_flat(int sid, int did); //added for pushback - ratul
  73. int lookup_hier(char* asrc, char* adst, int&result);
  74. static void ns_strtok(char *addr, int *addrstr);
  75. int elements_in_level (int *addr, int level);
  76. inline int domains(){ return (D_-1); }
  77. inline int domain_size(int domain);
  78. inline int cluster_size(int domain, int cluster);
  79. protected:
  80. void check(int);
  81. void alloc(int n);
  82. void reset(int src, int dst);
  83. void compute_routes();
  84. void insert(int src, int dst, double cost);
  85. adj_entry *adj_;
  86. route_entry *route_;
  87. void insert(int src, int dst, double cost, void* entry);
  88. void reset_all();
  89. int size_,
  90. maxnode_;
  91. /**** Hierarchical routing support ****/
  92. void hier_check(int index);
  93. void hier_alloc(int size);
  94. void hier_init(void);
  95. void str2address(const char*const* address, int *src, int *dst);
  96. void get_address(char * target, int next_hop, int index, int d, int size, int *src);
  97. void hier_insert(int *src, int *dst, int cost);
  98. void hier_reset(int *src, int *dst);
  99. void hier_compute();
  100. void hier_compute_routes(int index, int d);
  101. /* Debugging print functions */
  102. void hier_print_hadj();
  103. void hier_print_route();
  104. int **hadj_;
  105. int **hroute_;
  106. int *hsize_;
  107. int *cluster_size_; /* no. of nodes/cluster/domain */
  108. char ***hconnect_; /* holds the connectivity info --> address of target */
  109. int level_;
  110. int *C_;                    /* no. of clusters/domain */
  111. int D_, /* total no. of domains */
  112. Cmax_; /* max value of C_ for initialization purpose */
  113. };
  114. class RouteLogicAlgo : public RouteLogic {
  115. public:
  116. int lookup_flat(char* asrc, char* adst, int&result) {
  117. Tcl& tcl= Tcl::instance();
  118. tcl.evalf("%s lookup %s %s", name(), asrc, adst);
  119. result= atoi(tcl.result());
  120. return TCL_OK;
  121. }
  122. };
  123. #endif