Dear all,

I have followed the work in:
http://www.linuxquestions.org/questions/programming-9/ns2-how-receive-cbr-packets-at-my-own-agent-and-duplicate-them-for-new-destination-897086/
in order to implement an intermediate node that performs the following:

   - When receiving a packet duplicates the packet.
   - One of the packets is sent to the original destination.
   - The duplicated packet is sent to a different destination.

I have created the following dup.h and dup.cc files

*dup.h*

#ifndef __dup_h__
#define __dup_h__

using namespace std;
#include "address.h"
#include <packet.h>
#include <agent.h>
#include <random.h>
#include <trace.h>
#include <map>
#include "ip.h"
#include "rtp.h"
#include "tclcl.h"

#define JITTER 0

//For any packets or MPEG Packets
class Dup : public Agent {

   nsaddr_t  SBC_addr_;
   nsaddr_t  Sender_;
   nsaddr_t  Receiver1_; //if duplicate_flag==0 it's the main receiver
   nsaddr_t  Receiver2_;
   int dup_flag_;  //0: no duplication, 1: duplicate for new packet
protected:
   NsObject* target1_;
   NsObject* target2_;

   inline nsaddr_t& SBC_addr() { return SBC_addr_; }
   inline nsaddr_t& Sender() { return Sender_; }
   inline nsaddr_t& Receiver1() { return Receiver1_; }
   inline nsaddr_t& Receiver2() { return Receiver2_; }

   inline NsObject* target1() { return target1_; }
   inline NsObject* target2() { return target2_; }

   void forward_data(Packet*);//for receiver1
   void duplicate_data(Packet*);//for receiver2
   void duplicate(int);//set dup_flag

public:
   Dup(const char* ,const char* ,const char*);//sender,receiver1,receiver2
   int command(int, const char*const*);
   void recv(Packet*, Handler*);
};

#endif

*dup.cc*

#include <iostream>
#include "dup.h"
#include "address.h"


static class DupClass : public TclClass {
public:
   DupClass() : TclClass("Agent/Dup") {}
   TclObject* create(int argc, const char*const* argv) {
   return (new Dup(argv[4],argv[5],argv[6]));
  }
} class_dup;


Dup::Dup(const char* CBRsource,const char* CBRdest_main,const char*
CBRdest_dup) : Agent(PT_MPEG) {
    Sender_= atoi(const_cast<char *>(CBRsource));
    Receiver1_= atoi(const_cast<char *>(CBRdest_main));
    Receiver2_= atoi(const_cast<char *>(CBRdest_dup));
    dup_flag_=0;
    puts("Dup::Dup created successfully\n");
}


int Dup::command(int argc, const char*const* argv) {
    puts("Command fcn");
    if (argc == 2) {
    puts("argc = 2");
        if (strcasecmp(argv[1], "start-duplication") == 0) {
           duplicate(1);
           return TCL_OK;
        }
        if (strcasecmp(argv[1], "stop-duplication") == 0) {
           duplicate(0);
           return TCL_OK;
        }
    }
    else if (argc == 3) {
    puts("argc =3");
if(strcmp(argv[1], "target-node1") == 0) {
             target1_= (NsObject*) TclObject::lookup(argv[2]);
             if (!target1_){
              puts("Error");
         puts("Scheduler(target1): attempt to schedule an event with a NULL
handler.");
         puts("COMMAND !!!! \n");
                 return TCL_ERROR;
             }
             return TCL_OK;
        }
if(strcmp(argv[1], "target-node2") == 0) {
             target2_= (NsObject*) TclObject::lookup(argv[2]);
             if (!target2_){
         puts("Scheduler(target1): attempt to schedule an event with a NULL
handler.");
         puts("COMMAND !!!! \n");
                 return TCL_ERROR;
             }
             return TCL_OK;
        }

    }

    // Pass the command to the base class
    return Agent::command(argc, argv);
}

void Dup::duplicate(int flag) {
   dup_flag_=flag;
   return;
}

void Dup::recv(Packet* p, Handler* h) {
   struct hdr_cmn* ch = HDR_CMN(p);
   struct hdr_ip* ih = HDR_IP(p);
   puts("Recv ");
   if (ch->ptype() == PT_MPEG) {
if (dup_flag_ == 1) {
      duplicate_data(p->copy());     //for destination 2 true next SBC
           forward_data(p);               //for destination
   return;
}
        else {
           forward_data(p);//for destination 1
           return;
        }
    }
}


void Dup::forward_data(Packet* p) {
   puts("forward ");
   struct hdr_ip* ih= HDR_IP(p);
   ih->daddr() = Receiver1();
   Scheduler::instance().schedule(target_, p, 0.0);
}

void Dup::duplicate_data(Packet* p) {
   puts("Duplicate ");
   struct hdr_ip* ih= HDR_IP(p);
   ih->daddr() = Receiver2();
   Scheduler::instance().schedule(target_, p, 0.0);
}


In my *tcl file* i do the following in order to configure this new agent
(n3 is an intermediate node and n4 and n5 are end nodes. Packets are
destined to n4 and I want to duplicate them to n5)

set d1 [new Agent/Dup [AddrParams addr2id [$n3 node-addr]] [AddrParams
addr2id [$n4 node-addr]] [AddrParams addr2id [$n5 node-addr]] ]

#the main target for sending data packets
$d1 target-node1 $n4

#the target for duplicating data packets
$d1 target-node2 $n5

#node that must receive data and duplicate them for dup_destination
$ns attach-agent $n3 $d1



#Create Null agents (a traffic sink) and attach it to node n4/5
set null12 [new Agent/Null]
set null21 [new Agent/Null]

$ns attach-agent $n4 $null12
$ns attach-agent $n5 $null21

However, its is not performing what is suposed to do and all packets are
sent to n4. I have noticed that the method recv() in dup.cc is not executed
at any moment. Does anybody know why recv() is not called?

Thanks in advance!
-- 
Ricard Alegre
http://wirelessatcom.uab.es

Reply via email to