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

通讯编程

开发平台:

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, nov'98 -Padma.*/
  35. #include <string.h>
  36. #include <stdlib.h>
  37. #include <stdio.h>
  38. #include <assert.h>
  39. #include "rtable.h"
  40. static int rtent_trich(const void *a, const void *b) {
  41.   nsaddr_t ia = ((const rtable_ent *) a)->dst;
  42.   nsaddr_t ib = ((const rtable_ent *) b)->dst;
  43.   if (ia > ib) return 1;
  44.   if (ib > ia) return -1;
  45.   return 0;
  46. }
  47. RoutingTable::RoutingTable() {
  48.   // Let's start with a ten element maxelts.
  49.   elts = 0;
  50.   maxelts = 10;
  51.   rtab = new rtable_ent[maxelts];
  52. }
  53. void
  54. RoutingTable::AddEntry(const rtable_ent &ent)
  55. {
  56.   rtable_ent *it;
  57.   //DEBUG
  58.   assert(ent.metric <= BIG);
  59.   if ((it = (rtable_ent*) bsearch(&ent, rtab, elts, sizeof(rtable_ent), 
  60.  rtent_trich))) {
  61.     bcopy(&ent,it,sizeof(rtable_ent));
  62.     return;
  63.     /*
  64.     if (it->seqnum < ent.seqnum || it->metric > (ent.metric+em)) {
  65.       bcopy(&ent,it,sizeof(rtable_ent));
  66.       it->metric += em;
  67.       return NEW_ROUTE_SUCCESS_OLDENT;
  68.     } else {
  69.       return NEW_ROUTE_METRIC_TOO_HIGH;
  70.     }
  71.     */
  72.   }
  73.   if (elts == maxelts) {
  74.     rtable_ent *tmp = rtab;
  75.     maxelts *= 2;
  76.     rtab = new rtable_ent[maxelts];
  77.     bcopy(tmp, rtab, elts*sizeof(rtable_ent));
  78.     delete tmp;
  79.   }
  80.   
  81.   int max;
  82.   
  83.   for (max=0;max<elts;max++) {
  84.   if (ent.dst < rtab[max].dst) {
  85.   break;
  86.   }
  87.   }
  88.   // Copy all the further out guys out yet another.
  89.   // bcopy does not seem to quite work on sunos???
  90.   
  91.   //bcopy(&rtab[max], &rtab[max+1], sizeof(rtable_ent)*(elts-max));
  92.   
  93.   //if (elts) {
  94.   int i = elts-1;
  95.   while (i >= max) {
  96.   rtab[i+1] = rtab[i];
  97.   i--;
  98.   }
  99.   //}
  100.   bcopy(&ent, &rtab[max], sizeof(rtable_ent));
  101.   elts++;
  102.   return;
  103. }
  104. void 
  105. RoutingTable::InitLoop() {
  106.   ctr = 0;
  107. }
  108. rtable_ent *
  109. RoutingTable::NextLoop() {
  110.   if (ctr >= elts)
  111.     return 0;
  112.   return &rtab[ctr++];
  113. }
  114. // Only valid (duh) as long as no new routes are added
  115. int 
  116. RoutingTable::RemainingLoop() {
  117.   return elts-ctr;
  118. }
  119. rtable_ent *
  120. RoutingTable::GetEntry(nsaddr_t dest) {
  121.   rtable_ent ent;
  122.   ent.dst = dest;
  123.   return (rtable_ent *) bsearch(&ent, rtab, elts, sizeof(rtable_ent), 
  124. rtent_trich);
  125. }