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

通讯编程

开发平台:

Visual C++

  1. /* -*-  Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  2. /*
  3.  * Copyright (c) 1997 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 Computer Systems
  17.  *      Engineering Group at Lawrence Berkeley Laboratory.
  18.  * 4. Neither the name of the University nor of the Laboratory may be used
  19.  *    to endorse or promote products derived from this software without
  20.  *    specific prior written permission.
  21.  *
  22.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  23.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  24.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  25.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  26.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  27.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  28.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  29.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  30.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  31.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  32.  * SUCH DAMAGE.
  33.  */
  34. /* Ported from CMU/Monarch's code */
  35. /* 
  36.    $Id: tora_dest.cc,v 1.2 1999/08/12 21:12:29 yaxu Exp $
  37.    */
  38. #include <agent.h>
  39. #include <random.h>
  40. #include <trace.h>
  41. #include <ll.h>
  42. #include <priqueue.h>
  43. #include <tora/tora_packet.h>
  44. #include <tora/tora.h>
  45. #define CURRENT_TIME Scheduler::instance().clock()
  46. /* ======================================================================
  47.    TORADest Class Functions
  48.    ====================================================================== */
  49. TORADest::TORADest(nsaddr_t id, Agent *a) :  height(id)
  50. {
  51. index = id;
  52. rt_req = 0;
  53. time_upd = 0.0;
  54. time_rt_req = 0.0;
  55. time_tx_qry = 0.0;
  56. LIST_INIT(&nblist);
  57. num_active = num_down = num_up = 0;
  58.         agent = (toraAgent*) a;
  59. }
  60. void
  61. TORADest::dump()
  62. {
  63. TORANeighbor *tn = nb_find_next_hop();
  64. fprintf(stdout, "tDEST: %d, RT Req: %x, Time UPD: %fn",
  65. index, rt_req, time_upd);
  66. fprintf(stdout, "tttau: %f, oid: %d, r: %d, delta: %d, id: %dn",
  67. height.tau, height.oid, height.r, height.delta, height.id);
  68. fprintf(stdout, "ttActive: %d, Down: %d, Up: %d, Next Hop: %dnn",
  69. num_active, num_down, num_up, tn ? tn->index : -1);
  70. for(tn = nblist.lh_first; tn; tn = tn->link.le_next)
  71. tn->dump();
  72. }
  73. /* ====================================================================== */
  74. TORANeighbor*
  75. TORADest::nb_add(nsaddr_t id)
  76. {
  77. TORANeighbor *tn = new TORANeighbor(id, agent);
  78. assert(tn);
  79. LIST_INSERT_HEAD(&nblist, tn, link);
  80. num_active += 1;
  81. if(tn->index == index) {
  82. tn->height.Zero();
  83. tn->lnk_stat = LINK_DN;
  84. num_down += 1;
  85. }
  86. return tn;
  87. }
  88. int
  89. TORADest::nb_del(nsaddr_t id)
  90. {
  91. TORANeighbor *tn = nblist.lh_first;
  92. for( ; tn; tn = tn->link.le_next) {
  93. if(tn->index == id) {
  94. num_active -= 1;
  95. if(tn->lnk_stat == LINK_DN)
  96. num_down -=1;
  97. if(tn->lnk_stat == LINK_UP)
  98. num_up -= 1;
  99. LIST_REMOVE(tn, link);
  100. delete tn;
  101.                         /*
  102.                          *  Here's were we decide whether or not to
  103.                          *  do route maintenance.
  104.                          */
  105.                         if(num_down == 0) {
  106. if(num_up > 0) {
  107. update_height(CURRENT_TIME,
  108.       index,
  109.       0,
  110.       0,
  111.       index);
  112. } else {
  113. update_height(-1,
  114.       -1,
  115.       -1,
  116.       -1,
  117.       index);
  118. // set height to NULL
  119. }
  120. agent->logNbDeletedLastDN(this);
  121. return 1;
  122. // send an UPDATE packet
  123. }
  124. return 0;
  125. }
  126. }
  127.         return 0;
  128. }
  129. TORANeighbor*
  130. TORADest::nb_find(nsaddr_t id)
  131. {
  132. TORANeighbor *tn = nblist.lh_first;
  133. for( ; tn; tn = tn->link.le_next) {
  134. if(tn->index == id)
  135. return tn;
  136. }
  137. return 0;
  138. }
  139. TORANeighbor*
  140. TORADest::nb_find_next_hop()
  141. {
  142. TORANeighbor *tn = nblist.lh_first;
  143. TORANeighbor *tn_min = 0;
  144. for( ; tn; tn = tn->link.le_next) {
  145. if(tn->height.isNull())
  146.                         continue;
  147.                 if(tn->lnk_stat != LINK_DN)
  148.                         continue;
  149.                 if(tn_min == 0 || tn_min->height.compare(&tn->height) < 0) {
  150.                         tn_min = tn;
  151.                 }
  152. }
  153. assert(tn_min == 0 || tn_min->lnk_stat == LINK_DN);
  154. return tn_min;
  155. }
  156. /*
  157.  *  Find a neighbor of minimum height, subject to the constraint
  158.  *  that height.r == R.
  159.  */
  160. TORANeighbor*
  161. TORADest::nb_find_min_height(int R)
  162. {
  163. TORANeighbor *tn = nblist.lh_first;
  164. TORANeighbor *tn_min = 0;
  165. for( ; tn; tn = tn->link.le_next) {
  166. if(tn->height.r == R) {
  167. if(tn_min == 0 ||
  168.                            tn_min->height.compare(&tn->height) < 0)
  169. tn_min = tn;
  170. }
  171. }
  172. return tn_min;
  173. }
  174. /*
  175.  *  Find a neighbor of minimum height, subject to the constraint
  176.  *  that height.(tau,oid,r) == (tau,oid,r) and height != NULL
  177.  */
  178. TORANeighbor*
  179. TORADest::nb_find_min_nonnull_height(Height *h)
  180. {
  181. TORANeighbor *tn = nblist.lh_first;
  182. TORANeighbor *tn_min = 0;
  183. assert(h);
  184. for( ; tn; tn = tn->link.le_next) {
  185. if(tn->height.isNull() == 0 &&
  186.    tn->height.tau == h->tau &&
  187.    tn->height.oid == h->oid &&
  188.    tn->height.r == h->r) {
  189. if(tn_min == 0 ||
  190.                            tn_min->height.compare(&tn->height) < 0)
  191.         tn_min = tn;
  192. }
  193. }
  194. return tn_min;
  195. }
  196. /*
  197.  *  Find a neighbor of maximum height, subject to the constraint
  198.  *  that height != NULL.
  199.  */
  200. TORANeighbor*
  201. TORADest::nb_find_max_height()
  202. {
  203. TORANeighbor *tn = nblist.lh_first;
  204. TORANeighbor *tn_max = 0;
  205. for( ; tn; tn = tn->link.le_next) {
  206. if(tn->height.isNull() == 0) {
  207. if(tn_max == 0 ||
  208.                            tn_max->height.compare(&tn->height) > 0)
  209. tn_max = tn;
  210. }
  211. }
  212. return tn_max;
  213. }
  214. // Verify that all neighbors of non-null height have the same reference
  215. // level.
  216. int
  217. TORADest::nb_check_same_ref()
  218. {
  219. TORANeighbor *tn = nblist.lh_first;
  220. TORANeighbor *tref = 0;
  221. for( ; tn; tn = tn->link.le_next) {
  222. if(tn->height.isNull() == 0) {
  223. if(tref == 0)
  224. tref = tn;
  225. else if(tref->height.tau != tn->height.tau ||
  226. tref->height.oid != tn->height.oid ||
  227. tref->height.r != tn->height.r)
  228. return 0;
  229. }
  230. }
  231. return 1;
  232. }
  233. void
  234. TORADest::update_height_nb(TORANeighbor *tn, struct hdr_tora_upd *uh)
  235. {
  236. Height h(uh->tu_id);
  237. h.tau = uh->tu_tau;
  238. h.oid = uh->tu_oid;
  239. h.r = uh->tu_r;
  240. h.delta = uh->tu_delta;
  241. tn->height.update(&h);
  242. /*
  243.  *  Update num_down/num_up
  244.  */
  245. if(tn->lnk_stat == LINK_DN)
  246. num_down -= 1;
  247. if(tn->lnk_stat == LINK_UP)
  248. num_up -= 1;
  249. tn->update_link_status(&height);
  250. /*
  251.  *  Update num_down/num_up
  252.  */
  253. if(tn->lnk_stat == LINK_DN)
  254. num_down += 1;
  255. if(tn->lnk_stat == LINK_UP)
  256. num_up += 1;
  257. }
  258. /*
  259.  *  Updates the height of a destination and then recomputes
  260.  *  all of the link status information for the neighbors.
  261.  */
  262. void
  263. TORADest::update_height(double TAU, nsaddr_t OID, int R, int DELTA, nsaddr_t ID)
  264. {
  265. TORANeighbor *tn = nblist.lh_first;
  266. height.tau = TAU;
  267. height.oid = OID;
  268. height.r = R;
  269. height.delta = DELTA;
  270. height.id = ID;
  271. #ifdef LOGGING
  272.         agent->log_dst_state_change(this);
  273. #endif
  274. num_active = num_down = num_up = 0;
  275. for( ; tn; tn = tn->link.le_next) {
  276. tn->update_link_status(&height);
  277. num_active += 1;
  278. if(tn->lnk_stat == LINK_DN)
  279. num_down += 1;
  280. if(tn->lnk_stat == LINK_UP)
  281. num_up += 1;
  282. }
  283. }