Erwin Harahap

do Now or Never

Bagaimana cara membuat Agent pada NS2

Posted by Erwin on January 10, 2012

Agent yang akan dibuat adalah agent yang paling populer dijadikan bahan percobaan, yaitu PING Agent. Ada banyak sekali artikel yang memuat cara pembuatan Agent ini, karena kelihatannya, tutorial Ping Agent dibuat tidak lama setelah NS network simulator dipublikasikan, kira2 lebih dari 10 tahun yang lalu. Tapi saya tertarik untuk membuat artikel ini, setidaknya dapat dijadikan referensi dalam membuat Agent baru.

Saya akan mengacu kepada dua referensi utama dalam pembuatan agent Ping ini, yaitu tutorial yang dibuat oleh Marc Greis` dan artikel dari T. Issaraiyakul. Kedua link tersebut memberikan cara yang sangat detail dalam membuat agent baru. Disini, saya hanya akan mengulang nya saja, terutama, karena kedua artikel tersebut masih menggunakan NS2 versi awal, jadi barangkali akan terdapat sedikit perbedaan jika diterapkan pada NS2 versi berikutnya.

Saya menggunakan NS-2.35 dengan OS Centos 6.2, Bash Shell. Mesin Intel Xeon E5420 2.5 GHz 64 bit, 4GB ram.

Langkah pertama adalah membuat file header. Untuk menghindari konflik dengan Ping Agent yang telah dibuat pada NS2, maka dalam hal ini, saya akan membuat agent dengan nama xping. Dengan demikian, file header yang akan dibuat adalah xping.h.

/* listing file  xping.h */

#ifndef ns_xping_h
#define ns_xping_h
#include “agent.h”
#include “tclcl.h”
#include “packet.h”
#include “address.h”
#include “ip.h”

struct hdr_xping { char ret; double send_time; };
class XPingAgent : public Agent { public: XPingAgent();
int command(int argc, const char*const* argv);
void recv(Packet*, Handler*);
protected: int off_xping_; };

#endif

selanjutnya buat file xping.cc

/* listing file xping.cc */

#include “ping.h”

static class xPingHeaderClass : public PacketHeaderClass {
public:
xPingHeaderClass() : PacketHeaderClass(“PacketHeader/Ping”,
sizeof(hdr_ping)) {}
} class_pinghdr;

static class PingClass : public TclClass {
public:
PingClass() : TclClass(“Agent/Ping”) {}
TclObject* create(int, const char*const*) {
return (new PingAgent());
}
} class_ping;

PingAgent::PingAgent() : Agent(PT_PING)
{
bind(“packetSize_”, &size_);
bind(“off_ping_”, &off_ping_);
}

int PingAgent::command(int argc, const char*const* argv)
{
if (argc == 2) {
if (strcmp(argv[1], “send”) == 0) {
// Create a new packet
Packet* pkt = allocpkt();
// Access the Ping header for the new packet:
hdr_ping* hdr = (hdr_ping*)pkt->access(off_ping_);
// Set the ‘ret’ field to 0, so the receiving node knows
// that it has to generate an echo packet
hdr->ret = 0;
// Store the current time in the ‘send_time’ field
hdr->send_time = Scheduler::instance().clock();
// Send the packet
send(pkt, 0);
// return TCL_OK, so the calling function knows that the
// command has been processed
return (TCL_OK);
}
}
// If the command hasn’t been processed by PingAgent()::command,
// call the command() function for the base class
return (Agent::command(argc, argv));
}

void PingAgent::recv(Packet* pkt, Handler*)
{
// Access the IP header for the received packet:
hdr_ip* hdrip = (hdr_ip*)pkt->access(off_ip_); //
// Access the Ping header for the received packet:
hdr_ping* hdr = (hdr_ping*)pkt->access(off_ping_); //update pada baris ini, lihat masalahnya pada link ini
// Is the ‘ret’ field = 0 (i.e. the receiving node is being pinged)?
if (hdr->ret == 0) {
// Send an ‘echo’. First save the old packet’s send_time
double stime = hdr->send_time;
// Discard the packet
Packet::free(pkt);
// Create a new packet
Packet* pktret = allocpkt();
// Access the Ping header for the new packet:
hdr_ping* hdrret = (hdr_ping*)pktret->access(off_ping_);
// Set the ‘ret’ field to 1, so the receiver won’t send another echo
hdrret->ret = 1;
// Set the send_time field to the correct value
hdrret->send_time = stime;
// Send the packet
send(pktret, 0);
} else {
// A packet was received. Use tcl.eval to call the Tcl
// interpreter with the ping results.
// Note: In the Tcl code, a procedure ‘Agent/Ping recv {from rtt}’
// has to be defined which allows the user to react to the ping
// result.
char out[100];
// Prepare the output to the Tcl interpreter. Calculate the round
// trip time
sprintf(out, “%s recv %d %3.1f”, name(),
hdrip->src_ >> Address::instance().NodeShift_[1], //update pada baris ini, lihat masalahnya pada link ini
(Scheduler::instance().clock()-hdr->send_time) * 1000);
Tcl& tcl = Tcl::instance();
tcl.eval(out);
// Discard the packet
Packet::free(pkt);
}
}

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
%d bloggers like this: