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

📄 rcagent.cc

📁 可以在ns-2中进行仿真的SPIN路由协议的源码
💻 CC
字号:
/* -*-	Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- *//* * Copyright (C) Xerox Corporation 1997. All rights reserved. *   * License is granted to copy, to use, and to make and to use derivative * works for research and evaluation purposes, provided that Xerox is * acknowledged in all documentation pertaining to any such copy or derivative * work. Xerox grants no other licenses expressed or implied. The Xerox trade * name should not be used in any advertising without its written permission. *   * XEROX CORPORATION MAKES NO REPRESENTATIONS CONCERNING EITHER THE * MERCHANTABILITY OF THIS SOFTWARE OR THE SUITABILITY OF THIS SOFTWARE * FOR ANY PARTICULAR PURPOSE.  The software is provided "as is" without * express or implied warranty of any kind. *   * These notices must be retained in any copies of any part of this software. */#ifndef lintstatic const char rcsid[] =    "@(#) $Header: /var/cvs/sensnet.ns-2/mit/rca/rcagent.cc,v 1.1.1.1 1999/06/09 14:43:19 hari Exp $ (Xerox)";#endif#include <object.h>#include <agent.h>#include <trace.h>#include <packet.h>#include <scheduler.h>#include <mac.h>#include <ll.h>#include <cmu-trace.h>#include "rcagent.h"#include "rtp.h"#include "random.h"#include "ip.h"static class RCAgentClass : public TclClass {public:	RCAgentClass() : TclClass("Agent/RCAgent") {}	TclObject* create(int, const char*const*) {		return (new RCAgent());	}} class_rc_agent;RCAgent::RCAgent() : Agent(PT_RCA){	ll = 0;	bind("packetSize_", &size_);	bind("packetMsg_", &packetMsg_);}RCAgent::~RCAgent(){}intRCAgent::command(int argc, const char*const* argv){	TclObject *obj;  	Tcl& tcl = Tcl::instance();	if (argc == 3) {		if(strcmp(argv[1], "log-target") == 0) {			log_target = (Trace*) TclObject::lookup(argv[2]);			if(log_target == 0)				return TCL_ERROR;			return TCL_OK;		} else if(strcmp(argv[1], "log") == 0) {			log(argv[2]);			return TCL_OK;		}	} else if (argc == 4)	{		if (strcasecmp(argv[1], "add-ll") == 0) {			if( (obj = TclObject::lookup(argv[2])) == 0) {				fprintf(stderr, "RCAgent: %s lookup of %s failed\n", argv[1],					argv[2]);				return TCL_ERROR;			}			ll = (NsObject*) obj;			if( (obj = TclObject::lookup(argv[3])) == 0) {				fprintf(stderr, "RCAgent: %s lookup of %s failed\n", argv[1],					argv[2]);				return TCL_ERROR;			}			mac = (Mac*) obj;			return TCL_OK;		}	} else if (argc == 5) {		if (strcmp(argv[1], "sendmsg") == 0) {			int destination;			if (Tcl_GetInt(tcl.interp(),(char *)argv[4], &destination) != TCL_OK) {				fprintf(stderr, "RCAgent: could not convert %s to int", argv[4]);				return TCL_ERROR;			}			RCAgent::sendmsg(atoi(argv[2]), argv[3], destination, -1);			return (TCL_OK);		}	} else if (argc == 6) {		if (strcmp(argv[1], "sendmsg") == 0) {			int mac_dst;			if (Tcl_GetInt(tcl.interp(),(char *)argv[4], &mac_dst) != TCL_OK) {				fprintf(stderr, "RCAgent: could not convert %s to int", argv[4]);				return TCL_ERROR;			}			int link_dst;			if (Tcl_GetInt(tcl.interp(),(char *)argv[5], &link_dst) != TCL_OK) {				fprintf(stderr, "RCAgent: could not convert %s to int", argv[5]);				return TCL_ERROR;			}			RCAgent::sendmsg(atoi(argv[2]), argv[3], mac_dst, link_dst);			return (TCL_OK);		}	}	return Agent::command(argc, argv);}void RCAgent::sendmsg(int data_size, const char* meta_data, int mac_dst, int link_dst) {	Packet *p = allocpkt();	hdr_cmn *hdr = HDR_CMN(p);	hdr->size() = data_size;  hdr_rca *rca_hdr = HDR_RCA(p);	rca_hdr->msg_type() = packetMsg_;	rca_hdr->set_meta(meta_data);	rca_hdr->rca_mac_dst() = mac_dst;	rca_hdr->rca_link_dst() = link_dst;	rca_hdr->rca_src() = mac->addr();	//printf("Sending: Type=%d data_size=%d\n\tMeta = %s\n\tSource=%x\n\tTarget = %x\n",rca_hdr->msg_type(), hdr->size(), rca_hdr->meta(),rca_hdr->rca_src(),rca_hdr->rca_mac_dst());	//printf("\tTime = %f\n",Scheduler::instance().clock());	//printf("\tLink_dst = %x\n",rca_hdr->rca_link_dst());	//Packet::PrintRcHeader(p,"RCAgent");	Scheduler::instance().schedule(ll, p, 0); 		return;}void RCAgent::recv(Packet* p, Handler*){  hdr_cmn *hdr = HDR_CMN(p);  hdr_rca *rca_hdr = HDR_RCA(p);	//printf("Receiving: Link_dst = %x, Type=%d data_size=%d\n\tMeta = %s, source = %d\n",rca_hdr->rca_link_dst(),rca_hdr->msg_type(), hdr->size(), rca_hdr->meta(),rca_hdr->rca_src());	packetMsg_ = rca_hdr->msg_type();	if (app_)		app_->recv(rca_hdr->rca_link_dst(), hdr->size(), rca_hdr->meta(),							 rca_hdr->rca_src());	/*	 * didn't expect packet (or we're a null agent?)	 */	Packet::free(p);}void RCAgent::log(const char *msg){        if (!log_target) return;	Scheduler& s = Scheduler::instance();	sprintf(log_target->buffer(),		"C %.5f %s",		s.clock(),		msg);	log_target->dump();}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -