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

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * smac.h
  3.  * Copyright (C) 2000 by the University of Southern California
  4.  * $Id: smac.h,v 1.11 2005/08/25 18:58:07 johnh 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. // smac is designed and developed by Wei Ye (SCADDS/ISI)
  46. // and is ported into ns by Padma Haldar, June'02.
  47. // Contributors: Yuan Li
  48. // This module implements Sensor-MAC
  49. //  See http://www.isi.edu/scadds/papers/smac_infocom.pdf for details
  50. //
  51. // It has the following functions.
  52. //  1) Both virtual and physical carrier sense
  53. //  2) RTS/CTS for hidden terminal problem
  54. //  3) Backoff and retry
  55. //  4) Broadcast packets are sent directly without using RTS/CTS/ACK.
  56. //  5) A long unicast message is divided into multiple TOS_MSG (by upper
  57. //     layer). The RTS/CTS reserves the medium for the entire message.
  58. //     ACK is used for each TOS_MSG for immediate error recovery.
  59. //  6) Node goes to sleep when its neighbor is communicating with another
  60. //     node.
  61. //  7) Each node follows a periodic listen/sleep schedule
  62. //  8.1) At bootup time each node listens for a fixed SYNCPERIOD and then
  63. //     tries to send out a sync packet. It suppresses sending out of sync pkt 
  64. //     if it happens to receive a sync pkt from a neighbor and follows the 
  65. //     neighbor's schedule. 
  66. //  8.2) Or a node can choose its own schecule instead of following others, the
  67. //       schedule start time is user configurable
  68. //  9) Neighbor Discovery: in order to prevent that two neighbors can not
  69. //     find each other due to following complete different schedules, each
  70. //     node periodically listen for a whole period of the SYNCPERIOD
  71. //  10) Duty cycle is user configurable
  72. //  New features including adaptive listen
  73. //   See http://www.isi.edu/~weiye/pub/smac_ton.pdf
  74.  
  75. #ifndef NS_SMAC
  76. #define NS_SMAC
  77. //test features described in Journal paper, adaptive listen, etc
  78. //#ifndef JOURNAL_PAPER
  79. //#define JOURNAL_PAPER
  80. //#endif
  81. #include "mac.h"
  82. #include "mac-802_11.h"
  83. #include "cmu-trace.h"
  84. #include "random.h"
  85. #include "timer-handler.h"
  86. /* User-adjustable MAC parameters
  87.  *--------------------------------
  88.  * The default values can be overriden in Each application's Makefile
  89.  * SMAC_MAX_NUM_NEIGHB: maximum number of neighbors.
  90.  * SMAC_MAX_NUM_SCHED: maximum number of different schedules.
  91.  * SMAC_DUTY_CYCLE: duty cycle in percentage. It controls the length of sleep 
  92.  *   interval.
  93.  * SMAC_RETRY_LIMIT: maximum number of RTS retries for sending a single message.
  94.  * SMAC_EXTEND_LIMIT: maximum number of times to extend Tx time when ACK timeout
  95.      happens.
  96.  */
  97. #ifndef SMAC_MAX_NUM_NEIGHBORS
  98. #define SMAC_MAX_NUM_NEIGHBORS 20
  99. #endif
  100. #ifndef SMAC_MAX_NUM_SCHEDULES
  101. #define SMAC_MAX_NUM_SCHEDULES 4
  102. #endif
  103. #ifndef SMAC_DUTY_CYCLE
  104. #define SMAC_DUTY_CYCLE 10
  105. #endif
  106. #ifndef SMAC_RETRY_LIMIT
  107. #define SMAC_RETRY_LIMIT 5
  108. #endif
  109. #ifndef SMAC_EXTEND_LIMIT
  110. #define SMAC_EXTEND_LIMIT 5
  111. #endif
  112. #ifdef JOURNAL_PAPER
  113. #ifndef SMAC_UPDATE_NEIGHB_PERIOD
  114. #define SMAC_UPDATE_NEIGHB_PERIOD 50
  115. #endif
  116.                                                                                                                                                       
  117. #ifndef GUARDTIME
  118. #define GUARDTIME 0.001
  119. #endif
  120. #endif
  121.                                                                                                                                                            
  122. /* Internal MAC parameters
  123.  *--------------------------
  124.  * Do NOT change them unless for tuning S-MAC
  125.  * SYNC_CW: number of slots in the sync contention window, must be 2^n - 1 
  126.  * DATA_CW: number of slots in the data contention window, must be 2^n - 1
  127.  * SYNC_PERIOD: period to send a sync pkt, in cycles.
  128.  * SRCH_CYCLES_LONG: # of SYNC periods during which a node performs a neighbor discovery
  129.  * SRCH_CYCLES_SHORT: if there is no known neighbor, a node need to seach neighbor more aggressively
  130.  */
  131. #define SYNC_CW 31
  132. #define DATA_CW 63
  133. #define SYNCPERIOD 10
  134. #define SYNCPKTTIME 3         // an adhoc value used for now later shld converge with durSyncPkt_
  135. #define SRCH_CYCLES_SHORT 3
  136. #define SRCH_CYCLES_LONG 22
  137. /* Physical layer parameters
  138.  *---------------------------
  139.  * Based on the parameters from PHY_RADIO and RADIO_CONTROL
  140.  * CLOCK_RES: clock resolution in ms. 
  141.  * BANDWIDTH: bandwidth (bit rate) in kbps. Not directly used.
  142.  * PRE_PKT_BYTES: number of extra bytes transmitted before each pkt. It equals
  143.  *   preamble + start symbol + sync bytes.
  144.  * ENCODE_RATIO: output/input ratio of the number of bytes of the encoding
  145.  *  scheme. In Manchester encoding, 1-byte input generates 2-byte output.
  146.  * PROC_DELAY: processing delay of each packet in physical and MAC layer, in ms
  147.  */
  148. #define CLOCKRES 1       // clock resolution is 1ms
  149. #define BANDWIDTH 20      // kbps =>CHANGE BYTE_TX_TIME WHENEVER BANDWIDTH CHANGES
  150. //#define BYTE_TX_TIME 4/10 // 0.4 ms to tx one byte => changes when bandwidth does
  151. #define PRE_PKT_BYTES 5
  152. #define ENCODE_RATIO 2   /* Manchester encoding has 2x overhead */
  153. #define PROC_DELAY 1
  154. // Note everything is in clockticks (CLOCKRES in ms) for tinyOS
  155. // so we need to convert that to sec for ns
  156. #define CLKTICK2SEC(x)  ((x) * (CLOCKRES / 1.0e3))
  157. #define SEC2CLKTICK(x)  ((x) / (CLOCKRES / 1.0e3))
  158. // MAC states
  159. #define SLEEP 0         // radio is turned off, can't Tx or Rx
  160. #define IDLE 1          // radio in Rx mode, and can start Tx
  161. //#define CHOOSE_SCHED 2  // node in boot-up phase, needs to choose a schedule
  162. #define CR_SENSE 2      // medium is free, do it before initiate a Tx
  163. //#define BACKOFF 3       // medium is busy, and cannot Tx
  164. #define WAIT_CTS 3      // sent RTS, waiting for CTS
  165. #define WAIT_DATA 4     // sent CTS, waiting for DATA
  166. #define WAIT_ACK 5      // sent DATA, waiting for ACK
  167. #ifdef JOURNAL_PAPER
  168. #define TX_NEXT_FRAG 6 // send one fragment, waiting for next from upper layer
  169. #else
  170. #define WAIT_NEXTFRAG 6 // send one fragment, waiting for next from upper layer
  171. #endif
  172. #ifdef JOURNAL_PAPER
  173. #define DATA_SENSE1 7 // received a RTS destined to another node, keep listening until confirm sender gets a CTS or starts tx data
  174. #define DATA_SENSE2 8 // received a RTS destined to another node,and did not receive a RTS, keep listening until timeout or receive data
  175. #define TX_PKT 9 // before sending CTS/DATA/ACK, need to wait for a sifs_ time
  176. #endif
  177. // how to send the pkt: broadcast or unicast
  178. #define BCASTSYNC 0
  179. #define BCASTDATA 1
  180. #define UNICAST 2
  181. #ifdef JOURNAL_PAPER
  182. #define UNICAST_ADDR 0
  183. #endif
  184. // Types of pkt
  185. #define DATA_PKT 0
  186. #define RTS_PKT 1
  187. #define CTS_PKT 2
  188. #define ACK_PKT 3
  189. #define SYNC_PKT 4
  190. // radio states for performance measurement
  191. #define RADIO_SLP 0  // radio off
  192. #define RADIO_IDLE 1 // radio idle
  193. #define RADIO_RX 2   // recv'ing mode
  194. #define RADIO_TX 3   // transmitting mode
  195. /*  sizeof smac datapkt hdr and smac control and sync packets  */
  196. /*  have been hardcoded here to mirror the values in TINY_OS implementation */
  197. /*  The following is the pkt format definitions for tiny_os implementation */
  198. /*  of smac : */
  199. /*  typedef struct MAC_CTRLPKT_VALS{ */
  200. /*  unsigned char length; */
  201. /*  char type; */
  202. /*  short addr; */
  203. /*  unsigned char group; */
  204. /*  short srcAddr; */
  205. /*  unsigned char duration; */
  206. /*  short crc; */
  207. /*  }; */
  208. /*  typedef struct MAC_SYNCPKT_VALS{ */
  209. /*  unsigned char length; */
  210. /*  char type; */
  211. /*  short srcAddr; */
  212. /*  short syncNode; */
  213. /*  unsigned char sleepTime;  // my next sleep time from now */
  214. /*  short crc; */
  215. /*  };  */
  216. /*  struct MSG_VALS{ */
  217. /*  unsigned char length; */
  218. /*  char type; */
  219. /*  short addr; */
  220. /*  unsigned char group; */
  221. /*  short srcAddr; */
  222. /*  unsigned char duration; */
  223. /*  char data[DATA_LENGTH]; */
  224. /*  short crc; */
  225. /*  }; */
  226. // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  227. #define SIZEOF_SMAC_DATAPKT 50  // hdr(10) + payload - fixed size pkts
  228. #define SIZEOF_SMAC_CTRLPKT 10
  229. #define SIZEOF_SMAC_SYNCPKT 9  
  230. // Following are the ns definitions of the smac frames
  231. //SYNC PKT 
  232. struct smac_sync_frame { 
  233.   int type; 
  234.   int length; 
  235.   int srcAddr;
  236.   //int dstAddr;
  237.   int syncNode; 
  238.   double sleepTime;  // my next sleep time from now */
  239. #ifdef JOURNAL_PAPER
  240.   int state;  // if node has changed schedule
  241. #endif
  242.   int crc; 
  243. }; 
  244. // RTS, CTS, ACK
  245. struct smac_control_frame {
  246.   int type;
  247.   int length;
  248.   int dstAddr;
  249.   int srcAddr;
  250.   double duration;
  251.   int crc;
  252. };
  253. // DATA 
  254. struct hdr_smac {
  255.   int type;
  256.   int length;
  257.   int dstAddr;
  258.   int srcAddr;
  259.   double duration;
  260.   //char data[DATA_LENGTH];
  261.   int crc;
  262. };
  263. // Used by smac when in sync mode
  264. struct SchedTable { 
  265.   int txSync;  // flag indicating need to send sync 
  266.   int txData;  // flag indicating need to send data 
  267.   int numPeriods; // count for number of periods 
  268. #ifdef JOURNAL_PAPER
  269.   int numNodes;  // number of nodes on this schedule
  270.   int syncNode;  // the node who initialized this schedule
  271.   int chkSched; // flag indicating need to check numNodes
  272. #endif
  273. }; 
  274. struct NeighbList { 
  275.   int nodeId; 
  276.   int schedId;
  277. #ifdef JOURNAL_PAPER
  278.   int active; //flag indicating the node is active recently
  279.   int state; // flag indicating the node has changed schedule
  280. #endif 
  281. }; 
  282. class SMAC;
  283. // Timers used in smac
  284. class SmacTimer : public TimerHandler {
  285.  public:
  286.   SmacTimer(SMAC *a) : TimerHandler() {a_ = a; }
  287.   virtual void expire(Event *e) = 0 ;
  288.   int busy() ;
  289.  protected:
  290.   SMAC *a_;
  291. };
  292. #ifdef JOURNAL_PAPER
  293. // timer for updating neighbors periodically
  294. class SmacUpdateNeighbTimer : public SmacTimer {
  295.  public:
  296.   SmacUpdateNeighbTimer(SMAC *a) : SmacTimer(a) {}
  297.   void expire(Event *e);
  298. };
  299.                                                                                                                                                             
  300. // timer for putting nodes back to sleep after Adaptive Listen
  301. class SmacAdaptiveListenTimer : public SmacTimer {
  302.  public:
  303.   SmacAdaptiveListenTimer(SMAC *a) : SmacTimer(a) {}
  304.   void expire(Event *e);
  305. };
  306. #endif
  307. // Generic timer used for sync, CTS and ACK timeouts
  308. class SmacGeneTimer : public SmacTimer {
  309.  public:
  310.   SmacGeneTimer(SMAC *a) : SmacTimer(a) {}
  311.   void expire(Event *e);
  312. };
  313. // Receive timer for receiving pkts
  314. class SmacRecvTimer : public SmacTimer {
  315.  public:
  316.   SmacRecvTimer(SMAC *a) : SmacTimer(a) { stime_ = rtime_ = 0; }
  317.   void sched(double duration);
  318.   void resched(double time);
  319.   void expire(Event *e);
  320.   double timeToExpire();
  321.  protected:
  322.   double stime_;
  323.   double rtime_;
  324. };
  325. // Send timer
  326. class SmacSendTimer : public SmacTimer {
  327.  public:
  328.   SmacSendTimer(SMAC *a) : SmacTimer(a) {}
  329.   void expire(Event *e);
  330. };
  331. // Nav- indicating if medium is busy or not
  332. class SmacNavTimer : public SmacTimer {
  333.  public:
  334.   SmacNavTimer(SMAC *a) : SmacTimer(a) {}
  335.   void expire(Event *e);
  336. };
  337. // Neighbor nav - if neighbor is busy or not
  338. // used for data timeout
  339. class SmacNeighNavTimer : public SmacTimer {
  340.  public:
  341.   SmacNeighNavTimer(SMAC *a) : SmacTimer(a) { stime_ = rtime_ = 0; }
  342.   void sched(double duration);
  343.   void expire(Event *e);
  344.   double timeToExpire();
  345.  protected:
  346.   double stime_;
  347.   double rtime_;
  348. };
  349. // carrier sense timer
  350. class SmacCsTimer : public SmacTimer {
  351.  public:
  352.   SmacCsTimer(SMAC *a) : SmacTimer(a) {}
  353.   void expire(Event *e);
  354.   void checkToCancel();
  355. };
  356. // synchronisation timer, regulates the sleep/wakeup cycles
  357. class SmacCounterTimer : public SmacTimer { 
  358.  public:  
  359.   friend class SMAC;
  360.   SmacCounterTimer(SMAC *a, int i) : SmacTimer(a) {index_ = i;}
  361.   void sched(double t);
  362.   void expire(Event *e); 
  363.   double timeToSleep();
  364.  protected:
  365.   int index_;
  366.   double value_;
  367.   double syncTime_;
  368.   double dataTime_;
  369.   double listenTime_;
  370.   double sleepTime_;
  371.   double cycleTime_;
  372.   double tts_;
  373.   double stime_;
  374. }; 
  375. // The smac class
  376. class SMAC : public Mac {
  377.   
  378.   friend class SmacGeneTimer;
  379.   friend class SmacRecvTimer;
  380.   friend class SmacSendTimer;
  381.   friend class SmacNavTimer;
  382.   friend class SmacNeighNavTimer;
  383.   friend class SmacCsTimer; 
  384.   friend class SmacCounterTimer;
  385. #ifdef JOURNAL_PAPER
  386.   friend class SmacUpdateNeighbTimer;
  387.   friend class SmacAdaptiveListenTimer;
  388. #endif
  389.  public:
  390.   SMAC(void);
  391.   ~SMAC() { 
  392.     for (int i=0; i< SMAC_MAX_NUM_SCHEDULES; i++) {
  393.       delete mhCounter_[i];
  394.     }
  395.   }
  396.   void recv(Packet *p, Handler *h);
  397.  protected:
  398.   
  399.   // functions for handling timers
  400. #ifdef JOURNAL_PAPER
  401.   void handleUpdateNeighbTimer();
  402.   void handleAdaptiveListenTimer();
  403. #endif
  404.   void handleGeneTimer();
  405.   void handleRecvTimer();
  406.   void handleSendTimer();
  407.   void handleNavTimer();
  408.   void handleNeighNavTimer();
  409.   void handleCsTimer();
  410.   //void handleChkSendTimer();
  411.   void handleCounterTimer(int i);
  412.   // Internal MAC parameters
  413.   double slotTime_;
  414.   double slotTime_sec_;
  415.   double difs_;
  416.   double sifs_;
  417.   double eifs_;
  418.   double guardTime_;
  419.   double byte_tx_time_;
  420.   double dutyCycle_;
  421.  
  422.  private:
  423.   // functions for node schedule folowing sleep-wakeup cycles
  424.   void setMySched(Packet *syncpkt);
  425.   void sleep();
  426.   void wakeup();
  427. #ifdef JOURNAL_PAPER
  428.   // funtions for update neighbors and schedules
  429.   void check_schedFlag();
  430.   void update_schedTab_neighbList();
  431.   void update_myNeighbList();
  432.   void update_neighbList();
  433.   void checkMySched();
  434.   void dump();
  435. #endif
  436.   // functions for handling incoming packets
  437.   
  438.   void rxMsgDone(Packet* p);
  439.   //void rxFragDone(Packet *p);  no frag for now
  440. #ifdef JOURNAL_PAPER
  441.   void rxFragDone(Packet *p); 
  442. #endif
  443.   void handleRTS(Packet *p);
  444.   void handleCTS(Packet *p);
  445.   void handleDATA(Packet *p);
  446.   void handleACK(Packet *p);
  447.   void handleSYNC(Packet *p);
  448.   // functions for handling outgoing packets
  449.   
  450.   // check for pending data pkt to be tx'ed
  451.   // when smac is not following SYNC (sleep-wakeup) cycles.
  452.   int checkToSend();               // check if can send, start cs 
  453.   bool chkRadio();         // checks radiostate
  454.   void transmit(Packet *p);         // actually transmits packet
  455.   bool sendMsg(Packet *p, Handler *h);
  456.   bool bcastMsg(Packet *p);
  457.   bool unicastMsg(int n, Packet *p);
  458.   //int sendMoreFrag(Packet *p);
  459.   
  460.   void txMsgDone();
  461.   // void txFragDone();
  462. #ifdef JOURNAL_PAPER
  463.   // functions for handling fragmentation
  464.   bool txNextFrag(void* data);
  465.   void txFragDone();
  466.                                                                                                                                                             
  467.   // functions for handling adaptive listen
  468.   void adaptiveListen();
  469. #endif
  470.   int startBcast();
  471.   int startUcast();
  472.   
  473.   bool sendRTS();
  474.   bool sendCTS(double duration);
  475.   bool sendDATA();
  476.   bool sendACK(double duration);
  477.   bool sendSYNC();
  478.   void sentRTS(Packet *p);
  479.   void sentCTS(Packet *p);
  480.   void sentDATA(Packet *p);
  481.   void sentACK(Packet *p);
  482.   void sentSYNC(Packet *p);
  483.   
  484.   // Misc functions
  485.   void collision(Packet *p);
  486.   void capture(Packet *p);
  487.   double txtime(Packet *p);
  488.   
  489.   void updateNav(double duration);
  490.   void updateNeighNav(double duration);
  491.   void mac_log(Packet *p) {
  492.     logtarget_->recv(p, (Handler*) 0);
  493.   }
  494.   
  495.   void discard(Packet *p, const char* why);
  496.   int drop_RTS(Packet *p, const char* why);
  497.   int drop_CTS(Packet *p, const char* why);
  498.   int drop_DATA(Packet *p, const char* why);
  499.   int drop_SYNC(Packet *p, const char* why);
  500.   // smac methods to set dst, src and hdr_type in pkt hdrs
  501.   inline int hdr_dst(char* hdr, int dst = -2) {
  502.     struct hdr_smac *sh = (struct hdr_smac *) hdr;
  503.     if (dst > -2)
  504.       sh->dstAddr = dst;
  505.     return sh->dstAddr;
  506.   }
  507.   inline int hdr_src(char* hdr, int src = -2) {
  508.     struct hdr_smac *sh = (struct hdr_smac *) hdr;
  509.     if (src > -2)
  510.       sh->srcAddr = src;
  511.     return sh->srcAddr;
  512.   }
  513.   inline int hdr_type(char *hdr, u_int16_t type = 0) {
  514.     struct hdr_smac *sh = (struct hdr_smac *) hdr;
  515.     if (type)
  516.       sh->type = type;
  517.     return sh->type;
  518.   }
  519.   
  520.   // SMAC internal variables
  521.   
  522.   NsObject*       logtarget_;
  523.   
  524.   // Internal states
  525.   int  state_;                   // MAC state
  526.   int  radioState_;              // state of radio, rx, tx or sleep
  527.   int tx_active_;                
  528.   int mac_collision_;            
  529.   
  530.   int sendAddr_; // node to send data to
  531.   int recvAddr_; // node to receive data from
  532.   
  533.   double  nav_;         // network allocation vector. nav>0 -> medium busy
  534.   double  neighNav_;      // track neighbors' NAV while I'm sending/receiving
  535.   
  536.   // SMAC Timers
  537. #ifdef JOURNAL_PAPER
  538.   SmacUpdateNeighbTimer mhUpdateNeighb_; // timer for updating neighbors periodically
  539.   SmacAdaptiveListenTimer mhAdap_; // timer for putting nodes back to sleep after adaptive listen
  540. #endif
  541.   SmacNavTimer         mhNav_; // NAV timer medium is free or not
  542.   SmacNeighNavTimer     mhNeighNav_;    // neighbor NAV timer for data timeout
  543.   SmacSendTimer mhSend_; // incoming packets
  544.   SmacRecvTimer         mhRecv_;        // outgoing packets
  545.   SmacGeneTimer         mhGene_;        // generic timer used sync/CTS/ACK timeout
  546.   SmacCsTimer           mhCS_;          // carrier sense timer
  547.   
  548.   // array of countertimer, one for each schedule
  549.   // counter tracking node's sleep/awake cycle
  550.   SmacCounterTimer      *mhCounter_[SMAC_MAX_NUM_SCHEDULES];  
  551.   int numRetry_; // number of tries for a data pkt
  552.   int numExtend_;      // number of extensions on Tx time when frags are lost
  553. #ifdef JOURNAL_PAPER
  554.   int numFrags_;       // number of fragments in this transmission
  555.   int succFrags_;      // number of successfully transmitted fragments
  556. #endif
  557.   //int numFrags_;       // number of fragments in this transmission
  558.   //int succFrags_;      // number of successfully transmitted fragments
  559.   int lastRxFrag_;     // keep track of last data fragment recvd to prevent duplicate data
  560.   int howToSend_; // broadcast or unicast
  561.   
  562.   double durSyncPkt_;     // duration of sync packet
  563.   double durDataPkt_;     // duration of data packet XXX caveat fixed packet size
  564.   double durCtrlPkt_;     // duration of control packet
  565.   double timeWaitCtrl_;   // set timer to wait for a control packet
  566.   
  567.   struct SchedTable schedTab_[SMAC_MAX_NUM_SCHEDULES];   // schedule table
  568.   struct NeighbList neighbList_[SMAC_MAX_NUM_NEIGHBORS]; // neighbor list
  569.   int mySyncNode_;                                 // nodeid of my synchronizer
  570.   
  571.   int currSched_;      // current schedule I'm talking to
  572.   int numSched_;       // number of different schedules
  573.   int numNeighb_;      // number of known neighbors
  574.   int numBcast_;       // number of times needed to broadcast a packet
  575.   
  576.   Packet *dataPkt_; // outgoing data packet
  577.   Packet *pktRx_;               // buffer for incoming pkt
  578.   Packet *pktTx_;               // buffer for outgoing pkt
  579.   // flag to check pending data pkt for tx
  580.   // when smac is not following SYNC (sleep-wakeup) cycles.
  581.   int txData_ ;
  582.   int syncFlag_;  // is set to 1 when SMAC uses sleep-wakeup cycle
  583.   int selfConfigFlag_;  // is set to 0 when SMAC uses user configurable schedule start time
  584.   double startTime_;  // schedule start time (schedule starts from SYNC period)
  585.   // sleep-wakeup cycle times
  586.   double syncTime_;
  587.   double dataTime_;
  588.   double listenTime_;
  589.   double sleepTime_;
  590.   double cycleTime_;
  591. #ifdef JOURNAL_PAPER
  592.   int adapTime_;  // time before getting back to sleep when doing adaptive listen
  593.   int adaptiveListen_;
  594.   int adapSend_;
  595.   int txRequest_;
  596.   int dataSched_;
  597.   int syncSched_;
  598.   int sendAddr;
  599.                                                                                                                                                             
  600.   int schedState_; // schedule state: first, second schedule...
  601.                                                                                                                                                             
  602.   int globalSchedule_;  // flag indicating if node is in global schedule state
  603.                                                                                                                                                             
  604.   int updateNeighbList_; // flag indicating if node needs to update neighbor list
  605.   char sendSYNCFlag_;    // flag indicating if node has broadcasted SYNC packet or not
  606. #endif
  607.   // neighbor discovery
  608.   int searchNeighb_;  // flag indicating if node is in neighbot discovery period
  609.   int schedListen_;  // flag indicating if node is in scheduled listen period
  610.   int numSync_;  // used to set/clear searchNeighb flag
  611.   
  612.  protected:
  613.   int command(int argc, const char*const* argv);
  614.   virtual int initialized() { 
  615.     return (netif_ && uptarget_ && downtarget_); 
  616.   }
  617. };
  618. #endif //NS_SMAC