00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "ping.h"
00010
00011
00012 static class PingHeaderClass : public PacketHeaderClass {
00013 public:
00014 PingHeaderClass() : PacketHeaderClass("PacketHeader/Ping",
00015 sizeof(hdr_ping)) {}
00016 } class_pinghdr;
00017
00018
00019 static class PingClass : public TclClass {
00020 public:
00021 PingClass() : TclClass("Agent/Ping") {}
00022 TclObject* create(int, const char*const*) {
00023 return (new PingAgent());
00024 }
00025 } class_ping;
00026
00027
00028 PingAgent::PingAgent() : Agent(PT_PING)
00029 {
00030 bind("packetSize_", &size_);
00031 bind("off_ping_", &off_ping_);
00032 }
00033
00034
00035 int PingAgent::command(int argc, const char*const* argv)
00036 {
00037 if (argc == 2) {
00038 if (strcmp(argv[1], "send") == 0) {
00039
00040 Packet* pkt = allocpkt();
00041
00042 hdr_ping* hdr = (hdr_ping*)pkt->access(off_ping_);
00043
00044
00045 hdr->ret = 0;
00046
00047 hdr->send_time = Scheduler::instance().clock();
00048
00049 send(pkt, 0);
00050
00051
00052 return (TCL_OK);
00053 }
00054 }
00055
00056
00057 return (Agent::command(argc, argv));
00058 }
00059
00060
00061 void PingAgent::recv(Packet* pkt, Handler*)
00062 {
00063
00064 hdr_ip* hdrip = (hdr_ip*)pkt->access(off_ip_);
00065
00066 hdr_ping* hdr = (hdr_ping*)pkt->access(off_ping_);
00067
00068 if (hdr->ret == 0) {
00069
00070 double stime = hdr->send_time;
00071
00072 Packet::free(pkt);
00073
00074 Packet* pktret = allocpkt();
00075
00076 hdr_ping* hdrret = (hdr_ping*)pktret->access(off_ping_);
00077
00078 hdrret->ret = 1;
00079
00080 hdrret->send_time = stime;
00081
00082 send(pktret, 0);
00083 } else {
00084
00085
00086
00087
00088
00089 char out[100];
00090
00091
00092 sprintf(out, "%s recv %d %3.1f", name(),
00093 hdrip->src_ >> Address::instance().NodeShift_[1],
00094 (Scheduler::instance().clock()-hdr->send_time) * 1000);
00095 Tcl& tcl = Tcl::instance();
00096 tcl.eval(out);
00097
00098 Packet::free(pkt);
00099 }
00100 }
00101
00102