#include "GeoNetworkingLayer.hh" #include "GeoNetworkingTypes.hh" #include "loggers.hh" GeoNetworkingLayer::GeoNetworkingLayer(const std::string & p_type, const std::string & param) : TLayer(p_type), _params(), _codec() { loggers::get_instance().log(">>> GeoNetworkingLayer::GeoNetworkingLayer: %s, %s", to_string().c_str(), param.c_str()); // Setup parameters Params::convert(_params, param); } void GeoNetworkingLayer::sendMsg(const LibItsGeoNetworking__TestSystem::GeoNetworkingReq& p, const Params& params) { loggers::get_instance().log(">>> GeoNetworkingLayer::sendMsg"); // Encode GeoNetworking PDU OCTETSTRING data; _codec.encode(p.msgOut(), data); // Update parameters Params par(params); // FIXME Review all const Param& in method declarations par.insert(std::pair(Params::mac_dst, std::string(static_cast(oct2str(p.macDestinationAddress()))))); par.insert(std::pair(Params::its_aid, std::string(static_cast(int2str(p.its__aid()))))); sendData(data, par); } void GeoNetworkingLayer::sendData(OCTETSTRING& data, Params& params) { loggers::get_instance().log_msg(">>> GeoNetworkingLayer::sendData: ", data); params.log(); sendToAllLayers(data, params); } void GeoNetworkingLayer::receiveData(OCTETSTRING& data, Params& params) { loggers::get_instance().log_msg(">>> GeoNetworkingLayer::receiveData: ", data); // Decode the payload LibItsGeoNetworking__TestSystem::GeoNetworkingInd p; _codec.decode(data, p.msgIn(), ¶ms); // Add lower layers parameters // 1. Destination MAC address std::map::const_iterator it = params.find(Params::mac_dst); if (it != params.cend()) { loggers::get_instance().log("GeoNetworkingLayer::receiveData: dst=%s", it->second.c_str()); p.macDestinationAddress() = str2oct(CHARSTRING(it->second.c_str())); } else { p.macDestinationAddress() = OCTETSTRING(Params::mac_address.size(), Params::mac_address.data()); } // 2. ssp it = params.find(Params::ssp); if (it != params.cend()) { loggers::get_instance().log("GeoNetworkingLayer::receiveData: ssp=%s", it->second.c_str()); p.ssp() = str2bit(CHARSTRING(it->second.c_str())); } else { p.ssp().set_to_omit(); } // 3. its_aid it = params.find(Params::its_aid); if (it != params.cend()) { loggers::get_instance().log("GeoNetworkingLayer::receiveData: its_aid=%s", it->second.c_str()); p.its__aid() = std::stoi(it->second.c_str()); } else { p.its__aid().set_to_omit(); } // Pass the GeoNetworking raw payload to the upper layers if any it = params.find(Params::gn_payload); if (it != params.cend()) { loggers::get_instance().log("GeoNetworkingLayer::receiveData: gn_payload=%s", it->second.c_str()); OCTETSTRING os(str2oct(CHARSTRING(it->second.c_str()))); receiveToAllLayers(os, params); } else { loggers::get_instance().warning("GeoNetworkingLayer::receiveData: No payload to pass to upper layers"); } // Pass it to the ports toAllUpperPorts(p, params); } class GeoNetworkingFactory: public LayerFactory { static GeoNetworkingFactory _f; public: GeoNetworkingFactory(); virtual Layer * createLayer(const std::string & type, const std::string & param); }; GeoNetworkingFactory::GeoNetworkingFactory() { // Register factory loggers::get_instance().log(">>> GeoNetworkingFactory::GeoNetworkingFactory"); LayerStackBuilder::RegisterLayerFactory("GN", this); } Layer * GeoNetworkingFactory::createLayer(const std::string & type, const std::string & param) { return new GeoNetworkingLayer(type, param); } GeoNetworkingFactory GeoNetworkingFactory::_f;