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

通讯编程

开发平台:

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
  35.  *
  36.  * $Header: /cvsroot/nsnam/ns-2/imep/imep.h,v 1.6 2006/02/21 15:20:18 mahrenho Exp $
  37.  */
  38. #ifndef __imep_h__
  39. #define __imep_h__
  40. #include <stdarg.h>
  41. #include <sys/types.h>
  42. #include <config.h>
  43. #include <agent.h>
  44. #include <drop-tail.h>
  45. #include <trace.h>
  46. #include "lib/bsd-list.h"
  47. #include <rtproto/rtproto.h>
  48. #include <imep/rxmit_queue.h>
  49. #include <imep/dest_queue.h>
  50. #include <imep/imep_stats.h>
  51. #include <imep/imep_spec.h>
  52. // ======================================================================
  53. // ======================================================================
  54. #define IMEP_HDR_LEN 512
  55. #define BEACON_HDR_LEN (IP_HDR_LEN + sizeof(struct hdr_imep))
  56. #define HELLO_HDR_LEN (IP_HDR_LEN + sizeof(struct hdr_imep) + 
  57.  offsetof(struct imep_hello_block, hb_hello_list[0]) )
  58. #define ACK_HDR_LEN (IP_HDR_LEN + sizeof(struct hdr_imep) + 
  59.  offsetof(struct imep_ack_block, ab_ack_list[0] ) )
  60. #define INT32_T(X) *((int32_t*) &(X))
  61. #define U_INT16_T(X) *((u_int16_t*) &(X))
  62. #define U_INT32_T(X) *((u_int32_t*) &(X))
  63. // ======================================================================
  64. // ======================================================================
  65. class imepAgent;
  66. enum imepTimerType {
  67. BEACON_TIMER = 0x01,
  68. CONTROL_TIMER = 0x02,
  69. REXMIT_TIMER = 0x03,
  70. INCOMING_TIMER = 0x04
  71. };
  72. class imepTimer : public Handler {
  73. public:
  74.         imepTimer(imepAgent* a, imepTimerType t) : busy_(0), agent(a), type_(t) {}
  75.         void handle(Event*);
  76. void start(double time);
  77. void cancel();
  78. int busy() { return busy_; }
  79.         double  timeLeft();
  80. private:
  81. Event intr;
  82. int busy_;
  83.         imepAgent *agent;
  84. imepTimerType type_;
  85. };
  86. // ======================================================================
  87. // ======================================================================
  88. class imepLink {
  89. friend class imepAgent; // so the LIST macros work
  90. public:
  91. imepLink(nsaddr_t index) : index_(index), last_echo_(-BEACON_PERIOD) {}
  92. nsaddr_t& index() { return index_; }
  93. u_int32_t&   status() { return status_;}
  94. u_int8_t&       lastSeq() { return last_seq_;}
  95. u_int8_t&       lastSeqValid() { return last_seq_;}
  96. double& in_expire() { return in_expire_; }
  97. double& out_expire() { return out_expire_; }
  98. double&         lastEcho() { return last_echo_; } 
  99. protected:
  100. LIST_ENTRY(imepLink) link;
  101. private:
  102. nsaddr_t index_;
  103. u_int32_t status_;
  104. double       in_expire_;
  105. double out_expire_;
  106. double          last_echo_;
  107.         u_int8_t        last_seq_;  // greatest seq heard from index_
  108.         bool            last_seq_valid;
  109. };
  110. // ======================================================================
  111. // ======================================================================
  112. class imepAgent : public Agent {
  113. friend class imepTimer;
  114.  public:
  115. imepAgent(nsaddr_t index);
  116. void recv(Packet *p, Handler *h);
  117. int command(int argc, const char*const* argv);
  118. // ============================================================
  119. // The IMEP API (imep-api.cc)
  120. void imepRegister(rtAgent *rt);
  121. void imepGetLinkStatus(nsaddr_t index, u_int32_t& status);
  122. void imepSetLinkInStatus(nsaddr_t index);
  123. void imepSetLinkOutStatus(nsaddr_t index);
  124. void imepSetLinkBiStatus(nsaddr_t index);
  125. void imepSetLinkDownStatus(nsaddr_t index);
  126. void imepPacketUndeliverable(Packet *p);
  127. // called by the MAC layer when it is unable to deliver
  128. // a packet to its next hop.
  129.   void imepGetBiLinks(int*& nblist, int& nbcnt);
  130. // called by the routing layer to get a complete list of all
  131. // neighbors.
  132.         ImepStat stats;
  133.  protected:
  134.         void Terminate();
  135. // ============================================================
  136. // Timer stuff
  137. void handlerTimer(imepTimerType t);
  138.  private:
  139. imepTimer beaconTimer;
  140. imepTimer controlTimer;
  141. imepTimer rexmitTimer;
  142. imepTimer incomingTimer;
  143. void handlerBeaconTimer(void);
  144. void handlerControlTimer(void);
  145. void handlerReXmitTimer(void);
  146. void handlerIncomingTimer(void);
  147. // When this timer fires, holes in the sequence space
  148. // are ignored and objects are delivered to the upper
  149. // layers.
  150. // ============================================================
  151. // Packet processing functions
  152. void recv_incoming(Packet *p);
  153. void recv_outgoing(Packet *p);
  154. void imep_beacon_input(Packet *p);
  155. void imep_ack_input(Packet *p);
  156. void imep_hello_input(Packet *p);
  157. void imep_object_input(Packet *p);
  158.         void imep_object_process(Packet *p);
  159.         void imep_ack_object(Packet *p);
  160. void imep_input(Packet *p);
  161. void imep_output(Packet *p);
  162. void sendBeacon(void);
  163. void sendHello(nsaddr_t index);
  164. void sendAck(nsaddr_t index, u_int32_t seqno);
  165.         
  166. // ============================================================
  167. // Utility routines
  168. imepLink* findLink(nsaddr_t index);
  169. void purgeLink(void);
  170. // purge all expired links from the cache.
  171.         void purgeReXmitQ(nsaddr_t index);
  172.         // remove index from any response lists in the rexmit q
  173. Packet* findObjectSequence(u_int8_t seqno);
  174. // find the packet corresponding to sequence number "seqno".
  175. void removeObjectResponse(Packet *p, nsaddr_t index);
  176. // remove IP address "index" from the object response list of "p".
  177. struct imep_ack_block* findAckBlock(Packet *p);
  178. struct imep_hello_block* findHelloBlock(Packet *p);
  179. struct imep_object_block* findObjectBlock(Packet *p);
  180. struct imep_response* findResponseList(Packet *p);
  181. void aggregateAckBlock(Packet *p);
  182. void aggregateHelloBlock(Packet *p);
  183. void aggregateObjectBlock(Packet *p);
  184. void createResponseList(Packet *p);
  185.         int getResponseListSize();
  186. void scheduleReXmit(Packet *p);
  187. void scheduleIncoming(Packet *p, u_int32_t s);
  188. u_int8_t nextSequence() {
  189. controlSequence++;
  190. return (controlSequence & 0xFF);
  191. }
  192. inline int initialized() {
  193. return recvtarget_ && sendtarget_ && rtagent_ && logtarget_;
  194. }
  195. void imep_dump_header(Packet *p);
  196. public:
  197. void trace(char* fmt, ...);
  198. private:
  199. void log_neighbor_list(void);
  200.         char* dumpResponseList(Packet *p);
  201. // ============================================================
  202. // Routing Protocol Specific Routines
  203. void toraCreateHeader(Packet *p, char* dst, int length);
  204. void toraExtractHeader(Packet *p, char* dst);
  205. int toraHeaderLength(struct hdr_tora* t);
  206. // ============================================================
  207. nsaddr_t ipaddr;
  208. // IP Address of this node.
  209. u_int32_t controlSequence;
  210. NsObject *recvtarget_;
  211. // classifier
  212. NsObject *sendtarget_;
  213. // The link layer below the IMEP layer.
  214. rtAgent *rtagent_;
  215. // pointer to the "upper layer" routing agent.
  216. Trace *logtarget_;
  217. // allows the IMEP agent to write info to the log file.
  218. // XXX Must declare the first parameter in the macro, otherwise
  219. // msvc will be unhappy.
  220. LIST_HEAD(_dummy_imepLinkList,imepLink) imepLinkHead;
  221. // List of links to neighbors and corresponding status
  222. // ============================================================
  223. // Awaiting Broadcast (AB) Buffer
  224. PacketQueue ackQueue;
  225. PacketQueue helloQueue;
  226. PacketQueue objectQueue;
  227. // ============================================================
  228. // Waiting for ACK Buffer
  229. ReXmitQ rexmitq;
  230.         // ============================================================
  231. // Waiting for delivery to the upper layer Buffer
  232. dstQueue incomingQ;
  233. };
  234. #endif /* __imep_h__ */