modify cmutrace.cc 


mahi kapoor wrote:
> 
> 
> 
> hello everyone
>   i have introduced a new packet checkloop in maodv but when i run a tcl
> script
>   regarding maodv getting error
>   format_aodv:invalid AODV packet type
>   also i have done a little change in mact pkt. format.
>   i m attaching two files related to it.
>   please help me
>   regards
>   mahi
> 
>        
> ---------------------------------
>  Check out what you're missing if you're not on Yahoo! Messenger 
> /*
> Copyright (c) 1997, 1998 Carnegie Mellon University.  All Rights
> Reserved. 
> 
> Permission to use, copy, modify, and distribute this
> software and its documentation is hereby granted (including for
> commercial or for-profit use), provided that both the copyright notice and
> this permission notice appear in all copies of the software, derivative
> works, or modified versions, and any portions thereof, and that both
> notices appear in supporting documentation, and that credit is given to
> Carnegie Mellon University in all publications reporting on direct or
> indirect use of this code or its derivatives.
> 
> ALL CODE, SOFTWARE, PROTOCOLS, AND ARCHITECTURES DEVELOPED BY THE CMU
> MONARCH PROJECT ARE EXPERIMENTAL AND ARE KNOWN TO HAVE BUGS, SOME OF
> WHICH MAY HAVE SERIOUS CONSEQUENCES. CARNEGIE MELLON PROVIDES THIS
> SOFTWARE OR OTHER INTELLECTUAL PROPERTY IN ITS ``AS IS'' CONDITION,
> AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
> THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
> PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY
> BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
> CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
> SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
> BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
> WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
> OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE OR
> INTELLECTUAL PROPERTY, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
> DAMAGE.
> 
> Carnegie Mellon encourages (but does not require) users of this
> software or intellectual property to return any improvements or
> extensions that they make, and to grant Carnegie Mellon the rights to
> redistribute these changes without encumbrance.
> 
> The AODV code developed by the CMU/MONARCH group was optimized and tuned
> by Samir Das and Mahesh Marina, University of Cincinnati. The work was
> partially done in Sun Microsystems.
> */
> 
> 
> #ifndef __aodv_packet_h__
> #define __aodv_packet_h__
> 
> //#include <config.h>
> //#include "aodv.h"
> #define AODV_MAX_ERRORS 100
> 
> 
> /* =====================================================================
>    Packet Formats...
>    =====================================================================
> */
> #define AODVTYPE_HELLO        0x01
> #define AODVTYPE_RREQ         0x02
> #define AODVTYPE_RREP         0x04
> #define AODVTYPE_RERR         0x08
> #define AODVTYPE_RREP_ACK     0x10
> 
> /*** added for multicast ***/
> #define AODVTYPE_GRPH         0x06
> #define AODVTYPE_MACT         0x05
> //done by me
> ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
> #define AODVTYPE_CHECKLOOP    0x12
> /***************************/
> 
> /*** added for prediction in multicast***/
> #define AODVTYPE_WARN           0x07
> #define AODVTYPE_LPW    0x09
> #define AODVTYPE_RPE    0x03
> #define AODVTYPE_LINK_RREQ 0x11
> /****************************/
> 
> /*
>  * 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_ERROR(p)     ((struct hdr_aodv_error*)hdr_aodv::access(p))
> #define HDR_AODV_RREP_ACK(p)  ((struct
> hdr_aodv_rrep_ack*)hdr_aodv::access(p))
> 
> /*** added for multicast ***/
> #define HDR_AODV_GRPH(p)      ((struct hdr_aodv_grph*)hdr_aodv::access(p))
> #define HDR_AODV_MACT(p)      ((struct hdr_aodv_mact*)hdr_aodv::access(p))
> #define HDR_AODV_CHECKLOOP(p) ((struct
> hdr_aodv_checkloop*)hdr_aodv::access(p))
> /***************************/
> 
> /*** added for prediction***/
> #define HDR_AODV_WARN(p)    ((struct hdr_aodv_warn*)hdr_aodv::access(p))
> #define HDR_AODV_REQUEST_LINK(p) ((struct hdr_aodv_request_link
> *)hdr_aodv::access(p))
> #define HDR_AODV_RPE(p) ((struct hdr_aodv_rpe *)hdr_aodv::access(p))
> #define HDR_AODV_LPW(p) ((struct hdr_aodv_lpw *)hdr_aodv::access(p))
> /******************************************/
> 
> 
> /*
>  * General AODV Header - shared by all formats
>  */
> struct hdr_aodv {
>         u_int8_t        ah_type;
>       /*
>         u_int8_t        ah_reserved[2];
>         u_int8_t        ah_hopcount;
>       */
>               // Header access methods
>       static int offset_; // required by PacketHeaderManager
>       inline static int& offset() { return offset_; }
>       inline static hdr_aodv* access(const Packet* p) {
>               return (hdr_aodv*) p->access(offset_);
>       }
> };
> 
> /*** added for multicast ***/
> #define RREQ_NO_FLAG 0x00
> #define RREQ_J        0x01
> #define RREQ_JR 0x03
> #define RREQ_R  0x04
> /**************************/
> 
> struct hdr_aodv_request {
>         u_int8_t        rq_type;      // Packet Type
> 
>         /*** modified for multicast ***/
>         //u_int8_t        reserved[2];
>         u_int8_t        rq_flags;
>       u_int8_t                reserved;
>         /******************************/
> 
>         u_int8_t        rq_hop_count;   // Hop Count
>         u_int32_t       rq_bcast_id;    // Broadcast ID
> 
>         nsaddr_t        rq_dst;         // Destination IP Address
>         u_int32_t       rq_dst_seqno;   // Destination Sequence Number
>         nsaddr_t        rq_src;         // Source IP Address
>         u_int32_t       rq_src_seqno;   // Source Sequence Number
> 
>         double          rq_timestamp;   // when REQUEST sent;
>                                       // used to compute route discovery 
> latency
> 
>   // This define turns on gratuitous replies- see aodv.cc for
> implementation contributed by
>   // Anant Utgikar, 09/16/02.
>   //#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;
>   }
> };
> 
> /*** added for multicast ***/
> #define RREP_NO_FLAG 0x00
> #define RREP_J        0x01
> #define RREP_JR 0x03
> #define RREP_R  0x04
> /***************************/
> 
> struct hdr_aodv_reply {
>         u_int8_t        rp_type;        // Packet Type
> 
>         /*** modified for multicast ***/
>         //u_int8_t        reserved[2];
>         u_int8_t      rp_flags;
>         u_int8_t        reserved;
>         /*******************************/
> 
>         u_int8_t        rp_hop_count;           // Hop Count
>         nsaddr_t        rp_dst;                 // Destination IP Address
>         u_int32_t       rp_dst_seqno;           // Destination Sequence
> Number
>         nsaddr_t        rp_src;                 // Source IP Address
>         double                rp_lifetime;            // Lifetime
> 
>         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;
>   }
> 
> };
> 
> struct hdr_aodv_error {
>         u_int8_t        re_type;                // Type
>         u_int8_t        reserved[2];            // Reserved
>         u_int8_t        DestCount;                 // DestCount
>         // List of Unreachable destination IP addresses and sequence
> numbers
>         nsaddr_t        unreachable_dst[AODV_MAX_ERRORS];   
>         u_int32_t       unreachable_dst_seqno[AODV_MAX_ERRORS];   
> 
>   inline int size() { 
>   int sz = 0;
>   /*
>       sz = sizeof(u_int8_t)           // type
>            + 2*sizeof(u_int8_t)       // reserved
>            + sizeof(u_int8_t)         // length
>            + length*sizeof(nsaddr_t); // unreachable destinations
>   */
>       sz = (DestCount*2 + 1)*sizeof(u_int32_t);
>       assert(sz);
>         return sz;
>   }
> 
> };
> 
> struct hdr_aodv_rrep_ack {
>       u_int8_t        rpack_type;
>       u_int8_t        reserved;
> };
> 
> /*** added for multicast ***/
> #define MACT_J 0x01
> #define MACT_P 0x02
> #define MACT_GL 0x03
> 
> struct hdr_aodv_mact {
>       u_int8_t        mact_type;
>       u_int8_t        mact_flags;
>       u_int8_t        reserved;
>       u_int8_t        mact_hop_count;
>       nsaddr_t        mact_grp_dst;
>       nsaddr_t        mact_src;
>       u_int32_t       mact_src_seqno;
>       nsaddr_t        mact_joined_node;
> 
>       inline int size(){
>               int sz = 5 * sizeof(u_int32_t);
>               return sz;
>       }
> };
> 
> #define GRPH_U 0x01
> #define GRPH_NO_FLAG 0x00
> #define GRPH_M 0x02
> struct hdr_aodv_grph {
>       u_int8_t        gh_type;
>       u_int8_t        gh_flags;
>       u_int8_t        reserved;
>       u_int8_t        gh_hop_count;
>       nsaddr_t        gh_grp_leader_addr;
>       nsaddr_t        gh_multi_grp_addr;
>       u_int32_t       gh_grp_seqno;
> 
>       inline int size(){
>               int sz = 4 * sizeof(u_int32_t);
>               return sz;
>       }
> };
> 
> #define AODVTYPE_RREP_EXT 0x05
> #define AODVTYPE_RREP_EXT_LEN 0x06
> struct hdr_aodv_reply_ext{
>       u_int8_t type;
>     u_int8_t length;
>     u_int16_t hops_grp_leader;
>       nsaddr_t grp_leader_addr;
> 
>       inline int size(){
>               int sz = 2 * sizeof(u_int32_t);
>               return sz;
>       }
> };
> 
> #define AODVTYPE_RREQ_EXT 0x04
> #define AODVTYPE_RREQ_EXT_LEN 0x02
> struct hdr_aodv_request_ext {
>       u_int8_t type;
>       u_int8_t length;
>       u_int16_t hop_count;
> 
>       inline int size(){
>               int sz = 1 * sizeof(u_int32_t);
>               return sz;
>       }
> };
> //done by
> me//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
> struct hdr_aodv_checkloop {
>       nsaddr_t cl_reply_node;
>       nsaddr_t cl_joined_node;
>       nsaddr_t cl_grp_addr;
> 
>       inline int size(){
>               int sz=3 * sizeof(u_int32_t);
>               return sz;
>       }
> };
> /************************/
> 
> 
> /*** added for prediction ***/
> #define WARN_U 0x01
> #define WARN_D 0x02
> struct hdr_aodv_warn {
>         u_int8_t    wn_type;
>         u_int8_t    wn_flags;
>         u_int8_t    reserved;
>         nsaddr_t    wn_grp;
>         double      wn_expire;
> 
>         inline int size(){
>                 int sz = 3 * sizeof(u_int8_t) + 2 * sizeof(u_int32_t);
>                 return sz;
>         }
> };
> 
> struct hdr_aodv_lpw {
>         u_int8_t rp_type;
>         nsaddr_t rp_dst;
>         double breakTime;
> 
>         inline int size(){
>                int sz = 2 * sizeof(u_int32_t) + sizeof(u_int8_t);
>                return sz;
>         }
> };
> 
> struct hdr_aodv_rpe {
>         u_int8_t        rp_type;                // Type
>         u_int8_t        reserved[2];            // Reserved
>         u_int8_t        DestCount;                 // DestCount
>         // List of destination IP addresses and sequence numbers
>         
>         double          breakTime;
>         nsaddr_t        vulnerable_dst[AODV_MAX_ERRORS];   
>         u_int32_t       vulnerable_dst_seqno[AODV_MAX_ERRORS];
> 
>   inline int size() {
>         int sz = (DestCount*2 + 1)*sizeof(u_int32_t)+sizeof(double);
>         assert(sz);
>         return sz;
>   }
> };
> 
> struct hdr_aodv_request_link {
>         u_int8_t        rq_type;                // Packet Type
>         u_int8_t        rq_flags;
>         u_int8_t        reserved;
>         u_int8_t        rq_hop_count;           // Hop Count
> 
>         u_int32_t       rq_bcast_id;            // Broadcast ID
> 
>         nsaddr_t        rq_dst;                 // Destination IP Address
>         u_int32_t       rq_dst_seqno;           // Destination Sequence
> Number
>         nsaddr_t        rq_src;                 // Source IP Address
>         u_int32_t       rq_src_seqno;           // Source Sequence Number
> 
>         double          rq_timestamp;           // when REQUEST sent
> 
>         nsaddr_t        from;
>         nsaddr_t        to;
> 
>         inline int size(){
>                 int sz = 9 * sizeof(u_int32_t);
>                 return sz;
>         }
> 
> };
> /**********************/
> 
> 
> // for size calculation of header-space reservation
> union hdr_all_aodv {
>   hdr_aodv          ah;
>   hdr_aodv_request  rreq;
>   hdr_aodv_reply    rrep;
>   hdr_aodv_error    rerr;
>   hdr_aodv_rrep_ack rrep_ack;
> 
>   /*** added for multicast ***/
>   hdr_aodv_grph               grph;
>   hdr_aodv_mact               mact;
> //done by
> me//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
>   hdr_aodv_checkloop  cl;
>   /***************************/
> 
>   /*** added for prediction ***/
>   hdr_aodv_lpw  lpw;
>   hdr_aodv_rpe  rep;
>   hdr_aodv_request_link rq;
>   hdr_aodv_warn     warn;
>   /****************************/
> };
> 
> #endif /* __aodv_packet_h__ */
> 
> 
> /* -*-        Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- 
> */
> /*
>  * Copyright (c) 1997 Regents of the University of California.
>  * All rights reserved.
>  *
>  * Redistribution and use in source and binary forms, with or without
>  * modification, are permitted provided that the following conditions
>  * are met:
>  * 1. Redistributions of source code must retain the above copyright
>  *    notice, this list of conditions and the following disclaimer.
>  * 2. Redistributions in binary form must reproduce the above copyright
>  *    notice, this list of conditions and the following disclaimer in the
>  *    documentation and/or other materials provided with the distribution.
>  * 3. All advertising materials mentioning features or use of this
> software
>  *    must display the following acknowledgement:
>  *    This product includes software developed by the Computer Systems
>  *    Engineering Group at Lawrence Berkeley Laboratory.
>  * 4. Neither the name of the University nor of the Laboratory may be used
>  *    to endorse or promote products derived from this software without
>  *    specific prior written permission.
>  *
>  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
>  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
>  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
> PURPOSE
>  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
> LIABLE
>  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
> CONSEQUENTIAL
>  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
>  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
>  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
> STRICT
>  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
> WAY
>  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
>  * SUCH DAMAGE.
>  *
>  * Ported from CMU/Monarch's code, appropriate copyright applies.
>  * nov'98 -Padma.
>  *
>  * $Header: /nfs/jade/vint/CVSROOT/ns-2/trace/cmu-trace.cc,v 1.72
> 2003/02/22 03:53:35 buchheim Exp $
>  */
> 
> #include <packet.h>
> #include <ip.h>
> #include <tcp.h>
> #include <rtp.h>
> #include <arp.h>
> #include <dsr/hdr_sr.h>       // DSR
> #include <mac.h>
> #include <mac-802_11.h>
> #include <address.h>
> #include <tora/tora_packet.h> //TORA
> #include <imep/imep_spec.h>         // IMEP
> #include <aodv/aodv_packet.h> //AODV
> #include <cmu-trace.h>
> #include <mobilenode.h>
> 
> #include "diffusion/diff_header.h" // DIFFUSION -- Chalermek
> 
> 
> //#define LOG_POSITION
> 
> //extern char* pt_names[];
> 
> static class CMUTraceClass : public TclClass {
> public:
>       CMUTraceClass() : TclClass("CMUTrace") { }
>       TclObject* create(int, const char*const* argv) {
>               return (new CMUTrace(argv[4], *argv[5]));
>       }
> } cmutrace_class;
> 
> 
> 
> double CMUTrace::bradius = 0.0;
> double CMUTrace::radius_scaling_factor_ = 0.0;
> double CMUTrace::duration_scaling_factor_ = 0.0;
> 
> 
> CMUTrace::CMUTrace(const char *s, char t) : Trace(t)
> {
>       bzero(tracename, sizeof(tracename));
>       strncpy(tracename, s, MAX_ID_LEN);
> 
>         if(strcmp(tracename, "RTR") == 0) {
>                 tracetype = TR_ROUTER;
>         }
>       else if(strcmp(tracename, "TRP") == 0) {
>                 tracetype = TR_ROUTER;
>         }
>         else if(strcmp(tracename, "MAC") == 0) {
>                 tracetype = TR_MAC;
>         }
>         else if(strcmp(tracename, "IFQ") == 0) {
>                 tracetype = TR_IFQ;
>         }
>         else if(strcmp(tracename, "AGT") == 0) {
>                 tracetype = TR_AGENT;
>         }
>         else {
>                 fprintf(stderr, "CMU Trace Initialized with invalid
> type\n");
>                 exit(1);
>         }
> 
>       assert(type_ == DROP || type_ == SEND || type_ == RECV);
> 
>       newtrace_ = 0;
>       for (int i=0 ; i < MAX_NODE ; i++) 
>               nodeColor[i] = 3 ;
>         node_ = 0;
> 
> }
> 
> void
> CMUTrace::format_mac(Packet *p, const char *why, int offset)
> {
>       struct hdr_cmn *ch = HDR_CMN(p);
>       struct hdr_ip *ih = HDR_IP(p);
>       struct hdr_mac802_11 *mh = HDR_MAC802_11(p);
>       double x = 0.0, y = 0.0, z = 0.0;
>        
>       char op = (char) type_;
>       Node* thisnode = Node::get_node_by_address(src_);
>       double energy = -1;
>       if (thisnode) {
>           if (thisnode->energy_model()) {
>                   energy = thisnode->energy_model()->energy();
>           }
>       }
> 
>       // hack the IP address to convert pkt format to hostid format
>       // for now until port ids are removed from IP address. -Padma.
> 
>       int src = Address::instance().get_nodeaddr(ih->saddr());
> 
>       if(tracetype == TR_ROUTER && type_ == SEND) {
>               if(src_ != src)
>                       op = FWRD;
>       }
> 
>       // use tagged format if appropriate
>       if (pt_->tagged()) {
>               int next_hop = -1 ;
>               Node* nextnode = Node::get_node_by_address(ch->next_hop_);
>               if (nextnode) next_hop = nextnode->nodeid(); 
> 
>               node_->getLoc(&x, &y, &z);
> 
>               if (op == DROP) op = 'd';
>               if (op == SEND) op = '+';
>               if (op == FWRD) op = 'h';
> 
>               sprintf(pt_->buffer() + offset,
>                       "%c "TIME_FORMAT" -s %d -d %d -p %s -k %3s -i %d "
>                       "-N:loc {%.2f %.2f %.2f} -N:en %f "
>                       "-M:dur %x -M:s %x -M:d %x -M:t %x ",
>                       op,                             // event type
>                       Scheduler::instance().clock(),  // time
>                       src_,                           // this node
>                       next_hop,                       // next hop
>                       packet_info.name(ch->ptype()),  // packet type
>                       tracename,                      // trace level
>                       ch->uid(),                      // event id
>                       x, y, z,                        // location
>                       energy,                         // energy
>                       mh->dh_duration,                // MAC: duration
>                       ETHER_ADDR(mh->dh_da),          // MAC: source
>                       ETHER_ADDR(mh->dh_sa),          // MAC: destination
>                       GET_ETHER_TYPE(mh->dh_body)     // MAC: type
>                       );
>               return;
>       }
> 
> 
>       // Use new ns trace format to replace the old cmu trace format)
>       if (newtrace_) {
>           
>           node_->getLoc(&x, &y, &z);
>           // consistence
>           if ( op == DROP ) { op = 'd';}
> 
>               // basic trace infomation + basic exenstion
> 
>           sprintf(pt_->buffer() + offset,
>                  "%c -t %.9f -Hs %d -Hd %d -Ni %d -Nx %.2f -Ny %.2f -Nz %.2f 
> -Ne %f
> -Nl %3s -Nw %s ",
>                   op,                       // event type
>                   Scheduler::instance().clock(),  // time
>                   src_,                           // this node
>                     ch->next_hop_,                  // next hop
>                   src_,                           // this node
>                   x,                              // x coordinate
>                   y,                              // y coordinate
>                   z,                              // z coordinate
>                   energy,                         // energy, -1 = not existing
>                   tracename,                      // trace level
>                     why);                            // reason
> 
>           // mac layer extension
> 
>           offset = strlen(pt_->buffer());
> 
>           sprintf(pt_->buffer() + offset, 
>                   "-Ma %x -Md %x -Ms %x -Mt %x ",
>                   mh->dh_duration,
>                   ETHER_ADDR(mh->dh_da),
>                   ETHER_ADDR(mh->dh_sa),
>                   GET_ETHER_TYPE(mh->dh_body));
>                   
>            return;
>       }
> 
> 
> #ifdef LOG_POSITION
>         double x = 0.0, y = 0.0, z = 0.0;
>         node_->getLoc(&x, &y, &z);
> #endif
> 
>       sprintf(pt_->buffer() + offset,
> #ifdef LOG_POSITION
>               "%c %.9f %d (%6.2f %6.2f) %3s %4s %d %s %d [%x %x %x %x] ",
> #else
>               "%c %.9f _%d_ %3s %4s %d %s %d [%x %x %x %x] ",
> #endif
>               op,
>               Scheduler::instance().clock(),
>                 src_,                           // this node
> #ifdef LOG_POSITION
>                 x,
>                 y,
> #endif
>               tracename,
>               why,
>               
>                 ch->uid(),                      // identifier for this
> event
>               
>               ((ch->ptype() == PT_MAC) ? (
>                 (mh->dh_fc.fc_subtype == MAC_Subtype_RTS) ? "RTS"  :
>                 (mh->dh_fc.fc_subtype == MAC_Subtype_CTS) ? "CTS"  :
>                 (mh->dh_fc.fc_subtype == MAC_Subtype_ACK) ? "ACK"  :
>                 "UNKN"
>                 ) : packet_info.name(ch->ptype())),
>               
>               ch->size(),
> 
>               //*((u_int16_t*) &mh->dh_fc),
>               mh->dh_duration,
>               ETHER_ADDR(mh->dh_da),
>               ETHER_ADDR(mh->dh_sa),
>               GET_ETHER_TYPE(mh->dh_body));
> 
>       offset = strlen(pt_->buffer());
> 
>       if (thisnode) {
>               if (thisnode->energy_model()) {
>                       sprintf(pt_->buffer() + offset,
>                               "[energy %f] ",
>                               thisnode->energy_model()->energy());
>               }
>         }
> }
> 
> void
> CMUTrace::format_ip(Packet *p, int offset)
> {
>         struct hdr_cmn *ch = HDR_CMN(p);
>       struct hdr_ip *ih = HDR_IP(p);
>       
>       // hack the IP address to convert pkt format to hostid format
>       // for now until port ids are removed from IP address. -Padma.
>       int src = Address::instance().get_nodeaddr(ih->saddr());
>       int dst = Address::instance().get_nodeaddr(ih->daddr());
> 
>       if (pt_->tagged()) {
>               sprintf(pt_->buffer() + offset,
>                       "-IP:s %d -IP:sp %d -IP:d %d -IP:dp %d -p %s -e %d "
>                       "-c %d -i %d -IP:ttl %d ",
>                       src,                           // packet src
>                       ih->sport(),                   // src port
>                       dst,                           // packet dest
>                       ih->dport(),                   // dst port
>                       packet_info.name(ch->ptype()), // packet type
>                       ch->size(),                    // packet size
>                       ih->flowid(),                  // flow id
>                       ch->uid(),                     // unique id
>                       ih->ttl_                       // ttl
>                       );
>       } else if (newtrace_) {
>           sprintf(pt_->buffer() + offset,
>                   "-Is %d.%d -Id %d.%d -It %s -Il %d -If %d -Ii %d -Iv %d ",
>                   src,                           // packet src
>                   ih->sport(),                   // src port
>                   dst,                           // packet dest
>                   ih->dport(),                   // dst port
>                   packet_info.name(ch->ptype()),  // packet type
>                   ch->size(),                     // packet size
>                   ih->flowid(),                   // flow id
>                   ch->uid(),                      // unique id
>                   ih->ttl_);                      // ttl
>       } else {
>             sprintf(pt_->buffer() + offset, "------- [%d:%d %d:%d %d %d]
> ",
>                 src, ih->sport(),
>                 dst, ih->dport(),
>                 ih->ttl_, (ch->next_hop_ < 0) ? 0 : ch->next_hop_);
>       }
> }
> 
> void
> CMUTrace::format_arp(Packet *p, int offset)
> {
>       struct hdr_arp *ah = HDR_ARP(p);
> 
>       if (pt_->tagged()) {
>           sprintf(pt_->buffer() + offset,
>                   "-arp:op %s -arp:ms %d -arp:s %d -arp:md %d -arp:d %d ",
>                   ah->arp_op == ARPOP_REQUEST ?  "REQUEST" : "REPLY",
>                   ah->arp_sha,
>                   ah->arp_spa,
>                   ah->arp_tha,
>                   ah->arp_tpa);
>       } else if (newtrace_) {
>           sprintf(pt_->buffer() + offset,
>                   "-P arp -Po %s -Pms %d -Ps %d -Pmd %d -Pd %d ",
>                   ah->arp_op == ARPOP_REQUEST ?  "REQUEST" : "REPLY",
>                   ah->arp_sha,
>                   ah->arp_spa,
>                   ah->arp_tha,
>                   ah->arp_tpa);
>       } else {
> 
>           sprintf(pt_->buffer() + offset,
>               "------- [%s %d/%d %d/%d]",
>               ah->arp_op == ARPOP_REQUEST ?  "REQUEST" : "REPLY",
>               ah->arp_sha,
>               ah->arp_spa,
>               ah->arp_tha,
>               ah->arp_tpa);
>       }
> }
> 
> void
> CMUTrace::format_dsr(Packet *p, int offset)
> {
>       hdr_sr *srh = hdr_sr::access(p);
> 
>       if (pt_->tagged()) {
>           sprintf(pt_->buffer() + offset,
>                   "-dsr:h %d -dsr:q %d -dsr:s %d -dsr:p %d -dsr:n %d "
>                   "-dsr:l %d -dsr:e {%d %d} -dsr:w %d -dsr:m %d -dsr:c %d "
>                   "-dsr:b {%d %d} ",
>                   srh->num_addrs(),
>                   srh->route_request(),
>                   srh->rtreq_seq(),
>                   srh->route_reply(),
>                   srh->rtreq_seq(),
>                   srh->route_reply_len(),
>                   srh->reply_addrs()[0].addr,
>                   srh->reply_addrs()[srh->route_reply_len()-1].addr,
>                   srh->route_error(),
>                   srh->num_route_errors(),
>                   srh->down_links()[srh->num_route_errors() - 1].tell_addr,
>                   srh->down_links()[srh->num_route_errors() - 1].from_addr,
>                   srh->down_links()[srh->num_route_errors() - 1].to_addr);
>           return;
>       } else if (newtrace_) {
>           sprintf(pt_->buffer() + offset, 
>               "-P dsr -Ph %d -Pq %d -Ps %d -Pp %d -Pn %d -Pl %d -Pe %d->%d 
> -Pw %d -Pm
> %d -Pc %d -Pb %d->%d ",
>                   srh->num_addrs(),                   // how many nodes 
> travered
> 
>               srh->route_request(),
>               srh->rtreq_seq(),
> 
>               srh->route_reply(),
>               srh->rtreq_seq(),
>               srh->route_reply_len(),
>               // the dest of the src route
>               srh->reply_addrs()[0].addr,
>               srh->reply_addrs()[srh->route_reply_len()-1].addr,
> 
>               srh->route_error(),
>               srh->num_route_errors(),
>               srh->down_links()[srh->num_route_errors() - 1].tell_addr,
>               srh->down_links()[srh->num_route_errors() - 1].from_addr,
>               srh->down_links()[srh->num_route_errors() - 1].to_addr);
> 
>          return;
>       }
>       sprintf(pt_->buffer() + offset, 
>               "%d [%d %d] [%d %d %d %d->%d] [%d %d %d %d->%d]",
>               srh->num_addrs(),
> 
>               srh->route_request(),
>               srh->rtreq_seq(),
> 
>               srh->route_reply(),
>               srh->rtreq_seq(),
>               srh->route_reply_len(),
>               // the dest of the src route
>               srh->reply_addrs()[0].addr,
>               srh->reply_addrs()[srh->route_reply_len()-1].addr,
> 
>               srh->route_error(),
>               srh->num_route_errors(),
>               srh->down_links()[srh->num_route_errors() - 1].tell_addr,
>               srh->down_links()[srh->num_route_errors() - 1].from_addr,
>               srh->down_links()[srh->num_route_errors() - 1].to_addr);
> }
> 
> void
> CMUTrace::format_msg(Packet *, int)
> {
> }
> 
> void
> CMUTrace::format_tcp(Packet *p, int offset)
> {
>       struct hdr_cmn *ch = HDR_CMN(p);
>       struct hdr_tcp *th = HDR_TCP(p);
>       
>       if (pt_->tagged()) {
>           sprintf(pt_->buffer() + offset,
>                   "-tcp:s %d -tcp:a %d -tcp:f %d -tcp:o %d ",
>                   th->seqno_,
>                   th->ackno_,
>                   ch->num_forwards(),
>                   ch->opt_num_forwards());
>       } else if (newtrace_) {
>           sprintf(pt_->buffer() + offset,
>               "-Pn tcp -Ps %d -Pa %d -Pf %d -Po %d ",
>               th->seqno_,
>               th->ackno_,
>               ch->num_forwards(),
>               ch->opt_num_forwards());
> 
>       } else {
>           sprintf(pt_->buffer() + offset,
>               "[%d %d] %d %d",
>               th->seqno_,
>               th->ackno_,
>               ch->num_forwards(),
>               ch->opt_num_forwards());
>       }
> }
> 
> void
> CMUTrace::format_rtp(Packet *p, int offset)
> {
>       struct hdr_cmn *ch = HDR_CMN(p);
>       struct hdr_rtp *rh = HDR_RTP(p);
>       struct hdr_ip *ih = HDR_IP(p);
>         Node* thisnode = Node::get_node_by_address(src_);
> 
>       //hacking, needs to change later, 
>         int dst = Address::instance().get_nodeaddr(ih->daddr());
>       
>       if (dst == src_){
>               // I just received a cbr data packet
>               if (thisnode->energy_model() && 
>                   thisnode->energy_model()->powersavingflag()) {
>                       
> thisnode->energy_model()->set_node_state(EnergyModel::INROUTE);
>               }
>         }
> 
>       if (pt_->tagged()) {
>               sprintf(pt_->buffer() + offset,
>                       "-cbr:s %d -cbr:f %d -cbr:o %d ",
>                       rh->seqno_,
>                       ch->num_forwards(),
>                       ch->opt_num_forwards());
>       } else if (newtrace_) {
>               sprintf(pt_->buffer() + offset,
>                       "-Pn cbr -Pi %d -Pf %d -Po %d ",
>                       rh->seqno_,
>                       ch->num_forwards(),
>                       ch->opt_num_forwards());
>       } else {
>               sprintf(pt_->buffer() + offset,
>                       "[%d] %d %d",
>                       rh->seqno_,
>                       ch->num_forwards(),
>                       ch->opt_num_forwards());
>       }
> }
> 
> void
> CMUTrace::format_imep(Packet *p, int offset)
> {
>         struct hdr_imep *im = HDR_IMEP(p);
> 
> #define U_INT16_T(x)    *((u_int16_t*) &(x))
> 
>       if (pt_->tagged()) {
>           sprintf(pt_->buffer() + offset,
>                   "-imep:a %c -imep:h %c -imep:o %c -imep:l %04x ",
>                   (im->imep_block_flags & BLOCK_FLAG_ACK) ? 'A' : '-',
>                     (im->imep_block_flags & BLOCK_FLAG_HELLO) ? 'H' : '-',
>                     (im->imep_block_flags & BLOCK_FLAG_OBJECT) ? 'O' :
> '-',
>                     U_INT16_T(im->imep_length));
>       } else if (newtrace_) {
>           sprintf(pt_->buffer() + offset,
>                 "-P imep -Pa %c -Ph %c -Po %c -Pl 0x%04x ] ",
>                 (im->imep_block_flags & BLOCK_FLAG_ACK) ? 'A' : '-',
>                 (im->imep_block_flags & BLOCK_FLAG_HELLO) ? 'H' : '-',
>                 (im->imep_block_flags & BLOCK_FLAG_OBJECT) ? 'O' : '-',
>                 U_INT16_T(im->imep_length));
>       } else {
>             sprintf(pt_->buffer() + offset,
>                 "[%c %c %c 0x%04x] ",
>                 (im->imep_block_flags & BLOCK_FLAG_ACK) ? 'A' : '-',
>                 (im->imep_block_flags & BLOCK_FLAG_HELLO) ? 'H' : '-',
>                 (im->imep_block_flags & BLOCK_FLAG_OBJECT) ? 'O' : '-',
>                 U_INT16_T(im->imep_length));
>       }
> #undef U_INT16_T
> }
> 
> 
> void
> CMUTrace::format_tora(Packet *p, int offset)
> {
>         struct hdr_tora *th = HDR_TORA(p);
>         struct hdr_tora_qry *qh = HDR_TORA_QRY(p);
>         struct hdr_tora_upd *uh = HDR_TORA_UPD(p);
>         struct hdr_tora_clr *ch = HDR_TORA_CLR(p);
> 
>         switch(th->th_type) {
> 
>         case TORATYPE_QRY:
> 
>               if (pt_->tagged()) {
>                   sprintf(pt_->buffer() + offset,
>                           "-tora:t %x -tora:d %d -tora:c QUERY",
>                           qh->tq_type, qh->tq_dst);
>               } else if (newtrace_) {
>                   sprintf(pt_->buffer() + offset,
>                       "-P tora -Pt 0x%x -Pd %d -Pc QUERY ",
>                         qh->tq_type, qh->tq_dst);
>                       
>                 } else {
> 
>                     sprintf(pt_->buffer() + offset, "[0x%x %d] (QUERY)",
>                         qh->tq_type, qh->tq_dst);
>               }
>                 break;
> 
>         case TORATYPE_UPD:
> 
>               if (pt_->tagged()) {
>                   sprintf(pt_->buffer() + offset,
>                           "-tora:t %x -tora:d %d -tora:a %f -tora:o %d "
>                           "-tora:r %d -tora:e %d -tora:i %d -tora:c UPDATE",
>                           uh->tu_type,
>                             uh->tu_dst,
>                             uh->tu_tau,
>                             uh->tu_oid,
>                             uh->tu_r,
>                             uh->tu_delta,
>                             uh->tu_id);
>               } else if (newtrace_) {
>                   sprintf(pt_->buffer() + offset,
>                         "-P tora -Pt 0x%x -Pd %d (%f %d %d %d %d) -Pc
> UPDATE ",
>                         uh->tu_type,
>                         uh->tu_dst,
>                         uh->tu_tau,
>                         uh->tu_oid,
>                         uh->tu_r,
>                         uh->tu_delta,
>                         uh->tu_id);
>               } else {
>                     sprintf(pt_->buffer() + offset,
>                         "-Pt 0x%x -Pd %d -Pa %f -Po %d -Pr %d -Pe %d -Pi
> %d -Pc UPDATE ",
>                         uh->tu_type,
>                         uh->tu_dst,
>                         uh->tu_tau,
>                         uh->tu_oid,
>                         uh->tu_r,
>                         uh->tu_delta,
>                         uh->tu_id);
>               }
>                 break;
> 
>         case TORATYPE_CLR:
>               if (pt_->tagged()) {
>                   sprintf(pt_->buffer() + offset,
>                           "-tora:t %x -tora:d %d -tora:a %f -tora:o %d "
>                           "-tora:c CLEAR ",
>                           ch->tc_type,
>                             ch->tc_dst,
>                             ch->tc_tau,
>                             ch->tc_oid);
>               } else if (newtrace_) {
>                   sprintf(pt_->buffer() + offset, 
>                       "-P tora -Pt 0x%x -Pd %d -Pa %f -Po %d -Pc CLEAR ",
>                         ch->tc_type,
>                         ch->tc_dst,
>                         ch->tc_tau,
>                         ch->tc_oid);
>               } else {
>                     sprintf(pt_->buffer() + offset, "[0x%x %d %f %d]
> (CLEAR)",
>                         ch->tc_type,
>                         ch->tc_dst,
>                         ch->tc_tau,
>                         ch->tc_oid);
>               }
>                 break;
>         }
> }
> 
> 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);
> 
>         /*** added for multicast ***/
>         struct hdr_aodv_grph *gh = HDR_AODV_GRPH(p);
>         struct hdr_aodv_mact *mact = HDR_AODV_MACT(p);
>         struct hdr_aodv_warn *warn = HDR_AODV_WARN(p);
> //done by
> me//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
>       struct hdr_aodv_checkloop *cl=HDR_AODV_CHECKLOOP(p);
>         /****************************/
> 
>         switch(ah->ah_type) {
>         case AODVTYPE_RREQ:
> 
>         /*** added for prediction for unicast ***/
>         case AODVTYPE_LINK_RREQ:
>         /****************************************/
> 
>               if (pt_->tagged()) {
>                   sprintf(pt_->buffer() + offset,
>                           "-aodv:t %x -aodv:h %d -aodv:b %d -aodv:d %d "
>                           "-aodv:ds %d -aodv:s %d -aodv:ss %d "
>                           "-aodv:c REQUEST ",
>                           rq->rq_type,
>                             rq->rq_hop_count,
>                             rq->rq_bcast_id,
>                             rq->rq_dst,
>                             rq->rq_dst_seqno,
>                             rq->rq_src,
>                             rq->rq_src_seqno);
>               } else if (newtrace_) {
> 
>                   sprintf(pt_->buffer() + offset,
>                       "-P aodv -Pt 0x%x -Ph %d -Pb %d -Pd %d -Pds %d -Ps %d 
> -Pss %d -Pc
> REQUEST ",
>                       rq->rq_type,
>                         rq->rq_hop_count,
>                         rq->rq_bcast_id,
>                         rq->rq_dst,
>                         rq->rq_dst_seqno,
>                         rq->rq_src,
>                         rq->rq_src_seqno);
> 
> 
>               } else {
> 
>                   sprintf(pt_->buffer() + offset,
>                       "[0x%x %d %d [%d %d] [%d %d]] (REQUEST)",
>                       rq->rq_type,
>                         rq->rq_hop_count,
>                         rq->rq_bcast_id,
>                         rq->rq_dst,
>                         rq->rq_dst_seqno,
>                         rq->rq_src,
>                         rq->rq_src_seqno);
>               }
>                 break;
> 
>         case AODVTYPE_RREP:
>         case AODVTYPE_HELLO:
>       case AODVTYPE_RERR:
> 
>         /*** added for prediction for unicast ***/
>         case AODVTYPE_LPW:
>         case AODVTYPE_RPE:
>         /****************************************/
>               
>               if (pt_->tagged()) {
>                   sprintf(pt_->buffer() + offset,
>                           "-aodv:t %x -aodv:h %d -aodv:d %d -adov:ds %d "
>                           "-aodv:l %f -aodv:c %s ",
>                           rp->rp_type,
>                           rp->rp_hop_count,
>                           rp->rp_dst,
>                           rp->rp_dst_seqno,
>                           rp->rp_lifetime,
>                         /*** modified for prediction for unicast ***/
>                         rp->rp_type == AODVTYPE_RREP ? "REPLY" :
>                         (rp->rp_type == AODVTYPE_RERR ? "ERROR" :
>                         (rp->rp_type == AODVTYPE_HELLO ? "HELLO" :
>                         (rp->rp_type == AODVTYPE_LPW ? "LINK PREDICTION
> WARNING" :
>                         "ROUTE PREDICTION ERROR"))));
>                           //rp->rp_type == AODVTYPE_RREP ? "REPLY" :
>                           //(rp->rp_type == AODVTYPE_RERR ? "ERROR" :
>                            //"HELLO"));
>                         /**********************************************/
> 
>               } else if (newtrace_) {
>                       
>                       sprintf(pt_->buffer() + offset,
>                           "-P aodv -Pt 0x%x -Ph %d -Pd %d -Pds %d -Pl %f -Pc 
> %s ",
>                               rp->rp_type,
>                               rp->rp_hop_count,
>                               rp->rp_dst,
>                               rp->rp_dst_seqno,
>                               rp->rp_lifetime,
>                         /*** modified for prediction for unicast ***/
>                         rp->rp_type == AODVTYPE_RREP ? "REPLY" :
>                         (rp->rp_type == AODVTYPE_RERR ? "ERROR" :
>                         (rp->rp_type == AODVTYPE_HELLO ? "HELLO" :
>                         (rp->rp_type == AODVTYPE_LPW ? "LINK PREDICTION
> WARNING" :
>                         "ROUTE PREDICTION ERROR"))));
>                             //rp->rp_type == AODVTYPE_RREP ? "REPLY" :
>                             //(rp->rp_type == AODVTYPE_RERR ? "ERROR" :
>                              //"HELLO"));
>                         /**********************************************/
> 
>               } else {
>                       
>                       sprintf(pt_->buffer() + offset,
>                               "[0x%x %d [%d %d] %f] (%s)",
>                               rp->rp_type,
>                               rp->rp_hop_count,
>                               rp->rp_dst,
>                               rp->rp_dst_seqno,
>                               rp->rp_lifetime,
>                         /*** modified for prediction for unicast ***/
>                         rp->rp_type == AODVTYPE_RREP ? "REPLY" :
>                         (rp->rp_type == AODVTYPE_RERR ? "ERROR" :
>                         (rp->rp_type == AODVTYPE_HELLO ? "HELLO" :
>                         (rp->rp_type == AODVTYPE_LPW ? "LINK PREDICTION
> WARNING" :
>                         "ROUTE PREDICTION ERROR"))));
>                             //rp->rp_type == AODVTYPE_RREP ? "REPLY" :
>                             //(rp->rp_type == AODVTYPE_RERR ? "ERROR" :
>                              //"HELLO"));
>                         /**********************************************/
>               }
>                 break;
> 
>         /*** added for multicast ***/
>         case AODVTYPE_GRPH:
>             sprintf(pt_->buffer() + offset,
>                 "[0x%x 0x%x %d %d [%d %d]] (GROUP HELLO)",
>                 gh->gh_type, gh->gh_flags, gh->gh_hop_count,
> gh->gh_grp_leader_addr,
>                 gh->gh_multi_grp_addr, gh->gh_grp_seqno);
>             break;
> 
>         case AODVTYPE_MACT:
>             sprintf(pt_->buffer() + offset,
>                 "[0x%x 0x%x %d %d [%d %d] %d] (MACT)",
>                 mact->mact_type, mact->mact_flags, mact->mact_hop_count,
> mact->mact_grp_dst,
>                 mact->mact_src,
> mact->mact_src_seqno,mact->mact_joined_node);
>             break;
> 
>         case AODVTYPE_WARN:
>             sprintf(pt_->buffer() + offset,
>                 "[0x%x 0x%x %f %d(WARN)",
>                 warn->wn_type, warn->wn_flags, warn->wn_expire,
> warn->wn_grp);
>             break;
> //done by
> me//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
> 
>       case AODVTYPE_CHECKLOOP:
>           sprintf(pt_->buffer() + offset,
>               "[%d %d %d]
> (CHECKLOOP)",cl->cl_reply_node,cl->cl_joined_node,cl->cl_grp_addr);
>           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();
>         }
> }
> 
> void
> CMUTrace::nam_format(Packet *p, int offset)
> {
>       Node* srcnode = 0 ;
>       Node* dstnode = 0 ;
>       Node* nextnode = 0 ;
>         struct hdr_cmn *ch = HDR_CMN(p);
>       struct hdr_ip *ih = HDR_IP(p);
>       char op = (char) type_;
>       char colors[32];
>       int next_hop = -1 ;
> 
>         int dst = Address::instance().get_nodeaddr(ih->daddr());
> 
>       nextnode = Node::get_node_by_address(ch->next_hop_);
>         if (nextnode) next_hop = nextnode->nodeid(); 
> 
>       srcnode = Node::get_node_by_address(src_);
>       dstnode = Node::get_node_by_address(ch->next_hop_);
> 
>       double distance = 0;
> 
>         if ((srcnode) && (dstnode)) {
>          MobileNode* tmnode = (MobileNode*)srcnode;
>          MobileNode* rmnode = (MobileNode*)dstnode;
> 
>          distance = tmnode->propdelay(rmnode) * 300000000 ;
>       }
> 
>       double energy = -1;
>       double initenergy = -1;
> 
>       //default value for changing node color with respect to energy depletion
>       double l1 = 0.5; 
>       double l2 = 0.2;
>       
>       if (srcnode) {
>           if (srcnode->energy_model()) {
>                   energy = srcnode->energy_model()->energy();
>                   initenergy = srcnode->energy_model()->initialenergy();
>                   l1 = srcnode->energy_model()->level1();
>                   l2 = srcnode->energy_model()->level2();
>           }
>       }
> 
>         int energyLevel = 0 ;
>         double energyLeft = (double)(energy/initenergy) ;
> 
>         if ((energyLeft <= 1 ) && (energyLeft >= l1 )) energyLevel = 3;       
>         if ((energyLeft >= l2 ) && (energyLeft < l1 )) energyLevel = 2;       
>         if ((energyLeft > 0 ) && (energyLeft < l2 )) energyLevel = 1; 
> 
>       if (energyLevel == 0) 
>               strcpy(colors,"-c black -o red");
>         else if (energyLevel == 1) 
>               strcpy(colors,"-c red -o yellow");
>         else if (energyLevel == 2) 
>               strcpy(colors,"-c yellow -o green");
>         else if (energyLevel == 3) 
>               strcpy(colors,"-c green -o black");
> 
>       // A simple hack for scadds demo (fernandez's visit) -- Chalermek
>       int pkt_color = 0;
>       if (ch->ptype()==PT_DIFF) {
>               hdr_cdiff *dfh= HDR_CDIFF(p);
>               if (dfh->mess_type != DATA) {
>                       pkt_color = 1;
>               }
>       }
>       // convert to nam format 
>       if (op == 's') op = 'h' ;
>       if (op == 'D') op = 'd' ;
>       if (op == 'h') {
>          sprintf(pt_->nbuffer(),
>               "+ -t %.9f -s %d -d %d -p %s -e %d -c 2 -a %d -i %d -k %3s ",
>               Scheduler::instance().clock(),
>               src_,                           // this node
>               next_hop,
>               packet_info.name(ch->ptype()),
>               ch->size(),
>               pkt_color,   
>               ch->uid(),
>               tracename);
> 
>          offset = strlen(pt_->nbuffer());
>          pt_->namdump();
>          sprintf(pt_->nbuffer() ,
>               "- -t %.9f -s %d -d %d -p %s -e %d -c 2 -a %d -i %d -k %3s",
>               Scheduler::instance().clock(),
>               src_,                           // this node
>               next_hop,
>               packet_info.name(ch->ptype()),
>               ch->size(),
>               pkt_color,
>               ch->uid(),
>               tracename);
> 
>          offset = strlen(pt_->nbuffer());
>            pt_->namdump();
>       }
> 
>         // if nodes are too far from each other
>       // nam won't dump SEND event 'cuz it's
>       // gonna be dropped later anyway
>       // this value 250 is pre-calculated by using 
>       // two-ray ground refelction model with fixed
>       // transmission power 3.652e-10
> //    if ((type_ == SEND)  && (distance > 250 )) return ;
> 
>       if(tracetype == TR_ROUTER && type_ == RECV && dst != -1 ) return ;
>       if(type_ == RECV && dst == -1 )dst = src_ ; //broadcasting event
> 
>         if (energy != -1) { //energy model being turned on
>          if (nodeColor[src_] != energyLevel ) { //only dump it when node  
>              sprintf(pt_->nbuffer() ,                    //color change
>                 "n -t %.9f -s %d -S COLOR %s",
>                  Scheduler::instance().clock(),
>                  src_,                           // this node
>                  colors);
>                offset = strlen(pt_->nbuffer());
>                pt_->namdump();
>              nodeColor[src_] = energyLevel ;
>           }   
>         }
> 
> 
>       // don't generate an "r" event for a broadcast packet
>       // as it was already generated when the "h" event was written
>       if (next_hop == -1 && op == 'r')
>               return;
>       
>       sprintf(pt_->nbuffer(),
>               "%c -t %.9f -s %d -d %d -p %s -e %d -c 2 -a %d -i %d -k %3s",
>               op,
>               Scheduler::instance().clock(),
>               src_,                           // this node
>               next_hop,
>               packet_info.name(ch->ptype()),
>               ch->size(),
>               pkt_color,
>               ch->uid(),
>               tracename);
> 
>       if (next_hop == -1 && op == 'h') {
>               // print extra fields for broadcast packets
> 
>               // bradius is calculated assuming 2-ray ground reflectlon
>               // model using default settings of Phy/WirelessPhy and
>               // Antenna/OmniAntenna
>               if (bradius == 0.0) calculate_broadcast_parameters();
> 
>               double radius = bradius*radius_scaling_factor_; 
> 
>               // duration is calculated based on the radius and
>               // the speed of light (299792458 m/s)
>               double duration = 
> (bradius/299792458.0)*duration_scaling_factor_;
> 
> 
>               sprintf(pt_->nbuffer() + strlen(pt_->nbuffer()),
>                       " -R %.2f -D %.2f",
>                       radius,
>                       duration);
> 
>               // schedule "r" event
>               Tcl& tcl = Tcl::instance();
>               tcl.evalf("[Simulator instance] at %f {[Simulator instance]
> puts-nam-traceall {r -t %.9f -s %d -d %d -p %s -e %d -c 2 -a %d -i %d -k
> %3s -R %.2f -D %.2f}}",
>                       Scheduler::instance().clock() + duration,
>                       Scheduler::instance().clock() + duration,
>                       src_,
>                       next_hop,
>                       packet_info.name(ch->ptype()),
>                       ch->size(),
>                       pkt_color,
>                       ch->uid(),
>                       tracename,
>                       radius,
>                       duration);
>       }
> 
>       offset = strlen(pt_->nbuffer());
>       pt_->namdump();
> }
> 
> void CMUTrace::format(Packet* p, const char *why)
> {
>       hdr_cmn *ch = HDR_CMN(p);
>       int offset = 0;
> 
>       /*
>        * Log the MAC Header
>        */
>       format_mac(p, why, offset);
> 
>       if (pt_->namchannel()) 
>               nam_format(p, offset);
>       offset = strlen(pt_->buffer());
>       switch(ch->ptype()) {
>       case PT_MAC:
>               break;
>       case PT_ARP:
>               format_arp(p, offset);
>               break;
>       default:
>               format_ip(p, offset);
>               offset = strlen(pt_->buffer());
>               switch(ch->ptype()) {
>               case PT_AODV:
>                       format_aodv(p, offset);
>                       break;
>               case PT_TORA:
>                         format_tora(p, offset);
>                         break;
>                 case PT_IMEP:
>                         format_imep(p, offset);
>                         break;
>               case PT_DSR:
>                       format_dsr(p, offset);
>                       break;
>               case PT_MESSAGE:
>               case PT_UDP:
>                       format_msg(p, offset);
>                       break;
>               case PT_TCP:
>               case PT_ACK:
>                       format_tcp(p, offset);
>                       break;
>               case PT_CBR:
>                       format_rtp(p, offset);
>                       break;
>               case PT_DIFF:
>                       break;
>               case PT_GAF:
>               case PT_PING:
>                       break;
>               default:
>                       fprintf(stderr, "%s - invalid packet type (%s).\n",
>                               __PRETTY_FUNCTION__, 
> packet_info.name(ch->ptype()));
>                       exit(1);
>               }
>       }
> }
> 
> int
> CMUTrace::command(int argc, const char*const* argv)
> {
>       
>         if(argc == 3) {
>                 if(strcmp(argv[1], "node") == 0) {
>                         node_ = (MobileNode*) TclObject::lookup(argv[2]);
>                         if(node_ == 0)
>                                 return TCL_ERROR;
>                         return TCL_OK;
>                 }
>               if (strcmp(argv[1], "newtrace") == 0) {
>                       newtrace_ = atoi(argv[2]);
>                       return TCL_OK;
>               }
>         }
>       return Trace::command(argc, argv);
> }
> 
> /*ARGSUSED*/
> void
> CMUTrace::recv(Packet *p, Handler *h)
> {
>       if (!node_energy()) {
>               Packet::free(p);
>               return;
>       }
>         assert(initialized());
>         /*
>          * Agent Trace "stamp" the packet with the optimal route on
>          * sending.
>          */
>         if (tracetype == TR_AGENT && type_ == SEND) {
>                 God::instance()->stampPacket(p);
>         }
> #if 0
>         /*
>          * When the originator of a packet drops the packet, it may or may
>          * not have been stamped by GOD.  Stamp it before logging the
>          * information.
>          */
>         if(src_ == src && type_ == DROP) {
>                 God::instance()->stampPacket(p);
>         }
> #endif
>       format(p, "---");
>       pt_->dump();
>       //namdump();
>       if(target_ == 0)
>               Packet::free(p);
>       else
>               send(p, h);
> }
> 
> void
> CMUTrace::recv(Packet *p, const char* why)
> {
>         assert(initialized() && type_ == DROP);
>       if (!node_energy()) {
>               Packet::free(p);
>               return;
>       }
> #if 0
>         /*
>          * When the originator of a packet drops the packet, it may or may
>          * not have been stamped by GOD.  Stamp it before logging the
>          * information.
>          */
>         if(src_ == ih->saddr()) {
>                 God::instance()->stampPacket(p);
>         }
> #endif
>       format(p, why);
>       pt_->dump();
>       //namdump();
>       Packet::free(p);
> }
> 
> int CMUTrace::node_energy()
> {
>       Node* thisnode = Node::get_node_by_address(src_);
>       double energy = 1;
>       if (thisnode) {
>               if (thisnode->energy_model()) {
>                       energy = thisnode->energy_model()->energy();
>               }
>       } 
>       if (energy > 0) return 1;
>       return 0;
> }
> 
> void CMUTrace::calculate_broadcast_parameters() {
>       // Calculate the maximum distance at which a packet can be received
>       // based on the two-ray reflection model using the current default
>       // values for Phy/WirelessPhy and Antenna/OmniAntenna.
> 
>       double P_t, P_r, G_t, G_r, h, L;
>       Tcl& tcl = Tcl::instance();
> 
>       tcl.evalc("Phy/WirelessPhy set Pt_");
>       P_t = atof(tcl.result());
>       tcl.evalc("Phy/WirelessPhy set RXThresh_");
>       P_r = atof(tcl.result());
>       tcl.evalc("Phy/WirelessPhy set L_");
>       L = atof(tcl.result());
>       tcl.evalc("Antenna/OmniAntenna set Gt_");
>       G_t = atof(tcl.result());
>       tcl.evalc("Antenna/OmniAntenna set Gr_");
>       G_r = atof(tcl.result());
>       tcl.evalc("Antenna/OmniAntenna set Z_");
>       h = atof(tcl.result());
>       bradius = pow(P_t*G_r*G_t*pow(h,4.0)/(P_r*L), 0.25);
> 
>       // Also get the scaling factors
>       tcl.evalc("CMUTrace set radius_scaling_factor_");
>       radius_scaling_factor_ = atof(tcl.result());
>       tcl.evalc("CMUTrace set duration_scaling_factor_");
>       duration_scaling_factor_ = atof(tcl.result());
> }
> 
> 
> 
> 
> 

-- 
View this message in context: 
http://www.nabble.com/please-help-me-%2C-i-m-getting-error-when-i-introduce-new-packet%2C-have-tried-all-possibilities-tf3552305.html#a10874793
Sent from the ns-users mailing list archive at Nabble.com.

Reply via email to