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

通讯编程

开发平台:

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. /* dsdv.h -*- c++ -*-
  36.    $Id: dsdv.h,v 1.6 1999/08/20 18:03:16 haoboy Exp $
  37.    */
  38. #ifndef cmu_dsdv_h_
  39. #define cmu_dsdv_h_
  40. #include "config.h"
  41. #include "agent.h"
  42. #include "ip.h"
  43. #include "delay.h"
  44. #include "scheduler.h"
  45. #include "queue.h"
  46. #include "trace.h"
  47. #include "arp.h"
  48. #include "ll.h"
  49. #include "mac.h"
  50. #include "priqueue.h"
  51. #include "rtable.h"
  52. #if defined(WIN32) && !defined(snprintf)
  53. #define snprintf _snprintf
  54. #endif /* WIN32 && !snprintf */
  55. typedef double Time;
  56. #define MAX_QUEUE_LENGTH 5
  57. #define ROUTER_PORT      0xff
  58. class DSDV_Helper;
  59. class DSDVTriggerHandler;
  60. class DSDV_Agent : public Agent {
  61.   friend class DSDV_Helper;
  62.   friend class DSDVTriggerHandler;
  63. public:
  64.   DSDV_Agent();
  65.   virtual int command(int argc, const char * const * argv);
  66.   void lost_link(Packet *p);
  67.   
  68. protected:
  69.   void helper_callback(Event *e);
  70.   Packet* rtable(int);
  71.   virtual void recv(Packet *, Handler *);
  72.   void trace(char* fmt, ...);
  73.   void tracepkt(Packet *, double, int, const char *);
  74.   void needTriggeredUpdate(rtable_ent *prte, Time t);
  75.   // if no triggered update already pending for route prte, make one so
  76.   void cancelTriggersBefore(Time t);
  77.   // Cancel any triggered events scheduled to take place *before* time
  78.   // t (exclusive)
  79.   Packet * makeUpdate(int& periodic);
  80.   // return a packet advertising the state in the routing table
  81.   // makes a full ``periodic'' update if requested, or a ``triggered''
  82.   // partial update if there are only a few changes and full update otherwise
  83.   // returns with periodic = 1 if full update returned, or = 0 if partial
  84.   // update returned
  85.   void updateRoute(rtable_ent *old_rte, rtable_ent *new_rte);
  86.   void processUpdate (Packet * p);
  87.   void forwardPacket (Packet * p);
  88.   void startUp();
  89.   int diff_subnet(int dst);
  90.   void sendOutBCastPkt(Packet *p);
  91.   
  92.   
  93.   // update old_rte in routing table to to new_rte
  94.   Trace *tracetarget;       // Trace Target
  95.   DSDV_Helper  *helper_;    // DSDV Helper, handles callbacks
  96.   DSDVTriggerHandler *trigger_handler;
  97.   RoutingTable *table_;     // Routing Table
  98.   PriQueue *ll_queue;       // link level output queue
  99.   int seqno_;               // Sequence number to advertise with...
  100.   int myaddr_;              // My address...
  101.   
  102.   // Extensions for mixed type simulations using wired and wireless
  103.   // nodes
  104.   char *subnet_;            // My subnet
  105.   MobileNode *node_;        // My node
  106.   // for debugging
  107.   char *address;
  108.   NsObject *port_dmux_;    // my port dmux
  109.   Event *periodic_callback_;           // notify for periodic update
  110.   
  111.   // Randomness/MAC/logging parameters
  112.   int be_random_;
  113.   int use_mac_;
  114.   int verbose_;
  115.   int trace_wst_;
  116.   
  117.   // last time a periodic update was sent...
  118.   double lasttup_; // time of last triggered update
  119.   double next_tup; // time of next triggered update
  120.   //  Event *trigupd_scheduled; // event marking a scheduled triggered update
  121.   
  122.   // DSDV constants:
  123.   double alpha_;  // 0.875
  124.   double wst0_;   // 6 (secs)
  125.   double perup_;  // 15 (secs)  period between updates
  126.   int    min_update_periods_;    // 3 we must hear an update from a neighbor
  127.   // every min_update_periods or we declare
  128.   // them unreachable
  129.   
  130.   void output_rte(const char *prefix, rtable_ent *prte, DSDV_Agent *a);
  131.   
  132. };
  133. class DSDV_Helper : public Handler {
  134.   public:
  135.     DSDV_Helper(DSDV_Agent *a_) { a = a_; }
  136.     virtual void handle(Event *e) { a->helper_callback(e); }
  137.   private:
  138.     DSDV_Agent *a;
  139. };
  140. #endif