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