📄 mac-timers.cc
字号:
#include <delay.h>#include <connector.h>#include <packet.h>#include <random.h> // #define DEBUG#include <debug.h>#include <arp.h>#include <ll.h>#include <mac.h>#include <mac-timers.h>#include <mac-802_11.h> /* * Force timers to expire on slottime boundries. */// #define USE_SLOT_TIME#define ROUND_TIME() \ { \ assert(slottime); \ double rmd = remainder(s.clock() + rtime, slottime); \ if(rmd > 0.0) \ rtime += (slottime - rmd); \ else \ rtime += (-rmd); \ }/* ====================================================================== Timers ====================================================================== */voidMacTimer::start(double time){ Scheduler &s = Scheduler::instance(); assert(busy_ == 0); busy_ = 1; paused_ = 0; stime = s.clock(); rtime = time; assert(rtime >= 0.0); s.schedule(this, &intr, rtime);}voidMacTimer::stop(void){ Scheduler &s = Scheduler::instance(); assert(busy_); if(paused_ == 0) s.cancel(&intr); busy_ = 0; paused_ = 0; stime = 0.0; rtime = 0.0;}/* ====================================================================== Defer Timer ====================================================================== */voidDeferTimer::start(double time){ Scheduler &s = Scheduler::instance(); assert(busy_ == 0); busy_ = 1; paused_ = 0; stime = s.clock(); rtime = time;#ifdef USE_SLOT_TIME ROUND_TIME();#endif assert(rtime >= 0.0); s.schedule(this, &intr, rtime);}void DeferTimer::handle(Event *){ busy_ = 0; paused_ = 0; stime = 0.0; rtime = 0.0; mac->deferHandler();}/* ====================================================================== NAV Timer ====================================================================== */void NavTimer::handle(Event *){ busy_ = 0; paused_ = 0; stime = 0.0; rtime = 0.0; mac->navHandler();}/* ====================================================================== Receive Timer ====================================================================== */void RxTimer::handle(Event *){ busy_ = 0; paused_ = 0; stime = 0.0; rtime = 0.0; mac->recvHandler();}/* ====================================================================== Send Timer ====================================================================== */void TxTimer::handle(Event *){ busy_ = 0; paused_ = 0; stime = 0.0; rtime = 0.0; mac->sendHandler();}/* ====================================================================== Interface Timer ====================================================================== */voidIFTimer::handle(Event *){ busy_ = 0; paused_ = 0; stime = 0.0; rtime = 0.0; mac->txHandler();}/* ====================================================================== Backoff Timer ====================================================================== */voidBackoffTimer::handle(Event *){ busy_ = 0; paused_ = 0; stime = 0.0; rtime = 0.0; difs_wait = 0.0; mac->backoffHandler();}voidBackoffTimer::start(int cw, int idle){ Scheduler &s = Scheduler::instance(); assert(busy_ == 0); busy_ = 1; paused_ = 0; stime = s.clock(); rtime = (Random::random() % cw) * mac->phymib->SlotTime;#ifdef USE_SLOT_TIME ROUND_TIME();#endif difs_wait = 0.0; if(idle == 0) paused_ = 1; else { assert(rtime >= 0.0); s.schedule(this, &intr, rtime); }}voidBackoffTimer::pause(){ Scheduler &s = Scheduler::instance(); int slots = (int) ((s.clock() - (stime + difs_wait)) / mac->phymib->SlotTime); if(slots < 0) slots = 0; assert(busy_ && ! paused_); paused_ = 1; rtime -= (slots * mac->phymib->SlotTime); assert(rtime >= 0.0); difs_wait = 0.0; s.cancel(&intr);}voidBackoffTimer::resume(double difs){ Scheduler &s = Scheduler::instance(); assert(busy_ && paused_); paused_ = 0; stime = s.clock(); /* * The media should be idle for DIFS time before we start * decrementing the counter, so I add difs time in here. */ difs_wait = difs;#ifdef USE_SLOT_TIME ROUND_TIME();#endif assert(rtime + difs_wait >= 0.0); s.schedule(this, &intr, rtime + difs_wait);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -