cmu-trace.cc
上传用户:sdhqmy
上传日期:2015-12-07
资源大小:63k
文件大小:25k
源码类别:

3G开发

开发平台:

C/C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  2. /*
  3.  * Copyright (c) 1997 Regents of the University of California.
  4.  * All rights reserved.
  5.  *
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  * 1. Redistributions of source code must retain the above copyright
  10.  *    notice, this list of conditions and the following disclaimer.
  11.  * 2. Redistributions in binary form must reproduce the above copyright
  12.  *    notice, this list of conditions and the following disclaimer in the
  13.  *    documentation and/or other materials provided with the distribution.
  14.  * 3. All advertising materials mentioning features or use of this software
  15.  *    must display the following acknowledgement:
  16.  * This product includes software developed by the Computer Systems
  17.  * Engineering Group at Lawrence Berkeley Laboratory.
  18.  * 4. Neither the name of the University nor of the Laboratory may be used
  19.  *    to endorse or promote products derived from this software without
  20.  *    specific prior written permission.
  21.  *
  22.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  23.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  24.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  25.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  26.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  27.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  28.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  29.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  30.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  31.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  32.  * SUCH DAMAGE.
  33.  *
  34.  * Ported from CMU/Monarch's code, appropriate copyright applies.
  35.  * nov'98 -Padma.
  36.  *
  37.  * $Header: /nfs/jade/vint/CVSROOT/ns-2/trace/cmu-trace.cc,v 1.66 2002/04/01 23:07:28 buchheim Exp $
  38.  */
  39. #include <packet.h>
  40. #include <ip.h>
  41. #include <tcp.h>
  42. #include <rtp.h>
  43. #include <arp.h>
  44. #include <dsr/hdr_sr.h> // DSR
  45. #include <mac.h>
  46. #include <mac-802_11.h>
  47. #include <address.h>
  48. #include <tora/tora_packet.h> //TORA
  49. #include <imep/imep_spec.h>         // IMEP
  50. #include <aodv/aodv_packet.h> //AODV
  51. #include <cmu-trace.h>
  52. #include <mobilenode.h>
  53. #include "diffusion/diff_header.h" // DIFFUSION -- Chalermek
  54. //#define LOG_POSITION
  55. //extern char* pt_names[];
  56. static class CMUTraceClass : public TclClass {
  57. public:
  58. CMUTraceClass() : TclClass("CMUTrace") { }
  59. TclObject* create(int, const char*const* argv) {
  60. return (new CMUTrace(argv[4], *argv[5]));
  61. }
  62. } cmutrace_class;
  63. CMUTrace::CMUTrace(const char *s, char t) : Trace(t)
  64. {
  65. bzero(tracename, sizeof(tracename));
  66. strncpy(tracename, s, MAX_ID_LEN);
  67.         if(strcmp(tracename, "RTR") == 0) {
  68.                 tracetype = TR_ROUTER;
  69.         }
  70. else if(strcmp(tracename, "TRP") == 0) {
  71.                 tracetype = TR_ROUTER;
  72.         }
  73.         else if(strcmp(tracename, "MAC") == 0) {
  74.                 tracetype = TR_MAC;
  75.         }
  76.         else if(strcmp(tracename, "IFQ") == 0) {
  77.                 tracetype = TR_IFQ;
  78.         }
  79.         else if(strcmp(tracename, "AGT") == 0) {
  80.                 tracetype = TR_AGENT;
  81.         }
  82.         else {
  83.                 fprintf(stderr, "CMU Trace Initialized with invalid typen");
  84.                 exit(1);
  85.         }
  86. assert(type_ == DROP || type_ == SEND || type_ == RECV);
  87. newtrace_ = 0;
  88. for (int i=0 ; i < MAX_NODE ; i++) 
  89. nodeColor[i] = 3 ;
  90.         node_ = 0;
  91. }
  92. void
  93. CMUTrace::format_mac(Packet *p, const char *why, int offset)
  94. {
  95. struct hdr_cmn *ch = HDR_CMN(p);
  96. struct hdr_ip *ih = HDR_IP(p);
  97. struct hdr_mac802_11 *mh = HDR_MAC802_11(p);
  98. double x = 0.0, y = 0.0, z = 0.0;
  99.        
  100. char op = (char) type_;
  101. Node* thisnode = Node::get_node_by_address(src_);
  102. double energy = -1;
  103. if (thisnode) {
  104.     if (thisnode->energy_model()) {
  105.     energy = thisnode->energy_model()->energy();
  106.     }
  107. }
  108. // hack the IP address to convert pkt format to hostid format
  109. // for now until port ids are removed from IP address. -Padma.
  110. int src = Address::instance().get_nodeaddr(ih->saddr());
  111. if(tracetype == TR_ROUTER && type_ == SEND) {
  112. if(src_ != src)
  113. op = FWRD;
  114. }
  115. // use new tagged format if appropriate
  116. if (pt_->tagged()) {
  117. int next_hop = -1 ;
  118. Node* nextnode = Node::get_node_by_address(ch->next_hop_);
  119.          if (nextnode) next_hop = nextnode->nodeid(); 
  120. if (op == DROP) op = 'd';
  121. if (op == SEND) op = '+';
  122. if (op == FWRD) op = 'h';
  123. sprintf(pt_->buffer() + offset,
  124. "%c "TIME_FORMAT" -s %d -d %d -p %s -k %3s -i %d",
  125. op,
  126. Scheduler::instance().clock(),
  127. src_,
  128. next_hop,
  129. packet_info.name(ch->ptype()),
  130. tracename,
  131. ch->uid());
  132. return;
  133. }
  134. // Use new ns trace format to replace the old cmu trace format)
  135. if (newtrace_) {
  136.     
  137.     node_->getLoc(&x, &y, &z);
  138.     // consistence
  139.     if ( op == DROP ) { op = 'd';}
  140.         // basic trace infomation + basic exenstion
  141.     sprintf(pt_->buffer() + offset,
  142.    "%c -t %.9f -Hs %d -Hd %d -Ni %d -Nx %.2f -Ny %.2f -Nz %.2f -Ne %f -Nl %3s -Nw %s ",
  143.     op,                       // event type
  144.     Scheduler::instance().clock(),  // time
  145.     src_,                           // this node
  146.                     ch->next_hop_,                  // next hop
  147.     src_,                           // this node
  148.     x,                              // x coordinate
  149.     y,                              // y coordinate
  150.     z,                              // z coordinate
  151.     energy,                         // energy, -1 = not existing
  152.     tracename,                      // trace level
  153.                     why);                            // reason
  154.     // mac layer extension
  155.     offset = strlen(pt_->buffer());
  156.     sprintf(pt_->buffer() + offset, 
  157.     "-Ma %x -Md %x -Ms %x -Mt %x ",
  158.     mh->dh_duration,
  159.     ETHER_ADDR(mh->dh_da),
  160.     ETHER_ADDR(mh->dh_sa),
  161.     GET_ETHER_TYPE(mh->dh_body));
  162.     
  163.      return;
  164. }
  165. #ifdef LOG_POSITION
  166.         double x = 0.0, y = 0.0, z = 0.0;
  167.         node_->getLoc(&x, &y, &z);
  168. #endif
  169. sprintf(pt_->buffer() + offset,
  170. #ifdef LOG_POSITION
  171. "%c %.9f %d (%6.2f %6.2f) %3s %4s %d %s %d [%x %x %x %x] ",
  172. #else
  173. "%c %.9f _%d_ %3s %4s %d %s %d [%x %x %x %x] ",
  174. #endif
  175. op,
  176. Scheduler::instance().clock(),
  177.                 src_,                           // this node
  178. #ifdef LOG_POSITION
  179.                 x,
  180.                 y,
  181. #endif
  182. tracename,
  183. why,
  184.                 //ch->uid(),                      // identifier for this event
  185. //JUNGMIN : add channel info
  186. mh->dh_fc.fc_channel, //channel info
  187. ((ch->ptype() == PT_MAC) ? (
  188.   (mh->dh_fc.fc_subtype == MAC_Subtype_RTS) ? "RTS"  :
  189.   (mh->dh_fc.fc_subtype == MAC_Subtype_CTS) ? "CTS"  :
  190.   (mh->dh_fc.fc_subtype == MAC_Subtype_ACK) ? "ACK"  :
  191.   (mh->dh_fc.fc_subtype == MAC_Subtype_DRTS) ? "DRTS"  :
  192.   (mh->dh_fc.fc_subtype == MAC_Subtype_DCTS) ? "DCTS"  :
  193.   (mh->dh_fc.fc_subtype == MAC_Subtype_DRSH) ? "DRSH"  :
  194.   (mh->dh_fc.fc_subtype == MAC_Subtype_Beacon) ? "BCON" :
  195.   (mh->dh_fc.fc_subtype == MAC_Subtype_ATIM) ? "ATIM" :
  196.   (mh->dh_fc.fc_subtype == MAC_Subtype_ATIMACK) ? "AACK" :
  197.   (mh->dh_fc.fc_subtype == MAC_Subtype_ATIMRSH) ? "ARSH" :
  198.   "UNKN"
  199.   ) : packet_info.name(ch->ptype())),
  200. //end of JUNGMIN
  201. ch->size(),
  202. //*((u_int16_t*) &mh->dh_fc),
  203. mh->dh_duration,
  204. ETHER_ADDR(mh->dh_da),
  205. ETHER_ADDR(mh->dh_sa),
  206. GET_ETHER_TYPE(mh->dh_body));
  207. offset = strlen(pt_->buffer());
  208. if (thisnode) {
  209. if (thisnode->energy_model()) {
  210. sprintf(pt_->buffer() + offset,
  211. "[energy %f] ",
  212. thisnode->energy_model()->energy());
  213. }
  214.         }
  215. }
  216. void
  217. CMUTrace::format_ip(Packet *p, int offset)
  218. {
  219.         struct hdr_cmn *ch = HDR_CMN(p);
  220. struct hdr_ip *ih = HDR_IP(p);
  221. // hack the IP address to convert pkt format to hostid format
  222. // for now until port ids are removed from IP address. -Padma.
  223. int src = Address::instance().get_nodeaddr(ih->saddr());
  224. int dst = Address::instance().get_nodeaddr(ih->daddr());
  225. if (pt_->tagged()) {
  226. // Need to determine tag names for this data
  227. //sprintf(pt_->buffer() + offset,
  228. // "",
  229. // );
  230. } else if (newtrace_) {
  231.     sprintf(pt_->buffer() + offset,
  232.     "-Is %d.%d -Id %d.%d -It %s -Il %d -If %d -Ii %d -Iv %d ",
  233.     src,                           // packet src
  234.     ih->sport(),                   // src port
  235.     dst,                           // packet dest
  236.     ih->dport(),                   // dst port
  237.     packet_info.name(ch->ptype()),  // packet type
  238.     ch->size(),                     // packet size
  239.     ih->flowid(),                   // flow id
  240.     ch->uid(),                      // unique id
  241.     ih->ttl_);                      // ttl
  242. } else {
  243.     sprintf(pt_->buffer() + offset, "------- [%d:%d %d:%d %d %d] ",
  244. src, ih->sport(),
  245. dst, ih->dport(),
  246. ih->ttl_, (ch->next_hop_ < 0) ? 0 : ch->next_hop_);
  247. }
  248. }
  249. void
  250. CMUTrace::format_arp(Packet *p, int offset)
  251. {
  252. struct hdr_arp *ah = HDR_ARP(p);
  253. if (pt_->tagged()) {
  254. // Need to determine tag names for this data
  255. //sprintf(pt_->buffer() + offset,
  256. // "",
  257. // );
  258. } else if (newtrace_) {
  259.     sprintf(pt_->buffer() + offset,
  260.     "-P arp -Po %s -Pms %d -Ps %d -Pmd %d -Pd %d ",
  261.     ah->arp_op == ARPOP_REQUEST ?  "REQUEST" : "REPLY",
  262.     ah->arp_sha,
  263.     ah->arp_spa,
  264.     ah->arp_tha,
  265.     ah->arp_tpa);
  266. } else {
  267.     sprintf(pt_->buffer() + offset,
  268. "------- [%s %d/%d %d/%d]",
  269. ah->arp_op == ARPOP_REQUEST ?  "REQUEST" : "REPLY",
  270. ah->arp_sha,
  271. ah->arp_spa,
  272. ah->arp_tha,
  273. ah->arp_tpa);
  274. }
  275. }
  276. void
  277. CMUTrace::format_dsr(Packet *p, int offset)
  278. {
  279. hdr_sr *srh = hdr_sr::access(p);
  280. if (pt_->tagged()) {
  281. // Need to determine tag names for this data
  282. //sprintf(pt_->buffer() + offset,
  283. // "",
  284. // );
  285. } else if (newtrace_) {
  286.     sprintf(pt_->buffer() + offset, 
  287. "-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 ",
  288.     srh->num_addrs(),                   // how many nodes travered
  289. srh->route_request(),
  290. srh->rtreq_seq(),
  291. srh->route_reply(),
  292. srh->rtreq_seq(),
  293. srh->route_reply_len(),
  294. // the dest of the src route
  295. srh->reply_addrs()[0].addr,
  296. srh->reply_addrs()[srh->route_reply_len()-1].addr,
  297. srh->route_error(),
  298. srh->num_route_errors(),
  299. srh->down_links()[srh->num_route_errors() - 1].tell_addr,
  300. srh->down_links()[srh->num_route_errors() - 1].from_addr,
  301. srh->down_links()[srh->num_route_errors() - 1].to_addr);
  302.    return;
  303. }
  304. sprintf(pt_->buffer() + offset, 
  305. "%d [%d %d] [%d %d %d %d->%d] [%d %d %d %d->%d]",
  306. srh->num_addrs(),
  307. srh->route_request(),
  308. srh->rtreq_seq(),
  309. srh->route_reply(),
  310. srh->rtreq_seq(),
  311. srh->route_reply_len(),
  312. // the dest of the src route
  313. srh->reply_addrs()[0].addr,
  314. srh->reply_addrs()[srh->route_reply_len()-1].addr,
  315. srh->route_error(),
  316. srh->num_route_errors(),
  317. srh->down_links()[srh->num_route_errors() - 1].tell_addr,
  318. srh->down_links()[srh->num_route_errors() - 1].from_addr,
  319. srh->down_links()[srh->num_route_errors() - 1].to_addr);
  320. }
  321. void
  322. CMUTrace::format_msg(Packet *, int)
  323. {
  324. }
  325. void
  326. CMUTrace::format_tcp(Packet *p, int offset)
  327. {
  328. struct hdr_cmn *ch = HDR_CMN(p);
  329. struct hdr_tcp *th = HDR_TCP(p);
  330. if (pt_->tagged()) {
  331. // Need to determine tag names for this data
  332. //sprintf(pt_->buffer() + offset,
  333. // "",
  334. // );
  335. } else if (newtrace_) {
  336.     sprintf(pt_->buffer() + offset,
  337. "-Pn tcp -Ps %d -Pa %d -Pf %d -Po %d ",
  338. th->seqno_,
  339. th->ackno_,
  340. ch->num_forwards(),
  341. ch->opt_num_forwards());
  342. } else {
  343.     sprintf(pt_->buffer() + offset,
  344. "[%d %d] %d %d",
  345. th->seqno_,
  346. th->ackno_,
  347. ch->num_forwards(),
  348. ch->opt_num_forwards());
  349. }
  350. }
  351. void
  352. CMUTrace::format_rtp(Packet *p, int offset)
  353. {
  354. struct hdr_cmn *ch = HDR_CMN(p);
  355. struct hdr_rtp *rh = HDR_RTP(p);
  356. struct hdr_ip *ih = HDR_IP(p);
  357.         Node* thisnode = Node::get_node_by_address(src_);
  358. //hacking, needs to change later, 
  359.         int dst = Address::instance().get_nodeaddr(ih->daddr());
  360. if (dst == src_){
  361. // I just received a cbr data packet
  362. if (thisnode->energy_model() && 
  363.     thisnode->energy_model()->powersavingflag()) {
  364. thisnode->energy_model()->set_node_state(EnergyModel::INROUTE);
  365. }
  366.         }
  367. if (pt_->tagged()) {
  368. // Need to determine tag names for this data
  369. //sprintf(pt_->buffer() + offset,
  370. // "",
  371. // );
  372. } else if (newtrace_) {
  373. sprintf(pt_->buffer() + offset,
  374. "-Pn cbr -Pi %d -Pf %d -Po %d ",
  375. rh->seqno_,
  376. ch->num_forwards(),
  377. ch->opt_num_forwards());
  378. } else {
  379. sprintf(pt_->buffer() + offset,
  380. "[%d] %d %d",
  381. rh->seqno_,
  382. ch->num_forwards(),
  383. ch->opt_num_forwards());
  384. }
  385. }
  386. void
  387. CMUTrace::format_imep(Packet *p, int offset)
  388. {
  389.         struct hdr_imep *im = HDR_IMEP(p);
  390. #define U_INT16_T(x)    *((u_int16_t*) &(x))
  391. if (pt_->tagged()) {
  392. // Need to determine tag names for this data
  393. //sprintf(pt_->buffer() + offset,
  394. // "",
  395. // );
  396. } else if (newtrace_) {
  397.     sprintf(pt_->buffer() + offset,
  398.                 "-P imep -Pa %c -Ph %c -Po %c -Pl 0x%04x ] ",
  399.                 (im->imep_block_flags & BLOCK_FLAG_ACK) ? 'A' : '-',
  400.                 (im->imep_block_flags & BLOCK_FLAG_HELLO) ? 'H' : '-',
  401.                 (im->imep_block_flags & BLOCK_FLAG_OBJECT) ? 'O' : '-',
  402.                 U_INT16_T(im->imep_length));
  403. } else {
  404.             sprintf(pt_->buffer() + offset,
  405.                 "[%c %c %c 0x%04x] ",
  406.                 (im->imep_block_flags & BLOCK_FLAG_ACK) ? 'A' : '-',
  407.                 (im->imep_block_flags & BLOCK_FLAG_HELLO) ? 'H' : '-',
  408.                 (im->imep_block_flags & BLOCK_FLAG_OBJECT) ? 'O' : '-',
  409.                 U_INT16_T(im->imep_length));
  410. }
  411. #undef U_INT16_T
  412. }
  413. void
  414. CMUTrace::format_tora(Packet *p, int offset)
  415. {
  416.         struct hdr_tora *th = HDR_TORA(p);
  417.         struct hdr_tora_qry *qh = HDR_TORA_QRY(p);
  418.         struct hdr_tora_upd *uh = HDR_TORA_UPD(p);
  419.         struct hdr_tora_clr *ch = HDR_TORA_CLR(p);
  420.         switch(th->th_type) {
  421.         case TORATYPE_QRY:
  422. if (pt_->tagged()) {
  423. // Need to determine tag names for this data
  424. //sprintf(pt_->buffer() + offset,
  425. // "",
  426. // );
  427. } else if (newtrace_) {
  428.     sprintf(pt_->buffer() + offset,
  429. "-P tora -Pt 0x%x -Pd %d -Pc QUERY ",
  430.                         qh->tq_type, qh->tq_dst);
  431.                 } else {
  432.                     sprintf(pt_->buffer() + offset, "[0x%x %d] (QUERY)",
  433.                         qh->tq_type, qh->tq_dst);
  434. }
  435.                 break;
  436.         case TORATYPE_UPD:
  437. if (pt_->tagged()) {
  438. // Need to determine tag names for this data
  439. //sprintf(pt_->buffer() + offset,
  440. // "",
  441. // );
  442. } else if (newtrace_) {
  443.     sprintf(pt_->buffer() + offset,
  444.                         "-P tora -Pt 0x%x -Pd %d (%f %d %d %d %d) -Pc UPDATE ",
  445.                         uh->tu_type,
  446.                         uh->tu_dst,
  447.                         uh->tu_tau,
  448.                         uh->tu_oid,
  449.                         uh->tu_r,
  450.                         uh->tu_delta,
  451.                         uh->tu_id);
  452. } else {
  453.                     sprintf(pt_->buffer() + offset,
  454.                         "-Pt 0x%x -Pd %d -Pa %f -Po %d -Pr %d -Pe %d -Pi %d -Pc UPDATE ",
  455.                         uh->tu_type,
  456.                         uh->tu_dst,
  457.                         uh->tu_tau,
  458.                         uh->tu_oid,
  459.                         uh->tu_r,
  460.                         uh->tu_delta,
  461.                         uh->tu_id);
  462. }
  463.                 break;
  464.         case TORATYPE_CLR:
  465. if (pt_->tagged()) {
  466. // Need to determine tag names for this data
  467. //sprintf(pt_->buffer() + offset,
  468. // "",
  469. // );
  470. } else if (newtrace_) {
  471.     sprintf(pt_->buffer() + offset, 
  472. "-P tora -Pt 0x%x -Pd %d -Pa %f -Po %d -Pc CLEAR ",
  473.                         ch->tc_type,
  474.                         ch->tc_dst,
  475.                         ch->tc_tau,
  476.                         ch->tc_oid);
  477. } else {
  478.                     sprintf(pt_->buffer() + offset, "[0x%x %d %f %d] (CLEAR)",
  479.                         ch->tc_type,
  480.                         ch->tc_dst,
  481.                         ch->tc_tau,
  482.                         ch->tc_oid);
  483. }
  484.                 break;
  485.         }
  486. }
  487. void
  488. CMUTrace::format_aodv(Packet *p, int offset)
  489. {
  490.         struct hdr_aodv *ah = HDR_AODV(p);
  491.         struct hdr_aodv_request *rq = HDR_AODV_REQUEST(p);
  492.         struct hdr_aodv_reply *rp = HDR_AODV_REPLY(p);
  493.         switch(ah->ah_type) {
  494.         case AODVTYPE_RREQ:
  495. if (pt_->tagged()) {
  496. // Need to determine tag names for this data
  497. //sprintf(pt_->buffer() + offset,
  498. // "",
  499. // );
  500. } else if (newtrace_) {
  501.     sprintf(pt_->buffer() + offset,
  502. "-P aodv -Pt 0x%x -Ph %d -Pb %d -Pd %d -Pds %d -Ps %d -Pss %d -Pc REQUEST ",
  503. rq->rq_type,
  504.                         rq->rq_hop_count,
  505.                         rq->rq_bcast_id,
  506.                         rq->rq_dst,
  507.                         rq->rq_dst_seqno,
  508.                         rq->rq_src,
  509.                         rq->rq_src_seqno);
  510. } else {
  511.     sprintf(pt_->buffer() + offset,
  512. "[0x%x %d %d [%d %d] [%d %d]] (REQUEST)",
  513. rq->rq_type,
  514.                         rq->rq_hop_count,
  515.                         rq->rq_bcast_id,
  516.                         rq->rq_dst,
  517.                         rq->rq_dst_seqno,
  518.                         rq->rq_src,
  519.                         rq->rq_src_seqno);
  520. }
  521.                 break;
  522.         case AODVTYPE_RREP:
  523.         case AODVTYPE_HELLO:
  524. case AODVTYPE_RERR:
  525. if (pt_->tagged()) {
  526. // Need to determine tag names for this data
  527. //sprintf(pt_->buffer() + offset,
  528. // "",
  529. // );
  530. } else if (newtrace_) {
  531. sprintf(pt_->buffer() + offset,
  532.     "-P aodv -Pt 0x%x -Ph %d -Pd %d -Pds %d -Pl %f -Pc %s ",
  533. rp->rp_type,
  534. rp->rp_hop_count,
  535. rp->rp_dst,
  536. rp->rp_dst_seqno,
  537. rp->rp_lifetime,
  538. rp->rp_type == AODVTYPE_RREP ? "REPLY" :
  539. (rp->rp_type == AODVTYPE_RERR ? "ERROR" :
  540.  "HELLO"));
  541.         } else {
  542. sprintf(pt_->buffer() + offset,
  543. "[0x%x %d [%d %d] %f] (%s)",
  544. rp->rp_type,
  545. rp->rp_hop_count,
  546. rp->rp_dst,
  547. rp->rp_dst_seqno,
  548. rp->rp_lifetime,
  549. rp->rp_type == AODVTYPE_RREP ? "REPLY" :
  550. (rp->rp_type == AODVTYPE_RERR ? "ERROR" :
  551.  "HELLO"));
  552. }
  553.                 break;
  554.         default:
  555. #ifdef WIN32
  556.                 fprintf(stderr,
  557.         "CMUTrace::format_aodv: invalid AODV packet typen");
  558. #else
  559. fprintf(stderr,
  560.         "%s: invalid AODV packet typen", __FUNCTION__);
  561. #endif
  562.                 abort();
  563.         }
  564. }
  565. void
  566. CMUTrace::nam_format(Packet *p, int offset)
  567. {
  568. Node* srcnode = 0 ;
  569. Node* dstnode = 0 ;
  570. Node* nextnode = 0 ;
  571.         struct hdr_cmn *ch = HDR_CMN(p);
  572. struct hdr_ip *ih = HDR_IP(p);
  573. char op = (char) type_;
  574. char colors[32];
  575. int next_hop = -1 ;
  576.         int dst = Address::instance().get_nodeaddr(ih->daddr());
  577. nextnode = Node::get_node_by_address(ch->next_hop_);
  578.         if (nextnode) next_hop = nextnode->nodeid(); 
  579. srcnode = Node::get_node_by_address(src_);
  580. dstnode = Node::get_node_by_address(ch->next_hop_);
  581. double distance = 0;
  582.         if ((srcnode) && (dstnode)) {
  583.    MobileNode* tmnode = (MobileNode*)srcnode;
  584.    MobileNode* rmnode = (MobileNode*)dstnode;
  585.    distance = tmnode->propdelay(rmnode) * 300000000 ;
  586. }
  587. double energy = -1;
  588. double initenergy = -1;
  589. //default value for changing node color with respect to energy depletion
  590. double l1 = 0.5; 
  591. double l2 = 0.2;
  592. if (srcnode) {
  593.     if (srcnode->energy_model()) {
  594.     energy = srcnode->energy_model()->energy();
  595.     initenergy = srcnode->energy_model()->initialenergy();
  596.     l1 = srcnode->energy_model()->level1();
  597.     l2 = srcnode->energy_model()->level2();
  598.     }
  599. }
  600.         int energyLevel = 0 ;
  601.         double energyLeft = (double)(energy/initenergy) ;
  602.         if ((energyLeft <= 1 ) && (energyLeft >= l1 )) energyLevel = 3;
  603.         if ((energyLeft >= l2 ) && (energyLeft < l1 )) energyLevel = 2;
  604.         if ((energyLeft > 0 ) && (energyLeft < l2 )) energyLevel = 1;
  605. if (energyLevel == 0) 
  606. strcpy(colors,"-c black -o red");
  607.         else if (energyLevel == 1) 
  608. strcpy(colors,"-c red -o yellow");
  609.         else if (energyLevel == 2) 
  610. strcpy(colors,"-c yellow -o green");
  611.         else if (energyLevel == 3) 
  612. strcpy(colors,"-c green -o black");
  613. // A simple hack for scadds demo (fernandez's visit) -- Chalermek
  614. int pkt_color = 0;
  615. if (ch->ptype()==PT_DIFF) {
  616. hdr_cdiff *dfh= HDR_CDIFF(p);
  617. if (dfh->mess_type != DATA) {
  618. pkt_color = 1;
  619. }
  620. }
  621. // convert to nam format 
  622. if (op == 's') op = 'h' ;
  623. if (op == 'D') op = 'd' ;
  624. if (op == 'h') {
  625.    sprintf(pt_->nbuffer(),
  626. "+ -t %.9f -s %d -d %d -p %s -e %d -c 2 -a %d -i %d -k %3s ",
  627. Scheduler::instance().clock(),
  628. src_,                           // this node
  629. next_hop,
  630. packet_info.name(ch->ptype()),
  631. ch->size(),
  632. pkt_color,   
  633. ch->uid(),
  634. tracename);
  635.    offset = strlen(pt_->nbuffer());
  636.    pt_->namdump();
  637.    sprintf(pt_->nbuffer() ,
  638. "- -t %.9f -s %d -d %d -p %s -e %d -c 2 -a %d -i %d -k %3s",
  639. Scheduler::instance().clock(),
  640. src_,                           // this node
  641. next_hop,
  642. packet_info.name(ch->ptype()),
  643. ch->size(),
  644. pkt_color,
  645. ch->uid(),
  646. tracename);
  647.    offset = strlen(pt_->nbuffer());
  648.            pt_->namdump();
  649. }
  650.         // if nodes are too far from each other
  651. // nam won't dump SEND event 'cuz it's
  652. // gonna be dropped later anyway
  653. // this value 250 is pre-calculated by using 
  654. // two-ray ground refelction model with fixed
  655. // transmission power 3.652e-10
  656. // if ((type_ == SEND)  && (distance > 250 )) return ;
  657. if(tracetype == TR_ROUTER && type_ == RECV && dst != -1 ) return ;
  658. if(type_ == RECV && dst == -1 )dst = src_ ; //broadcasting event
  659.         if (energy != -1) { //energy model being turned on
  660.    if (nodeColor[src_] != energyLevel ) { //only dump it when node  
  661.        sprintf(pt_->nbuffer() ,                    //color change
  662.           "n -t %.9f -s %d -S COLOR %s",
  663.            Scheduler::instance().clock(),
  664.            src_,                           // this node
  665.            colors);
  666.                offset = strlen(pt_->nbuffer());
  667.                pt_->namdump();
  668.        nodeColor[src_] = energyLevel ;
  669.     }   
  670.         }
  671. sprintf(pt_->nbuffer() ,
  672. "%c -t %.9f -s %d -d %d -p %s -e %d -c 2 -a %d -i %d -k %3s",
  673. op,
  674. Scheduler::instance().clock(),
  675. src_,                           // this node
  676. next_hop,
  677. packet_info.name(ch->ptype()),
  678. ch->size(),
  679. pkt_color,
  680. ch->uid(),
  681. tracename);
  682. offset = strlen(pt_->nbuffer());
  683. pt_->namdump();
  684. }
  685. void CMUTrace::format(Packet* p, const char *why)
  686. {
  687. hdr_cmn *ch = HDR_CMN(p);
  688. int offset = 0;
  689. /*
  690.  * Log the MAC Header
  691.  */
  692. format_mac(p, why, offset);
  693. if (pt_->namchannel()) 
  694. nam_format(p, offset);
  695. offset = strlen(pt_->buffer());
  696. switch(ch->ptype()) {
  697. case PT_MAC:
  698. break;
  699. case PT_ARP:
  700. format_arp(p, offset);
  701. break;
  702. default:
  703. format_ip(p, offset);
  704. offset = strlen(pt_->buffer());
  705. switch(ch->ptype()) {
  706. case PT_AODV:
  707. format_aodv(p, offset);
  708. break;
  709. case PT_TORA:
  710.                         format_tora(p, offset);
  711.                         break;
  712.                 case PT_IMEP:
  713.                         format_imep(p, offset);
  714.                         break;
  715. case PT_DSR:
  716. format_dsr(p, offset);
  717. break;
  718. case PT_MESSAGE:
  719. case PT_UDP:
  720. format_msg(p, offset);
  721. break;
  722. case PT_TCP:
  723. case PT_ACK:
  724. format_tcp(p, offset);
  725. break;
  726. case PT_CBR:
  727. format_rtp(p, offset);
  728. break;
  729.         case PT_DIFF:
  730. break;
  731. case PT_GAF:
  732. break;
  733. default:
  734. fprintf(stderr, "%s - invalid packet type (%s).n",
  735. __PRETTY_FUNCTION__, packet_info.name(ch->ptype()));
  736. exit(1);
  737. }
  738. }
  739. }
  740. int
  741. CMUTrace::command(int argc, const char*const* argv)
  742. {
  743.         if(argc == 3) {
  744.                 if(strcmp(argv[1], "node") == 0) {
  745.                         node_ = (MobileNode*) TclObject::lookup(argv[2]);
  746.                         if(node_ == 0)
  747.                                 return TCL_ERROR;
  748.                         return TCL_OK;
  749.                 }
  750. if (strcmp(argv[1], "newtrace") == 0) {
  751. newtrace_ = atoi(argv[2]);
  752.         return TCL_OK;
  753. }
  754.         }
  755. return Trace::command(argc, argv);
  756. }
  757. /*ARGSUSED*/
  758. void
  759. CMUTrace::recv(Packet *p, Handler *h)
  760. {
  761. if (!node_energy()) {
  762. Packet::free(p);
  763. return;
  764. }
  765.         assert(initialized());
  766.         /*
  767.          * Agent Trace "stamp" the packet with the optimal route on
  768.          * sending.
  769.          */
  770.         if (tracetype == TR_AGENT && type_ == SEND) {
  771.                 God::instance()->stampPacket(p);
  772.         }
  773. #if 0
  774.         /*
  775.          * When the originator of a packet drops the packet, it may or may
  776.          * not have been stamped by GOD.  Stamp it before logging the
  777.          * information.
  778.          */
  779.         if(src_ == src && type_ == DROP) {
  780.                 God::instance()->stampPacket(p);
  781.         }
  782. #endif
  783. format(p, "---");
  784. pt_->dump();
  785. //namdump();
  786. if(target_ == 0)
  787. Packet::free(p);
  788. else
  789. send(p, h);
  790. }
  791. void
  792. CMUTrace::recv(Packet *p, const char* why)
  793. {
  794.         assert(initialized() && type_ == DROP);
  795. if (!node_energy()) {
  796. Packet::free(p);
  797. return;
  798. }
  799. #if 0
  800.         /*
  801.          * When the originator of a packet drops the packet, it may or may
  802.          * not have been stamped by GOD.  Stamp it before logging the
  803.          * information.
  804.          */
  805.         if(src_ == ih->saddr()) {
  806.                 God::instance()->stampPacket(p);
  807.         }
  808. #endif
  809. format(p, why);
  810. pt_->dump();
  811. //namdump();
  812. Packet::free(p);
  813. }
  814. int CMUTrace::node_energy()
  815. {
  816. Node* thisnode = Node::get_node_by_address(src_);
  817. double energy = 1;
  818. if (thisnode) {
  819. if (thisnode->energy_model()) {
  820. energy = thisnode->energy_model()->energy();
  821. }
  822. if (energy > 0) return 1;
  823. return 0;
  824. }