Public Methods | |
RIPTable (Node owner) | |
void | addElement (Node destination, Node next_node, float cost) |
Node | findNextNodeForRouteTo (Node destination_node) |
void | updateTable (Node node) |
void | updateTable (RIPTable another_table) |
void | garbageCollect () |
void | setCostToInfinity (Node node) |
void | setCost (Node destination, float cost) |
RIPTableElement | elementAt (int index) |
int | findEntry (Node destination_node) |
int | size () |
Private Attributes | |
Vector | table = new Vector() |
Node | owner_node |
Definition at line 18 of file RIPTable.java.
|
Default constructor.
Definition at line 31 of file RIPTable.java. 00032 { 00033 this.owner_node = owner; 00034 } |
|
Adds element to the table.
Definition at line 43 of file RIPTable.java. Referenced by Node::attach(), and updateTable().
00044 { 00045 RIPTableElement new_element = new RIPTableElement(destination, next_node, cost); 00046 table.addElement(new_element); 00047 } |
|
Gets element at index i.
Definition at line 331 of file RIPTable.java. Referenced by updateTable().
00332 { 00333 return (RIPTableElement)table.elementAt(index); 00334 } |
|
Finds table entry with given destination node or network.
Definition at line 342 of file RIPTable.java. Referenced by updateTable().
00343 { 00344 int i; 00345 RIPTableElement element; 00346 00347 for (i=0; i<table.size(); i++) 00348 { 00349 element = (RIPTableElement)table.elementAt(i); 00350 if (element.destination_node == destination_node) 00351 { 00352 return i; 00353 } 00354 } 00355 return -1; 00356 } |
|
Finds next node along a path to destination.
Definition at line 56 of file RIPTable.java. Referenced by Node::transmitAll().
00057 { 00058 int i; 00059 RIPTableElement element; 00060 Node next_node; 00061 00062 next_node = null; 00063 for (i=0; i<table.size(); i++) 00064 { 00065 element = (RIPTableElement)table.elementAt(i); 00066 /* Route is valid only if cost is less than infinity (16). */ 00067 if (destination_node == element.destination_node) 00068 { 00069 next_node = element.next_node; 00070 if (element.cost < 16) 00071 { 00072 return next_node; 00073 } 00074 } 00075 /* if */ 00076 } 00077 /* for */ 00078 return next_node; 00079 } |
|
Decreases all timers and removes expired entries. Definition at line 240 of file RIPTable.java. Referenced by Node::updateRoutingTable().
00241 { 00242 int i; 00243 RIPTableElement element; 00244 00245 for (i=0; i<table.size(); i++) 00246 { 00247 element = (RIPTableElement)table.elementAt(i); 00248 if (!element.route_change_flag) 00249 { 00250 if (element.route_timeout>0) 00251 { 00252 element.route_timeout -= 1; 00253 } 00254 else if (element.garbage_timeout>0) 00255 { 00256 element.cost = 16; 00257 element.garbage_timeout -= 1; 00258 } 00259 else 00260 { 00261 /* Entry expired, will be terminated. */ 00262 table.removeElementAt(i); 00263 i--; 00264 } 00265 } 00266 /* if */ 00267 } 00268 /* for */ 00269 } |
|
Sets cost to given value.
Definition at line 305 of file RIPTable.java. 00306 { 00307 int i; 00308 RIPTableElement element; 00309 00310 for (i=0; i<table.size(); i++) 00311 { 00312 element = (RIPTableElement)table.elementAt(i); 00313 if (element.destination_node == destination) 00314 { 00315 element.cost = cost; 00316 element.route_change_flag = true; 00317 element.route_timeout = 5; 00318 element.garbage_timeout = 5; 00319 } 00320 /* if */ 00321 } 00322 /* for */ 00323 } |
|
Sets destination cost to infinity. Used when line or node is erased/disconnected.
Definition at line 277 of file RIPTable.java. Referenced by Node::detach().
00278 { 00279 int i; 00280 RIPTableElement element; 00281 00282 for (i=0; i<table.size(); i++) 00283 { 00284 element = (RIPTableElement)table.elementAt(i); 00285 if ((element.next_node == node) || 00286 (element.destination_node == node) 00287 ) 00288 { 00289 element.cost = 16; 00290 element.route_change_flag = true; 00291 element.route_timeout = 5; 00292 element.garbage_timeout = 5; 00293 } 00294 /* if */ 00295 } 00296 /* for */ 00297 } |
|
Gets table size.
Definition at line 363 of file RIPTable.java. Referenced by updateTable().
00364 { 00365 return table.size(); 00366 } |
|
Updates the table.
Definition at line 187 of file RIPTable.java. 00188 { 00189 int i; 00190 int j; 00191 RIPTableElement old_element; 00192 RIPTableElement new_element; 00193 00194 for (i=0; i<another_table.size(); i++) 00195 { 00196 new_element = another_table.elementAt(i); 00197 j = findEntry(new_element.destination_node); 00198 if (j != -1) 00199 { 00200 old_element = (RIPTableElement)table.elementAt(j); 00201 if (old_element.cost > new_element.cost + 1) 00202 { 00203 /* Better route exists. */ 00204 old_element.cost = new_element.cost + 1; 00205 old_element.next_node = new_element.next_node; 00206 old_element.route_change_flag = true; 00207 old_element.route_timeout = 5; 00208 old_element.garbage_timeout = 5; 00209 } 00210 else if (old_element.next_node == new_element.next_node) 00211 { 00212 /* Update if required. */ 00213 old_element.cost = new_element.cost + 1; 00214 old_element.route_change_flag = true; 00215 old_element.route_timeout = 5; 00216 old_element.garbage_timeout = 5; 00217 } 00218 else 00219 { 00220 old_element.route_change_flag = false; 00221 } 00222 } 00223 00224 else 00225 { 00226 /* Create new table element. */ 00227 addElement(new_element.destination_node, new_element.next_node, 00228 new_element.cost + 1 00229 ); 00230 } 00231 /* else */ 00232 } 00233 /* for */ /* Process all elements. */ 00234 } |
|
Updates the table. Instead of sending updates as packets through the network, every node will update table directly (for simplicity).
Definition at line 88 of file RIPTable.java. Referenced by Node::updateRoutingTable().
00089 { 00090 int i; 00091 int j; 00092 RIPTable another_table = node.getRIPTable(); 00093 RIPTableElement old_element; 00094 RIPTableElement new_element; 00095 00096 /* Metric update for node. */ 00097 j = findEntry(node); 00098 if (j >= 0) 00099 { 00100 old_element = (RIPTableElement)table.elementAt(j); 00101 old_element.cost = 1; 00102 old_element.next_node = node; 00103 old_element.route_change_flag = true; 00104 old_element.route_timeout = 5; 00105 old_element.garbage_timeout = 5; 00106 } 00107 /* Metric update. */ 00108 for (i=0; i<another_table.size(); i++) 00109 { 00110 new_element = another_table.elementAt(i); 00111 j = findEntry(new_element.destination_node); 00112 if ((j >= 0) && 00113 (new_element.destination_node != owner_node) 00114 ) 00115 { 00116 old_element = (RIPTableElement)table.elementAt(j); 00117 if (new_element.next_node == owner_node) 00118 { 00119 /* Split horizon with poisoned reverse. Cost is 16. */ 00120 if (old_element.cost >= 16) 00121 { 00122 /* Better route exists. */ 00123 old_element.cost = 16; 00124 old_element.next_node = node; 00125 old_element.route_change_flag = true; 00126 old_element.route_timeout = 5; 00127 old_element.garbage_timeout = 5; 00128 } 00129 else if (old_element.next_node == node) 00130 { 00131 /* Update is required. */ 00132 old_element.cost = 16; 00133 old_element.route_change_flag = true; 00134 old_element.route_timeout = 5; 00135 old_element.garbage_timeout = 5; 00136 } 00137 else 00138 { 00139 old_element.route_change_flag = false; 00140 } 00141 00142 } 00143 else 00144 { 00145 /* Normal update. */ 00146 if (old_element.cost >= new_element.cost + 1) 00147 { 00148 /* Better route exists. */ 00149 old_element.cost = new_element.cost + 1; 00150 old_element.next_node = node; 00151 old_element.route_change_flag = true; 00152 old_element.route_timeout = 5; 00153 old_element.garbage_timeout = 5; 00154 } 00155 else if (old_element.next_node == node) 00156 { 00157 /* Update is required. */ 00158 old_element.cost = new_element.cost + 1; 00159 old_element.route_change_flag = true; 00160 old_element.route_timeout = 5; 00161 old_element.garbage_timeout = 5; 00162 } 00163 else 00164 { 00165 old_element.route_change_flag = false; 00166 } 00167 } 00168 /* else */ 00169 } 00170 else if(new_element.destination_node != owner_node) 00171 { 00172 /* Create new table element. */ 00173 addElement(new_element.destination_node, node, 00174 new_element.cost + 1 00175 ); 00176 } 00177 /* else */ 00178 } 00179 /* for */ /* Process all elements. */ 00180 } |
|
Owner node. Definition at line 25 of file RIPTable.java. |
|
RIP table. Definition at line 22 of file RIPTable.java. |