![]() |
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/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
1.5.5