![]() |
User Manual, Developers Guide and API Documentation |
![]() |
00001 /****************************************************************************** 00002 * DLLBase (DLL Base classes to create FUN-based DLL) * 00003 * __________________________________________________________________________ * 00004 * * 00005 * Copyright (C) 2006 * 00006 * Chair of Communication Networks (ComNets) * 00007 * Kopernikusstr. 16, D-52074 Aachen, Germany * 00008 * phone: ++49-241-80-27910 (phone), fax: ++49-241-80-22242 * 00009 * email: wns@comnets.rwth-aachen.de * 00010 * www: http://wns.comnets.rwth-aachen.de * 00011 ******************************************************************************/ 00012 00013 #include <DLL/UpperConvergence.hpp> 00014 #include <DLL/RANG.hpp> 00015 00016 #include <WNS/service/nl/Address.hpp> 00017 #include <WNS/service/dll/ProtocolNumber.hpp> 00018 #include <WNS/ReferenceModifier.hpp> 00019 #include <WNS/ReferenceModifier.hpp> 00020 00021 using namespace dll; 00022 00023 STATIC_FACTORY_REGISTER_WITH_CREATOR(NoUpperConvergence, wns::ldk::FunctionalUnit, 00024 "dll.upperconvergence.None", wns::ldk::FUNConfigCreator); 00025 00026 STATIC_FACTORY_REGISTER_WITH_CREATOR(UTUpperConvergence, wns::ldk::FunctionalUnit, 00027 "dll.upperconvergence.UT", wns::ldk::FUNConfigCreator); 00028 00029 STATIC_FACTORY_REGISTER_WITH_CREATOR(APUpperConvergence, wns::ldk::FunctionalUnit, 00030 "dll.upperconvergence.AP", wns::ldk::FUNConfigCreator); 00031 00032 UpperConvergence::UpperConvergence(wns::ldk::fun::FUN* fun, const wns::pyconfig::View& config) : 00033 wns::ldk::CommandTypeSpecifier<UpperCommand>(fun), 00034 wns::ldk::HasReceptor<>(), 00035 wns::ldk::HasConnector<wns::ldk::FirstServeConnector>(), 00036 wns::ldk::HasDeliverer<>(), 00037 00038 sourceMACAddress(), 00039 logger(config.get("logger")) 00040 { 00041 } 00042 00043 00044 UpperConvergence::~UpperConvergence() 00045 { 00046 } 00047 00048 void 00049 UpperConvergence::onFUNCreated() 00050 { 00051 } 00052 00053 void 00054 UpperConvergence::sendData( 00055 const wns::service::dll::UnicastAddress& _peer, 00056 const wns::osi::PDUPtr& pdu, 00057 wns::service::dll::protocolNumber protocol, 00058 wns::service::dll::FlowID _dllFlowID) 00059 { 00060 pdu->setPDUType(protocol); 00061 00062 MESSAGE_BEGIN(NORMAL, logger, m, getFUN()->getName()); 00063 m << ": doSendData() called in convergence::Upper, target DLLAddress: " << _peer; 00064 MESSAGE_END(); 00065 00066 wns::ldk::CompoundPtr compound(new wns::ldk::Compound(getFUN()->createCommandPool(), pdu)); 00067 00068 activateCommand(compound->getCommandPool()); 00069 00070 UpperCommand* sgc = getCommand(compound->getCommandPool()); 00071 00072 sgc->peer.targetMACAddress = _peer; 00073 sgc->peer.sourceMACAddress = sourceMACAddress; 00074 sgc->local.dllFlowID = _dllFlowID; 00075 00076 assure(compound, "Invalid compound."); 00077 00078 if(this->getConnector()->hasAcceptor(compound)) 00079 { 00080 this->wns::ldk::FunctionalUnit::sendData(compound); 00081 } 00082 else 00083 { 00084 MESSAGE_SINGLE(NORMAL, logger, "Dropped Outgoing Compound because DLL cannot handle it."); 00085 } 00086 } 00087 00088 00089 void 00090 UpperConvergence::setMACAddress(const wns::service::dll::UnicastAddress& _sourceMACAddress) 00091 { 00092 sourceMACAddress = _sourceMACAddress; 00093 } 00094 00095 wns::service::dll::UnicastAddress 00096 UpperConvergence::getMACAddress() const 00097 { 00098 return sourceMACAddress; 00099 } 00100 00101 wns::ldk::CommandPool* 00102 UpperConvergence::createReply(const wns::ldk::CommandPool* original) const 00103 { 00104 wns::ldk::CommandPool* reply = getFUN()->createCommandPool(); 00105 00106 UpperCommand* originalCommand = getCommand(original); 00107 UpperCommand* replyCommand = activateCommand(reply); 00108 00109 replyCommand->peer.sourceMACAddress = sourceMACAddress; 00110 replyCommand->peer.targetMACAddress = originalCommand->peer.sourceMACAddress; 00111 00112 return reply; 00113 } // UnicastUpper::createReply 00114 00115 UTUpperConvergence::UTUpperConvergence(wns::ldk::fun::FUN* fun,const wns::pyconfig::View& config) : 00116 UpperConvergence(fun,config), 00117 wns::ldk::Forwarding<UTUpperConvergence>(), 00118 wns::Cloneable<UTUpperConvergence>() 00119 {} 00120 00121 void 00122 UTUpperConvergence::processIncoming(const wns::ldk::CompoundPtr& compound) 00123 { 00124 MESSAGE_BEGIN(NORMAL, logger, m, getFUN()->getName()); 00125 m << ": doOnData(), forwarding to upper Component (IP) "; 00126 MESSAGE_END(); 00127 00128 dataHandlerRegistry.find(wns::service::dll::protocolNumberOf(compound->getData()))->onData(compound->getData()); 00129 00130 MESSAGE_BEGIN(VERBOSE, logger, m, getFUN()->getName()); 00131 m << ": Compound backtrace" 00132 << compound->dumpJourney(); // JOURNEY 00133 MESSAGE_END(); 00134 00135 } // processIncoming 00136 00137 void 00138 UTUpperConvergence::registerHandler(wns::service::dll::protocolNumber protocol, 00139 wns::service::dll::Handler* dh) 00140 { 00141 assureNotNull(dh); 00142 dataHandlerRegistry.insert(protocol, dh); 00143 00144 MESSAGE_BEGIN(NORMAL, logger, m, getFUN()->getName()); 00145 m << ": UTUpperConv registered dataHandler for protocol number " << protocol; 00146 MESSAGE_END(); 00147 } 00148 00149 void 00150 UTUpperConvergence::establishFlow(wns::service::tl::FlowID flowID, wns::service::qos::QoSClass qosClass) 00151 { 00152 MESSAGE_SINGLE(NORMAL, logger, "establishFlow(FlowID="<<flowID<<") called by TL, but it is ignored here"); 00153 } // establishFlow 00154 00155 00156 void 00157 UTUpperConvergence::releaseFlow(wns::service::tl::FlowID /*flowID*/) 00158 { 00159 } // releaseFlow 00160 00161 00162 APUpperConvergence::APUpperConvergence(wns::ldk::fun::FUN* fun, const wns::pyconfig::View& config) : 00163 UpperConvergence(fun,config), 00164 wns::ldk::Forwarding<APUpperConvergence>(), 00165 wns::Cloneable<APUpperConvergence>(), 00166 dataHandler(NULL) 00167 {} 00168 00169 void 00170 APUpperConvergence::processIncoming(const wns::ldk::CompoundPtr& compound) 00171 { 00172 MESSAGE_BEGIN(NORMAL, logger, m, getFUN()->getName()); 00173 m << ": doOnData(), forwarding to RANG"; 00174 MESSAGE_END(); 00175 assure(dataHandler, "no data handler set"); 00176 00177 // as opposed to the UT upper convergence, we have to tell the RANG who we 00178 // are and where the Packet comes from. 00179 UpperCommand* myCommand = getCommand(compound->getCommandPool()); 00180 dataHandler->onData(compound->getData(), 00181 myCommand->peer.sourceMACAddress, 00182 this); 00183 00184 MESSAGE_BEGIN(VERBOSE, logger, m, getFUN()->getName()); 00185 m << ": Compound backtrace" 00186 << compound->dumpJourney(); // JOURNEY 00187 MESSAGE_END(); 00188 00189 } // processIncoming 00190 00191 void 00192 APUpperConvergence::registerHandler(wns::service::dll::protocolNumber /*protocol*/, 00193 wns::service::dll::Handler* dh) 00194 { 00195 // Upper layer protocol demultiplexing is done in RANG. Therefore we 00196 // ignore the protocol field. 00197 00198 assureType(dh, dll::RANG*); 00199 dataHandler = dynamic_cast<dll::RANG*>(dh); 00200 assure(dataHandler, "APUpperConvergence failed to register wns::service::dll::Handler"); 00201 00202 MESSAGE_BEGIN(NORMAL, logger, m, getFUN()->getName()); 00203 m << ": APUpperConv registered dataHandler"; 00204 MESSAGE_END(); 00205 } 00206 00207 bool 00208 APUpperConvergence::hasRANG() 00209 { 00210 if (dataHandler) 00211 return true; 00212 else 00213 return false; 00214 } 00215 00216 dll::RANG* 00217 APUpperConvergence::getRANG() 00218 { 00219 assure(dataHandler, "RANG hasn't been set"); 00220 return dataHandler; 00221 }
1.5.5