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

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * requesttable.cc
  3.  * Copyright (C) 2000 by the University of Southern California
  4.  * $Id: requesttable.cc,v 1.4 2005/08/25 18:58:05 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. // Other copyrights might apply to parts of this software and are so
  47. // noted when applicable.
  48. //
  49. // Ported from CMU/Monarch's code, appropriate copyright applies.  
  50. /* requesttable.h
  51.    implement a table to keep track of the most current request
  52.    number we've heard from a node in terms of that node's id
  53. */
  54. #include "path.h"
  55. #include "constants.h"
  56. #include "requesttable.h"
  57. RequestTable::RequestTable(int s): size(s)
  58. {
  59.   table = new Entry[size];
  60.   size = size;
  61.   ptr = 0;
  62. }
  63. RequestTable::~RequestTable()
  64. {
  65.   delete[] table;
  66. }
  67. int
  68. RequestTable::find(const ID& net_id, const ID& MAC_id) const
  69. {
  70.   for (int c = 0 ; c < size ; c++)
  71.   if (table[c].net_id == net_id || table[c].MAC_id == MAC_id)
  72.   return c;
  73.   return size;
  74. }
  75. int
  76. RequestTable::get(const ID& id) const
  77. {
  78.   int existing_entry = find(id, id);
  79.   if (existing_entry >= size)    
  80.     {
  81.       return 0;
  82.     }
  83.   return table[existing_entry].req_num;
  84. }
  85. Entry*
  86. RequestTable::getEntry(const ID& id)
  87. {
  88.   int existing_entry = find(id, id);
  89.   if (existing_entry >= size)    
  90.     {
  91.       table[ptr].MAC_id = ::invalid_addr;
  92.       table[ptr].net_id = id;
  93.       table[ptr].req_num = 0;
  94.       table[ptr].last_arp = 0.0;
  95.       table[ptr].rt_reqs_outstanding = 0;
  96.       table[ptr].last_rt_req = -(rt_rq_period + 1.0);
  97.       existing_entry = ptr;
  98.       ptr = (ptr+1)%size;
  99.     }
  100.   return &(table[existing_entry]);
  101. }
  102. void
  103. RequestTable::insert(const ID& net_id, int req_num)
  104. {
  105.   insert(net_id,::invalid_addr,req_num);
  106. }
  107. void
  108. RequestTable::insert(const ID& net_id, const ID& MAC_id, int req_num)
  109. {
  110.   int existing_entry = find(net_id, MAC_id);
  111.   if (existing_entry < size)
  112.     {
  113.       if (table[existing_entry].MAC_id == ::invalid_addr)
  114. table[existing_entry].MAC_id = MAC_id; // handle creations by getEntry
  115.       table[existing_entry].req_num = req_num;
  116.       return;
  117.     }
  118.   // otherwise add it in
  119.   table[ptr].MAC_id = MAC_id;
  120.   table[ptr].net_id = net_id;
  121.   table[ptr].req_num = req_num;
  122.   table[ptr].last_arp = 0.0;
  123.   table[ptr].rt_reqs_outstanding = 0;
  124.   table[ptr].last_rt_req = -(rt_rq_period + 1.0);
  125.   ptr = (ptr+1)%size;
  126. }