messpass.cc

Go to the documentation of this file.
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     // check packet size (we don't fragment packets)
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     // check packet size (we don't fragment packets)
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         // If an application is attached, pass the data to the app
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         // otherwise if it's just PacketData, pass it to Tcl
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         // It wasn't PacketData, or userdata() was NULL
00110         // so pass an empty string to Tcl
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 }

Generated on Tue Mar 6 16:47:47 2007 for ns2 Network Simulator 2.29 by  doxygen 1.4.6