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

通讯编程

开发平台:

Visual C++

  1. /*
  2. Copyright (c) 1997, 1998 Carnegie Mellon University.  All Rights
  3. Reserved. 
  4. Redistribution and use in source and binary forms, with or without
  5. modification, are permitted provided that the following conditions are met:
  6. 1. Redistributions of source code must retain the above copyright notice,
  7. this list of conditions and the following disclaimer.
  8. 2. Redistributions in binary form must reproduce the above copyright notice,
  9. this list of conditions and the following disclaimer in the documentation
  10. and/or other materials provided with the distribution.
  11. 3. The name of the author may not be used to endorse or promote products
  12. derived from this software without specific prior written permission.
  13. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  14. IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  15. OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  16. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  17. SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  18. PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
  19. OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  20. WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
  21. OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
  22. ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  23. The AODV code developed by the CMU/MONARCH group was optimized and tuned by Samir Das and Mahesh Marina, University of Cincinnati. The work was partially done in Sun Microsystems.
  24. */
  25. #ifndef __aodv_h__
  26. #define __aodv_h__
  27. //#include <agent.h>
  28. //#include <packet.h>
  29. //#include <sys/types.h>
  30. //#include <cmu/list.h>
  31. //#include <scheduler.h>
  32. #include <cmu-trace.h>
  33. #include <priqueue.h>
  34. #include <aodv/aodv_rtable.h>
  35. #include <aodv/aodv_rqueue.h>
  36. #include <classifier/classifier-port.h>
  37. /*
  38.   Allows local repair of routes 
  39. */
  40. #define AODV_LOCAL_REPAIR
  41. /*
  42.   Allows AODV to use link-layer (802.11) feedback in determining when
  43.   links are up/down.
  44. */
  45. #define AODV_LINK_LAYER_DETECTION
  46. /*
  47.   Causes AODV to apply a "smoothing" function to the link layer feedback
  48.   that is generated by 802.11.  In essence, it requires that RT_MAX_ERROR
  49.   errors occurs within a window of RT_MAX_ERROR_TIME before the link
  50.   is considered bad.
  51. */
  52. #define AODV_USE_LL_METRIC
  53. /*
  54.   Only applies if AODV_USE_LL_METRIC is defined.
  55.   Causes AODV to apply omniscient knowledge to the feedback received
  56.   from 802.11.  This may be flawed, because it does not account for
  57.   congestion.
  58. */
  59. //#define AODV_USE_GOD_FEEDBACK
  60. class AODV;
  61. #define MY_ROUTE_TIMEOUT        10                       // 100 seconds
  62. #define ACTIVE_ROUTE_TIMEOUT    10 // 50 seconds
  63. #define REV_ROUTE_LIFE          6 // 5  seconds
  64. #define BCAST_ID_SAVE           6 // 3 seconds
  65. // No. of times to do network-wide search before timing out for 
  66. // MAX_RREQ_TIMEOUT sec. 
  67. #define RREQ_RETRIES            3  
  68. // timeout after doing network-wide search RREQ_RETRIES times
  69. #define MAX_RREQ_TIMEOUT 10.0 //sec
  70. /* Various constants used for the expanding ring search */
  71. #define TTL_START     5
  72. #define TTL_THRESHOLD 7
  73. #define TTL_INCREMENT 2 
  74. // This should be somewhat related to arp timeout
  75. #define NODE_TRAVERSAL_TIME     0.03             // 30 ms
  76. #define LOCAL_REPAIR_WAIT_TIME  0.15 //sec
  77. // Should be set by the user using best guess (conservative) 
  78. #define NETWORK_DIAMETER        30             // 30 hops
  79. // Must be larger than the time difference between a node propagates a route 
  80. // request and gets the route reply back.
  81. //#define RREP_WAIT_TIME     (3 * NODE_TRAVERSAL_TIME * NETWORK_DIAMETER) // ms
  82. //#define RREP_WAIT_TIME     (2 * REV_ROUTE_LIFE)  // seconds
  83. #define RREP_WAIT_TIME         1.0  // sec
  84. #define ID_NOT_FOUND    0x00
  85. #define ID_FOUND        0x01
  86. //#define INFINITY        0xff
  87. // The followings are used for the forward() function. Controls pacing.
  88. #define DELAY 1.0           // random delay
  89. #define NO_DELAY -1.0       // no delay 
  90. // think it should be 30 ms
  91. #define ARP_DELAY 0.01      // fixed delay to keep arp happy
  92. #define HELLO_INTERVAL          1               // 1000 ms
  93. #define ALLOWED_HELLO_LOSS      3               // packets
  94. #define BAD_LINK_LIFETIME       3               // 3000 ms
  95. #define MaxHelloInterval        (1.25 * HELLO_INTERVAL)
  96. #define MinHelloInterval        (0.75 * HELLO_INTERVAL)
  97. /*
  98.   Timers (Broadcast ID, Hello, Neighbor Cache, Route Cache)
  99. */
  100. class BroadcastTimer : public Handler {
  101. public:
  102.         BroadcastTimer(AODV* a) : agent(a) {}
  103.         void handle(Event*);
  104. private:
  105.         AODV    *agent;
  106. Event intr;
  107. };
  108. class HelloTimer : public Handler {
  109. public:
  110.         HelloTimer(AODV* a) : agent(a) {}
  111.         void handle(Event*);
  112. private:
  113.         AODV    *agent;
  114. Event intr;
  115. };
  116. class NeighborTimer : public Handler {
  117. public:
  118.         NeighborTimer(AODV* a) : agent(a) {}
  119.         void handle(Event*);
  120. private:
  121.         AODV    *agent;
  122. Event intr;
  123. };
  124. class RouteCacheTimer : public Handler {
  125. public:
  126.         RouteCacheTimer(AODV* a) : agent(a) {}
  127.         void handle(Event*);
  128. private:
  129.         AODV    *agent;
  130. Event intr;
  131. };
  132. class LocalRepairTimer : public Handler {
  133. public:
  134.         LocalRepairTimer(AODV* a) : agent(a) {}
  135.         void handle(Event*);
  136. private:
  137.         AODV    *agent;
  138. Event intr;
  139. };
  140. /*
  141.   Broadcast ID Cache
  142. */
  143. class BroadcastID {
  144.         friend class AODV;
  145.  public:
  146.         BroadcastID(nsaddr_t i, u_int32_t b) { src = i; id = b;  }
  147.  protected:
  148.         LIST_ENTRY(BroadcastID) link;
  149.         nsaddr_t        src;
  150.         u_int32_t       id;
  151.         double          expire;         // now + BCAST_ID_SAVE s
  152. };
  153. LIST_HEAD(aodv_bcache, BroadcastID);
  154. /*
  155.   The Routing Agent
  156. */
  157. class AODV: public Agent {
  158.   /*
  159.    * make some friends first 
  160.    */
  161.         friend class aodv_rt_entry;
  162.         friend class BroadcastTimer;
  163.         friend class HelloTimer;
  164.         friend class NeighborTimer;
  165.         friend class RouteCacheTimer;
  166.         friend class LocalRepairTimer;
  167.  public:
  168.         AODV(nsaddr_t id);
  169.         void recv(Packet *p, Handler *);
  170.  protected:
  171.         int             command(int, const char *const *);
  172.         int             initialized() { return 1 && target_; }
  173.         /*
  174.          * Route Table Management
  175.          */
  176.         void            rt_resolve(Packet *p);
  177.         void            rt_update(aodv_rt_entry *rt, u_int32_t seqnum,
  178.          u_int16_t metric, nsaddr_t nexthop,
  179.        double expire_time);
  180.         void            rt_down(aodv_rt_entry *rt);
  181.         void            local_rt_repair(aodv_rt_entry *rt, Packet *p);
  182.  public:
  183.         void            rt_ll_failed(Packet *p);
  184.         void            handle_link_failure(nsaddr_t id);
  185.  protected:
  186.         void            rt_purge(void);
  187.         void            enque(aodv_rt_entry *rt, Packet *p);
  188.         Packet*         deque(aodv_rt_entry *rt);
  189.         /*
  190.          * Neighbor Management
  191.          */
  192.         void            nb_insert(nsaddr_t id);
  193.         AODV_Neighbor*       nb_lookup(nsaddr_t id);
  194.         void            nb_delete(nsaddr_t id);
  195.         void            nb_purge(void);
  196.         /*
  197.          * Broadcast ID Management
  198.          */
  199.         void            id_insert(nsaddr_t id, u_int32_t bid);
  200.         bool         id_lookup(nsaddr_t id, u_int32_t bid);
  201.         void            id_purge(void);
  202.         /*
  203.          * Packet TX Routines
  204.          */
  205.         void            forward(aodv_rt_entry *rt, Packet *p, double delay);
  206.         void            sendHello(void);
  207.         void            sendRequest(nsaddr_t dst);
  208.         void            sendReply(nsaddr_t ipdst, u_int32_t hop_count,
  209.                                   nsaddr_t rpdst, u_int32_t rpseq,
  210.                                   u_int32_t lifetime, double timestamp);
  211.         void            sendError(Packet *p, bool jitter = true);
  212.                                           
  213.         /*
  214.          * Packet RX Routines
  215.          */
  216.         void            recvAODV(Packet *p);
  217.         void            recvHello(Packet *p);
  218.         void            recvRequest(Packet *p);
  219.         void            recvReply(Packet *p);
  220.         void            recvError(Packet *p);
  221. /*
  222.  * History management
  223.  */
  224. double  PerHopTime(aodv_rt_entry *rt);
  225.         nsaddr_t        index;                  // IP Address of this node
  226.         u_int32_t       seqno;                  // Sequence Number
  227.         int             bid;                    // Broadcast ID
  228.         aodv_rtable         rthead;                 // routing table
  229.         aodv_ncache         nbhead;                 // Neighbor Cache
  230.         aodv_bcache          bihead;                 // Broadcast ID Cache
  231.         /*
  232.          * Timers
  233.          */
  234.         BroadcastTimer  btimer;
  235.         HelloTimer      htimer;
  236.         NeighborTimer   ntimer;
  237.         RouteCacheTimer rtimer;
  238.         LocalRepairTimer lrtimer;
  239.         /*
  240.          * Routing Table
  241.          */
  242.         aodv_rtable          rtable;
  243.         /*
  244.          *  A "drop-front" queue used by the routing layer to buffer
  245.          *  packets to which it does not have a route.
  246.          */
  247.         aodv_rqueue         rqueue;
  248.         /*
  249.          * A mechanism for logging the contents of the routing
  250.          * table.
  251.          */
  252.         Trace           *logtarget;
  253.         /*
  254.          * A pointer to the network interface queue that sits
  255.          * between the "classifier" and the "link layer".
  256.          */
  257.         PriQueue        *ifqueue;
  258.         /*
  259.          * Logging stuff
  260.          */
  261.         void            log_link_del(nsaddr_t dst);
  262.         void            log_link_broke(Packet *p);
  263.         void            log_link_kept(nsaddr_t dst);
  264. /* for passing packets up to agents */
  265. PortClassifier *dmux_;
  266. };
  267. #endif /* __aodv_h__ */