📄 nodetrace.cc
字号:
/* -*- Mode:C++; c-basic-offset:8; tab-width:8 -*- *//* */#include <stdio.h>#include <stdlib.h>#include "nodetrace.h"#include "packet.h"#include "ip.h"#include "tcp.h"#include "rtp.h"#include "srm.h"#include "tfrc.h"#include "flags.h"#include "address.h"#include "trace.h"#include "rap/rap.h"//const double NodeTrace::PRECISION = 1.0e+6; NodeTrace *NodeTrace::instance__ = NULL;int NodeTrace::trace_on_ = 0;Tcl_Channel NodeTrace::channel_ = 0;bool NodeTrace::tagged_ = 0;char* NodeTrace::wrk_ = NULL;static class NodeTraceClass : public TclClass {public: NodeTraceClass() : TclClass("NodeTrace") { } TclObject* create(int argc, const char*const* argv) { return (new NodeTrace()); }} nodetrace_class;NodeTrace::NodeTrace() { wrk_ = new char[1026]; bind ("trace_on", &trace_on_);}NodeTrace::~NodeTrace(){ delete wrk_;}NodeTrace& NodeTrace::instance(){ if (instance__ == NULL) instance__ = new NodeTrace(); return ( *instance__);}void NodeTrace::dump(){ int n = strlen(wrk_); if ((n > 0) && (channel_ != 0)) { /* * tack on a newline (temporarily) instead * of doing two writes */ wrk_[n] = '\n'; wrk_[n + 1] = 0; (void)Tcl_Write(channel_, wrk_, n + 1); //Tcl_Flush(channel_); wrk_[n] = 0; }}/* * $nodetrace attach $fileID * $nodetrace flush */int NodeTrace::command(int argc, const char*const* argv){ Tcl& tcl = Tcl::instance(); if (argc == 2) { if (strcmp(argv[1], "detach") == 0) { channel_ = 0; return (TCL_OK); } if (strcmp(argv[1], "flush") == 0) { if (channel_ != 0) Tcl_Flush(channel_); return (TCL_OK); } if (strcmp(argv[1], "tagged") == 0) { tcl.resultf("%d", tagged()); return (TCL_OK); } } else if (argc == 3) { 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("nodetrace: can't attach %s for writing", id); return (TCL_ERROR); } return (TCL_OK); } if (strcmp(argv[1], "tagged") == 0) { int tag; if (Tcl_GetBoolean(tcl.interp(), (char*)argv[2], &tag) == TCL_OK) { tagged(tag); return (TCL_OK); } else return (TCL_ERROR); } } return (TclObject::command(argc, argv));}char* srm_names1[] = { SRM_NAMES};int NodeTrace::get_seqno(Packet* p){ hdr_cmn *th = hdr_cmn::access(p); hdr_tcp *tcph = hdr_tcp::access(p); hdr_rtp *rh = hdr_rtp::access(p); hdr_rap *raph = hdr_rap::access(p); hdr_tfrc *tfrch = hdr_tfrc::access(p); packet_t t = th->ptype(); int seqno; /* UDP's now have seqno's too */ if (t == PT_RTP || t == PT_CBR || t == PT_UDP || t == PT_EXP || t == PT_PARETO || t == PT_SELFSIM) seqno = rh->seqno(); else if (t == PT_RAP_DATA || t == PT_RAP_ACK) seqno = raph->seqno(); else if (t == PT_TCP || t == PT_ACK || t == PT_HTTP || t == PT_FTP || t == PT_TELNET) seqno = tcph->seqno(); else if (t == PT_TFRC) seqno = tfrch->seqno; else seqno = -1; return seqno;}void NodeTrace::format(int tt, char* nodeaddress, Packet* p){ hdr_cmn *th = hdr_cmn::access(p); hdr_ip *iph = hdr_ip::access(p); hdr_tcp *tcph = hdr_tcp::access(p); hdr_srm *sh = hdr_srm::access(p); 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_names1[sh->type()]; } } if (name == 0) abort(); int seqno = get_seqno(p); /* * 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; hdr_flags* hf = hdr_flags::access(p); 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' : '-'; // Fast start: see tcp-fs and tcp-int 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->saddr()); char *src_portaddr = Address::instance().print_portaddr(iph->sport()); char *dst_nodeaddr = Address::instance().print_nodeaddr(iph->daddr()); char *dst_portaddr = Address::instance().print_portaddr(iph->dport()); int priority = iph->prio_; sprintf(buffer(), "%c "TIME_FORMAT" %s %s %d %s %d %s.%s %s.%s %d %d %d", tt, round(Scheduler::instance().clock()), nodeaddress, name, th->size(), flags, iph->flowid() /* was p->class_ */, // iph->src() >> (Address::instance().NodeShift_[1]), // iph->src() & (Address::instance().PortMask_), // iph->dst() >> (Address::instance().NodeShift_[1]), // iph->dst() & (Address::instance().PortMask_), src_nodeaddr, src_portaddr, dst_nodeaddr, dst_portaddr, seqno, th->uid(), /* was p->uid_ */ priority); delete [] src_nodeaddr; delete [] src_portaddr; delete [] dst_nodeaddr; delete [] dst_portaddr;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -