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 #include "mmac-module.h"
00032 #include "mmac-clmsg.h"
00033
00034 static int MacIndex = 0;
00035
00036 MMacModule::MMacModule() : index_(MacIndex++), ifq_(0)
00037 {
00038 }
00039
00040 MMacModule::~MMacModule()
00041 {
00042 }
00043
00044 int MMacModule::command (int argc, const char *const *argv)
00045 {
00046 Tcl& tcl = Tcl::instance();
00047
00048 if(argc == 2)
00049 {
00050 if (strcasecmp(argv[1],"getIfq")==0)
00051 {
00052 if(ifq_)
00053 {
00054 tcl.result(ifq_->name());
00055 return TCL_OK;
00056 }
00057 else return TCL_ERROR;
00058 }
00059 }
00060 else if(argc == 3)
00061 {
00062 if(strcasecmp(argv[1], "setIfq")==0)
00063 {
00064 ifq_ = dynamic_cast<Queue*>(TclObject::lookup(argv[2]));
00065
00066 if(!ifq_)
00067 return TCL_ERROR;
00068
00069 tcl.evalf("%s target %s",ifq_->name(), name());
00070
00071 return TCL_OK;
00072 }
00073 }
00074
00075
00076 return Module::command(argc,argv);
00077
00078 }
00079
00080 void MMacModule::recv (Packet *p)
00081 {
00082 hdr_cmn *ch = HDR_CMN(p);
00083
00084 if(ch->direction() == hdr_cmn::UP)
00085 {
00086 rx(p);
00087 }
00088 else
00089 {
00090 if(ifq_)
00091 ifq_->recv(p, (Handler*) 0);
00092 else
00093 tx(p);
00094 }
00095 }
00096
00097 void MMacModule::recv(Packet *p, Handler*)
00098 {
00099 hdr_cmn *ch = HDR_CMN(p);
00100
00101 if(ch->direction() == hdr_cmn::UP)
00102 rx(p);
00103 else
00104 tx(p);
00105 }
00106
00107 int MMacModule::crLaySynchronousCommand(ClMessage* m)
00108 {
00109 if(m->type() == MAC_CLMSG_GET_ADDR)
00110 {
00111 if(debug_ > 5)
00112 printf("MMac(1), rx a MAC_CLMSG_GET_ADDR; -> return addr\n");
00113
00114 ((MacClMsgGetAddr *)m)->setAddr(addr());
00115 return 1;
00116 }
00117 return Module::crLaySynchronousCommand(m);
00118 }
00119
00120
00121 int MMacModule::recvSyncClMsg(ClMessage* m)
00122 {
00123 if(m->type() == MAC_CLMSG_GET_ADDR)
00124 {
00125 if(debug_ > 5)
00126 printf("MMac(2), rx a MAC_CLMSG_GET_ADDR; -> return addr\n");
00127
00128 ((MacClMsgGetAddr *)m)->setAddr(addr());
00129 return 1;
00130 }
00131 return Module::recvSyncClMsg(m);
00132 }
00133
00134
00135 int MMacModule::addr()
00136 {
00137 return index_;
00138 }
00139
00140 void MMacModule::resume()
00141 {
00142 if(ifq_)
00143 ifq_->resume();
00144 }