⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smac.h

📁 网络仿真模拟工具NS2下实现的支持传感器网络的MAC协议SMAC
💻 H
📖 第 1 页 / 共 2 页
字号:
// Copyright (c) 2000 by the University of Southern California// All rights reserved.//// Permission to use, copy, modify, and distribute this software and its// documentation in source and binary forms for non-commercial purposes// and without fee is hereby granted, provided that the above copyright// notice appear in all copies and that both the copyright notice and// this permission notice appear in supporting documentation. and that// any documentation, advertising materials, and other materials related// to such distribution and use acknowledge that the software was// developed by the University of Southern California, Information// Sciences Institute.  The name of the University may not be used to// endorse or promote products derived from this software without// specific prior written permission.//// THE UNIVERSITY OF SOUTHERN CALIFORNIA makes no representations about// the suitability of this software for any purpose.  THIS SOFTWARE IS// PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,// INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.//// Other copyrights might apply to parts of this software and are so// noted when applicable.// smac is designed and developed by Wei Ye (SCADDS/ISI)// and is ported into ns by Padma Haldar, June'02.// Contributors: Yuan Li// This module implements Sensor-MAC//  See http://www.isi.edu/scadds/papers/smac_infocom.pdf for details//// It has the following functions.//  1) Both virtual and physical carrier sense//  2) RTS/CTS for hidden terminal problem//  3) Backoff and retry//  4) Broadcast packets are sent directly without using RTS/CTS/ACK.//  5) A long unicast message is divided into multiple TOS_MSG (by upper//     layer). The RTS/CTS reserves the medium for the entire message.//     ACK is used for each TOS_MSG for immediate error recovery.//  6) Node goes to sleep when its neighbor is communicating with another//     node.//  7) Each node follows a periodic listen/sleep schedule//  8.1) At bootup time each node listens for a fixed SYNCPERIOD and then//     tries to send out a sync packet. It suppresses sending out of sync pkt //     if it happens to receive a sync pkt from a neighbor and follows the //     neighbor's schedule. //  8.2) Or a node can choose its own schecule instead of following others, the//       schedule start time is user configurable//  9) Neighbor Discovery: in order to prevent that two neighbors can not//     find each other due to following complete different schedules, each//     node periodically listen for a whole period of the SYNCPERIOD//  10) Duty cycle is user configurable//  New features including adaptive listen//   See http://www.isi.edu/~weiye/pub/smac_ton.pdf #ifndef NS_SMAC#define NS_SMAC//test features described in Journal paper, adaptive listen, etc//#ifndef JOURNAL_PAPER//#define JOURNAL_PAPER//#endif#include "mac.h"#include "mac-802_11.h"#include "cmu-trace.h"#include "random.h"#include "timer-handler.h"/* User-adjustable MAC parameters *-------------------------------- * The default values can be overriden in Each application's Makefile * SMAC_MAX_NUM_NEIGHB: maximum number of neighbors. * SMAC_MAX_NUM_SCHED: maximum number of different schedules. * SMAC_DUTY_CYCLE: duty cycle in percentage. It controls the length of sleep  *   interval. * SMAC_RETRY_LIMIT: maximum number of RTS retries for sending a single message. * SMAC_EXTEND_LIMIT: maximum number of times to extend Tx time when ACK timeout     happens. */#ifndef SMAC_MAX_NUM_NEIGHBORS#define SMAC_MAX_NUM_NEIGHBORS 20#endif#ifndef SMAC_MAX_NUM_SCHEDULES#define SMAC_MAX_NUM_SCHEDULES 4#endif#ifndef SMAC_DUTY_CYCLE#define SMAC_DUTY_CYCLE 10#endif#ifndef SMAC_RETRY_LIMIT#define SMAC_RETRY_LIMIT 5#endif#ifndef SMAC_EXTEND_LIMIT#define SMAC_EXTEND_LIMIT 5#endif#ifdef JOURNAL_PAPER#ifndef SMAC_UPDATE_NEIGHB_PERIOD#define SMAC_UPDATE_NEIGHB_PERIOD 50#endif                                                                                                                                                      #ifndef GUARDTIME#define GUARDTIME 0.001#endif#endif                                                                                                                                                           /* Internal MAC parameters *-------------------------- * Do NOT change them unless for tuning S-MAC * SYNC_CW: number of slots in the sync contention window, must be 2^n - 1  * DATA_CW: number of slots in the data contention window, must be 2^n - 1 * SYNC_PERIOD: period to send a sync pkt, in cycles. * SRCH_CYCLES_LONG: # of SYNC periods during which a node performs a neighbor discovery * SRCH_CYCLES_SHORT: if there is no known neighbor, a node need to seach neighbor more aggressively */#define SYNC_CW 31#define DATA_CW 63#define SYNCPERIOD 10#define SYNCPKTTIME 3         // an adhoc value used for now later shld converge with durSyncPkt_#define SRCH_CYCLES_SHORT 3#define SRCH_CYCLES_LONG 22/* Physical layer parameters *--------------------------- * Based on the parameters from PHY_RADIO and RADIO_CONTROL * CLOCK_RES: clock resolution in ms.  * BANDWIDTH: bandwidth (bit rate) in kbps. Not directly used. * PRE_PKT_BYTES: number of extra bytes transmitted before each pkt. It equals *   preamble + start symbol + sync bytes. * ENCODE_RATIO: output/input ratio of the number of bytes of the encoding *  scheme. In Manchester encoding, 1-byte input generates 2-byte output. * PROC_DELAY: processing delay of each packet in physical and MAC layer, in ms */#define CLOCKRES 1       // clock resolution is 1ms#define BANDWIDTH 20      // kbps =>CHANGE BYTE_TX_TIME WHENEVER BANDWIDTH CHANGES//#define BYTE_TX_TIME 4/10 // 0.4 ms to tx one byte => changes when bandwidth does#define PRE_PKT_BYTES 5#define ENCODE_RATIO 2   /* Manchester encoding has 2x overhead */#define PROC_DELAY 1// Note everything is in clockticks (CLOCKRES in ms) for tinyOS// so we need to convert that to sec for ns#define CLKTICK2SEC(x)  ((x) * (CLOCKRES / 1.0e3))#define SEC2CLKTICK(x)  ((x) / (CLOCKRES / 1.0e3))// MAC states#define SLEEP 0         // radio is turned off, can't Tx or Rx#define IDLE 1          // radio in Rx mode, and can start Tx//#define CHOOSE_SCHED 2  // node in boot-up phase, needs to choose a schedule#define CR_SENSE 2      // medium is free, do it before initiate a Tx//#define BACKOFF 3       // medium is busy, and cannot Tx#define WAIT_CTS 3      // sent RTS, waiting for CTS#define WAIT_DATA 4     // sent CTS, waiting for DATA#define WAIT_ACK 5      // sent DATA, waiting for ACK#ifdef JOURNAL_PAPER#define TX_NEXT_FRAG 6 // send one fragment, waiting for next from upper layer#else#define WAIT_NEXTFRAG 6 // send one fragment, waiting for next from upper layer#endif#ifdef JOURNAL_PAPER#define DATA_SENSE1 7 // received a RTS destined to another node, keep listening until confirm sender gets a CTS or starts tx data#define DATA_SENSE2 8 // received a RTS destined to another node,and did not receive a RTS, keep listening until timeout or receive data#define TX_PKT 9 // before sending CTS/DATA/ACK, need to wait for a sifs_ time#endif// how to send the pkt: broadcast or unicast#define BCASTSYNC 0#define BCASTDATA 1#define UNICAST 2#ifdef JOURNAL_PAPER#define UNICAST_ADDR 0#endif// Types of pkt#define DATA_PKT 0#define RTS_PKT 1#define CTS_PKT 2#define ACK_PKT 3#define SYNC_PKT 4// radio states for performance measurement#define RADIO_SLP 0  // radio off#define RADIO_IDLE 1 // radio idle#define RADIO_RX 2   // recv'ing mode#define RADIO_TX 3   // transmitting mode/*  sizeof smac datapkt hdr and smac control and sync packets  *//*  have been hardcoded here to mirror the values in TINY_OS implementation *//*  The following is the pkt format definitions for tiny_os implementation *//*  of smac : *//*  typedef struct MAC_CTRLPKT_VALS{ *//*  unsigned char length; *//*  char type; *//*  short addr; *//*  unsigned char group; *//*  short srcAddr; *//*  unsigned char duration; *//*  short crc; *//*  }; *//*  typedef struct MAC_SYNCPKT_VALS{ *//*  unsigned char length; *//*  char type; *//*  short srcAddr; *//*  short syncNode; *//*  unsigned char sleepTime;  // my next sleep time from now *//*  short crc; *//*  };  *//*  struct MSG_VALS{ *//*  unsigned char length; *//*  char type; *//*  short addr; *//*  unsigned char group; *//*  short srcAddr; *//*  unsigned char duration; *//*  char data[DATA_LENGTH]; *//*  short crc; *//*  }; */// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#define SIZEOF_SMAC_DATAPKT 50  // hdr(10) + payload - fixed size pkts#define SIZEOF_SMAC_CTRLPKT 10#define SIZEOF_SMAC_SYNCPKT 9  // Following are the ns definitions of the smac frames//SYNC PKT struct smac_sync_frame {   int type;   int length;   int srcAddr;  //int dstAddr;  int syncNode;   double sleepTime;  // my next sleep time from now */#ifdef JOURNAL_PAPER  int state;  // if node has changed schedule#endif  int crc; }; // RTS, CTS, ACKstruct smac_control_frame {  int type;  int length;  int dstAddr;  int srcAddr;  double duration;  int crc;};// DATA struct hdr_smac {  int type;  int length;  int dstAddr;  int srcAddr;  double duration;  //char data[DATA_LENGTH];  int crc;};// Used by smac when in sync modestruct SchedTable {   int txSync;  // flag indicating need to send sync   int txData;  // flag indicating need to send data   int numPeriods; // count for number of periods #ifdef JOURNAL_PAPER  int numNodes;  // number of nodes on this schedule  int syncNode;  // the node who initialized this schedule  int chkSched; // flag indicating need to check numNodes#endif}; struct NeighbList {   int nodeId;   int schedId;#ifdef JOURNAL_PAPER  int active; //flag indicating the node is active recently  int state; // flag indicating the node has changed schedule#endif }; class SMAC;// Timers used in smacclass SmacTimer : public TimerHandler { public:  SmacTimer(SMAC *a) : TimerHandler() {a_ = a; }  virtual void expire(Event *e) = 0 ;  int busy() ; protected:  SMAC *a_;};#ifdef JOURNAL_PAPER// timer for updating neighbors periodicallyclass SmacUpdateNeighbTimer : public SmacTimer { public:  SmacUpdateNeighbTimer(SMAC *a) : SmacTimer(a) {}  void expire(Event *e);};                                                                                                                                                            // timer for putting nodes back to sleep after Adaptive Listenclass SmacAdaptiveListenTimer : public SmacTimer { public:  SmacAdaptiveListenTimer(SMAC *a) : SmacTimer(a) {}  void expire(Event *e);};#endif// Generic timer used for sync, CTS and ACK timeoutsclass SmacGeneTimer : public SmacTimer { public:  SmacGeneTimer(SMAC *a) : SmacTimer(a) {}  void expire(Event *e);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -