⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nodetrace.cc

📁 obs网络试验平台
💻 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 + -