📄 mac-timers.cc
字号:
/* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- *//* * Copyright (c) 1997 Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the Computer Systems * Engineering Group at Lawrence Berkeley Laboratory. * 4. Neither the name of the University nor of the Laboratory may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. *//* Ported from CMU/Monarch's code, nov'98 -Padma.*//* * Code contained within lines such as the below * // wqos - <date> - dugdale // wqos - changes by dugdale ends * * or * // wqos - <date> - almquist // wqos - changes by almquist ends * * have been changed or added to implement the PCF mode of IEEE 802.11 and is * Copyright (c) 2001 Anders Lindgren and Andreas Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the above disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the above disclaimer in the * documentation and/or other materials provided with the distribution. * * The disclaimer above apply to the modifications made to the source code * by Anders Lindgren and Andreas Almquist as well as to the rest of the code. */#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();}// wqos - Tue 26 Sep 00, 16:42 - dugdale/* ====================================================================== Beacon Timer ====================================================================== */void BeaconTimer::handle(Event *){ busy_ = 0; paused_ = 0; stime = 0.0; rtime = 0.0; mac->beaconHandler();}// wqos - changes by dugdale ends/* ====================================================================== 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(); //the caculation below make validation pass for linux though it // looks dummy double st = s.clock(); double rt = stime + difs_wait; double sr = st - rt; double mst = (mac->phymib_->SlotTime); int slots = int (sr/mst); //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 + -