📄 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.*/#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); //if (mac->index_==0) printf("\tDEFERTimer[%d]::start(%f) \ttime %2.9f\n",d_tc_,time,stime); //DEBUG s.schedule(this, &intr, rtime);}voidDeferTimer::handle(Event *){ busy_ = 0; paused_ = 0; stime = 0.0; rtime = 0.0; //if (mac->index_==0) printf("\tDEFERTimer[%d]::handle \t\ttime %2.9f\n",d_tc_,Scheduler::instance().clock()); //DEBUG mac->deferHandler(d_tc_); // Mac802_11 *mac (vd. MacTimer)}/*====================================================================== */voidNavTimer::handle(Event *){ busy_ = 0; paused_ = 0; stime = 0.0; rtime = 0.0; mac->navHandler(n_tc_);}/* ====================================================================== Receive Timer ====================================================================== */voidRxTimer::handle(Event *){ busy_ = 0; paused_ = 0; stime = 0.0; rtime = 0.0; mac->recvHandler();}/* ====================================================================== Send Timer ====================================================================== */voidTxTimer::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; //if (mac->index_==0) printf("\tBackoffTimer[%d]::handle \ttime %2.9f\n",b_tc_,Scheduler::instance().clock()); //DEBUG mac->backoffHandler(b_tc_);}voidBackoffTimer::start(int cw, int idle){ Scheduler &s = Scheduler::instance(); assert(busy_ == 0); busy_ = 1; paused_ = 0; stime = s.clock(); // IEEE802.11e Draft 4.0 page 66, line 20 rtime = ((Random::random() % (cw+1))+1) * mac->phymib_->SlotTime;#ifdef USE_SLOT_TIME ROUND_TIME();#endif difs_wait = 0.0; //if (mac->index_==0) printf("\tBackoffTimer[%d]::start(%d,%d) \ttime %2.9f\n",b_tc_,cw,idle,stime); //DEBUG if(idle == 0) paused_ = 1; else { assert(rtime >= 0.0); s.schedule(this, &intr, rtime); }}voidBackoffTimer::pause(){ Scheduler &s = Scheduler::instance(); //if (mac->index_==0) printf("\t\tBackoffTimer[%d]::pause() time %2.9f\n",b_tc_,s.clock()); //DEBUG //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); // Se abbiamo atteso più del difs_wait, allora sottraiamo già il tempo di uno slot, secondo l' EDCF del draft 2.0 //if(slots > 0) slots++; //TODO: verificare se succede ancora nel Draft 4.0 if(slots < 0) slots = 0; assert(busy_ && ! paused_); paused_ = 1; rtime -= (slots * mac->phymib_->SlotTime); //assert(rtime >= 0.0); // EDCF if (rtime < 0.0) { rtime = 0.0; /*printf("****EDCF BackoffTimer WARNING: rtime=0 on pause\n");*/ } difs_wait = 0.0; s.cancel(&intr);}voidBackoffTimer::resume(double difs){ Scheduler &s = Scheduler::instance(); //if (mac->index_==0) printf("\t\tBackoffTimer[%d]::resume(%f) time %2.9f\n",b_tc_,difs,s.clock()); //DEBUG 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);}/* ====================================================================== Beacon Timer ====================================================================== */voidBeaconTimer::handle(Event *){ busy_ = 0; paused_ = 0; stime = 0.0; rtime = 0.0; mac->BeaconHandler();}/* ====================================================================== Scheduler Timer ====================================================================== */voidSchedulerTimer::handle(Event *){ busy_ = 0; paused_ = 0; stime = 0.0; rtime = 0.0; mac->HCFscheduler(); // The scheduler of polled TXOP}//@@ FaZvoid psPollTimer::handle(Event *){ busy_ = 0; paused_ = 0; stime = 0.0; rtime = 0.0; printf("PS-Poll Timer Expired at %2.9f \n",Scheduler::instance().clock()); mac->schedulerPSPoll();}//@ FaZ
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -