www.pudn.com > 802.16jModule.rar > contentionslot.cc
/* This software was developed at the National Institute of Standards and
* Technology by employees of the Federal Government in the course of
* their official duties. Pursuant to title 17 Section 105 of the United
* States Code this software is not subject to copyright protection and
* is in the public domain.
* NIST assumes no responsibility whatsoever for its use by other parties,
* and makes no guarantees, expressed or implied, about its quality,
* reliability, or any other characteristic.
*
* We would appreciate acknowledgement if the software is used.
*
* NIST ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION AND
* DISCLAIM ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING
* FROM THE USE OF THIS SOFTWARE.
*
* @author rouil
*/
#include "contentionslot.h"
#include
#include
/*
* Creates a contention slot for the given frame
* @param frame The frame map
*/
ContentionSlot::ContentionSlot (FrameMap *map)
{
assert (map);
map_ = map;
}
/**
* Destructor
*/
ContentionSlot::~ContentionSlot() {}
/*
* Set the initial contention slot window size
* @param backoff_start the initial contention slot window size
*/
void ContentionSlot::setBackoff_start( int backoff_start )
{
backoff_start_ = backoff_start;
}
/*
* Set the final contention slot window size
* @param backoff_stop the final contention slot window size
*/
void ContentionSlot::setBackoff_stop( int backoff_stop )
{
backoff_stop_ = backoff_stop;
}
/**
* Resume the timers for the requests
*/
void ContentionSlot::resumeTimers () {}
/**
* Pause the timers for the requests
*/
void ContentionSlot::pauseTimers () {}
/**** Methods for Ranging Contention slot ****/
/*
* Creates a contention slot for the given frame
* @param frame The frame map
*/
RngContentionSlot::RngContentionSlot (FrameMap *map) : ContentionSlot (map)
{
request_ = NULL;
}
/**
* Destructor
*/
RngContentionSlot::~RngContentionSlot()
{
if (request_)
delete request_;
}
/*
* Add a ranging request
* @param p The packet to be sent during the ranging opportunity
*/
void RngContentionSlot::addRequest (Packet *p)
{
assert (request_ == NULL);
request_ = new RangingRequest (this, p);
}
/*
* Remove the pending request
*/
void RngContentionSlot::removeRequest ()
{
//assert (request_);
if (request_) {
delete request_;
request_ = NULL;
}
}
/**
* Resume the timers for the requests
*/
void RngContentionSlot::resumeTimers ()
{
if (request_)
request_->resume();
}
/**
* Pause the timers for the requests
*/
void RngContentionSlot::pauseTimers ()
{
if (request_)
request_->pause();
}
/**** Methods for Bandwidth Contention slot ****/
/*
* Creates a contention slot for the given frame
* @param frame The frame map
*/
BwContentionSlot::BwContentionSlot (FrameMap *map) : ContentionSlot (map)
{
LIST_INIT (&request_list_);
}
/**
* Destructor
*/
BwContentionSlot::~BwContentionSlot() {}
/*
* Add a bandwidth request
* @param p The packet to be sent during the ranging opportunity
* @param cid The CID of the bandwidth request
* @param len The size in bytes of the bandwidth request
*/
void BwContentionSlot::addRequest (Packet *p, int cid, int len)
{
assert (getRequest (cid)==NULL);
BwRequest *b = new BwRequest (this, p, cid, len);
b->insert_entry_head (&request_list_);
}
/*
* Remove the pending request
*/
void BwContentionSlot::removeRequest (int cid)
{
BwRequest *b = getRequest (cid);
if (b!=NULL) {
b->remove_entry ();
delete b;
}
}
/*
* Remove all pending reuquest
*/
void BwContentionSlot::removeRequests ()
{
for (BwRequest *c = (BwRequest *)request_list_.lh_first; c ; c=(BwRequest *)request_list_.lh_first) {
c->remove_entry();
delete c;
}
}
/*
* Get the request for the given CID
* @param cid The CID for the request
*/
BwRequest* BwContentionSlot::getRequest (int cid)
{
for (BwRequest *c = (BwRequest *)request_list_.lh_first; c ; c=(BwRequest *)(c->next_entry())) {
if (c->getCID()==cid)
return c;
}
return NULL;
}
/**
* Resume the timers for the requests
*/
void BwContentionSlot::resumeTimers ()
{
for (BwRequest *c = (BwRequest *)request_list_.lh_first; c ; c=(BwRequest *)(c->next_entry())) {
c->resume();
}
}
/**
* Pause the timers for the requests
*/
void BwContentionSlot::pauseTimers ()
{
for (BwRequest *c = (BwRequest *)request_list_.lh_first; c ; c=(BwRequest *)(c->next_entry())) {
c->pause();
}
}