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

📄 prototest.cc

📁 一个自己实现的无线传感器网络源码
💻 CC
字号:
#include "Prototest.h"#include "Prototest_pkt.h"#include <random.h>#include <cmu-trace.h>#include <iostream>int hdr_prototest_pkt::offset_;static class PrototestHeaderClass : public PacketHeaderClass {	public:	PrototestHeaderClass() : PacketHeaderClass("PacketHeader/Prototest", sizeof(hdr_prototest_pkt)) {		bind_offset(&hdr_protoname_pkt::offset_);	}} class_rtProtoPrototest_hdr;static class PrototestClass : public TclClass {	public:	PrototestClass() : TclClass("Agent/Prototest") {}	TclObject* create(int argc, const char*const* argv) {		assert(argc == 5);		return (new Prototest((nsaddr_t) Address::instance().str2addr(argv[4])));	}} class_rtProtoPrototest;voidPrototest_PktTimer::expire(Event* e) {  	agent_->send_prototest_pkt();  	agent_->reset_prototest_pkt_timer();}Prototest::Prototest(nsaddr_t id) : Agent(PT_PROTONAME), pkt_timer_(this) { 	bind_bool("accesible_var_", &accesible_var_); 	ra_addr_ = id;  	node_ = (MobileNode*)Node::get_node_by_address(id);}intPrototest::command(int argc, const char*const* argv) { 	if (argc == 2) { 		if (strcasecmp(argv[1], "start") == 0) { 			pkt_timer_.resched(0.0); 			return TCL_OK; 		} 		else if (strcasecmp(argv[1], "print_rtable") == 0) { 			if (logtarget_ != 0) { 				sprintf(logtarget_->pt_->buffer(), "P %f _%d_ Routing Table", CURRENT_TIME, ra_addr()); 				logtarget_->pt_->dump(); 				rtable_.print(logtarget_); 			} 			else { 				fprintf(stdout, "%f _%d_ If you want to print this routing table " 				"you must create a trace file in your tcl script", CURRENT_TIME, ra_addr()); 			} 			return TCL_OK; 		} 	} 	else if (argc == 3) { 	// Obtains corresponding dmux to carry packets to upper layers 		if (strcmp(argv[1], "port-dmux") == 0) { 			dmux_ = (PortClassifier*)TclObject::lookup(argv[2]); 			if (dmux_ == 0) { 				fprintf(stderr, "%s: %s lookup of %s failed\n", __FILE__, argv[1], argv[2]);			 return TCL_ERROR; 			} 			return TCL_OK; 		} 		// Obtains corresponding tracer 		else if (strcmp(argv[1], "log-target") == 0 || strcmp(argv[1], "tracetarget") == 0) { 			logtarget_ = (Trace*)TclObject::lookup(argv[2]); 			if (logtarget_ == 0) 				return TCL_ERROR;			return TCL_OK; 		} 	} 	// Pass the command to the base class 	return Agent::command(argc, argv);}voidPrototest::recv(Packet* p, Handler* h) {	struct hdr_cmn* ch = HDR_CMN(p); 	struct hdr_ip* ih = HDR_IP(p); 	if (ih->saddr() == ra_addr()) { 		// If there exists a loop, must drop the packet 		if (ch->num_forwards() > 0) { 			drop(p, DROP_RTR_ROUTE_LOOP); 			return; 		} 		// else if this is a packet I am originating, must add IP header 		else if (ch->num_forwards() == 0) 			ch->size() += IP_HDR_LEN; 	} 	// If it is a protoname packet, must process it 	if (ch->ptype() == PT_PROTOTEST) 		recv_prototest_pkt(p); 	// Otherwise, must forward the packet (unless TTL has reached zero) 	else { 		ih->ttl_--; 		if (ih->ttl_ == 0) { 			drop(p, DROP_RTR_TTL); 			return; 		} 		forward_data(p); 	}}voidPrototest::recv_prototest_pkt(Packet* p) {	struct hdr_ip* ih = HDR_IP(p);	struct hdr_prototest_pkt* ph = HDR_PROTOTEST_PKT(p); 	// All routing messages are sent from and to port RT_PORT, 	// so we check it. 	assert(ih->sport() == RT_PORT); 	assert(ih->dport() == RT_PORT); 	/* ... processing of protoname packet ... */ 	// Release resources 	Packet::free(p);}voidPrototest::send_prototest_pkt() {	Packet* p = allocpkt(); 	struct hdr_cmn* ch = HDR_CMN(p); 	struct hdr_ip* ih = HDR_IP(p); 	struct hdr_prototest_pkt* ph = HDR_PROTOTEST_PKT(p); 	ph->pkt_src() = ra_addr(); 	ph->pkt_len() = 7; 	ph->pkt_seq_num() = seq_num_++; 	ch->ptype() = PT_PROTOTEST; 	ch->direction() = hdr_cmn::DOWN; 	ch->size() = IP_HDR_LEN + ph->pkt_len(); 	ch->error() = 0; 	ch->next_hop() = IP_BROADCAST; 	ch->addr_type() = NS_AF_INET; 	ih->saddr() = ra_addr();	ih->daddr() = IP_BROADCAST; 	ih->sport() = RT_PORT; 	ih->dport() = RT_PORT; 	ih->ttl() = IP_DEF_TTL; 	Scheduler::instance().schedule(target_, p, JITTER);}voidPrototest::reset_prototest_pkt_timer() {	pkt_timer_.resched((double)5.0);}voidPrototest::forward_data(Packet* p) {      struct hdr_cmn* ch = HDR_CMN(p);      struct hdr_ip* ih = HDR_IP(p);        if (ch->direction() == hdr_cmn::UP &&          ((u_int32_t)ih->daddr() == IP_BROADCAST || ih->daddr() == ra_addr())) {          dmux_->recv(p, 0);          return;     }     else {         ch->direction() = hdr_cmn::DOWN;         ch->addr_type() = NS_AF_INET;         if ((u_int32_t)ih->daddr() == IP_BROADCAST)             ch->next_hop() = IP_BROADCAST;         else {             nsaddr_t next_hop = rtable_.lookup(ih->daddr());             if (next_hop == IP_BROADCAST) {                 debug("%f: Agent %d can not forward a packet destined to %d\n",                     CURRENT_TIME,                     ra_addr(),                     ih->daddr());                 drop(p, DROP_RTR_NO_ROUTE);                 return;             }             else                 ch->next_hop() = next_hop;         }         Scheduler::instance().schedule(target_, p, 0.0);     }}

⌨️ 快捷键说明

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