1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

EDCF protocol in Network simulation program

Discussion in 'C' started by linux_007, Apr 12, 2009.

  1. linux_007

    linux_007 New Member

    Joined:
    Apr 12, 2009
    Messages:
    2
    Likes Received:
    0
    Trophy Points:
    0
    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 use 4 queues in each station than one and modify on the some parameters (CWmin,CWmax,AIFS)these parameters using for assign priorities for each queue.Please i need help.

    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;}intPriQ::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);}voidPriQ::recv(Packet *p, Handler *h){if(flag == 0) {((Mac802_11e*) target())->queue_ = this;flag = 1;for(int i = 0; i < MAX_PRI; i++) {pri_.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);}}voidPriQ::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);elsepri_[cntl].q_->remove(p, pp);}return p;}/** Called at the end of the simulation to purge the IFQ.*/voidPriQ::Terminate(){for(int i = 0; i< MAX_PRI; i++){Packet *p;while((p = pri_.deque())) {drop(p, DROP_END_OF_SIMULATION);//drop(p);}}}int PriQ::getLevels(){return levels;}
     
  2. linux_007

    linux_007 New Member

    Joined:
    Apr 12, 2009
    Messages:
    2
    Likes Received:
    0
    Trophy Points:
    0
    Sorry the code was aline in wrong form. This is the code
    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:rhead = { 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;
    }
     
    Last edited by a moderator: Apr 13, 2009
  3. shahzad_nust

    shahzad_nust New Member

    Joined:
    Jul 13, 2009
    Messages:
    1
    Likes Received:
    0
    Trophy Points:
    0
    hi LINUX_007!
    i only registered on this forum due to the same problem u posted above. i also need an urgent help on ns2 simulation of mac802.11e. so please if you have completed your task by the help of any other source or byself then please contact me at adeel_aas2001@yahoo.com or post some simple step by step tutorialism help about mac 802_11e simulation in ns2 here.actually i am new ns2 and also not expert in c coding. i am the student of MS software engg. and doing research on wireless multimedia networks, so please do some help to me regarding the above discussed problem.
    anybody else could help me on this topic.
    will wait of your kind reply.......
     

Share This Page