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

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * mac-tdma.h
  3.  * Copyright (C) 1999 by the University of Southern California
  4.  * $Id: mac-tdma.h,v 1.6 2006/02/21 15:20:19 mahrenho Exp $
  5.  *
  6.  * This program is free software; you can redistribute it and/or
  7.  * modify it under the terms of the GNU General Public License,
  8.  * version 2, as published by the Free Software Foundation.
  9.  *
  10.  * This program is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  * GNU General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU General Public License along
  16.  * with this program; if not, write to the Free Software Foundation, Inc.,
  17.  * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
  18.  *
  19.  *
  20.  * The copyright of this module includes the following
  21.  * linking-with-specific-other-licenses addition:
  22.  *
  23.  * In addition, as a special exception, the copyright holders of
  24.  * this module give you permission to combine (via static or
  25.  * dynamic linking) this module with free software programs or
  26.  * libraries that are released under the GNU LGPL and with code
  27.  * included in the standard release of ns-2 under the Apache 2.0
  28.  * license or under otherwise-compatible licenses with advertising
  29.  * requirements (or modified versions of such code, with unchanged
  30.  * license).  You may copy and distribute such a system following the
  31.  * terms of the GNU GPL for this module and the licenses of the
  32.  * other code concerned, provided that you include the source code of
  33.  * that other code when and as the GNU GPL requires distribution of
  34.  * source code.
  35.  *
  36.  * Note that people who make modified versions of this module
  37.  * are not obligated to grant this special exception for their
  38.  * modified versions; it is their choice whether to do so.  The GNU
  39.  * General Public License gives permission to release a modified
  40.  * version without this exception; this exception also makes it
  41.  * possible to release a modified version which carries forward this
  42.  * exception.
  43.  *
  44.  */
  45. //
  46. // mac-tdma.h
  47. // by Xuan Chen (xuanc@isi.edu), ISI/USC.
  48. // 
  49. // Preamble TDMA MAC layer for single hop.
  50. // Centralized slot assignment computing.
  51. #ifndef ns_mac_tdma_h
  52. #define ns_mac_tdma_h
  53. // #define DEBUG
  54. //#include <debug.h>
  55. #include "marshall.h"
  56. #include <delay.h>
  57. #include <connector.h>
  58. #include <packet.h>
  59. #include <random.h>
  60. #include <arp.h>
  61. #include <ll.h>
  62. #include <mac.h>
  63. #define GET_ETHER_TYPE(x) GET2BYTE((x))
  64. #define SET_ETHER_TYPE(x,y)            {u_int16_t t = (y); STORE2BYTE(x,&t);}
  65. /* We are still using these specs for phy layer---same as 802.11. */
  66. /*
  67.  * IEEE 802.11 Spec, section 15.3.2
  68.  * - default values for the DSSS PHY MIB
  69.  */
  70. #define DSSS_CWMin 31
  71. #define DSSS_CWMax 1023
  72. #define DSSS_SlotTime 0.000020 // 20us
  73. #define DSSS_CCATime 0.000015 // 15us
  74. #define DSSS_RxTxTurnaroundTime 0.000005 // 5us
  75. #define DSSS_SIFSTime 0.000010 // 10us
  76. #define DSSS_PreambleLength 144 // 144 bits
  77. #define DSSS_PLCPHeaderLength 48 // 48 bits
  78. class PHY_MIB {
  79. public:
  80. u_int32_t CWMin;
  81. u_int32_t CWMax;
  82. double SlotTime;
  83. double CCATime;
  84. double RxTxTurnaroundTime;
  85. double SIFSTime;
  86. u_int32_t PreambleLength;
  87. u_int32_t PLCPHeaderLength;
  88. };
  89. /* ======================================================================
  90.    Frame Formats
  91.    ====================================================================== */
  92. #define MAC_ProtocolVersion 0x00
  93. #define MAC_Type_Data 0x02
  94. #define MAC_Subtype_Data 0x00
  95. // Max data length allowed in one slot (byte)
  96. #define MAC_TDMA_MAX_DATA_LEN 1500        
  97. // How many time slots in one frame.
  98. #define MAC_TDMA_SLOT_NUM       32           
  99. // The mode for MacTdma layer's defer timers. */
  100. #define SLOT_SCHE               0
  101. #define SLOT_SEND               1
  102. #define SLOT_RECV               2
  103. #define SLOT_BCAST              3
  104. // Indicate if there is a packet needed to be sent out.
  105. #define NOTHING_TO_SEND         -2
  106. // Indicate if this is the very first time the simulation runs.
  107. #define FIRST_ROUND             -1
  108. // Turn radio on /off
  109. #define ON                       1
  110. #define OFF                      0
  111. /* Quoted from MAC-802.11. */
  112. #define DATA_DURATION           5
  113. /* We are using same header structure as 802.11 currently */
  114. struct frame_control {
  115. u_char fc_subtype : 4;
  116. u_char fc_type : 2;
  117. u_char fc_protocol_version : 2;
  118. u_char fc_order : 1;
  119. u_char fc_wep : 1;
  120. u_char fc_more_data : 1;
  121. u_char fc_pwr_mgt : 1;
  122. u_char fc_retry : 1;
  123. u_char fc_more_frag : 1;
  124. u_char fc_from_ds : 1;
  125. u_char fc_to_ds : 1;
  126. };
  127. struct hdr_mac_tdma {
  128. struct frame_control dh_fc;
  129. u_int16_t dh_duration;
  130. u_char dh_da[ETHER_ADDR_LEN];
  131. u_char dh_sa[ETHER_ADDR_LEN];
  132. u_char dh_bssid[ETHER_ADDR_LEN];
  133. u_int16_t dh_scontrol;
  134. u_char dh_body[1]; // XXX Non-ANSI
  135. };
  136. #define ETHER_HDR_LEN
  137. ((phymib_->PreambleLength >> 3) +
  138.  (phymib_->PLCPHeaderLength >> 3) +
  139.  offsetof(struct hdr_mac_tdma, dh_body[0] ) +
  140.  ETHER_FCS_LEN)
  141. #define DATA_Time(len) (8 * (len) / bandwidth_)
  142. /* ======================================================================
  143.    The following destination class is used for duplicate detection.
  144.    ====================================================================== */
  145. // We may need it later for caching...
  146. class Host {
  147. public:
  148. LIST_ENTRY(Host) link;
  149. u_int32_t index;
  150. u_int32_t seqno;
  151. };
  152. /* Timers */
  153. class MacTdma;
  154. class MacTdmaTimer : public Handler {
  155. public:
  156. MacTdmaTimer(MacTdma* m, double s = 0) : mac(m) {
  157. busy_ = paused_ = 0; stime = rtime = 0.0; slottime_ = s;
  158. }
  159. virtual void handle(Event *e) = 0;
  160. virtual void start(Packet *p, double time);
  161. virtual void stop(Packet *p);
  162. virtual void pause(void) { assert(0); }
  163. virtual void resume(void) { assert(0); }
  164. inline int busy(void) { return busy_; }
  165. inline int paused(void) { return paused_; }
  166. inline double slottime(void) { return slottime_; }
  167. inline double expire(void) {
  168. return ((stime + rtime) - Scheduler::instance().clock());
  169. }
  170. protected:
  171. MacTdma  *mac;
  172. int busy_;
  173. int paused_;
  174. Event intr;
  175. double stime; // start time
  176. double rtime; // remaining time
  177. double slottime_;
  178. };
  179. /* Timers to schedule transmitting and receiving. */
  180. class SlotTdmaTimer : public MacTdmaTimer {
  181. public:
  182. SlotTdmaTimer(MacTdma *m) : MacTdmaTimer(m) {}
  183. void handle(Event *e);
  184. };
  185. /* Timers to control packet sending and receiving time. */
  186. class RxPktTdmaTimer : public MacTdmaTimer {
  187. public:
  188. RxPktTdmaTimer(MacTdma *m) : MacTdmaTimer(m) {}
  189. void handle(Event *e);
  190. };
  191. class TxPktTdmaTimer : public MacTdmaTimer {
  192. public:
  193. TxPktTdmaTimer(MacTdma *m) : MacTdmaTimer(m) {}
  194. void handle(Event *e);
  195. };
  196. /* TDMA Mac layer. */
  197. class MacTdma : public Mac {
  198.   friend class SlotTdmaTimer;
  199.   friend class TxPktTdmaTimer;
  200.   friend class RxPktTdmaTimer;
  201.  public:
  202.   MacTdma(PHY_MIB* p);
  203.   void recv(Packet *p, Handler *h);
  204.   inline int hdr_dst(char* hdr, int dst = -2);
  205.   inline int hdr_src(char* hdr, int src = -2);
  206.   inline int hdr_type(char* hdr, u_int16_t type = 0);
  207.   
  208.   /* Timer handler */
  209.   void slotHandler(Event *e);
  210.   void recvHandler(Event *e);
  211.   void sendHandler(Event *e);
  212.   
  213.  protected:
  214.   PHY_MIB *phymib_;
  215.   
  216.   // Both the slot length and max slot num (max node num) can be configged.
  217.   int slot_packet_len_;
  218.   int                   max_node_num_;
  219.   
  220.  private:
  221.   int command(int argc, const char*const* argv);
  222.   // Do slot scheduling for the active nodes within one cluster.
  223.   void re_schedule();
  224.   void makePreamble();
  225.   void radioSwitch(int i);
  226.   /* Packet Transmission Functions.*/
  227.   void    sendUp(Packet* p);
  228.   void    sendDown(Packet* p);
  229.   
  230.   /* Actually receive data packet when rxTimer times out. */
  231.   void recvDATA(Packet *p);
  232.   /* Actually send the packet buffered. */
  233.   void send();
  234.   inline int is_idle(void);
  235.   
  236.   /* Debugging Functions.*/
  237.   void trace_pkt(Packet *p);
  238.   void dump(char* fname);
  239.   
  240.   void mac_log(Packet *p) {
  241.     logtarget_->recv(p, (Handler*) 0);
  242.   }
  243.   
  244.   inline double TX_Time(Packet *p) {
  245.     double t = DATA_Time((HDR_CMN(p))->size());
  246.     //    printf("<%d>, packet size: %d, tx-time: %fn", index_, (HDR_CMN(p))->size(), t);
  247.     if(t < 0.0) {
  248.       drop(p, "XXX");
  249.       exit(1);
  250.     }
  251.     return t;
  252.   }
  253.   
  254.   inline u_int16_t usec(double t) {
  255.     u_int16_t us = (u_int16_t)ceil(t *= 1e6);
  256.     return us;
  257.   };
  258.   /* Timers */
  259.   SlotTdmaTimer mhSlot_;
  260.   TxPktTdmaTimer mhTxPkt_;
  261.   RxPktTdmaTimer mhRxPkt_;
  262.   /* Internal MAC state */
  263.   MacState rx_state_; // incoming state (MAC_RECV or MAC_IDLE)
  264.   MacState tx_state_; // outgoing state
  265.   
  266.   /* The indicator of the radio. */
  267.   int radio_active_;
  268.   int tx_active_; // transmitter is ACTIVE
  269.   
  270.   NsObject* logtarget_;
  271.   
  272.   /* TDMA scheduling state. 
  273.      Currently, we only use a centralized simplified way to do 
  274.      scheduling. Will work on the algorithm later.*/
  275.   // The max num of slot within one frame.
  276.   static int max_slot_num_;
  277.   // The time duration for each slot.
  278.   static double slot_time_;
  279.   /* The start time for whole TDMA scheduling. */
  280.   static double start_time_;
  281.   
  282.   /* Data structure for tdma scheduling. */
  283.   static int active_node_;            // How many nodes needs to be scheduled
  284.   static int *tdma_schedule_;
  285.   int slot_num_;                      // The slot number it's allocated.
  286.   static int *tdma_preamble_;        // The preamble data structure.
  287.   // When slot_count_ = active_nodes_, a new preamble is needed.
  288.   int slot_count_;
  289.   
  290.   // How many packets has been sent out?
  291.   static int tdma_ps_;
  292.   static int tdma_pr_;
  293. };
  294. double MacTdma::slot_time_ = 0;
  295. double MacTdma::start_time_ = 0;
  296. int MacTdma::active_node_ = 0;
  297. int MacTdma::max_slot_num_ = 0;
  298. int *MacTdma::tdma_schedule_ = NULL;
  299. int *MacTdma::tdma_preamble_ = NULL;
  300. int MacTdma::tdma_ps_ = 0;
  301. int MacTdma::tdma_pr_ = 0;
  302. #endif /* __mac_tdma_h__ */