User Manual, Developers Guide and API Documentation

RANG.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/RANG.hpp>
00014 #include <DLL/StationManager.hpp>
00015 #include <DLL/Layer2.hpp>
00016 #include <DLL/UpperConvergence.hpp>
00017 
00018 #include <WNS/node/component/FQSN.hpp>
00019 #include <WNS/module/Base.hpp>
00020 
00021 #include <sstream>
00022 
00023 using namespace dll;
00024 
00025 STATIC_FACTORY_REGISTER_WITH_CREATOR(RANG,
00026                      wns::node::component::Interface,
00027                      "dll.RANG",
00028                      wns::node::component::ConfigCreator);
00029 
00030 RANG::RANG(wns::node::Interface* node, const wns::pyconfig::View& _config) :
00031     wns::node::component::Component(node, _config),
00032     accessPointLookup(),
00033     config(_config),
00034     learnAPfromIncomingData((config.knows("learnAPfromIncomingData") ? config.get<bool>("learnAPfromIncomingData") : true)),
00035     logger(config.get("logger"))
00036 {
00037 } // RANG
00038 
00039 void
00040 RANG::doStartup()
00041 {
00042     addService(config.get<std::string>("dataTransmission"), this);
00043     addService(config.get<std::string>("notification"), this);
00044 }
00045 
00046 void
00047 RANG::onData(const wns::osi::PDUPtr& _data,
00048              wns::service::dll::FlowID)
00049 {
00050     assure(dataHandlerRegistry.knows(wns::service::dll::protocolNumberOf(_data)), "no data handler set");
00051     dataHandlerRegistry.find(wns::service::dll::protocolNumberOf(_data))->onData(_data);
00052 }
00053 
00054 void
00055 RANG::onData(const wns::osi::PDUPtr& _data,
00056              wns::service::dll::UnicastAddress _sourceMACAddress,
00057              wns::service::dll::UnicastDataTransmission* _ap,
00058              wns::service::dll::FlowID _dllFlowID)
00059 {
00060     if(learnAPfromIncomingData)
00061     {
00062         updateAPLookUp(_sourceMACAddress, _ap);
00063     }
00064 
00065     MESSAGE_BEGIN(NORMAL, logger, m,"Receiving incoming data from MAC Address: ");
00066     m << _sourceMACAddress;
00067     MESSAGE_END();
00068 
00069     assure(dataHandlerRegistry.knows(wns::service::dll::protocolNumberOf(_data)), "no data handler set");
00070     dataHandlerRegistry.find(wns::service::dll::protocolNumberOf(_data))->onData(_data, _dllFlowID);
00071 }
00072 
00073 void
00074 RANG::sendData(
00075     const wns::service::dll::UnicastAddress& _peer,
00076     const wns::osi::PDUPtr& pdu,
00077     wns::service::dll::protocolNumber protocol,
00078     wns::service::dll::FlowID _dllFlowID)
00079 {
00080     wns::service::dll::UnicastDataTransmission* ap = NULL;
00081     if( knowsAddress(_peer) )
00082     {
00083         ap = getAccessPointFor(_peer);
00084     } else
00085     {
00086         MESSAGE_BEGIN(NORMAL, logger, m, "No valid access point found. Dropping packet to ");
00087         m << _peer;
00088         MESSAGE_END();
00089         return;
00090     }
00091     MESSAGE_BEGIN(NORMAL, logger, m, getName());
00092     m << ": doSendData(), RANG forwarding to convergence::Upper\n";
00093     m << "target is ";
00094     m << _peer;
00095     MESSAGE_END();
00096     ap->sendData(_peer, pdu, protocol, _dllFlowID);
00097 }
00098 
00099 void
00100 RANG::registerHandler(wns::service::dll::protocolNumber protocol, wns::service::dll::Handler* dh)
00101 {
00102     assure(dh, "no data handler set");
00103     assure(!dataHandlerRegistry.knows(protocol), "data handler already registered");
00104     dataHandlerRegistry.insert(protocol, dh);
00105 }
00106 
00107 void
00108 RANG::onNodeCreated()
00109 {
00110 }
00111 
00112 
00113 void
00114 RANG::onWorldCreated()
00115 {
00116     int numAPs = config.len("dllDataTransmissions");
00117     assure( numAPs == config.len("dllNotifications"),
00118             "mismatch in number of DataTransmission / Notification services");
00119     // browse through the list of connected APs
00120     for (int i=0; i<numAPs; ++i)
00121     {
00122         wns::node::component::FQSN dataTransmission(config.get<wns::pyconfig::View>("dllDataTransmissions",i));
00123         wns::node::component::FQSN notification(config.get<wns::pyconfig::View>("dllNotifications",i));
00124 
00125         dll::UpperConvergence* dataTransmissionService =
00126             getRemoteService<dll::UpperConvergence*>(dataTransmission);
00127         dll::UpperConvergence* notificationService =
00128             getRemoteService<dll::UpperConvergence*>(notification);
00129 
00130         wns::service::dll::UnicastAddress macAdr = dataTransmissionService->getMACAddress();
00131 
00132         notificationService->registerHandler(wns::service::dll::TUNNEL, this);
00133         accessPointLookup.insert(macAdr, dataTransmissionService);
00134 
00135         MESSAGE_BEGIN(NORMAL, logger, m, "Added AP");
00136         m << i+1 << " with MAC Adr.: " << macAdr << " to RANG!";
00137         MESSAGE_END();
00138     }
00139 }
00140 
00141 bool
00142 RANG::knowsAddress(wns::service::dll::UnicastAddress _sourceMACAddress)
00143 {
00144     return accessPointLookup.knows(_sourceMACAddress);
00145 }
00146 
00147 wns::service::dll::UnicastDataTransmission*
00148 RANG::getAccessPointFor(wns::service::dll::UnicastAddress _sourceMACAddress)
00149 {
00150     assure(knowsAddress(_sourceMACAddress), "No valid access point found.");
00151     return accessPointLookup.find(_sourceMACAddress);
00152 }
00153 
00154 // Modified Handler Interface for APs
00155 void
00156 RANG::updateAPLookUp( wns::service::dll::UnicastAddress _sourceMACAddress,
00157                       wns::service::dll::UnicastDataTransmission* _ap)
00158 {
00159     // keep the MAC Address table up to date
00160     if (knowsAddress(_sourceMACAddress))
00161         accessPointLookup.erase(_sourceMACAddress);
00162 
00163     accessPointLookup.insert(_sourceMACAddress, _ap);
00164 
00165     MESSAGE_BEGIN(NORMAL, logger, m, "updated APLookup for UT with MAC Adr.: ");
00166     m << _sourceMACAddress << " (AP with MAC Adr.: " << dynamic_cast<dll::UpperConvergence*>(_ap)->getMACAddress() << ").";
00167     MESSAGE_END();
00168 }
00169 
00170 void
00171 RANG::removeAddress(wns::service::dll::UnicastAddress _sourceMACAddress,
00172                     wns::service::dll::UnicastDataTransmission* _ap)
00173 {
00174     if (knowsAddress(_sourceMACAddress))
00175     {
00176         if (getAccessPointFor(_sourceMACAddress) == _ap)
00177         {
00178             accessPointLookup.erase(_sourceMACAddress);
00179 
00180             MESSAGE_BEGIN(NORMAL, logger, m,"removed UT with MAC Adr.: ");
00181             m << _sourceMACAddress << " from APLookup.";
00182             MESSAGE_END();
00183         }
00184         else
00185         {
00186             throw wns::Exception("AP unrelated to UT tried to remove its routing entry!");
00187         }
00188     }
00189     else
00190         throw wns::Exception("Tried to remove unknown UT address from RANG APlookup table!");
00191 }
00192 
00193 void
00194 RANG::onShutdown()
00195 {
00196 }
00197 
00198 

Generated on Fri Feb 10 03:32:29 2012 for openWNS by  doxygen 1.5.5