requesttable.cc

Go to the documentation of this file.
00001 
00002 /*
00003  * requesttable.cc
00004  * Copyright (C) 2000 by the University of Southern California
00005  * $Id: requesttable.cc,v 1.4 2005/08/25 18:58:05 johnh Exp $
00006  *
00007  * This program is free software; you can redistribute it and/or
00008  * modify it under the terms of the GNU General Public License,
00009  * version 2, as published by the Free Software Foundation.
00010  *
00011  * This program is distributed in the hope that it will be useful,
00012  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014  * GNU General Public License for more details.
00015  *
00016  * You should have received a copy of the GNU General Public License along
00017  * with this program; if not, write to the Free Software Foundation, Inc.,
00018  * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
00019  *
00020  *
00021  * The copyright of this module includes the following
00022  * linking-with-specific-other-licenses addition:
00023  *
00024  * In addition, as a special exception, the copyright holders of
00025  * this module give you permission to combine (via static or
00026  * dynamic linking) this module with free software programs or
00027  * libraries that are released under the GNU LGPL and with code
00028  * included in the standard release of ns-2 under the Apache 2.0
00029  * license or under otherwise-compatible licenses with advertising
00030  * requirements (or modified versions of such code, with unchanged
00031  * license).  You may copy and distribute such a system following the
00032  * terms of the GNU GPL for this module and the licenses of the
00033  * other code concerned, provided that you include the source code of
00034  * that other code when and as the GNU GPL requires distribution of
00035  * source code.
00036  *
00037  * Note that people who make modified versions of this module
00038  * are not obligated to grant this special exception for their
00039  * modified versions; it is their choice whether to do so.  The GNU
00040  * General Public License gives permission to release a modified
00041  * version without this exception; this exception also makes it
00042  * possible to release a modified version which carries forward this
00043  * exception.
00044  *
00045  */
00046 //
00047 // Other copyrights might apply to parts of this software and are so
00048 // noted when applicable.
00049 //
00050 // Ported from CMU/Monarch's code, appropriate copyright applies.  
00051 
00052 /* requesttable.h
00053 
00054    implement a table to keep track of the most current request
00055    number we've heard from a node in terms of that node's id
00056 
00057 */
00058 
00059 #include "path.h"
00060 #include "constants.h"
00061 #include "requesttable.h"
00062 
00063 RequestTable::RequestTable(int s): size(s)
00064 {
00065   table = new Entry[size];
00066   size = size;
00067   ptr = 0;
00068 }
00069 
00070 RequestTable::~RequestTable()
00071 {
00072   delete[] table;
00073 }
00074 
00075 int
00076 RequestTable::find(const ID& net_id, const ID& MAC_id) const
00077 {
00078   for (int c = 0 ; c < size ; c++)
00079       if (table[c].net_id == net_id || table[c].MAC_id == MAC_id)
00080           return c;
00081   return size;
00082 }
00083 
00084 int
00085 RequestTable::get(const ID& id) const
00086 {
00087   int existing_entry = find(id, id);
00088 
00089   if (existing_entry >= size)    
00090     {
00091       return 0;
00092     }
00093   return table[existing_entry].req_num;
00094 }
00095 
00096 
00097 Entry*
00098 RequestTable::getEntry(const ID& id)
00099 {
00100   int existing_entry = find(id, id);
00101 
00102   if (existing_entry >= size)    
00103     {
00104       table[ptr].MAC_id = ::invalid_addr;
00105       table[ptr].net_id = id;
00106       table[ptr].req_num = 0;
00107       table[ptr].last_arp = 0.0;
00108       table[ptr].rt_reqs_outstanding = 0;
00109       table[ptr].last_rt_req = -(rt_rq_period + 1.0);
00110       existing_entry = ptr;
00111       ptr = (ptr+1)%size;
00112     }
00113   return &(table[existing_entry]);
00114 }
00115 
00116 void
00117 RequestTable::insert(const ID& net_id, int req_num)
00118 {
00119   insert(net_id,::invalid_addr,req_num);
00120 }
00121 
00122 
00123 void
00124 RequestTable::insert(const ID& net_id, const ID& MAC_id, int req_num)
00125 {
00126   int existing_entry = find(net_id, MAC_id);
00127 
00128   if (existing_entry < size)
00129     {
00130       if (table[existing_entry].MAC_id == ::invalid_addr)
00131     table[existing_entry].MAC_id = MAC_id; // handle creations by getEntry
00132       table[existing_entry].req_num = req_num;
00133       return;
00134     }
00135 
00136   // otherwise add it in
00137   table[ptr].MAC_id = MAC_id;
00138   table[ptr].net_id = net_id;
00139   table[ptr].req_num = req_num;
00140   table[ptr].last_arp = 0.0;
00141   table[ptr].rt_reqs_outstanding = 0;
00142   table[ptr].last_rt_req = -(rt_rq_period + 1.0);
00143   ptr = (ptr+1)%size;
00144 }

Generated on Tue Mar 6 16:47:49 2007 for ns2 Network Simulator 2.29 by  doxygen 1.4.6