GIDForums  

Go Back   GIDForums > Computer Programming Forums > C++ Forum
User Name
Password
Register FAQ Members List Calendar Search Today's Posts Mark Forums Read

 
 
Thread Tools Search this Thread Rate Thread
  #1  
Old 13-Apr-2009, 08:19
linux_007 linux_007 is offline
New Member
 
Join Date: Apr 2009
Posts: 1
linux_007 is on a distinguished road

EDCF protocol in Network simulator program.


Please can any one insert comments for this part of the source code for NS-2 program that use EDCF protocol than DCF .The EDCF initiate 4 queues in each station than one and modify on some parameters (CWmin,CWmax,AIFS)these parameters using for assign priority for each queue. PLEASE i need help. I JUST want to know where the code add the 4 queues and modify on their parameters


CPP / C++ / C Code:
#include <object.h>
#include <queue.h>
#include <packet.h>
#include <cmu-trace.h>
//#include <iostream.h>
#include "priq.h"
#include "mac-802_11e.h"

typedef int (*PacketFilter)(Packet *, void *);

PriQ_List PriQ::prhead = { 0 };

static class PriQClass : public TclClass {
public:
PriQClass() : TclClass("Queue/DTail/PriQ") {}
TclObject* create(int, const char*const*) {
return (new PriQ);
}
} class_PriQ;


PriQ::PriQ() : DTail()
{
bind("Prefer_Routing_Protocols", &Prefer_Routing_Protocols);
bind("Max_Levels", &max_levels);
bind("Levels", &levels);
LIST_INSERT_HEAD(&prhead, this, link);
flag = 0;
cntl = 0;
level = 0;
}

int
PriQ::command(int argc, const char*const* argv)
{
Scheduler &s = Scheduler::instance();
if (argc == 5 )
{ 
if(strcmp(argv[1], "Prio") == 0){
if(!(atoi(argv[2]) > levels)){
level = atoi(argv[2]);
if(strcmp(argv[3], "PF") == 0){
pri_[level].setPF(atoi(argv[4]));
return(TCL_OK);
}
if(strcmp(argv[3], "CW_MIN") == 0){
pri_[level].setCW_MIN(atoi(argv[4]));
return(TCL_OK);
}
if(strcmp(argv[3], "CW_MAX") == 0){
pri_[level].setCW_MAX(atoi(argv[4]));
return(TCL_OK);
}
if(strcmp(argv[3], "AIFS") == 0){
pri_[level].setAIFS(atoi(argv[4])); 
return(TCL_OK); 
}
if(strcmp(argv[3], "TXOPLimit") == 0){
pri_[level].setTXOPLimit(atof(argv[4])); 
return(TCL_OK); 
}
}else return (TCL_ERROR);
}
}
if (argc == 2 && strcasecmp(argv[1], "reset") == 0)
{
Terminate();
//FALL-THROUGH to give parents a chance to reset
}

return DTail::command(argc, argv);
}

void
PriQ::recv(Packet *p, Handler *h)
{
if(flag == 0) {
((Mac802_11e*) target())->queue_ = this;
flag = 1;
for(int i = 0; i < MAX_PRI; i++) {
pri_[i].setdrop(drop_); 
}
}

struct hdr_cmn *ch = HDR_CMN(p);
if(Prefer_Routing_Protocols) {

switch(ch->ptype()) {
case PT_DSR:
case PT_MESSAGE:
case PT_TORA:
case PT_AODV:
recvHighPriority(p, h);
break;

default:
pri_recv(p, h);
}
}
else {
pri_recv(p, h);
}
}

void
PriQ::pri_recv(Packet *p, Handler *h)
{
Scheduler &s = Scheduler::instance();
level = PKT_LEVEL(p); 
struct hdr_cmn *ch = HDR_CMN(p);
/* target_handle() is necessary to give the target to class Queue. 
* Otherwise the target is not known in class Queue 
* when dequeing packet (
*/
pri_[level].target_handle(target_);
pri_[level].recv(p,h);
} 


void 
PriQ::recvHighPriority(Packet *p, Handler *)
// insert packet at front of queue
{
pri_[cntl].q_->enqueHead(p);
pri_[cntl].target_handle(target_);
if (pri_[cntl].q_->length() >= qlim_)
{
Packet *to_drop = pri_[cntl].q_->lookup(pri_[cntl].q_->length()-1);
pri_[cntl].q_->remove(to_drop);
drop(to_drop);
}
if (!pri_[cntl].blocked()) {
/*
* We're not blocked. Get a packet and send it on.
* We perform an extra check because the queue
* might drop the packet even if it was
* previously empty! (e.g., RED can do this.)
*/


p = pri_[cntl].deque();
if (p != 0) {
pri_[cntl].block();
pri_[cntl].recvHighPri(p);
//target_->recv(p, &qh_); <- done in d-tail.cc
}
} 
}

void 
PriQ::filter(PacketFilter filter, void * data)
// apply filter to each packet in queue, 
// - if filter returns 0 leave packet in queue
// - if filter returns 1 remove packet from queue
{
int i = 0;
while (i < pri_[cntl].q_->length())
{
Packet *p = pri_[cntl].q_->lookup(i);
if (filter(p,data))
{
pri_[cntl].q_->remove(p); // decrements q len
}
else i++;
}
}

Packet*
PriQ::filter(nsaddr_t id)
{
Packet *p = 0;
Packet *pp = 0;
struct hdr_cmn *ch;

for(p = pri_[cntl].q_->head(); p; p = p->next_) {
ch = HDR_CMN(p);
if(ch->next_hop() == id)
break;
pp = p;
}

/*
* Deque Packet
*/
if(p) {
if(pp == 0)
pri_[cntl].q_->remove(p);
else
pri_[cntl].q_->remove(p, pp);
}
return p;
}



/*
* Called at the end of the simulation to purge the IFQ.
*/
void
PriQ::Terminate()
{
for(int i = 0; i< MAX_PRI; i++){
Packet *p;
while((p = pri_[i].deque())) {
drop(p, DROP_END_OF_SIMULATION);
//drop(p);

}
}
}

int PriQ::getLevels(){
return levels;
}
 
 

Recent GIDBlogToyota - 2009 May Promotion by Nihal

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
Help Old Computer Linux Network Planning 6795 Computer Software Forum - Linux 1 09-Dec-2007 22:56
network card problem - cannot connect to Internet newbie06 Computer Software Forum - Linux 4 01-Feb-2007 07:16
Now You Can Network Play Red Alert Winxp antoinefinch Computer Software Forum - Games 3 04-Aug-2006 09:48
Working with Network !! kaiser3519 MS Visual C++ / MFC Forum 1 08-Jun-2006 02:11
Network etiquette article crystalattice Open Discussion Forum 0 01-Oct-2004 15:38

Network Sites: GIDNetwork · GIDWebHosts · GIDSearch · Learning Journal by J de Silva, The

All times are GMT -6. The time now is 07:07.


vBulletin, Copyright © 2000 - 2009, Jelsoft Enterprises Ltd.