📄 smac.h
字号:
// 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 + -