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