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

通讯编程

开发平台:

Visual C++

  1. /* -*-  Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  2. /*
  3.  * Copyright (c) 1999 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 MASH Research
  17.  *      Group at the University of California Berkeley.
  18.  * 4. Neither the name of the University nor of the Research Group may be
  19.  *    used 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.  * @(#) $Header: /cvsroot/nsnam/ns-2/satellite/satlink.h,v 1.7 2005/09/21 20:52:47 haldar Exp $
  35.  *
  36.  * Contributed by Tom Henderson, UCB Daedalus Research Group, June 1999
  37.  */
  38. #ifndef ns_satlink_h
  39. #define ns_satlink_h
  40. #include "node.h"
  41. #include "channel.h"
  42. #include "phy.h"
  43. #include "queue.h"
  44. #include "net-interface.h"
  45. #include "timer-handler.h"
  46. #define LINK_HDRSIZE 16 
  47. // Link types
  48. #define LINK_GENERIC 1
  49. #define LINK_GSL_GEO 2
  50. #define LINK_GSL_POLAR 3
  51. #define LINK_GSL_REPEATER 4
  52. #define LINK_GSL 5  
  53. #define LINK_ISL_INTRAPLANE 6
  54. #define LINK_ISL_INTERPLANE 7
  55. #define LINK_ISL_CROSSSEAM 8 
  56. class SatLinkHead;
  57. class SatTrace;
  58. class SatNode;
  59. class SatLL : public LL {
  60. public:
  61.         SatLL() : LL(), arpcache_(-1), arpcachedst_(-1) {}
  62.         virtual void sendDown(Packet* p);
  63.         virtual void sendUp(Packet* p);
  64.         virtual void recv(Packet* p, Handler* h);
  65. Channel* channel(); // Helper function used for ``ARP''
  66. SatNode* satnode() {return satnode_; }
  67. protected:
  68. int command(int argc, const char*const* argv);
  69. int getRoute(Packet *p);
  70. SatNode* satnode_;
  71. // Optimization-- cache the last value of Mac address 
  72.         int arpcache_;  
  73.         int arpcachedst_;
  74. };
  75. ///////////////////////////////////////////////////////////////////////
  76. class SatMac;
  77. class MacSendTimer : public TimerHandler {
  78. public:
  79.         MacSendTimer(SatMac *a) : TimerHandler() {a_ = a; }
  80. protected:
  81.         virtual void expire(Event *e);
  82.         SatMac *a_;
  83. };
  84. class MacRecvTimer : public TimerHandler {
  85. public:
  86.         MacRecvTimer(SatMac *a) : TimerHandler() {a_ = a; }
  87. protected:
  88.         virtual void expire(Event *e);
  89.         SatMac *a_;
  90. };
  91. class MacHandlerRcv : public Handler {
  92. public:
  93.         MacHandlerRcv(SatMac* m) : mac_(m) {}
  94.         void handle(Event* e);
  95. protected:
  96.         SatMac* mac_;
  97. };
  98. class SatMac : public Mac {
  99. public:
  100. SatMac();
  101. void sendDown(Packet* p);
  102. void sendUp(Packet *p);
  103. virtual void send_timer() {}
  104. virtual void recv_timer() {}
  105. protected:
  106. int command(int argc, const char*const* argv);
  107. MacSendTimer send_timer_; 
  108. MacRecvTimer recv_timer_; 
  109. SatTrace* drop_trace_; // Trace object for dropped packets in Mac
  110. int trace_drops_; // OTcl-settable flag for whether we trace drops
  111. SatTrace* coll_trace_; // Trace object for collisions in Mac
  112. int trace_collisions_; // OTcl-settable flag for whether we trace coll.
  113. };
  114. class UnslottedAlohaMac : public SatMac {
  115. public:
  116. UnslottedAlohaMac();
  117. void sendDown(Packet* p); 
  118. void sendUp(Packet *p); 
  119. void send_timer(); 
  120. void recv_timer(); 
  121. void end_of_contention(Packet* p);
  122. protected:
  123. virtual void backoff(double delay=0);
  124. Packet* snd_pkt_; // stores packet currently being sent
  125. Packet* rcv_pkt_; // stores packet currently being recieved
  126. MacState tx_state_; // transmit state (SEND or COLL or IDLE)
  127. MacState rx_state_; // receive state (RECV or IDLE)
  128. int rtx_;  // # of retransmissions so far
  129. int rtx_limit_; // Set in OTcl-- retransmission limit
  130. double mean_backoff_; // Set in OTcl-- mean backoff time 
  131. double send_timeout_; // Set in OTcl-- time out after this interval
  132. double end_of_contention_; // Saves time that contention will be over
  133. };
  134. ///////////////////////////////////////////////////////////////////////
  135. class SatPhy : public Phy {
  136.  public:
  137. SatPhy() {}
  138. void sendDown(Packet *p);
  139. int sendUp(Packet *p);
  140.  protected:
  141. int command(int argc, const char*const* argv);
  142. };
  143. class RepeaterPhy : public Phy {
  144.  public:
  145. RepeaterPhy() {}
  146. void recv(Packet* p, Handler*);
  147. void sendDown(Packet *p);
  148. int sendUp(Packet *) { return 0; } 
  149.  protected:
  150. };
  151. ///////////////////////////////////////////////////////////////////////
  152. /*
  153.  * Class SatChannel
  154.  */
  155. class SatChannel : public Channel{
  156. friend class SatRouteObject;
  157.  public:
  158. SatChannel(void);
  159. int getId() { return index_; }
  160. void add_interface(Phy*);
  161. void remove_interface(Phy*);
  162. int find_peer_mac_addr(int);
  163.  protected:
  164. double get_pdelay(Node* tnode, Node* rnode);
  165.  private:
  166. };
  167. ///////////////////////////////////////////////////////////////////////
  168. class SatNode;
  169. class ErrorModel;
  170. /*
  171.  * For now, this is the API used in the satellite networking code (hopefully
  172.  * a more general one will follow).
  173.  */
  174. class SatLinkHead : public LinkHead {
  175. public:
  176. SatLinkHead(); 
  177. // This builds on the API provided by LinkHead
  178. // (Note: the following pointers are not part of a generic API and may 
  179. // be changed in the future
  180. SatPhy* phy_tx() { return phy_tx_; }
  181. SatPhy* phy_rx() { return phy_rx_; }
  182. SatMac* mac() { return mac_; }
  183. SatLL* satll() { return satll_; }
  184. Queue* queue() { return queue_; }
  185. ErrorModel* errmodel() { return errmodel_; }
  186. int linkup_;
  187. SatNode* node() { return ((SatNode*) node_); }
  188. protected:
  189. virtual int command(int argc, const char*const* argv); 
  190. SatPhy* phy_tx_;
  191. SatPhy* phy_rx_;
  192. SatMac* mac_;
  193. SatLL* satll_;
  194. Queue* queue_;
  195. ErrorModel* errmodel_;
  196. };
  197. #endif