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
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049 #include "dumb-agent.h"
00050
00051 static class DumbAgentClass : public TclClass {
00052 public:
00053 DumbAgentClass() : TclClass("Agent/DumbAgent") {}
00054 TclObject* create(int, const char*const*) {
00055 return (new DumbAgent());
00056 }
00057 } class_DumbAgent;
00058
00059 DumbAgent::DumbAgent() : Agent(PT_PING) {}
00060
00061
00062 int DumbAgent::command(int argc, const char*const* argv)
00063 {
00064 if (argc == 3) {
00065 if (strcmp(argv[1], "port-dmux") == 0) {
00066 dmux_ = (PortClassifier *)TclObject::lookup (argv[2]);
00067 if (dmux_ == 0) {
00068 fprintf (stderr, "%s: %s lookup of %s failed\n", __FILE__, argv[1],
00069 argv[2]);
00070 return TCL_ERROR;
00071 }
00072 return TCL_OK;
00073 }
00074 else if (strcmp(argv[1], "tracetarget") == 0) {
00075 tracetarget_ = (Trace *)TclObject::lookup (argv[2]);
00076 if (tracetarget_ == 0) {
00077 fprintf (stderr, "%s: %s lookup of %s failed\n", __FILE__, argv[1],
00078 argv[2]);
00079 return TCL_ERROR;
00080 }
00081 return TCL_OK;
00082 }
00083 }
00084 return Agent::command(argc, argv);
00085 }
00086
00087
00088 void DumbAgent::recv(Packet *p, Handler *h=0)
00089 {
00090
00091 hdr_cmn *ch = HDR_CMN(p);
00092 hdr_ip *iph = HDR_IP(p);
00093
00094 if (ch->direction() == hdr_cmn::UP) {
00095 if ((u_int32_t)iph->daddr() == IP_BROADCAST) {
00096 printf("Recvd brdcast pkt\n");
00097 dmux_->recv(p, 0);
00098
00099 } else {
00100
00101
00102 assert(iph->daddr() == here_.addr_);
00103 printf("Recvd unicast pkt\n");
00104 dmux_->recv(p, 0);
00105 }
00106
00107 } else {
00108 target_->recv(p, (Handler*)0);
00109 }
00110
00111 }
00112
00113 void DumbAgent::trace(char *fmt, ...)
00114 {
00115
00116 va_list ap;
00117
00118 if (!tracetarget_)
00119 return;
00120
00121 va_start (ap, fmt);
00122 vsprintf (tracetarget_->pt_->buffer (), fmt, ap);
00123 tracetarget_->pt_->dump ();
00124 va_end (ap);
00125 }