cmu-trace.cc
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:39k
源码类别:

通讯编程

开发平台:

Visual 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: /cvsroot/nsnam/ns-2/trace/cmu-trace.cc,v 1.92 2008/02/18 03:39:03 tom_henderson Exp $
  38.  */
  39. #include <packet.h>
  40. #include <ip.h>
  41. #include <tcp.h>
  42. #include <sctp.h>
  43. #include <rtp.h>
  44. #include <arp.h>
  45. #include <dsr/hdr_sr.h> // DSR
  46. #include <mac.h>
  47. #include <mac-802_11.h>
  48. #include <smac.h>
  49. #include <address.h>
  50. #include <tora/tora_packet.h> //TORA
  51. #include <imep/imep_spec.h>         // IMEP
  52. #include <aodv/aodv_packet.h> //AODV
  53. #include <cmu-trace.h>
  54. #include <mobilenode.h>
  55. #include <simulator.h>
  56. //<zheng: add for 802.15.4>
  57. #include "wpan/p802_15_4pkt.h"
  58. #include "wpan/p802_15_4trace.h"
  59. #include "wpan/p802_15_4nam.h"
  60. //</zheng: add for 802.15.4>
  61. #include "diffusion/diff_header.h" // DIFFUSION -- Chalermek
  62. PacketTracer::PacketTracer() : next_(0)
  63. {
  64. }
  65. void PacketTracer::setNext(PacketTracer *next)
  66. {
  67. next_ = next;
  68. }
  69. PacketTracer::~PacketTracer()
  70. {
  71. }
  72. PacketTracer *PacketTracer::getNext()
  73. {
  74. return next_;
  75. }
  76. int PacketTracer::format_unknow(Packet *p, int offset, BaseTrace *pt, int newtrace)
  77. {
  78. return (format(p, offset, pt, newtrace) || (next_ && next_->format_unknow(p, offset, pt, newtrace)));
  79. }
  80. PacketTracer *CMUTrace::pktTrc_ = 0;
  81. void CMUTrace::addPacketTracer(PacketTracer *pt)
  82. {
  83. if(!pt)
  84. return;
  85. pt->setNext(pktTrc_);
  86. pktTrc_ = pt;
  87. }
  88. //#define LOG_POSITION
  89. //extern char* pt_names[];
  90. static class CMUTraceClass : public TclClass {
  91. public:
  92. CMUTraceClass() : TclClass("CMUTrace") { }
  93. TclObject* create(int, const char*const* argv) {
  94. return (new CMUTrace(argv[4], *argv[5]));
  95. }
  96. } cmutrace_class;
  97. //<zheng: ns 2.27 removed the following part, but we need it to control the broadcast radius>
  98. double CMUTrace::bradius = 0.0;
  99. double CMUTrace::radius_scaling_factor_ = 0.0;
  100. double CMUTrace::duration_scaling_factor_ = 0.0;
  101. //</zheng>
  102. CMUTrace::CMUTrace(const char *s, char t) : Trace(t)
  103. {
  104. bzero(tracename, sizeof(tracename));
  105. strncpy(tracename, s, MAX_ID_LEN);
  106.         if(strcmp(tracename, "RTR") == 0) {
  107.                 tracetype = TR_ROUTER;
  108.         }
  109. else if(strcmp(tracename, "TRP") == 0) {
  110.                 tracetype = TR_ROUTER;
  111.         }
  112.         else if(strcmp(tracename, "PHY") == 0) {
  113.                 tracetype = TR_PHY;
  114.         }
  115.         else if(strcmp(tracename, "MAC") == 0) {
  116.                 tracetype = TR_MAC;
  117.         }
  118.         else if(strcmp(tracename, "IFQ") == 0) {
  119.                 tracetype = TR_IFQ;
  120.         }
  121.         else if(strcmp(tracename, "AGT") == 0) {
  122.                 tracetype = TR_AGENT;
  123.         }
  124.         else {
  125.                 fprintf(stderr, "CMU Trace Initialized with invalid typen");
  126.                 exit(1);
  127.         }
  128. // change wrt Mike's code
  129. // assert(type_ == DROP || type_ == SEND || type_ == RECV);
  130. assert(type_ == DROP || type_ == SEND || type_ == RECV
  131.                || ((type_ == EOT) && (tracetype == TR_MAC)));
  132. newtrace_ = 0;
  133. for (int i=0 ; i < MAX_NODE ; i++) 
  134. nodeColor[i] = 3 ;
  135.         node_ = 0;
  136. }
  137. void
  138. CMUTrace::format_mac_common(Packet *p, const char *why, int offset)
  139. {
  140. struct hdr_cmn *ch = HDR_CMN(p);
  141. struct hdr_ip *ih = HDR_IP(p);
  142. struct hdr_mac802_11 *mh;
  143. struct hdr_smac *sh;
  144. char mactype[SMALL_LEN];
  145. strcpy(mactype, Simulator::instance().macType());
  146. if (strcmp (mactype, "Mac/SMAC") == 0)
  147. sh = HDR_SMAC(p);
  148. else
  149. mh = HDR_MAC802_11(p);
  150. double x = 0.0, y = 0.0, z = 0.0;
  151.        
  152. char op = (char) type_;
  153. Node* thisnode = Node::get_node_by_address(src_);
  154. double energy = -1;
  155. if (thisnode) {
  156.     if (thisnode->energy_model()) {
  157.     energy = thisnode->energy_model()->energy();
  158.     }
  159. }
  160. // hack the IP address to convert pkt format to hostid format
  161. // for now until port ids are removed from IP address. -Padma.
  162. int src = Address::instance().get_nodeaddr(ih->saddr());
  163. if(tracetype == TR_ROUTER && type_ == SEND) {
  164. if(src_ != src)
  165. op = FWRD;
  166. }
  167. // use tagged format if appropriate
  168. if (pt_->tagged()) {
  169. int next_hop = -1 ;
  170. Node* nextnode = Node::get_node_by_address(ch->next_hop_);
  171.          if (nextnode) next_hop = nextnode->nodeid(); 
  172. node_->getLoc(&x, &y, &z);
  173. if (op == DROP) op = 'd';
  174. if (op == SEND) op = '+';
  175. if (op == FWRD) op = 'h';
  176. sprintf(pt_->buffer() + offset,
  177. "%c "TIME_FORMAT" -s %d -d %d -p %s -k %3s -i %d "
  178. "-N:loc {%.2f %.2f %.2f} -N:en %f ",
  179. op, // event type
  180. Scheduler::instance().clock(), // time
  181. src_, // this node
  182. next_hop, // next hop
  183. packet_info.name(ch->ptype()), // packet type
  184. tracename, // trace level
  185. ch->uid(), // event id
  186. x, y, z, // location
  187. energy); // energy
  188. offset = strlen(pt_->buffer());
  189. if (strcmp (mactype, "Mac/SMAC") == 0) {
  190. format_smac(p, offset);
  191. } else {
  192. format_mac(p, offset);
  193. }
  194. return;
  195. }
  196. // Use new ns trace format to replace the old cmu trace format)
  197. if (newtrace_) {
  198.     
  199.     node_->getLoc(&x, &y, &z);
  200.     // consistence
  201.     if ( op == DROP ) { op = 'd';}
  202.         // basic trace infomation + basic exenstion
  203.     sprintf(pt_->buffer() + offset,
  204.    "%c -t %.9f -Hs %d -Hd %d -Ni %d -Nx %.2f -Ny %.2f -Nz %.2f -Ne %f -Nl %3s -Nw %s ",
  205.     op,                       // event type
  206.     Scheduler::instance().clock(),  // time
  207.     src_,                           // this node
  208.                     ch->next_hop_,                  // next hop
  209.     src_,                           // this node
  210.     x,                              // x coordinate
  211.     y,                              // y coordinate
  212.     z,                              // z coordinate
  213.     energy,                         // energy, -1 = not existing
  214.     tracename,                      // trace level
  215.                     why);                            // reason
  216.     // mac layer extension
  217.     offset = strlen(pt_->buffer());
  218.     if (strcmp(mactype, "Mac/SMAC") == 0) {
  219.     format_smac(p, offset);
  220.     } else {
  221.     format_mac(p, offset);
  222.     }
  223.     return;
  224. }
  225. #ifdef LOG_POSITION
  226.         x = 0.0, y = 0.0, z = 0.0;
  227.         node_->getLoc(&x, &y, &z);
  228. #endif
  229. sprintf(pt_->buffer() + offset,
  230. #ifdef LOG_POSITION
  231. "%c %.9f %d (%6.2f %6.2f) %3s %4s %d %s %d ",
  232. #else
  233. "%c %.9f _%d_ %3s %4s %d %s %d",
  234. #endif
  235. op,
  236. Scheduler::instance().clock(),
  237.                 src_,                           // this node
  238. #ifdef LOG_POSITION
  239.                 x,
  240.                 y,
  241. #endif
  242. tracename,
  243. why,
  244.                 ch->uid(),                      // identifier for this event
  245. ((ch->ptype() == PT_MAC) ? (
  246.   (mh->dh_fc.fc_type == MAC_Type_Control) ? (
  247.   (mh->dh_fc.fc_subtype == MAC_Subtype_RTS) ? "RTS"  :
  248.   (mh->dh_fc.fc_subtype == MAC_Subtype_CTS) ? "CTS"  :
  249.   (mh->dh_fc.fc_subtype == MAC_Subtype_ACK) ? "ACK":
  250.   //<zheng: add for 802.15.4>
  251.   (mh->dh_fc.fc_subtype == MAC_Subtype_Beacon) ? "BCN"  : //Beacon
  252.   (mh->dh_fc.fc_subtype == MAC_Subtype_Command_AssoReq) ? "CM1"  : //CMD: Association request
  253.   (mh->dh_fc.fc_subtype == MAC_Subtype_Command_AssoRsp) ? "CM2"  : //CMD: Association response
  254.   (mh->dh_fc.fc_subtype == MAC_Subtype_Command_DAssNtf) ? "CM3"  : //CMD: Disassociation notification
  255.   (mh->dh_fc.fc_subtype == MAC_Subtype_Command_DataReq) ? "CM4"  : //CMD: Data request
  256.   (mh->dh_fc.fc_subtype == MAC_Subtype_Command_PIDCNtf) ? "CM5"  : //CMD: PAN ID conflict notification
  257.   (mh->dh_fc.fc_subtype == MAC_Subtype_Command_OrphNtf) ? "CM6"  : //CMD: Orphan notification
  258.   (mh->dh_fc.fc_subtype == MAC_Subtype_Command_BconReq) ? "CM7"  : //CMD: Beacon request
  259.   (mh->dh_fc.fc_subtype == MAC_Subtype_Command_CoorRea) ? "CM8"  : //CMD: Coordinator realignment
  260.   (mh->dh_fc.fc_subtype == MAC_Subtype_Command_GTSReq) ? "CM9"  : //CMD: GTS request
  261.           "UNKN") :
  262.    (mh->dh_fc.fc_type == MAC_Type_Management) ? (
  263.   (mh->dh_fc.fc_subtype == MAC_Subtype_80211_Beacon) ? "BCN"  :
  264.   (mh->dh_fc.fc_subtype == MAC_Subtype_AssocReq) ? "ACRQ"  :
  265.   (mh->dh_fc.fc_subtype == MAC_Subtype_AssocRep) ? "ACRP"  : 
  266.   (mh->dh_fc.fc_subtype == MAC_Subtype_Auth) ? "AUTH"  :
  267.   (mh->dh_fc.fc_subtype == MAC_Subtype_ProbeReq) ? "PRRQ"  :
  268.   (mh->dh_fc.fc_subtype == MAC_Subtype_ProbeRep) ? "PRRP"  :
  269.   "UNKN") :
  270.   "UNKN") :
  271.  (ch->ptype() == PT_SMAC) ? (
  272.   (sh->type == RTS_PKT) ? "RTS" :
  273.   (sh->type == CTS_PKT) ? "CTS" :
  274.   (sh->type == ACK_PKT) ? "ACK" :
  275.   (sh->type == SYNC_PKT) ? "SYNC" :
  276.   "UNKN") : 
  277.  packet_info.name(ch->ptype())),
  278. ch->size());
  279. offset = strlen(pt_->buffer());
  280. if(tracetype == TR_PHY) {
  281. format_phy(p, offset);
  282. offset = strlen(pt_->buffer());
  283. return;
  284. }
  285. if (strncmp (mactype, "Mac/SMAC", 8) == 0) {
  286. format_smac(p, offset);
  287. } else {
  288. format_mac(p, offset);
  289.         }
  290. offset = strlen(pt_->buffer());
  291. if (thisnode) {
  292. if (thisnode->energy_model()) {
  293. // log detailed energy consumption
  294. // total energy and breakdown in idle, sleep, transmit and receive modes
  295. sprintf(pt_->buffer() + offset,
  296. "[energy %f ei %.3f es %.3f et %.3f er %.3f] ",
  297. thisnode->energy_model()->energy(),
  298. thisnode->energy_model()->ei(),
  299. thisnode->energy_model()->es(),
  300. thisnode->energy_model()->et(),
  301. thisnode->energy_model()->er());
  302. }
  303.         }
  304. }
  305. void
  306. CMUTrace::format_phy(Packet *p, int offset)
  307. {
  308. sprintf(pt_->buffer() + offset, " ");
  309. }
  310. void
  311. CMUTrace::format_mac(Packet *p, int offset)
  312. {
  313. struct hdr_mac802_11 *mh = HDR_MAC802_11(p);
  314. if (pt_->tagged()) {
  315. sprintf(pt_->buffer() + offset,
  316. "-M:dur %x -M:s %x -M:d %x -M:t %x ",
  317. mh->dh_duration, // MAC: duration
  318. // change wrt Mike's code
  319. //ETHER_ADDR(mh->dh_da), // MAC: source
  320. //ETHER_ADDR(mh->dh_sa), // MAC: destination
  321. ETHER_ADDR(mh->dh_ra),          // MAC: source
  322.                        ETHER_ADDR(mh->dh_ta),          // MAC: destination
  323. GET_ETHER_TYPE(mh->dh_body)); // MAC: type
  324. } else if (newtrace_) {
  325. sprintf(pt_->buffer() + offset, 
  326. "-Ma %x -Md %x -Ms %x -Mt %x ",
  327. mh->dh_duration,
  328. // change wrt Mike's code
  329. //ETHER_ADDR(mh->dh_da),
  330. //ETHER_ADDR(mh->dh_sa),
  331.     ETHER_ADDR(mh->dh_ra),
  332.                    ETHER_ADDR(mh->dh_ta),
  333. GET_ETHER_TYPE(mh->dh_body));
  334. } else {
  335. sprintf(pt_->buffer() + offset,
  336. " [%x %x %x %x] ",
  337. //*((u_int16_t*) &mh->dh_fc),
  338. mh->dh_duration,
  339. // change wrt Mike's code
  340. //ETHER_ADDR(mh->dh_da),
  341. //ETHER_ADDR(mh->dh_sa),
  342. ETHER_ADDR(mh->dh_ra),
  343.                         ETHER_ADDR(mh->dh_ta),
  344. GET_ETHER_TYPE(mh->dh_body));
  345. }
  346. }
  347. void
  348. CMUTrace::format_smac(Packet *p, int offset)
  349. {
  350. struct hdr_smac *sh = HDR_SMAC(p);
  351. sprintf(pt_->buffer() + offset,
  352. " [%.2f %d %d] ",
  353. sh->duration,
  354. sh->dstAddr,
  355. sh->srcAddr);
  356. }
  357. void
  358. CMUTrace::format_ip(Packet *p, int offset)
  359. {
  360.         struct hdr_cmn *ch = HDR_CMN(p);
  361. struct hdr_ip *ih = HDR_IP(p);
  362. // hack the IP address to convert pkt format to hostid format
  363. // for now until port ids are removed from IP address. -Padma.
  364. int src = Address::instance().get_nodeaddr(ih->saddr());
  365. int dst = Address::instance().get_nodeaddr(ih->daddr());
  366. if (pt_->tagged()) {
  367. sprintf(pt_->buffer() + offset,
  368. "-IP:s %d -IP:sp %d -IP:d %d -IP:dp %d -p %s -e %d "
  369. "-c %d -i %d -IP:ttl %d ",
  370. src,                           // packet src
  371. ih->sport(),                   // src port
  372. dst,                           // packet dest
  373. ih->dport(),                   // dst port
  374. packet_info.name(ch->ptype()), // packet type
  375. ch->size(),                    // packet size
  376. ih->flowid(),                  // flow id
  377. ch->uid(),                     // unique id
  378. ih->ttl_                       // ttl
  379. );
  380. } else if (newtrace_) {
  381.     sprintf(pt_->buffer() + offset,
  382.     "-Is %d.%d -Id %d.%d -It %s -Il %d -If %d -Ii %d -Iv %d ",
  383.     src,                           // packet src
  384.     ih->sport(),                   // src port
  385.     dst,                           // packet dest
  386.     ih->dport(),                   // dst port
  387.     packet_info.name(ch->ptype()),  // packet type
  388.     ch->size(),                     // packet size
  389.     ih->flowid(),                   // flow id
  390.     ch->uid(),                      // unique id
  391.     ih->ttl_);                      // ttl
  392. } else {
  393.     sprintf(pt_->buffer() + offset, "------- [%d:%d %d:%d %d %d] ",
  394. src, ih->sport(),
  395. dst, ih->dport(),
  396. ih->ttl_, (ch->next_hop_ < 0) ? 0 : ch->next_hop_);
  397. }
  398. }
  399. // Note:  HDLC format (format_hdlc()) has moved to satellite tracing
  400. void
  401. CMUTrace::format_arp(Packet *p, int offset)
  402. {
  403. struct hdr_arp *ah = HDR_ARP(p);
  404. if (pt_->tagged()) {
  405.     sprintf(pt_->buffer() + offset,
  406.     "-arp:op %s -arp:ms %d -arp:s %d -arp:md %d -arp:d %d ",
  407.     ah->arp_op == ARPOP_REQUEST ?  "REQUEST" : "REPLY",
  408.     ah->arp_sha,
  409.     ah->arp_spa,
  410.     ah->arp_tha,
  411.     ah->arp_tpa);
  412. } else if (newtrace_) {
  413.     sprintf(pt_->buffer() + offset,
  414.     "-P arp -Po %s -Pms %d -Ps %d -Pmd %d -Pd %d ",
  415.     ah->arp_op == ARPOP_REQUEST ?  "REQUEST" : "REPLY",
  416.     ah->arp_sha,
  417.     ah->arp_spa,
  418.     ah->arp_tha,
  419.     ah->arp_tpa);
  420. } else {
  421.     sprintf(pt_->buffer() + offset,
  422. "------- [%s %d/%d %d/%d]",
  423. ah->arp_op == ARPOP_REQUEST ?  "REQUEST" : "REPLY",
  424. ah->arp_sha,
  425. ah->arp_spa,
  426. ah->arp_tha,
  427. ah->arp_tpa);
  428. }
  429. }
  430. void
  431. CMUTrace::format_dsr(Packet *p, int offset)
  432. {
  433. hdr_sr *srh = hdr_sr::access(p);
  434. if (pt_->tagged()) {
  435.     sprintf(pt_->buffer() + offset,
  436.     "-dsr:h %d -dsr:q %d -dsr:s %d -dsr:p %d -dsr:n %d "
  437.     "-dsr:l %d -dsr:e {%d %d} -dsr:w %d -dsr:m %d -dsr:c %d "
  438.     "-dsr:b {%d %d} ",
  439.     srh->num_addrs(),
  440.     srh->route_request(),
  441.     srh->rtreq_seq(),
  442.     srh->route_reply(),
  443.     srh->rtreq_seq(),
  444.     srh->route_reply_len(),
  445.     srh->reply_addrs()[0].addr,
  446.     srh->reply_addrs()[srh->route_reply_len()-1].addr,
  447.     srh->route_error(),
  448.     srh->num_route_errors(),
  449.     srh->down_links()[srh->num_route_errors() - 1].tell_addr,
  450.     srh->down_links()[srh->num_route_errors() - 1].from_addr,
  451.     srh->down_links()[srh->num_route_errors() - 1].to_addr);
  452.     return;
  453. } else if (newtrace_) {
  454.     sprintf(pt_->buffer() + offset, 
  455. "-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 ",
  456.     srh->num_addrs(),                   // how many nodes travered
  457. srh->route_request(),
  458. srh->rtreq_seq(),
  459. srh->route_reply(),
  460. srh->rtreq_seq(),
  461. srh->route_reply_len(),
  462. // the dest of the src route
  463. srh->reply_addrs()[0].addr,
  464. srh->reply_addrs()[srh->route_reply_len()-1].addr,
  465. srh->route_error(),
  466. srh->num_route_errors(),
  467. srh->down_links()[srh->num_route_errors() - 1].tell_addr,
  468. srh->down_links()[srh->num_route_errors() - 1].from_addr,
  469. srh->down_links()[srh->num_route_errors() - 1].to_addr);
  470.    return;
  471. }
  472. sprintf(pt_->buffer() + offset, 
  473. "%d [%d %d] [%d %d %d %d->%d] [%d %d %d %d->%d]",
  474. srh->num_addrs(),
  475. srh->route_request(),
  476. srh->rtreq_seq(),
  477. srh->route_reply(),
  478. srh->rtreq_seq(),
  479. srh->route_reply_len(),
  480. // the dest of the src route
  481. srh->reply_addrs()[0].addr,
  482. srh->reply_addrs()[srh->route_reply_len()-1].addr,
  483. srh->route_error(),
  484. srh->num_route_errors(),
  485. srh->down_links()[srh->num_route_errors() - 1].tell_addr,
  486. srh->down_links()[srh->num_route_errors() - 1].from_addr,
  487. srh->down_links()[srh->num_route_errors() - 1].to_addr);
  488. }
  489. void
  490. CMUTrace::format_msg(Packet *, int)
  491. {
  492. }
  493. void
  494. CMUTrace::format_tcp(Packet *p, int offset)
  495. {
  496. struct hdr_cmn *ch = HDR_CMN(p);
  497. struct hdr_tcp *th = HDR_TCP(p);
  498. if (pt_->tagged()) {
  499.     sprintf(pt_->buffer() + offset,
  500.     "-tcp:s %d -tcp:a %d -tcp:f %d -tcp:o %d ",
  501.     th->seqno_,
  502.     th->ackno_,
  503.     ch->num_forwards(),
  504.     ch->opt_num_forwards());
  505. } else if (newtrace_) {
  506.     sprintf(pt_->buffer() + offset,
  507. "-Pn tcp -Ps %d -Pa %d -Pf %d -Po %d ",
  508. th->seqno_,
  509. th->ackno_,
  510. ch->num_forwards(),
  511. ch->opt_num_forwards());
  512. } else {
  513.     sprintf(pt_->buffer() + offset,
  514. "[%d %d] %d %d",
  515. th->seqno_,
  516. th->ackno_,
  517. ch->num_forwards(),
  518. ch->opt_num_forwards());
  519. }
  520. }
  521. /* Armando L. Caro Jr. <acaro@@cis,udel,edu> 6/5/2002
  522.  * (with help from Florina Almenrez <florina@@it,uc3m,es>)
  523.  */
  524. void
  525. CMUTrace::format_sctp(Packet* p,int offset)
  526. {
  527. struct hdr_cmn *ch = HDR_CMN(p);
  528. struct hdr_sctp *sh = HDR_SCTP(p);
  529. //struct hdr_ip *ih = HDR_IP(p);
  530. char cChunkType;
  531.   
  532. for(u_int i = 0; i < sh->NumChunks(); i++) {
  533. switch(sh->SctpTrace()[i].eType) {
  534. case SCTP_CHUNK_INIT:
  535. case SCTP_CHUNK_INIT_ACK:
  536. case SCTP_CHUNK_COOKIE_ECHO:
  537. case SCTP_CHUNK_COOKIE_ACK:
  538. cChunkType = 'I';       // connection initialization
  539. break;
  540.       
  541. case SCTP_CHUNK_DATA:
  542. cChunkType = 'D';
  543. break;
  544.       
  545. case SCTP_CHUNK_SACK:
  546. cChunkType = 'S';
  547. break;
  548.       
  549. case SCTP_CHUNK_FORWARD_TSN:
  550. cChunkType = 'R';
  551. break;
  552. case SCTP_CHUNK_HB:
  553. cChunkType = 'H';
  554. break;
  555. case SCTP_CHUNK_HB_ACK:
  556. cChunkType = 'B';
  557. break;
  558. default:
  559. // quiet compiler
  560. cChunkType = ' ';
  561. assert (false);
  562. break;
  563. }
  564.     
  565. if( newtrace_ ) {
  566. sprintf(pt_->buffer() + offset,
  567. "-Pn sctp -Pnc %d -Pct %c "
  568. "-Ptsn %d -Psid %d -Pssn %d "
  569. "-Pf %d -Po %d ",
  570. sh->NumChunks(),
  571. cChunkType,
  572. sh->SctpTrace()[i].uiTsn,
  573. sh->SctpTrace()[i].usStreamId,
  574. sh->SctpTrace()[i].usStreamSeqNum,
  575. ch->num_forwards(),
  576. ch->opt_num_forwards());
  577. }
  578. else {
  579. sprintf(pt_->buffer() + offset,
  580. "[%d %c %d %d %d] %d %d",
  581. sh->NumChunks(),
  582. cChunkType,
  583. sh->SctpTrace()[i].uiTsn,
  584. sh->SctpTrace()[i].usStreamId,
  585. sh->SctpTrace()[i].usStreamSeqNum,
  586. ch->num_forwards(),
  587. ch->opt_num_forwards());
  588. }
  589. }
  590. }
  591. void
  592. CMUTrace::format_rtp(Packet *p, int offset)
  593. {
  594. struct hdr_cmn *ch = HDR_CMN(p);
  595. struct hdr_rtp *rh = HDR_RTP(p);
  596. struct hdr_ip *ih = HDR_IP(p);
  597.         Node* thisnode = Node::get_node_by_address(src_);
  598. //hacking, needs to change later, 
  599.         int dst = Address::instance().get_nodeaddr(ih->daddr());
  600. if (dst == src_){
  601. // I just received a cbr data packet
  602. if (thisnode->energy_model() && 
  603.     thisnode->energy_model()->powersavingflag()) {
  604. thisnode->energy_model()->set_node_state(EnergyModel::INROUTE);
  605. }
  606.         }
  607. if (pt_->tagged()) {
  608. sprintf(pt_->buffer() + offset,
  609. "-cbr:s %d -cbr:f %d -cbr:o %d ",
  610. rh->seqno_,
  611. ch->num_forwards(),
  612. ch->opt_num_forwards());
  613. } else if (newtrace_) {
  614. sprintf(pt_->buffer() + offset,
  615. "-Pn cbr -Pi %d -Pf %d -Po %d ",
  616. rh->seqno_,
  617. ch->num_forwards(),
  618. ch->opt_num_forwards());
  619. } else {
  620. sprintf(pt_->buffer() + offset,
  621. "[%d] %d %d",
  622. rh->seqno_,
  623. ch->num_forwards(),
  624. ch->opt_num_forwards());
  625. }
  626. }
  627. void
  628. CMUTrace::format_imep(Packet *p, int offset)
  629. {
  630.         struct hdr_imep *im = HDR_IMEP(p);
  631. #define U_INT16_T(x)    *((u_int16_t*) &(x))
  632. if (pt_->tagged()) {
  633.     sprintf(pt_->buffer() + offset,
  634.     "-imep:a %c -imep:h %c -imep:o %c -imep:l %04x ",
  635.     (im->imep_block_flags & BLOCK_FLAG_ACK) ? 'A' : '-',
  636.                     (im->imep_block_flags & BLOCK_FLAG_HELLO) ? 'H' : '-',
  637.                     (im->imep_block_flags & BLOCK_FLAG_OBJECT) ? 'O' : '-',
  638.                     U_INT16_T(im->imep_length));
  639. } else if (newtrace_) {
  640.     sprintf(pt_->buffer() + offset,
  641.                 "-P imep -Pa %c -Ph %c -Po %c -Pl 0x%04x ] ",
  642.                 (im->imep_block_flags & BLOCK_FLAG_ACK) ? 'A' : '-',
  643.                 (im->imep_block_flags & BLOCK_FLAG_HELLO) ? 'H' : '-',
  644.                 (im->imep_block_flags & BLOCK_FLAG_OBJECT) ? 'O' : '-',
  645.                 U_INT16_T(im->imep_length));
  646. } else {
  647.             sprintf(pt_->buffer() + offset,
  648.                 "[%c %c %c 0x%04x] ",
  649.                 (im->imep_block_flags & BLOCK_FLAG_ACK) ? 'A' : '-',
  650.                 (im->imep_block_flags & BLOCK_FLAG_HELLO) ? 'H' : '-',
  651.                 (im->imep_block_flags & BLOCK_FLAG_OBJECT) ? 'O' : '-',
  652.                 U_INT16_T(im->imep_length));
  653. }
  654. #undef U_INT16_T
  655. }
  656. void
  657. CMUTrace::format_tora(Packet *p, int offset)
  658. {
  659.         struct hdr_tora *th = HDR_TORA(p);
  660.         struct hdr_tora_qry *qh = HDR_TORA_QRY(p);
  661.         struct hdr_tora_upd *uh = HDR_TORA_UPD(p);
  662.         struct hdr_tora_clr *ch = HDR_TORA_CLR(p);
  663.         switch(th->th_type) {
  664.         case TORATYPE_QRY:
  665. if (pt_->tagged()) {
  666.     sprintf(pt_->buffer() + offset,
  667.     "-tora:t %x -tora:d %d -tora:c QUERY",
  668.     qh->tq_type, qh->tq_dst);
  669. } else if (newtrace_) {
  670.     sprintf(pt_->buffer() + offset,
  671. "-P tora -Pt 0x%x -Pd %d -Pc QUERY ",
  672.                         qh->tq_type, qh->tq_dst);
  673.                 } else {
  674.                     sprintf(pt_->buffer() + offset, "[0x%x %d] (QUERY)",
  675.                         qh->tq_type, qh->tq_dst);
  676. }
  677.                 break;
  678.         case TORATYPE_UPD:
  679. if (pt_->tagged()) {
  680.     sprintf(pt_->buffer() + offset,
  681.     "-tora:t %x -tora:d %d -tora:a %f -tora:o %d "
  682.     "-tora:r %d -tora:e %d -tora:i %d -tora:c UPDATE",
  683.     uh->tu_type,
  684.                             uh->tu_dst,
  685.                             uh->tu_tau,
  686.                             uh->tu_oid,
  687.                             uh->tu_r,
  688.                             uh->tu_delta,
  689.                             uh->tu_id);
  690. } else if (newtrace_) {
  691.     sprintf(pt_->buffer() + offset,
  692.                         "-P tora -Pt 0x%x -Pd %d (%f %d %d %d %d) -Pc UPDATE ",
  693.                         uh->tu_type,
  694.                         uh->tu_dst,
  695.                         uh->tu_tau,
  696.                         uh->tu_oid,
  697.                         uh->tu_r,
  698.                         uh->tu_delta,
  699.                         uh->tu_id);
  700. } else {
  701.                     sprintf(pt_->buffer() + offset,
  702.                         "-Pt 0x%x -Pd %d -Pa %f -Po %d -Pr %d -Pe %d -Pi %d -Pc UPDATE ",
  703.                         uh->tu_type,
  704.                         uh->tu_dst,
  705.                         uh->tu_tau,
  706.                         uh->tu_oid,
  707.                         uh->tu_r,
  708.                         uh->tu_delta,
  709.                         uh->tu_id);
  710. }
  711.                 break;
  712.         case TORATYPE_CLR:
  713. if (pt_->tagged()) {
  714.     sprintf(pt_->buffer() + offset,
  715.     "-tora:t %x -tora:d %d -tora:a %f -tora:o %d "
  716.     "-tora:c CLEAR ",
  717.     ch->tc_type,
  718.                             ch->tc_dst,
  719.                             ch->tc_tau,
  720.                             ch->tc_oid);
  721. } else if (newtrace_) {
  722.     sprintf(pt_->buffer() + offset, 
  723. "-P tora -Pt 0x%x -Pd %d -Pa %f -Po %d -Pc CLEAR ",
  724.                         ch->tc_type,
  725.                         ch->tc_dst,
  726.                         ch->tc_tau,
  727.                         ch->tc_oid);
  728. } else {
  729.                     sprintf(pt_->buffer() + offset, "[0x%x %d %f %d] (CLEAR)",
  730.                         ch->tc_type,
  731.                         ch->tc_dst,
  732.                         ch->tc_tau,
  733.                         ch->tc_oid);
  734. }
  735.                 break;
  736.         }
  737. }
  738. void
  739. CMUTrace::format_aodv(Packet *p, int offset)
  740. {
  741.         struct hdr_aodv *ah = HDR_AODV(p);
  742.         struct hdr_aodv_request *rq = HDR_AODV_REQUEST(p);
  743.         struct hdr_aodv_reply *rp = HDR_AODV_REPLY(p);
  744.         switch(ah->ah_type) {
  745.         case AODVTYPE_RREQ:
  746. if (pt_->tagged()) {
  747.     sprintf(pt_->buffer() + offset,
  748.     "-aodv:t %x -aodv:h %d -aodv:b %d -aodv:d %d "
  749.     "-aodv:ds %d -aodv:s %d -aodv:ss %d "
  750.     "-aodv:c REQUEST ",
  751.     rq->rq_type,
  752.                             rq->rq_hop_count,
  753.                             rq->rq_bcast_id,
  754.                             rq->rq_dst,
  755.                             rq->rq_dst_seqno,
  756.                             rq->rq_src,
  757.                             rq->rq_src_seqno);
  758. } else if (newtrace_) {
  759.     sprintf(pt_->buffer() + offset,
  760. "-P aodv -Pt 0x%x -Ph %d -Pb %d -Pd %d -Pds %d -Ps %d -Pss %d -Pc REQUEST ",
  761. rq->rq_type,
  762.                         rq->rq_hop_count,
  763.                         rq->rq_bcast_id,
  764.                         rq->rq_dst,
  765.                         rq->rq_dst_seqno,
  766.                         rq->rq_src,
  767.                         rq->rq_src_seqno);
  768. } else {
  769.     sprintf(pt_->buffer() + offset,
  770. "[0x%x %d %d [%d %d] [%d %d]] (REQUEST)",
  771. rq->rq_type,
  772.                         rq->rq_hop_count,
  773.                         rq->rq_bcast_id,
  774.                         rq->rq_dst,
  775.                         rq->rq_dst_seqno,
  776.                         rq->rq_src,
  777.                         rq->rq_src_seqno);
  778. }
  779.                 break;
  780.         case AODVTYPE_RREP:
  781.         case AODVTYPE_HELLO:
  782. case AODVTYPE_RERR:
  783. if (pt_->tagged()) {
  784.     sprintf(pt_->buffer() + offset,
  785.     "-aodv:t %x -aodv:h %d -aodv:d %d -adov:ds %d "
  786.     "-aodv:l %f -aodv:c %s ",
  787.     rp->rp_type,
  788.     rp->rp_hop_count,
  789.     rp->rp_dst,
  790.     rp->rp_dst_seqno,
  791.     rp->rp_lifetime,
  792.     rp->rp_type == AODVTYPE_RREP ? "REPLY" :
  793.     (rp->rp_type == AODVTYPE_RERR ? "ERROR" :
  794.      "HELLO"));
  795. } else if (newtrace_) {
  796. sprintf(pt_->buffer() + offset,
  797.     "-P aodv -Pt 0x%x -Ph %d -Pd %d -Pds %d -Pl %f -Pc %s ",
  798. rp->rp_type,
  799. rp->rp_hop_count,
  800. rp->rp_dst,
  801. rp->rp_dst_seqno,
  802. rp->rp_lifetime,
  803. rp->rp_type == AODVTYPE_RREP ? "REPLY" :
  804. (rp->rp_type == AODVTYPE_RERR ? "ERROR" :
  805.  "HELLO"));
  806.         } else {
  807. sprintf(pt_->buffer() + offset,
  808. "[0x%x %d [%d %d] %f] (%s)",
  809. rp->rp_type,
  810. rp->rp_hop_count,
  811. rp->rp_dst,
  812. rp->rp_dst_seqno,
  813. rp->rp_lifetime,
  814. rp->rp_type == AODVTYPE_RREP ? "REPLY" :
  815. (rp->rp_type == AODVTYPE_RERR ? "ERROR" :
  816.  "HELLO"));
  817. }
  818.                 break;
  819.         default:
  820. #ifdef WIN32
  821.                 fprintf(stderr,
  822.         "CMUTrace::format_aodv: invalid AODV packet typen");
  823. #else
  824. fprintf(stderr,
  825.         "%s: invalid AODV packet typen", __FUNCTION__);
  826. #endif
  827.                 abort();
  828.         }
  829. }
  830. void
  831. CMUTrace::nam_format(Packet *p, int offset)
  832. {
  833. Node* srcnode = 0 ;
  834. Node* dstnode = 0 ;
  835. Node* nextnode = 0 ;
  836.         struct hdr_cmn *ch = HDR_CMN(p);
  837. struct hdr_ip *ih = HDR_IP(p);
  838. char op = (char) type_;
  839. char colors[32];
  840. int next_hop = -1 ;
  841. // change wrt Mike's code
  842. assert(type_ != EOT);
  843. //<zheng: add for 802.15.4>
  844. //Actually we only need to handle MAC layer for nam (but should display dropping for other layers)
  845. //if (strcmp(tracename,"MAC") != 0)
  846. //if ((op != 'D')&&(op != 'd'))
  847. // return;
  848. struct hdr_mac802_11 *mh = HDR_MAC802_11(p);
  849. char ptype[11];
  850. strcpy(ptype,
  851. ((ch->ptype() == PT_MAC) ? (
  852.   (mh->dh_fc.fc_subtype == MAC_Subtype_RTS) ? "RTS"  :
  853.   (mh->dh_fc.fc_subtype == MAC_Subtype_CTS) ? "CTS"  :
  854.   (mh->dh_fc.fc_subtype == MAC_Subtype_ACK) ? "ACK"  :
  855.   (mh->dh_fc.fc_subtype == MAC_Subtype_Beacon) ? "BCN"  : //Beacon
  856.   (mh->dh_fc.fc_subtype == MAC_Subtype_AssocReq) ? "ACRQ"  :
  857.           (mh->dh_fc.fc_subtype == MAC_Subtype_AssocRep) ? "ACRP"  :
  858.   (mh->dh_fc.fc_subtype == MAC_Subtype_Command_AssoReq) ? "CM1"  : //CMD: Association request
  859.   (mh->dh_fc.fc_subtype == MAC_Subtype_Command_AssoRsp) ? "CM2"  : //CMD: Association response
  860.   (mh->dh_fc.fc_subtype == MAC_Subtype_Command_DAssNtf) ? "CM3"  : //CMD: Disassociation notification
  861.   (mh->dh_fc.fc_subtype == MAC_Subtype_Command_DataReq) ? "CM4"  : //CMD: Data request
  862.   (mh->dh_fc.fc_subtype == MAC_Subtype_Command_PIDCNtf) ? "CM5"  : //CMD: PAN ID conflict notification
  863.   (mh->dh_fc.fc_subtype == MAC_Subtype_Command_OrphNtf) ? "CM6"  : //CMD: Orphan notification
  864.   (mh->dh_fc.fc_subtype == MAC_Subtype_Command_BconReq) ? "CM7"  : //CMD: Beacon request
  865.   (mh->dh_fc.fc_subtype == MAC_Subtype_Command_CoorRea) ? "CM8"  : //CMD: Coordinator realignment
  866.   (mh->dh_fc.fc_subtype == MAC_Subtype_Command_GTSReq) ? "CM9"  : //CMD: GTS request
  867.   "UNKN"
  868.   ) : packet_info.name(ch->ptype())));
  869. //</zheng: add for 802.15.4>
  870.         int dst = Address::instance().get_nodeaddr(ih->daddr());
  871. nextnode = Node::get_node_by_address(ch->next_hop_);
  872.         if (nextnode) next_hop = nextnode->nodeid(); 
  873. srcnode = Node::get_node_by_address(src_);
  874. dstnode = Node::get_node_by_address(ch->next_hop_);
  875. double distance = 0;
  876.         if ((srcnode) && (dstnode)) {
  877.    MobileNode* tmnode = (MobileNode*)srcnode;
  878.    MobileNode* rmnode = (MobileNode*)dstnode;
  879.    distance = tmnode->propdelay(rmnode) * 300000000 ;
  880. }
  881. double energy = -1;
  882. double initenergy = -1;
  883. //default value for changing node color with respect to energy depletion
  884. double l1 = 0.5; 
  885. double l2 = 0.2;
  886. if (srcnode) {
  887.     if (srcnode->energy_model()) {
  888.     energy = srcnode->energy_model()->energy();
  889.     initenergy = srcnode->energy_model()->initialenergy();
  890.     l1 = srcnode->energy_model()->level1();
  891.     l2 = srcnode->energy_model()->level2();
  892.     }
  893. }
  894.         int energyLevel = 0 ;
  895.         double energyLeft = (double)(energy/initenergy) ;
  896.         if ((energyLeft <= 1 ) && (energyLeft >= l1 )) energyLevel = 3;
  897.         if ((energyLeft >= l2 ) && (energyLeft < l1 )) energyLevel = 2;
  898.         if ((energyLeft > 0 ) && (energyLeft < l2 )) energyLevel = 1;
  899. if (energyLevel == 0) 
  900. strcpy(colors,"-c black -o red");
  901.         else if (energyLevel == 1) 
  902. strcpy(colors,"-c red -o yellow");
  903.         else if (energyLevel == 2) 
  904. strcpy(colors,"-c yellow -o green");
  905.         else if (energyLevel == 3) 
  906. strcpy(colors,"-c green -o black");
  907. // A simple hack for scadds demo (fernandez's visit) -- Chalermek
  908. int pkt_color = 0;
  909. if (ch->ptype()==PT_DIFF) {
  910. hdr_cdiff *dfh= HDR_CDIFF(p);
  911. if (dfh->mess_type != DATA) {
  912. pkt_color = 1;
  913. }
  914. }
  915. //<zheng: add for 802.15.4>
  916. if (Nam802_15_4::Nam_Status)
  917. {
  918. ATTRIBUTELINK *attr;
  919. int t_src,t_dst;
  920. if (ch->ptype() == PT_MAC)
  921. {
  922. t_src = p802_15_4macSA(p);
  923. t_dst = p802_15_4macDA(p);;
  924. }
  925. else
  926. {
  927. t_src = HDR_IP(p)->saddr();
  928. t_dst = HDR_IP(p)->daddr();
  929. }
  930. attr = findAttrLink(HDR_CMN(p)->ptype(),t_src,t_dst);
  931. if (attr == NULL)
  932. attr = findAttrLink(HDR_CMN(p)->ptype());
  933. if (attr != NULL)
  934. HDR_LRWPAN(p)->attribute = attr->attribute;
  935. else
  936. HDR_LRWPAN(p)->attribute = 0;
  937. if (HDR_LRWPAN(p)->attribute >= 32)
  938. pkt_color = HDR_LRWPAN(p)->attribute;
  939. }
  940. //</zheng: add for 802.15.4>
  941. // convert to nam format 
  942. if (op == 's') op = 'h' ;
  943. if (op == 'D') op = 'd' ;
  944. if (op == 'h') {
  945. sprintf(pt_->nbuffer(),
  946. "+ -t %.9f -s %d -d %d -p %s -e %d -c 2 -a %d -i %d -k %3s ",
  947. Scheduler::instance().clock(),
  948. src_,                           // this node
  949. next_hop,
  950. ptype, //<zheng: modify for 802.15.4>packet_info.name(ch->ptype()),
  951. ch->size(),
  952. pkt_color,   
  953. ch->uid(),
  954. tracename);
  955. offset = strlen(pt_->nbuffer());
  956. pt_->namdump();
  957. sprintf(pt_->nbuffer() ,
  958. "- -t %.9f -s %d -d %d -p %s -e %d -c 2 -a %d -i %d -k %3s",
  959. Scheduler::instance().clock(),
  960. src_,                           // this node
  961. next_hop,
  962. ptype, //<zheng: modify for 802.15.4>packet_info.name(ch->ptype()),
  963. ch->size(),
  964. pkt_color,
  965. ch->uid(),
  966. tracename);
  967. offset = strlen(pt_->nbuffer());
  968. pt_->namdump();
  969. }
  970.         // if nodes are too far from each other
  971. // nam won't dump SEND event 'cuz it's
  972. // gonna be dropped later anyway
  973. // this value 250 is pre-calculated by using 
  974. // two-ray ground refelction model with fixed
  975. // transmission power 3.652e-10
  976. // if ((type_ == SEND)  && (distance > 250 )) return ;
  977. if(tracetype == TR_ROUTER && type_ == RECV && dst != -1 ) return ;
  978. if(type_ == RECV && dst == -1 )dst = src_ ; //broadcasting event
  979.         if (energy != -1) { //energy model being turned on
  980.    if (src_ >= MAX_NODE) {
  981.    fprintf (stderr, "node id must be < %dn",
  982.     MAX_NODE);
  983.        exit(0);
  984.    }
  985.    if (nodeColor[src_] != energyLevel ) { //only dump it when node  
  986.        sprintf(pt_->nbuffer() ,                    //color change
  987.           "n -t %.9f -s %d -S COLOR %s",
  988.            Scheduler::instance().clock(),
  989.            src_,                           // this node
  990.            colors);
  991.                offset = strlen(pt_->nbuffer());
  992.                pt_->namdump();
  993.        nodeColor[src_] = energyLevel ;
  994.     }   
  995.         }
  996. sprintf(pt_->nbuffer() ,
  997. "%c -t %.9f -s %d -d %d -p %s -e %d -c 2 -a %d -i %d -k %3s",
  998. op,
  999. Scheduler::instance().clock(),
  1000. src_,                           // this node
  1001. next_hop,
  1002. ptype, //<zheng: modify for 802.15.4>packet_info.name(ch->ptype()),
  1003. ch->size(),
  1004. pkt_color,
  1005. ch->uid(),
  1006. tracename);
  1007. //<zheng: ns 2.27 removed the following part, but we need it to control the broadcast radius>
  1008. if (Nam802_15_4::Nam_Status)
  1009. {
  1010. if ((strcmp(tracename, "AGT") != 0) || ((u_int32_t)(ih->daddr()) == IP_BROADCAST)) //<zheng: add: next_hop info not available at agent level>
  1011. //(doesn't really matter -- seems agent level has no effect on nam)
  1012. if (next_hop == -1 && op == 'h') {
  1013. // print extra fields for broadcast packets
  1014. // bradius is calculated assuming 2-ray ground reflectlon
  1015. // model using default settings of Phy/WirelessPhy and
  1016. // Antenna/OmniAntenna
  1017. if (bradius == 0.0) calculate_broadcast_parameters();
  1018. double radius = bradius*radius_scaling_factor_; 
  1019. // duration is calculated based on the radius and
  1020. // the speed of light (299792458 m/s)
  1021. double duration = (bradius/299792458.0)*duration_scaling_factor_;
  1022. //<zheng: add -- the duration in 802.15.4 could be very small and rounded to 0.0>
  1023. if (Nam802_15_4::Nam_Status)
  1024. if (duration < 0.000000001)
  1025. duration = 0.000000001;
  1026. //</zheng: add>
  1027. sprintf(pt_->nbuffer() + strlen(pt_->nbuffer()),
  1028. " -R %.2f -D %.2f",
  1029. radius,
  1030. duration);
  1031. }
  1032. }
  1033. //</zheng>
  1034. offset = strlen(pt_->nbuffer());
  1035. pt_->namdump();
  1036. }
  1037. void CMUTrace::format(Packet* p, const char *why)
  1038. {
  1039. hdr_cmn *ch = HDR_CMN(p);
  1040. int offset = 0;
  1041. /*
  1042.  * Log the MAC Header
  1043.  */
  1044. format_mac_common(p, why, offset);
  1045. if (pt_->namchannel()) 
  1046. nam_format(p, offset);
  1047. offset = strlen(pt_->buffer());
  1048. switch(ch->ptype()) {
  1049. case PT_MAC:
  1050. case PT_SMAC:
  1051. break;
  1052. case PT_ARP:
  1053. format_arp(p, offset);
  1054. break;
  1055. default:
  1056. format_ip(p, offset);
  1057. offset = strlen(pt_->buffer());
  1058. switch(ch->ptype()) {
  1059. case PT_AODV:
  1060. format_aodv(p, offset);
  1061. break;
  1062. case PT_TORA:
  1063.                         format_tora(p, offset);
  1064.                         break;
  1065.                 case PT_IMEP:
  1066.                         format_imep(p, offset);
  1067.                         break;
  1068. case PT_DSR:
  1069. format_dsr(p, offset);
  1070. break;
  1071. case PT_MESSAGE:
  1072. case PT_UDP:
  1073. format_msg(p, offset);
  1074. break;
  1075. case PT_TCP:
  1076. case PT_ACK:
  1077. format_tcp(p, offset);
  1078. break;
  1079. case PT_SCTP:
  1080. /* Armando L. Caro Jr. <acaro@@cis,udel,edu> 6/5/2002
  1081.  */
  1082. format_sctp(p, offset);
  1083. break;
  1084. case PT_CBR:
  1085. format_rtp(p, offset);
  1086. break;
  1087.         case PT_DIFF:
  1088. break;
  1089. case PT_GAF:
  1090. case PT_PING:
  1091. break;
  1092. default:
  1093. if(pktTrc_ && pktTrc_->format_unknow(p, offset, pt_, newtrace_))
  1094. break;
  1095. /*<zheng: del -- there are many more new packet types added, like PT_EXP (poisson traffic belongs to this type)>
  1096. fprintf(stderr, "%s - invalid packet type (%s).n",
  1097. __PRETTY_FUNCTION__, packet_info.name(ch->ptype()));
  1098. exit(1);
  1099. </zheng: del>*/
  1100. break; //zheng: add
  1101. }
  1102. }
  1103. }
  1104. int
  1105. CMUTrace::command(int argc, const char*const* argv)
  1106. {
  1107.         if(argc == 3) {
  1108.                 if(strcmp(argv[1], "node") == 0) {
  1109.                         node_ = (MobileNode*) TclObject::lookup(argv[2]);
  1110.                         if(node_ == 0)
  1111.                                 return TCL_ERROR;
  1112.                         return TCL_OK;
  1113.                 }
  1114. if (strcmp(argv[1], "newtrace") == 0) {
  1115. newtrace_ = atoi(argv[2]);
  1116.         return TCL_OK;
  1117. }
  1118.         }
  1119. return Trace::command(argc, argv);
  1120. }
  1121. /*ARGSUSED*/
  1122. void
  1123. CMUTrace::recv(Packet *p, Handler *h)
  1124. {
  1125. if (!node_energy()) {
  1126. Packet::free(p);
  1127. return;
  1128. }
  1129.         assert(initialized());
  1130.         /*
  1131.          * Agent Trace "stamp" the packet with the optimal route on
  1132.          * sending.
  1133.          */
  1134.         if (tracetype == TR_AGENT && type_ == SEND) {
  1135.                 God::instance()->stampPacket(p);
  1136.         }
  1137. #if 0
  1138.         /*
  1139.          * When the originator of a packet drops the packet, it may or may
  1140.          * not have been stamped by GOD.  Stamp it before logging the
  1141.          * information.
  1142.          */
  1143.         if(src_ == src && type_ == DROP) {
  1144.                 God::instance()->stampPacket(p);
  1145.         }
  1146. #endif
  1147. format(p, "---");
  1148. pt_->dump();
  1149. //namdump();
  1150. if(target_ == 0)
  1151. Packet::free(p);
  1152. else
  1153. send(p, h);
  1154. }
  1155. void
  1156. CMUTrace::recv(Packet *p, const char* why)
  1157. {
  1158.         assert(initialized() && type_ == DROP);
  1159. if (!node_energy()) {
  1160. Packet::free(p);
  1161. return;
  1162. }
  1163. #if 0
  1164.         /*
  1165.          * When the originator of a packet drops the packet, it may or may
  1166.          * not have been stamped by GOD.  Stamp it before logging the
  1167.          * information.
  1168.          */
  1169.         if(src_ == ih->saddr()) {
  1170.                 God::instance()->stampPacket(p);
  1171.         }
  1172. #endif
  1173. format(p, why);
  1174. pt_->dump();
  1175. //namdump();
  1176. Packet::free(p);
  1177. }
  1178. int CMUTrace::node_energy()
  1179. {
  1180. Node* thisnode = Node::get_node_by_address(src_);
  1181. double energy = 1;
  1182. if (thisnode) {
  1183. if (thisnode->energy_model()) {
  1184. energy = thisnode->energy_model()->energy();
  1185. }
  1186. if (energy > 0) return 1;
  1187. return 0;
  1188. }
  1189. //<zheng: ns 2.27 removed the following part, but we need it to control the broadcast radius>
  1190. void CMUTrace::calculate_broadcast_parameters() {
  1191. // Calculate the maximum distance at which a packet can be received
  1192. // based on the two-ray reflection model using the current default
  1193. // values for Phy/WirelessPhy and Antenna/OmniAntenna.
  1194. double P_t, P_r, G_t, G_r, h, L;
  1195. Tcl& tcl = Tcl::instance();
  1196. tcl.evalc("Phy/WirelessPhy set Pt_");
  1197. P_t = atof(tcl.result());
  1198. tcl.evalc("Phy/WirelessPhy set RXThresh_");
  1199. P_r = atof(tcl.result());
  1200. tcl.evalc("Phy/WirelessPhy set L_");
  1201. L = atof(tcl.result());
  1202. tcl.evalc("Antenna/OmniAntenna set Gt_");
  1203. G_t = atof(tcl.result());
  1204. tcl.evalc("Antenna/OmniAntenna set Gr_");
  1205. G_r = atof(tcl.result());
  1206. tcl.evalc("Antenna/OmniAntenna set Z_");
  1207. h = atof(tcl.result());
  1208. bradius = pow(P_t*G_r*G_t*pow(h,4.0)/(P_r*L), 0.25);
  1209. //<zheng: add for 802.15.4>
  1210. //the above calculation is not accurate for short distance
  1211. double PI,freq,lambda,crossover_dist;
  1212. PI = 3.14159265359;
  1213. tcl.evalc("Phy/WirelessPhy set freq_");
  1214. freq = atof(tcl.result());
  1215. lambda = 3.0e8/freq;
  1216. crossover_dist = (4 * PI * h * h) / lambda;
  1217. if (bradius < crossover_dist) //need re-calculation
  1218. bradius = pow(P_t * G_r * G_t * pow(lambda, 2.0)/(P_r * L), 0.5)/(4 * PI);
  1219. //</zheng: add for 802.15.4>
  1220. // Also get the scaling factors
  1221. tcl.evalc("CMUTrace set radius_scaling_factor_");
  1222. radius_scaling_factor_ = atof(tcl.result());
  1223. tcl.evalc("CMUTrace set duration_scaling_factor_");
  1224. duration_scaling_factor_ = atof(tcl.result());
  1225. }
  1226. //</zheng>