00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #include "ping.h"
00038
00039 int hdr_ping::offset_;
00040 static class PingHeaderClass : public PacketHeaderClass {
00041 public:
00042 PingHeaderClass() : PacketHeaderClass("PacketHeader/Ping",
00043 sizeof(hdr_ping)) {
00044 bind_offset(&hdr_ping::offset_);
00045 }
00046 } class_pinghdr;
00047
00048
00049 static class PingClass : public TclClass {
00050 public:
00051 PingClass() : TclClass("Agent/Ping") {}
00052 TclObject* create(int, const char*const*) {
00053 return (new PingAgent());
00054 }
00055 } class_ping;
00056
00057
00058 PingAgent::PingAgent() : Agent(PT_PING)
00059 {
00060 bind("packetSize_", &size_);
00061 }
00062
00063 int PingAgent::command(int argc, const char*const* argv)
00064 {
00065 if (argc == 2) {
00066 if (strcmp(argv[1], "send") == 0) {
00067
00068 Packet* pkt = allocpkt();
00069
00070 hdr_ping* hdr = hdr_ping::access(pkt);
00071
00072
00073 hdr->ret = 0;
00074
00075 hdr->send_time = Scheduler::instance().clock();
00076
00077 send(pkt, 0);
00078
00079
00080 return (TCL_OK);
00081
00082 }
00083
00084 else if (strcmp(argv[1], "start-WL-brdcast") == 0) {
00085 Packet* pkt = allocpkt();
00086
00087 hdr_ip* iph = HDR_IP(pkt);
00088 hdr_ping* ph = hdr_ping::access(pkt);
00089
00090 iph->daddr() = IP_BROADCAST;
00091 iph->dport() = iph->sport();
00092 ph->ret = 0;
00093 send(pkt, (Handler*) 0);
00094 return (TCL_OK);
00095 }
00096 }
00097
00098
00099
00100 return (Agent::command(argc, argv));
00101 }
00102
00103
00104 void PingAgent::recv(Packet* pkt, Handler*)
00105 {
00106
00107 hdr_ip* hdrip = hdr_ip::access(pkt);
00108
00109
00110 hdr_ping* hdr = hdr_ping::access(pkt);
00111
00112
00113
00114 if ((u_int32_t)hdrip->daddr() == IP_BROADCAST) {
00115 if (hdr->ret == 0) {
00116
00117 printf("Recv BRDCAST Ping REQ : at %d.%d from %d.%d\n", here_.addr_, here_.port_, hdrip->saddr(), hdrip->sport());
00118 Packet::free(pkt);
00119
00120
00121 Packet* pktret = allocpkt();
00122
00123 hdr_ping* hdrret = hdr_ping::access(pktret);
00124 hdr_cmn* ch = HDR_CMN(pktret);
00125 hdr_ip* ipret = hdr_ip::access(pktret);
00126
00127 hdrret->ret = 1;
00128
00129
00130 ipret->daddr() = IP_BROADCAST;
00131 ipret->dport() = ipret->sport();
00132
00133 send(pktret, 0);
00134
00135 } else {
00136 printf("Recv BRDCAST Ping REPLY : at %d.%d from %d.%d\n", here_.addr_, here_.port_, hdrip->saddr(), hdrip->sport());
00137 Packet::free(pkt);
00138 }
00139 return;
00140 }
00141
00142 if (hdr->ret == 0) {
00143
00144 double stime = hdr->send_time;
00145
00146 Packet::free(pkt);
00147
00148 Packet* pktret = allocpkt();
00149
00150 hdr_ping* hdrret = hdr_ping::access(pktret);
00151
00152
00153 hdrret->ret = 1;
00154
00155 hdrret->send_time = stime;
00156
00157 send(pktret, 0);
00158 } else {
00159
00160
00161
00162
00163
00164 char out[100];
00165
00166
00167 sprintf(out, "%s recv %d %3.1f", name(),
00168 hdrip->src_.addr_ >> Address::instance().NodeShift_[1],
00169 (Scheduler::instance().clock()-hdr->send_time) * 1000);
00170 Tcl& tcl = Tcl::instance();
00171 tcl.eval(out);
00172
00173 Packet::free(pkt);
00174 }
00175 }
00176
00177