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

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * routing_table.cc
  3.  * Copyright (C) 2000 by the University of Southern California
  4.  * $Id: routing_table.cc,v 1.5 2005/08/25 18:58:04 johnh Exp $
  5.  *
  6.  * This program is free software; you can redistribute it and/or
  7.  * modify it under the terms of the GNU General Public License,
  8.  * version 2, as published by the Free Software Foundation.
  9.  *
  10.  * This program is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  * GNU General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU General Public License along
  16.  * with this program; if not, write to the Free Software Foundation, Inc.,
  17.  * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
  18.  *
  19.  *
  20.  * The copyright of this module includes the following
  21.  * linking-with-specific-other-licenses addition:
  22.  *
  23.  * In addition, as a special exception, the copyright holders of
  24.  * this module give you permission to combine (via static or
  25.  * dynamic linking) this module with free software programs or
  26.  * libraries that are released under the GNU LGPL and with code
  27.  * included in the standard release of ns-2 under the Apache 2.0
  28.  * license or under otherwise-compatible licenses with advertising
  29.  * requirements (or modified versions of such code, with unchanged
  30.  * license).  You may copy and distribute such a system following the
  31.  * terms of the GNU GPL for this module and the licenses of the
  32.  * other code concerned, provided that you include the source code of
  33.  * that other code when and as the GNU GPL requires distribution of
  34.  * source code.
  35.  *
  36.  * Note that people who make modified versions of this module
  37.  * are not obligated to grant this special exception for their
  38.  * modified versions; it is their choice whether to do so.  The GNU
  39.  * General Public License gives permission to release a modified
  40.  * version without this exception; this exception also makes it
  41.  * possible to release a modified version which carries forward this
  42.  * exception.
  43.  *
  44.  */
  45. /********************************************************************/
  46. /* routing_table.cc : Chalermek Intanagonwiwat (USC/ISI)  05/18/99  */
  47. /********************************************************************/
  48. // Important Note: Work still in progress !
  49. #include <assert.h>
  50. #include <math.h>
  51. #include <stdio.h>
  52. #include <signal.h>
  53. #include <float.h>
  54. #include <tcl.h>
  55. #include <stdlib.h>
  56. #include "diff_header.h"
  57. #include "agent.h"
  58. #include "tclcl.h"
  59. #include "ip.h"
  60. #include "config.h"
  61. #include "packet.h"
  62. #include "trace.h"
  63. #include "random.h"
  64. #include "classifier.h"
  65. #include "node.h"
  66. #include "diffusion.h"
  67. #include "diff_rate.h"
  68. #include "iflist.h"
  69. #include "hash_table.h"
  70. #include "arp.h"
  71. #include "mac.h"
  72. #include "ll.h"
  73. #include "dsr/path.h"
  74. #include "god.h"
  75. #include "routing_table.h"
  76. void Diff_Routing_Entry::reset()
  77. {
  78.   counter = 0;
  79.   num_active = 0;
  80.   num_iif = 0;
  81.   clear_outlist(active);
  82.   clear_outlist(inactive);
  83.   clear_inlist(iif);
  84.   clear_inlist(down_iif);
  85.   clear_agentlist(source);
  86.   clear_agentlist(sink);
  87.   active = NULL;
  88.   inactive = NULL;
  89.   iif = NULL;
  90.   down_iif = NULL;
  91.   source = NULL;
  92.   sink = NULL;
  93.   last_fwd_time = -2.0*INTEREST_PERIODIC;
  94.   new_org_counter = 0;
  95. }
  96. void Diff_Routing_Entry::clear_outlist(Out_List *list)
  97. {
  98.   Out_List *cur=list;
  99.   Out_List *temp = NULL;
  100.   while (cur != NULL) {
  101.     temp = OUT_NEXT(cur);
  102.     delete cur;
  103.     cur = temp;
  104.   }
  105.   
  106. }
  107. void Diff_Routing_Entry::clear_inlist(In_List *list)
  108. {
  109.   In_List *cur=list;
  110.   In_List *temp = NULL;
  111.   while (cur != NULL) {
  112.     temp = IN_NEXT(cur);
  113.     delete cur;
  114.     cur = temp;
  115.   }
  116. }
  117. void Diff_Routing_Entry::clear_agentlist(Agent_List *list)
  118. {
  119.   Agent_List *cur=list;
  120.   Agent_List *temp = NULL;
  121.   while (cur != NULL) {
  122.     temp = AGENT_NEXT(cur);
  123.     delete cur;
  124.     cur = temp;
  125.   }
  126. }
  127. int Diff_Routing_Entry::MostRecvOrg()
  128. {
  129.   In_List *cur;
  130.   int     most = 0;
  131.   for (cur=iif; cur!=NULL; cur = IN_NEXT(cur)) {
  132.       most = max(most,NEW_ORG_RECV(cur));
  133.   }
  134.   return most;
  135. }
  136. bool Diff_Routing_Entry::ExistOriginalGradient()
  137. {
  138.   Out_List *cur_out;
  139.   for (cur_out = active; cur_out!=NULL; cur_out=OUT_NEXT(cur_out)) {
  140.     if (GRADIENT(cur_out) == ORIGINAL)
  141.       return true;
  142.   }
  143.   return false;
  144. }
  145. void Diff_Routing_Entry::IncRecvCnt(ns_addr_t agent_addr)
  146. {
  147.   PrvCurPtr RetVal;
  148.   counter++;
  149.   RetVal=INTF_FIND(iif, agent_addr);
  150.   if (RetVal.cur != NULL) {
  151.      TOTAL_RECV(RetVal.cur)++;
  152.      return;
  153.   } 
  154.   RetVal=INTF_FIND(source, agent_addr);
  155.   if (RetVal.cur != NULL)
  156.     return;
  157.   // On-demand adding In_List 
  158.   TOTAL_RECV(AddInList(agent_addr))++;
  159. }
  160. void Diff_Routing_Entry::CntPosSend(ns_addr_t agent_addr)
  161. {
  162.   PrvCurPtr RetVal;
  163.   RetVal=INTF_FIND(iif, agent_addr);
  164.   if (RetVal.cur != NULL) {
  165.      NUM_POS_SEND(RetVal.cur)++;
  166.      return;
  167.   } 
  168.   // On-demand adding In_List 
  169.   In_List *cur_in = AddInList(agent_addr);
  170.   NUM_POS_SEND(cur_in)++;
  171. }
  172. void Diff_Routing_Entry::CntNeg(ns_addr_t agent_addr)
  173. {
  174.   PrvCurPtr RetVal;
  175.   RetVal=INTF_FIND(active, agent_addr);
  176.   if (RetVal.cur != NULL) {
  177.      NUM_NEG_RECV(RetVal.cur)++;
  178.      return;
  179.   } 
  180.   /*
  181.   perror("Hey man. How come you send me the negative reinforment?n");
  182.   exit(-1);
  183.   */
  184. }
  185. void Diff_Routing_Entry::CntNewSub(ns_addr_t agent_addr)
  186. {
  187.   PrvCurPtr RetVal;
  188.   RetVal=INTF_FIND(iif, agent_addr);
  189.   if (RetVal.cur != NULL) {
  190.      NEW_SUB_RECV(RetVal.cur)++;
  191.      TOTAL_NEW_SUB_RECV(RetVal.cur)++;
  192.      LAST_TS_NEW_SUB(RetVal.cur) = NOW;
  193.      return;
  194.   } 
  195.   RetVal=INTF_FIND(source, agent_addr);
  196.   if (RetVal.cur != NULL)
  197.     return;
  198.   // On-demand adding In_List 
  199.   In_List *cur_in = AddInList(agent_addr);
  200.   NEW_SUB_RECV(cur_in)++;
  201.   TOTAL_NEW_SUB_RECV(cur_in)++;
  202.   LAST_TS_NEW_SUB(cur_in) = NOW;
  203. }
  204. void Diff_Routing_Entry::ClrNewSub(ns_addr_t agent_addr)
  205. {
  206.   PrvCurPtr RetVal;
  207.   RetVal=INTF_FIND(iif, agent_addr);
  208.   if (RetVal.cur != NULL) {
  209.      NEW_SUB_RECV(RetVal.cur)= 0;
  210.      LAST_TS_NEW_SUB(RetVal.cur) = -1.0;
  211.      return;
  212.   } 
  213. }
  214. void Diff_Routing_Entry::CntNewOrg(ns_addr_t agent_addr)
  215. {
  216.   PrvCurPtr RetVal;
  217.   RetVal=INTF_FIND(iif, agent_addr);
  218.   if (RetVal.cur != NULL) {
  219.      NEW_ORG_RECV(RetVal.cur)++;
  220.      TOTAL_NEW_ORG_RECV(RetVal.cur)++;
  221.      return;
  222.   } 
  223.   RetVal=INTF_FIND(source, agent_addr);
  224.   if (RetVal.cur != NULL)
  225.     return;
  226.   // On-demand adding In_List 
  227.   In_List *cur_in = AddInList(agent_addr);
  228.   NEW_ORG_RECV(cur_in)++;
  229.   TOTAL_NEW_ORG_RECV(cur_in)++;
  230. }
  231. void Diff_Routing_Entry::CntOldOrg(ns_addr_t agent_addr)
  232. {
  233.   PrvCurPtr RetVal;
  234.   RetVal=INTF_FIND(iif, agent_addr);
  235.   if (RetVal.cur != NULL) {
  236.      OLD_ORG_RECV(RetVal.cur)++;
  237.      TOTAL_OLD_ORG_RECV(RetVal.cur)++;
  238.      return;
  239.   } 
  240.   RetVal=INTF_FIND(source, agent_addr);
  241.   if (RetVal.cur != NULL)
  242.     return;
  243.   // On-demand adding In_List 
  244.   In_List *cur_in = AddInList(agent_addr);
  245.   OLD_ORG_RECV(cur_in)++;
  246.   TOTAL_OLD_ORG_RECV(cur_in)++;
  247. }
  248. void Diff_Routing_Entry::ClrAllNewOrg()
  249. {
  250.   In_List *cur;
  251.   for (cur = iif; cur!= NULL; cur = IN_NEXT(cur)) {
  252.      NEW_ORG_RECV(cur)= 0;
  253.   }
  254. }
  255. void Diff_Routing_Entry::ClrAllOldOrg()
  256. {
  257.   In_List *cur;
  258.   for (cur=iif; cur!=NULL; cur = IN_NEXT(cur) ) {
  259.      OLD_ORG_RECV(cur)= 0;
  260.   }
  261. }
  262. In_List *Diff_Routing_Entry::MostRecentIn()
  263. {
  264.   In_List *cur, *ret;
  265.   double recent_time;
  266.   ret = NULL;
  267.   recent_time = -1.0;
  268.   for (cur = iif; cur!=NULL; cur=IN_NEXT(cur)) {
  269.     if (LAST_TS_NEW_SUB(cur) > recent_time) {
  270.       ret = cur;
  271.       recent_time = LAST_TS_NEW_SUB(cur);
  272.     }
  273.   }
  274.   return ret;
  275. }
  276. In_List * Diff_Routing_Entry::AddInList(ns_addr_t addr)
  277. {
  278.   In_List *inPtr= new In_List;
  279.   AGT_ADDR(inPtr) = addr;
  280.   INTF_INSERT(iif, inPtr); 
  281.   num_iif++;
  282.   return inPtr;
  283. }
  284. Diff_Routing_Entry:: Diff_Routing_Entry() 
  285.     last_fwd_time = -2.0*INTEREST_PERIODIC;  
  286.     counter      = 0;
  287.     new_org_counter = 0;
  288.     num_active   = 0;
  289.     num_iif      = 0;
  290.     active       = NULL; 
  291.     inactive     = NULL; 
  292.     iif          = NULL;
  293.     down_iif     = NULL;
  294.     source       = NULL;
  295.     sink         = NULL;
  296. }