My own packet:
Since i am getting a lot of messages related to creating your own packet in aodv, i am going to write another post explaining about packet creation and how to add tracing information in cmu_trace.cc. The intro post
create your own packet - part 1.
i) Create your own packet in aodv-packet.h
/* =====================================================================
Packet Formats...
===================================================================== */
#define AODVTYPE_HELLO 0x01
#define AODVTYPE_RREQ 0x02
#define AODVTYPE_RREP 0x04
#define AODVTYPE_RERR 0x08
#define AODVTYPE_RREP_ACK 0x10
#define AODVTYPE_MYREQ 0x20
#define AODVTYPE_MYREP 0x40
...
...
/*
* AODV Routing Protocol Header Macros
*/
#define HDR_AODV(p) ((struct hdr_aodv*)hdr_aodv::access(p))
#define HDR_AODV_REQUEST(p) ((struct hdr_aodv_request*)hdr_aodv::access(p))
#define HDR_AODV_REPLY(p) ((struct hdr_aodv_reply*)hdr_aodv::access(p))
///
#define HDR_AODV_MYREQUEST(p) ((struct hdr_aodv_myrequest*)hdr_aodv::access(p))
#define HDR_AODV_MYREPLY(p) ((struct hdr_aodv_myreply*)hdr_aodv::access(p))
....
....
struct hdr_aodv_myrequest {
u_int8_t rq_type; // Packet Type
u_int8_t reserved[2];
nsaddr_t rq_dst; // Destination IP Address
nsaddr_t rq_src; // Source IP Address
nsaddr_t trust_on; // Node on which, we want to know the trust
double rq_timestamp; // when REQUEST sent;
// used to compute route discovery latency
//#define RREQ_GRAT_RREP 0x80
inline int size() {
int sz = 0;
/*
sz = sizeof(u_int8_t) // rq_type
+ 2*sizeof(u_int8_t) // reserved
+ sizeof(u_int8_t) // rq_hop_count
+ sizeof(double) // rq_timestamp
+ sizeof(u_int32_t) // rq_bcast_id
+ sizeof(nsaddr_t) // rq_dst
+ sizeof(u_int32_t) // rq_dst_seqno
+ sizeof(nsaddr_t) // rq_src
+ sizeof(u_int32_t); // rq_src_seqno
*/
sz = 7*sizeof(u_int32_t);
assert (sz >= 0);
return sz;
}
};
struct hdr_aodv_myreply {
u_int8_t rp_type; // Packet Type
u_int8_t reserved[2];
nsaddr_t rp_dst; // Destination IP Address
nsaddr_t rp_src; // Source IP Address
nsaddr_t trust_on; // Node on which, we want to know the trust
double rp_lifetime; // Lifetime
double trust_val;
double rp_timestamp; // when corresponding REQ sent;
// used to compute route discovery latency
inline int size() {
int sz = 0;
/*
sz = sizeof(u_int8_t) // rp_type
+ 2*sizeof(u_int8_t) // rp_flags + reserved
+ sizeof(u_int8_t) // rp_hop_count
+ sizeof(double) // rp_timestamp
+ sizeof(nsaddr_t) // rp_dst
+ sizeof(u_int32_t) // rp_dst_seqno
+ sizeof(nsaddr_t) // rp_src
+ sizeof(u_int32_t); // rp_lifetime
*/
sz = 6*sizeof(u_int32_t);
assert (sz >= 0);
return sz;
}
};
....
ii) In aodv.cc
....
....
void AODV::recvAODV(Packet *p)
{
struct hdr_aodv *ah = HDR_AODV(p);
assert(HDR_IP (p)->sport() == RT_PORT);
assert(HDR_IP (p)->dport() == RT_PORT);
/*
* Incoming Packets.
*/
///
switch(ah->ah_type)
{
case AODVTYPE_RREQ:
recvRequest(p);
break;
case AODVTYPE_RREP:
recvReply(p);
break;
case AODVTYPE_MYREQ:
recvMyRequest(p);
break;
case AODVTYPE_MYREP:
recvMyReply(p);
break;
....
....
void AODV::recvMyRequest(Packet *p)
{
struct hdr_aodv_myrequest *rq = HDR_AODV_MYREQUEST(p);
// Get the trust value from rq->rq_dst i.e index
MobileNode *iNode;
iNode=(MobileNode *) (Node::get_node_by_address(index));
double tval = iNode->neigh_trust[rq->trust_on];
// Re-initialize the neighbor trust
iNode->neigh_trust[rq->trust_on] = 0;
sendMyReply(rq->rq_src, // IP Destination
index, // Dest IP Address
rq->trust_on, // Node on which, we want to know the trust
MY_ROUTE_TIMEOUT, // Lifetime
rq->rq_timestamp, // Timestamp
tval); // Trust value
Packet::free(p);
// drop the myreq packet and create a reply packet
}
void AODV::recvMyReply(Packet *p)
{
struct hdr_ip *ih = HDR_IP(p);
struct hdr_aodv_myreply *rp = HDR_AODV_MYREPLY(p);
temp_trust[rp->rp_src][rp->trust_on] = rp->trust_val;
fprintf(fp,"\n%d on %d is %lf by %d at %lf",rp->rp_src,rp->trust_on,rp->trust_val,index,CURRENT_TIME);
Packet::free(p);
}
....
....
void AODV::sendMyRequest(nsaddr_t dst, nsaddr_t trust_n)
{
// printf("\nsend trust req to %d %d by %d at %lf\n",dst,trust_n,index,CURRENT_TIME);
// Allocate a RREQ packet
Packet *p = Packet::alloc();
struct hdr_cmn *ch = HDR_CMN(p);
struct hdr_ip *ih = HDR_IP(p);
struct hdr_aodv_myrequest *rq = HDR_AODV_MYREQUEST(p);
// Fill out the MYREQ packet
// ch->uid() = 0;
ch->ptype() = PT_AODV;
ch->size() = IP_HDR_LEN + rq->size();
ch->iface() = -2;
ch->error() = 0;
ch->addr_type() = NS_AF_NONE;
ch->prev_hop_ = index; // AODV hack
ch->next_hop_ = dst;
ih->saddr() = index;
ih->daddr() = dst;
ih->sport() = RT_PORT;
ih->dport() = RT_PORT;
// Fill up some more fields.
rq->rq_type = AODVTYPE_MYREQ;
rq->rq_dst = dst;
rq->rq_src = index;
rq->trust_on = trust_n;
rq->rq_timestamp = CURRENT_TIME;
Scheduler::instance().schedule(target_, p, 0.);
}
....
....
void AODV::sendMyReply(nsaddr_t ipdst, nsaddr_t rpdst, nsaddr_t trust_n, u_int32_t lifetime, double timestamp, double trust_v)
{
Packet *p = Packet::alloc();
struct hdr_cmn *ch = HDR_CMN(p);
struct hdr_ip *ih = HDR_IP(p);
struct hdr_aodv_myreply *rp = HDR_AODV_MYREPLY(p);
rp->rp_type = AODVTYPE_MYREP;
rp->rp_dst = ipdst;
rp->rp_src = index;
rp->trust_on = trust_n;
rp->trust_val = trust_v;
rp->rp_lifetime = lifetime;
rp->rp_timestamp = timestamp;
// ch->uid() = 0;
ch->ptype() = PT_AODV;
ch->size() = IP_HDR_LEN + rp->size();
ch->iface() = -2;
ch->error() = 0;
ch->addr_type() = NS_AF_INET;
ch->next_hop_ = ipdst;
ch->prev_hop_ = index; // AODV hack
ch->direction() = hdr_cmn::DOWN;
ih->saddr() = index;
ih->daddr() = ipdst;
ih->sport() = RT_PORT;
ih->dport() = RT_PORT;
ih->ttl_ = NETWORK_DIAMETER;
Scheduler::instance().schedule(target_, p, 0.);
}
....
....
// calling sendMyRequest() function
// inside
// in my use case
sendMyRequest(i,j);
iii) Include all the function declaration in aodv.h
iv) Adding tracing info in cmu-trace.cc file
...
...
void
CMUTrace::format_aodv(Packet *p, int offset)
{
struct hdr_aodv *ah = HDR_AODV(p);
struct hdr_aodv_request *rq = HDR_AODV_REQUEST(p);
struct hdr_aodv_reply *rp = HDR_AODV_REPLY(p);
struct hdr_aodv_myrequest *trq = HDR_AODV_MYREQUEST(p);
struct hdr_aodv_myreply *trp = HDR_AODV_MYREPLY(p);
switch(ah->ah_type) {
case AODVTYPE_RREQ:
....
....
case AODVTYPE_MYREQ:
if (pt_->tagged()) {
sprintf(pt_->buffer() + offset,
"-aodv:t %x -aodv:d %d -aodv:s %d -aodv:o %d"
"-aodv:c REQUEST ",
trq->rq_type,
trq->rq_dst,
trq->rq_src,
trq->trust_on);
} else if (newtrace_) {
sprintf(pt_->buffer() + offset,
"-P aodv -Pt 0x%x -Pd %d -Ps %d -Po %d -Pc REQUEST ",
trq->rq_type,
trq->rq_dst,
trq->rq_src,
trq->trust_on);
} else {
sprintf(pt_->buffer() + offset,
"[0x%x [%d] [%d]] (REQUEST)",
trq->rq_type,
trq->rq_dst,
trq->rq_src,
trq->trust_on);
}
break;
case AODVTYPE_RREP:
case AODVTYPE_HELLO:
case AODVTYPE_RERR:
....
....
break;
case AODVTYPE_MYREP:
if (pt_->tagged()) {
sprintf(pt_->buffer() + offset,
"-aodv:t %x -aodv:d %d -aodv:o %d"
"-aodv:l %f -aodv:v %f -aodv:c %s ",
trp->rp_type,
trp->rp_dst,
trp->trust_on,
trp->rp_lifetime,
trp->trust_val,
"MYREPLY");
} else if (newtrace_) {
sprintf(pt_->buffer() + offset,
"-P aodv -Pt 0x%x -Pd %d -Po %d -Pl %f -Pv %f -Pc %s ",
trp->rp_type,
trp->rp_dst,
trp->trust_on,
trp->rp_lifetime,
trp->trust_val,
"REPLY");
} else {
sprintf(pt_->buffer() + offset,
"[0x%x [%d] %d %f %f] (%s)",
trp->rp_type,
trp->rp_dst,
trp->trust_on,
trp->rp_lifetime,
trp->trust_val,
"MYREPLY");
}
break;
default:
#ifdef WIN32
fprintf(stderr,
"CMUTrace::format_aodv: invalid AODV packet type\n");
#else
fprintf(stderr,
"%s: invalid AODV packet type\n", __FUNCTION__);
#endif
abort();
}
}
v) In ns-2.35/trace/cmu-trace.cc , We need to add tracing information otherwise, we will get a "invalid AODV packet type" error.
vi) Whenever you do changes in aodv files, run all these four commands (Do Not Forget),
./configure
make clean
make
make install
Note: I didn't do everything, but i did give you enough information, to proceed. Try to understand the functionality, then it is much simple. Hope it helps...