User Manual, Developers Guide and API Documentation

UpperConvergence.cpp

Go to the documentation of this file.
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 }

Generated on Sat Feb 11 03:31:32 2012 for openWNS by  doxygen 1.5.5