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 #include "wirelessphy-module.h"
00031
00032 static class WirelessPhyModuleClass : public TclClass {
00033 public:
00034 WirelessPhyModuleClass() : TclClass("Module/Phy") {}
00035 TclObject* create(int, const char*const*) {
00036 return (new WirelessPhyModule());
00037
00038 }
00039 } class_wirelessphymodule;
00040
00041 WirelessPhyModule::WirelessPhyModule() : Module(), phy_(0)
00042 {
00043 }
00044
00045 WirelessPhyModule::~WirelessPhyModule()
00046 {
00047 }
00048
00049 int WirelessPhyModule::command(int argc, const char*const* argv)
00050 {
00051
00052 Tcl& tcl = Tcl::instance();
00053 if(argc == 2)
00054 {
00055 if(strcasecmp(argv[1], "getPhy")==0)
00056 {
00057 if(phy_)
00058 tcl.result(phy_->name());
00059 else
00060 return TCL_ERROR;
00061 return TCL_OK;
00062 }
00063 }
00064 else if(argc == 3)
00065 {
00066 if(strcasecmp(argv[1], "setPhy")==0)
00067 {
00068 phy_ = (Phy *)TclObject::lookup(argv[2]);
00069 if(!phy_)
00070 return TCL_ERROR;
00071 tcl.evalf("%s channel %s",phy_->name(), name());
00072 return TCL_OK;
00073 }
00074 }
00075 return Module::command(argc, argv);
00076 }
00077
00078 void WirelessPhyModule::recv(Packet *p)
00079 {
00080 if(phy_){
00081
00082
00083 hdr_MrclWrlPhy *wph = HDR_MRCLWRLPHY(p);
00084 wph->destPos_ = getPosition();
00085 phy_->recv(p, 0);
00086 }
00087 else
00088 {
00089 fprintf(stderr, "WirelessPhyModule: there is no PHY connected!!");
00090 exit(1);
00091 }
00092 }
00093
00094 void WirelessPhyModule::recv(Packet *p, Handler *callback)
00095 {
00096 hdr_cmn *ch = HDR_CMN(p);
00097 if(ch->direction() == hdr_cmn::DOWN)
00098 {
00099
00100
00101 hdr_MrclWrlPhy *wph = HDR_MRCLWRLPHY(p);
00102 wph->sourcePos_ = getPosition();
00103 wph->destPos_ = 0;
00104 sendDown(p);
00105 }
00106 else
00107 {
00108 sendUp(p);
00109 }
00110 }
00111
00112
00113