📄 trace.cc.cc
字号:
/* -*- Mode:C++; c-basic-offset:8; tab-width:8 -*- */
/*
* Copyright (c) 1990-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.
*
* @(#) $Header: /usr/src/mash/repository/vint/ns-2/trace.cc,v 1.58 1999/03/13 03:53:10 haoboy Exp $ (LBL)
*/
#include <stdio.h>
#include <stdlib.h>
#include "packet.h"
#include "ip.h"
#include "tcp.h"
#include "rtp.h"
#include "srm.h"
#include "flags.h"
#include "address.h"
#include "trace.h"
#include "Temporary_class.h"
const double Trace::PRECISION = 1.0e+6;
class TraceClass : public TclClass {
public:
TraceClass() : TclClass("Trace") { }
TclObject* create(int argc, const char*const* argv) {
if (argc >= 5)
return (new Trace(*argv[4]));
return 0;
}
} trace_class;
Trace::Trace(int type)
: Connector(), type_(type), src_(0), dst_(0), channel_(0), callback_(0)
#ifdef NAM_TRACE
, namChan_(0)
#endif
{
bind("src_", (int*)&src_);
bind("dst_", (int*)&dst_);
bind("callback_", &callback_);
bind("show_tcphdr_", &show_tcphdr_);
#ifdef OFF_HDR
bind("off_ip_", &off_ip_);
bind("off_tcp_", &off_tcp_);
bind("off_rtp_", &off_rtp_);
bind("off_srm_", &off_srm_);
#endif
//begin archana krishna
bind("off_cmn_", &off_cmn_);
bind("off_ip_", &off_ip_);
bind("off_rtp_", &off_rtp_);
bind("bandwidth_", &bandwidth_);
bind("congest1_", &congest1_);
bind("congest2_", &congest2_);
if(measure == NULL)
{
measure = new Measure[NUMOFPACKS];
}
//end archana krishna
}
Trace::~Trace()
{
//begin archanakrishna
delete [] measure;
//end archanakrishna
}
/*
* $trace detach
* $trace flush
* $trace attach $fileID
*/
int Trace::command(int argc, const char*const* argv)
{
Tcl& tcl = Tcl::instance();
if (argc == 2) {
if (strcmp(argv[1], "detach") == 0) {
channel_ = 0;
#ifdef NAM_TRACE
namChan_ = 0;
#endif
return (TCL_OK);
}
if (strcmp(argv[1], "flush") == 0) {
#ifdef NAM_TRACE
if (channel_ != 0)
Tcl_Flush(channel_);
if (namChan_ != 0)
Tcl_Flush(namChan_);
#else
Tcl_Flush(channel_);
#endif
return (TCL_OK);
}
} else if (argc == 3) {
if (strcmp(argv[1], "annotate") == 0) {
if (channel_ != 0)
annotate(argv[2]);
return (TCL_OK);
}
if (strcmp(argv[1], "attach") == 0) {
int mode;
const char* id = argv[2];
channel_ = Tcl_GetChannel(tcl.interp(), (char*)id,
&mode);
if (channel_ == 0) {
tcl.resultf("trace: can't attach %s for writing", id);
return (TCL_ERROR);
}
return (TCL_OK);
}
#ifdef NAM_TRACE
if (strcmp(argv[1], "namattach") == 0) {
int mode;
const char* id = argv[2];
namChan_ = Tcl_GetChannel(tcl.interp(), (char*)id,
&mode);
if (namChan_ == 0) {
tcl.resultf("trace: can't attach %s for writing", id);
return (TCL_ERROR);
}
return (TCL_OK);
}
if (strcmp(argv[1], "ntrace") == 0) {
if (namChan_ != 0)
write_nam_trace(argv[2]);
return (TCL_OK);
}
#endif
}
return (Connector::command(argc, argv));
}
#ifdef NAM_TRACE
void Trace::write_nam_trace(const char *s)
{
sprintf(nwrk_, "%s", s);
namdump();
}
#endif
void Trace::annotate(const char* s)
{
sprintf(wrk_, "v %g eval {set sim_annotation {%s}}",
round(Scheduler::instance().clock()), s);
dump();
sprintf(nwrk_, "v -t %.17g sim_annotation %g %s",
Scheduler::instance().clock(),
Scheduler::instance().clock(), s);
namdump();
}
char* srm_names[] = {
SRM_NAMES
};
// this function should retain some backward-compatibility, so that
// scripts don't break.
void Trace::format(int tt, int s, int d, Packet* p)
{
#ifdef OFF_HDR
hdr_cmn *th = (hdr_cmn*)p->access(off_cmn_);
hdr_ip *iph = (hdr_ip*)p->access(off_ip_);
hdr_tcp *tcph = (hdr_tcp*)p->access(off_tcp_);
hdr_rtp *rh = (hdr_rtp*)p->access(off_rtp_);
hdr_srm *sh = (hdr_srm*)p->access(off_srm_);
#else
hdr_cmn *th = hdr_cmn::access(p);
hdr_ip *iph = hdr_ip::access(p);
hdr_tcp *tcph = hdr_tcp::access(p);
hdr_rtp *rh = hdr_rtp::access(p);
hdr_srm *sh = hdr_srm::access(p);
#endif
const char* sname = "null";
packet_t t = th->ptype();
const char* name = packet_info.name(t);
/* SRM-specific */
if (strcmp(name,"SRM") == 0 || strcmp(name,"cbr") == 0 || strcmp(name,"udp") == 0) {
if ( sh->type() < 5 && sh->type() > 0 ) {
sname = srm_names[sh->type()];
}
}
if (name == 0)
abort();
int seqno;
/* XXX */
/* UDP's now have seqno's too */
if (t == PT_RTP || t == PT_CBR || t == PT_UDP || t == PT_EXP ||
t == PT_PARETO)
seqno = rh->seqno();
else if (t == PT_TCP || t == PT_ACK || t == PT_HTTP || t == PT_FTP ||
t == PT_TELNET)
seqno = tcph->seqno();
else
seqno = -1;
/*
* When new flags are added, make sure to change NUMFLAGS
* in trace.h
*/
char flags[NUMFLAGS+1];
for (int i = 0; i < NUMFLAGS; i++)
flags[i] = '-';
flags[NUMFLAGS] = 0;
#ifdef OFF_HDR
hdr_flags* hf = (hdr_flags*)p->access(off_flags_);
#else
hdr_flags* hf = hdr_flags::access(p);
#endif
flags[0] = hf->ecn_ ? 'C' : '-'; // Ecn Echo
flags[1] = hf->pri_ ? 'P' : '-';
flags[2] = '-';
flags[3] = hf->cong_action_ ? 'A' : '-'; // Congestion Action
flags[4] = hf->ecn_to_echo_ ? 'E' : '-'; // Congestion Experienced
flags[5] = hf->fs_ ? 'F' : '-';
flags[6] = hf->ecn_capable_ ? 'N' : '-';
#ifdef notdef
flags[1] = (iph->flags() & PF_PRI) ? 'P' : '-';
flags[2] = (iph->flags() & PF_USR1) ? '1' : '-';
flags[3] = (iph->flags() & PF_USR2) ? '2' : '-';
flags[5] = 0;
#endif
char *src_nodeaddr = Address::instance().print_nodeaddr(iph->src());
char *src_portaddr = Address::instance().print_portaddr(iph->src());
char *dst_nodeaddr = Address::instance().print_nodeaddr(iph->dst());
char *dst_portaddr = Address::instance().print_portaddr(iph->dst());
if (!show_tcphdr_) {
sprintf(wrk_, "%c %12.7f %d %d %s %d %s %d %s%s %s%s %d %d",
tt,
round(Scheduler::instance().clock()),
s,
d,
name,
th->size(),
flags,
iph->flowid() /* was p->class_ */,
src_nodeaddr,
src_portaddr,
dst_nodeaddr,
dst_portaddr,
seqno,
th->uid() /* was p->uid_ */);
} else {
sprintf(wrk_,
"%c %g %d %d %s %d %s %d %s%s %s%s %d %d %d 0x%x %d %d",
tt,
round(Scheduler::instance().clock()),
s,
d,
name,
th->size(),
flags,
iph->flowid(), /* was p->class_ */
src_nodeaddr,
src_portaddr,
dst_nodeaddr,
dst_portaddr,
seqno,
th->uid(), /* was p->uid_ */
tcph->ackno(),
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -