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 <iostream>
00031
00032 #include"link_channel.h"
00033
00034
00035
00036 class LinkChannelModuleClass : public TclClass {
00037 public:
00038 LinkChannelModuleClass() : TclClass("Module/Link") {}
00039 TclObject* create(int, const char*const*) {
00040 return (new LinkChannelModule());
00041 }
00042 } class_module_channel_link;
00043
00044
00045 LinkChannelModule::LinkChannelModule() : linkhead_(0), srcsap(0), dstsap(0)
00046 {
00047
00048 }
00049
00050 LinkChannelModule::~LinkChannelModule()
00051 {
00052
00053 }
00054
00055
00056
00057 int LinkChannelModule::command(int argc, const char*const* argv)
00058 {
00059
00060 Tcl& tcl = Tcl::instance();
00061
00062 if(argc == 3)
00063 {
00064
00065 if (strcasecmp(argv[1],"addsap")==0)
00066 {
00067
00068
00069 ChSAP *chsap = dynamic_cast<ChSAP*>(TclObject::lookup(argv[2]));
00070
00071 if (srcsap == NULL)
00072 {
00073 srcsap = chsap;
00074 }
00075 else
00076 {
00077 if (debug_)
00078 {
00079 if (dstsap)
00080 {
00081 cerr << "dstsap:" << dstsap
00082 << " addsap:" << chsap << endl;
00083 }
00084 }
00085 assert (dstsap == NULL);
00086 dstsap = chsap;
00087 }
00088
00089 return ChannelModule::command(argc,argv);
00090
00091 }
00092 else if(strcasecmp(argv[1], "setLinkHead")==0)
00093 {
00094 linkhead_ = (NsObject *)TclObject::lookup(argv[2]);
00095
00096 if(!linkhead_)
00097 return TCL_ERROR;
00098
00099
00100
00101 return TCL_OK;
00102 }
00103
00104 }
00105
00106
00107 return ChannelModule::command(argc,argv);
00108
00109
00110 }
00111
00112
00113
00114
00115 void LinkChannelModule::recv(Packet* p, ChSAP* cs)
00116 {
00117 assert(linkhead_ != NULL);
00118
00119 if (cs != srcsap)
00120 {
00121 if (debug_)
00122 cerr << this <<" packet received from the wrong ChSAP - Module/Link is unidirectional!" << endl;
00123
00124
00125 Packet::free(p);
00126 return;
00127 }
00128
00129 if (debug_)
00130 cerr << this << " received packet from ChSAP" << cs << " (srcsap=" << srcsap << "), sending to " << linkhead_ << endl;
00131
00132 linkhead_->recv(p, (Handler *) 0);
00133
00134 }
00135
00136
00137 void LinkChannelModule::recv(Packet* p, Handler* h)
00138 {
00139
00140 hdr_cmn* ch = hdr_cmn::access(p);
00141
00142 if (ch->error())
00143 {
00144 drop(p,1,LINKCH_DROP_REASON_ERROR);
00145 return;
00146 }
00147
00148
00149 if (debug_)
00150 cerr << this <<" sending packet from " << h << " (srcsap=" << srcsap << ") to dstsap " << dstsap << endl;
00151
00152 dstsap->sendUp(p,0);
00153 }