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

通讯编程

开发平台:

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 Daedalus Research
  17.  * Group at the University of California Berkeley.
  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.  * @(#) $Header: /cvsroot/nsnam/ns-2/mac/mac-multihop.h,v 1.7 1998/06/27 01:24:07 gnguyen Exp $ (UCB)
  35.  */
  36. #ifndef ns_mac_multihop_h
  37. #define ns_mac_multihop_h
  38. #include "packet.h"
  39. #include "mac.h"
  40. #include "random.h"
  41. #include "ip.h"
  42. #define MAC_POLLSIZE 40 /* completely arbitrary */
  43. #define MAC_POLLACKSIZE 40 /* completely arbitrary */
  44. /* States of MultihopMac protocol */
  45. #define MAC_IDLE 0x01
  46. #define MAC_POLLING 0x02
  47. #define MAC_RCV 0x04
  48. #define MAC_SND 0x08
  49. #define MAC_TICK 16000 /* 1 tick = 1ms; 16 sub-ticks in a tick */
  50. class MultihopMac;
  51. /*
  52.  * PollEvent class to generate poll events in the multihop
  53.  * network prior to sending and receiving packets.
  54.  */
  55. class PollEvent : public Event {
  56.   public:
  57. PollEvent(MultihopMac* m, MultihopMac* pm) : 
  58. backoffTime_(0), mac_(m), peerMac_(pm) { }
  59. int backoffTime_; /* valid only for NackPoll */
  60. inline MultihopMac *peerMac() { return peerMac_; }
  61.   protected:
  62. MultihopMac *mac_; /* pointer to my mac */
  63. MultihopMac *peerMac_; /* pointer to my peer's mac */
  64. };
  65. /*
  66.  * Handle poll events.
  67.  */
  68. class PollHandler : public Handler {
  69.   public:
  70. PollHandler(MultihopMac* m) { mac_ = m; }
  71. void handle(Event *);
  72. protected:
  73. MultihopMac* mac_;
  74. };
  75. /*
  76.  * Handle pollack events.
  77.  */
  78. class PollAckHandler : public Handler {
  79.   public:
  80. PollAckHandler(MultihopMac* m) { mac_ = m; }
  81. void handle(Event *);
  82. protected:
  83. MultihopMac* mac_;
  84. };
  85. /*
  86.  * Handle pollnack events.
  87.  */
  88. class PollNackHandler : public Handler {
  89.   public:
  90. PollNackHandler(MultihopMac* m) { mac_ = m; }
  91. void handle(Event *);
  92. protected:
  93. MultihopMac* mac_;
  94. };
  95. /*
  96.  * Handle poll timeout events.
  97.  */
  98. class PollTimeoutHandler : public Handler {
  99.   public:
  100. PollTimeoutHandler(MultihopMac* m) { mac_ = m; }
  101. void handle(Event *);
  102. protected:
  103. MultihopMac* mac_;
  104. };
  105. class BackoffHandler : public Handler {
  106.   public: 
  107. BackoffHandler(MultihopMac *m) { mac_ = m; }
  108. void handle(Event *);
  109. protected:
  110. MultihopMac* mac_;
  111. };
  112. /*
  113. class MultihopMacHandler : public Handler {
  114.   public:
  115. MultihopMacHandler(MultihopMac* m) { mac_ = m; }
  116. void handle(Event *e);
  117. protected:
  118. MultihopMac* mac_;
  119. };
  120. */
  121. class MultihopMac : public Mac {
  122.   public:
  123. MultihopMac();
  124. void send(Packet*); /* send data packet (assume POLLed) link */
  125. void recv(Packet *, Handler *); /* call from higher layer (LL) */
  126. void poll(Packet *); /* poll peer mac */
  127. int checkInterfaces(int); /* probe state of this and other MACs */
  128. void schedulePoll(MultihopMac *); /* schedule poll for later */
  129. inline int mode() { return mode_; }
  130. inline int mode(int m) { return mode_ = m; }
  131. inline MultihopMac *peer() { return peer_; }
  132. inline MultihopMac *peer(MultihopMac *p) { return peer_ = p; }
  133. inline double tx_rx() { return tx_rx_; } /* access tx_rx time */
  134. inline double rx_tx() { return rx_tx_; } /* access rx_tx time */
  135. inline double rx_rx() { return rx_rx_; } /* access rx_rx time */
  136. inline double backoffBase() { return backoffBase_; }
  137. inline double backoffTime() { return backoffTime_; }
  138. inline double backoffTime(double bt) { return backoffTime_ = bt; }
  139. inline PollEvent *pendingPE() { return pendingPollEvent_; }
  140. inline PollEvent *pendingPE(PollEvent *pe) { return pendingPollEvent_ = pe; }
  141. inline Packet *pkt() { return pkt_; }
  142. inline PollHandler* ph() { return &ph_; } /* access poll handler */
  143. inline PollAckHandler* pah() { return &pah_; }
  144. inline PollNackHandler* pnh() { return &pnh_; }
  145. inline PollTimeoutHandler* pth() { return &pth_; }
  146. inline BackoffHandler* bh() { return &bh_; }
  147. // inline MultihopMacHandler* mh() { return &mh_; }
  148. inline double pollTxtime(int s) { return (double) s*8.0/bandwidth(); }
  149.   protected:
  150. int mode_; /* IDLE/SND/RCV */
  151. MultihopMac *peer_; /* peer mac */
  152. double tx_rx_; /* Turnaround times: transmit-->recv */
  153. double rx_tx_; /* recv-->transmit */
  154. double rx_rx_; /* recv-->recv */
  155. double backoffTime_;
  156. double backoffBase_;
  157. PollEvent *pendingPollEvent_; /* pending in scheduler */
  158. Packet *pkt_; /* packet stored for poll retries */
  159. PollHandler ph_; /* handler for POLL events */
  160. PollAckHandler pah_; /* handler for POLL_ACK events */
  161. PollNackHandler pnh_; /* handler for POLL_NACK events */
  162. PollTimeoutHandler pth_;/* handler for POLL_TIMEOUT events */
  163. BackoffHandler bh_; /* handler for exponential backoffs */
  164. // MultihopMacHandler mh_; /* handle receives of data */
  165. };
  166. #endif