00001 #ifndef lint
00002 static const char rcsid[] =
00003 "@(#) $Header: /nfs/jade/vint/CVSROOT/ns-2/common/messpass.cc,v 1.3 2003/11/27 23:27:19 xuanc Exp $";
00004 #endif
00005
00006 #include "messpass.h"
00007 #include "rtp.h"
00008 #include "random.h"
00009 #include "address.h"
00010 #include "ip.h"
00011
00012
00013 static class MessagePassingAgentClass : public TclClass {
00014 public:
00015 MessagePassingAgentClass() : TclClass("Agent/MessagePassing") {}
00016 TclObject* create(int, const char*const*) {
00017 return (new MessagePassingAgent());
00018 }
00019 } class_message_passing_agent;
00020
00021 MessagePassingAgent::MessagePassingAgent() : Agent(PT_MESSAGE), seqno_(-1)
00022 {
00023 bind("packetSize_", &size_);
00024 }
00025
00026 MessagePassingAgent::MessagePassingAgent(packet_t type) : Agent(type)
00027 {
00028 bind("packetSize_", &size_);
00029 }
00030
00031 void MessagePassingAgent::sendmsg(int nbytes, AppData* data, const char* flags)
00032 {
00033 Packet *p;
00034
00035 if (nbytes == -1) {
00036 printf("Error: sendmsg() for MessagePassingAgent should not be -1\n");
00037 return;
00038 }
00039
00040
00041 if (nbytes > size_) {
00042 printf("Error: packet greater than maximum MessagePassingAgent packet size\n");
00043 return;
00044 }
00045
00046 double local_time = Scheduler::instance().clock();
00047 p = allocpkt();
00048 hdr_cmn::access(p)->size() = nbytes;
00049 hdr_rtp* rh = hdr_rtp::access(p);
00050 rh->flags() = 0;
00051 rh->seqno() = ++seqno_;
00052 hdr_cmn::access(p)->timestamp() =
00053 (u_int32_t)(SAMPLERATE*local_time);
00054 p->setdata(data);
00055 target_->recv(p);
00056 idle();
00057 }
00058
00059
00060 void MessagePassingAgent::sendto(int nbytes, AppData *data, const char* flags, ns_addr_t dst)
00061 {
00062 Packet *p;
00063
00064 if (nbytes == -1) {
00065 printf("Error: packet size for MessagePassingAgent should not be -1\n");
00066 return;
00067 }
00068
00069
00070 if (nbytes > size_) {
00071 printf("Error: packet greater than maximum MessagePassingAgent packet size\n");
00072 return;
00073 }
00074
00075 double local_time = Scheduler::instance().clock();
00076 p = allocpkt();
00077 hdr_ip* iph = hdr_ip::access(p);
00078 iph->daddr() = dst.addr_;
00079 iph->dport() = dst.port_;
00080 hdr_cmn::access(p)->size() = nbytes;
00081 hdr_rtp* rh = hdr_rtp::access(p);
00082 rh->flags() = 0;
00083 rh->seqno() = ++seqno_;
00084 hdr_cmn::access(p)->timestamp() =
00085 (u_int32_t)(SAMPLERATE*local_time);
00086 p->setdata(data);
00087 target_->recv(p);
00088 idle();
00089 }
00090
00091
00092 void MessagePassingAgent::recv(Packet* pkt, Handler*)
00093 {
00094 if (app_ ) {
00095
00096 hdr_cmn* h = hdr_cmn::access(pkt);
00097 app_->process_data(h->size(), pkt->userdata());
00098 } else if (pkt->userdata() && pkt->userdata()->type() == PACKET_DATA) {
00099
00100
00101 PacketData* data = (PacketData*)pkt->userdata();
00102
00103 hdr_ip* iph = hdr_ip::access(pkt);
00104 Tcl& tcl = Tcl::instance();
00105 tcl.evalf("%s recv %d %d %d {%s}", name(),
00106 iph->saddr(), iph->sport(),
00107 hdr_cmn::access(pkt)->size(), data->data());
00108 } else {
00109
00110
00111
00112
00113 hdr_ip* iph = hdr_ip::access(pkt);
00114 Tcl& tcl = Tcl::instance();
00115 tcl.evalf("%s recv %d %d %d {}", name(),
00116 iph->saddr(), iph->sport(),
00117 hdr_cmn::access(pkt)->size());
00118
00119 }
00120 Packet::free(pkt);
00121 }
00122
00123
00124 int MessagePassingAgent::command(int argc, const char*const* argv)
00125 {
00126 PacketData* data;
00127 ns_addr_t dst;
00128
00129 if (argc == 4) {
00130 if (strcmp(argv[1], "send") == 0) {
00131 data = new PacketData(1 + strlen(argv[3]));
00132 strcpy((char*)data->data(), argv[3]);
00133 sendmsg(atoi(argv[2]), data);
00134 return TCL_OK;
00135 }
00136 } else if (argc == 5) {
00137 if (strcmp(argv[1], "sendmsg") == 0) {
00138 data = new PacketData(1 + strlen(argv[3]));
00139 strcpy((char*)data->data(), argv[3]);
00140 sendmsg(atoi(argv[2]), data, argv[4]);
00141 return TCL_OK;
00142 } else if (strcmp(argv[1], "sendto") == 0) {
00143 dst.addr_ = atoi(argv[3]);
00144 dst.port_ = atoi(argv[4]);
00145 if (dst.port_ == 0) dst.port_ = here_.port_;
00146 sendto(atoi(argv[2]), 0, dst);
00147 return TCL_OK;
00148 }
00149 } else if (argc == 6) {
00150 if (strcmp(argv[1], "sendto") == 0) {
00151 data = new PacketData(1 + strlen(argv[3]));
00152 strcpy((char*)data->data(), argv[3]);
00153 dst.addr_ = atoi(argv[4]);
00154 dst.port_ = atoi(argv[5]);
00155 if (dst.port_ == 0) dst.port_ = here_.port_;
00156 sendto(atoi(argv[2]), data, 0, dst);
00157 return TCL_OK;
00158 } else if (strcmp(argv[1], "sendmsgto") == 0) {
00159 dst.addr_ = atoi(argv[3]);
00160 dst.port_ = atoi(argv[4]);
00161 if (dst.port_ == 0) dst.port_ = here_.port_;
00162 sendto(atoi(argv[2]), argv[5], dst);
00163 return TCL_OK;
00164 }
00165 } else if (argc == 7) {
00166 if (strcmp(argv[1], "sendmsgto") == 0) {
00167 data = new PacketData(1 + strlen(argv[3]));
00168 strcpy((char*)data->data(), argv[3]);
00169 dst.addr_ = atoi(argv[4]);
00170 dst.port_ = atoi(argv[5]);
00171 if (dst.port_ == 0) dst.port_ = here_.port_;
00172 sendto(atoi(argv[2]), argv[6], dst);
00173 return TCL_OK;
00174 }}
00175 return (Agent::command(argc, argv));
00176 }