00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 #ifndef ns_route_h
00044 #define ns_route_h
00045
00046 #undef INFINITY
00047 #define INFINITY 0x3fff
00048 #define INDEX(i, j, N) ((N) * (i) + (j))
00049
00050
00051
00052
00053
00054 #define HIER_LEVEL 3
00055 #define N_N_INDEX(i, j, a, b, c) (((i) * (a+b+c)) + (j))
00056 #define N_C_INDEX(i, j, a, b, c) (((i) * (a+b+c)) + (a+j))
00057 #define N_D_INDEX(i, j, a, b, c) (((i) * (a+b+c)) + (a+(b-1)+j))
00058 #define C_C_INDEX(i, j, a, b, c) (((a+i) * (a+b+c)) + (a+j))
00059 #define C_D_INDEX(i, j, a, b, c) (((a+i) * (a+b+c)) + (a+(b-1)+j))
00060 #define D_D_INDEX(i, j, a, b, c) (((a+(b-1)+i) * (a+b+c)) + (a+(b-1)+j))
00061
00062 struct adj_entry {
00063 double cost;
00064 void* entry;
00065 };
00066
00067 struct route_entry {
00068 public:
00069 int next_hop;
00070 void* entry;
00071 };
00072
00073 class RouteLogic : public TclObject {
00074 public:
00075 RouteLogic();
00076 ~RouteLogic();
00077 int command(int argc, const char*const* argv);
00078 virtual int lookup_flat(char* asrc, char* adst, int&result);
00079 virtual int lookup_flat(int sid, int did);
00080 int lookup_hier(char* asrc, char* adst, int&result);
00081 static void ns_strtok(char *addr, int *addrstr);
00082 int elements_in_level (int *addr, int level);
00083 inline int domains(){ return (D_-1); }
00084 inline int domain_size(int domain);
00085 inline int cluster_size(int domain, int cluster);
00086 protected:
00087
00088 void check(int);
00089 void alloc(int n);
00090 void reset(int src, int dst);
00091 void compute_routes();
00092 void insert(int src, int dst, double cost);
00093 adj_entry *adj_;
00094 route_entry *route_;
00095 void insert(int src, int dst, double cost, void* entry);
00096 void reset_all();
00097 int size_,
00098 maxnode_;
00099
00100
00101
00102 void hier_check(int index);
00103 void hier_alloc(int size);
00104 void hier_init(void);
00105 void str2address(const char*const* address, int *src, int *dst);
00106 void get_address(char * target, int next_hop, int index, int d, int size, int *src);
00107 void hier_insert(int *src, int *dst, int cost);
00108 void hier_reset(int *src, int *dst);
00109 void hier_compute();
00110 void hier_compute_routes(int index, int d);
00111
00112
00113 void hier_print_hadj();
00114 void hier_print_route();
00115
00116 int **hadj_;
00117 int **hroute_;
00118 int *hsize_;
00119 int *cluster_size_;
00120 char ***hconnect_;
00121 int level_;
00122 int *C_;
00123 int D_,
00124 Cmax_;
00125
00126 };
00127
00128 class RouteLogicAlgo : public RouteLogic {
00129 public:
00130 int lookup_flat(char* asrc, char* adst, int&result) {
00131 Tcl& tcl= Tcl::instance();
00132 tcl.evalf("%s lookup %s %s", name(), asrc, adst);
00133 result= atoi(tcl.result());
00134 return TCL_OK;
00135 }
00136 };
00137 #endif