📄 rcagent.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 + -