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

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * routealgo.cc
  3.  * Copyright (C) 2000 by the University of Southern California
  4.  * $Id: routealgo.cc,v 1.5 2005/08/25 18:58:11 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.  * Generic helpers (all routing algorithms)
  47.  * contributed to ns
  48.  * George Riley, Georgia Tech, Winter 2000
  49.  */
  50. #include "config.h"
  51. #ifdef HAVE_STL
  52. #include <stdio.h>
  53. #include "routealgo/rnode.h"
  54. // Forward declarations
  55. static void PrintPred(nodeid_t, nodeid_t, RoutingVec_t&);
  56. static void NixPred(nodeid_t, nodeid_t, RoutingVec_t&, RNodeVec_t&, NixVec&);
  57. // Globally visible routines
  58. void PrintRoute( nodeid_t s, nodeid_t d, RoutingVec_t& pred)
  59. { // Print the route, given source s, destination d and predecessor vector pred
  60.   printf("Route to node %ld is : ", d);
  61.   PrintPred(s, d, pred);
  62.   printf("n");
  63. }
  64. // Create the NixVector
  65. void NixRoute( nodeid_t s, nodeid_t d, RoutingVec_t& pred,
  66.                RNodeVec_t& nodes, NixVec& nv)
  67. {
  68.   NixPred(s, d, pred, nodes, nv);
  69. }
  70. // Print the parent list (debug)
  71. void PrintParents(RoutingVec_t& pred)
  72. {
  73.   printf("Parent vector is");
  74.   for (RoutingVec_it i = pred.begin(); i != pred.end(); i++)
  75.     {
  76.       printf(" %ld", *i);
  77.     }
  78.   printf("n");
  79. }
  80. // Print the route from the nixvector (debug)
  81. void PrintNix(nodeid_t s, RNodeVec_t nodes, NixVec& nv)
  82. {
  83.   printf("Printing Nv from %ldn", s);
  84.   while(1)
  85.     {
  86.       printf("%ldn", s);
  87.       fflush(stdout);
  88.       if (!nodes[s])
  89.         {
  90.           printf("PrintNix Error, no node for %ldn", s);
  91.           break;
  92.         }
  93.       printf("Node %ld nixl %ldn", s, nodes[s]->GetNixl());
  94.       Nix_t n = nv.Extract(nodes[s]->GetNixl());
  95.       if (n == NIX_NONE) break; // Done
  96.       nodeid_t s1 = nodes[s]->GetNeighbor(n);
  97.       if (s1 == NODE_NONE)
  98.         {
  99.           printf("Huh?  Node %ld can't get neighbor %ldn", s, n);
  100.           break;
  101.         }
  102.       s = s1;
  103.     }
  104.   printf("n");
  105.   nv.Reset();
  106. }
  107. // helpers
  108. static void PrintPred(nodeid_t s, nodeid_t p, RoutingVec_t& pred)
  109. {
  110.   if (s == p)
  111.     {
  112.       printf(" %ld", s);
  113.     }
  114.   else
  115.     {
  116.       if (pred[p] == NODE_NONE)
  117.         {
  118.           printf(" No path..");
  119.         }
  120.       else
  121.         {
  122.           PrintPred(s, pred[p], pred);
  123.           printf(" %ld", p);
  124.         }
  125.     }
  126. }
  127. static void NixPred(nodeid_t s, nodeid_t p, RoutingVec_t& pred,
  128.                     RNodeVec_t& nodes, NixVec& nv)
  129. {
  130.   if (s == p)
  131.     {
  132.       return; // Got there
  133.     }
  134.   else
  135.     {
  136.       if (pred[p] == NODE_NONE)
  137.         {
  138.           if(0)printf(" No path..");
  139.           return;
  140.         }
  141.       else
  142.         {
  143.           NixPred(s, pred[p], pred, nodes, nv);
  144.           NixPair_t n = nodes[pred[p]]->GetNix(p);
  145.           if (n.first == NIX_NONE)
  146.             { // ! Error.
  147.               printf("RouteAlgo::GetNix returned NIX_NONE!n");
  148.               exit(1);
  149.             }
  150.           if(0)printf("NVAdding ind %ld lth %ldn", n.first, n.second);
  151.           nv.Add(n);
  152.         }
  153.     }
  154. }
  155. #endif /* STL */