X-Git-Url: https://git.teslayout.com/public/public/public/?a=blobdiff_plain;f=source%2Fdiameter.comm%2FEngine.cpp;h=867b6cceb093af97502194853a6ae6d7bdd15366;hb=c56124ff93e8bceec159748dfe5ba8d56c62e3de;hp=d43da75bb35c37c7b023fafe5efd184acfdebacd;hpb=028006fc5ee34967fcfffff24a2b1c8b410c26c3;p=anna.git diff --git a/source/diameter.comm/Engine.cpp b/source/diameter.comm/Engine.cpp index d43da75..867b6cc 100644 --- a/source/diameter.comm/Engine.cpp +++ b/source/diameter.comm/Engine.cpp @@ -64,6 +64,7 @@ comm::Engine::Engine(const char *className, const stack::Dictionary *baseProtoco anna::diameter::sccs::activate(); a_originRealm = anna::functions::getDomainname(); a_originHost = anna::functions::getHostname(); + a_ceaPathfile = ""; // Internal base protocol codec engine: a_baseProtocolCodecEngine.setValidationMode(anna::diameter::codec::Engine::ValidationMode::Always); // default was: after decoding @@ -115,8 +116,8 @@ void comm::Engine::setClientCERandDWR(const std::string & cer, const std::string // * [Acct-Application-Id] 259 Unsigned32 anna::diameter::codec::Message diameterCER(getBaseProtocolCodecEngine()); int applicationId = 0 /*anna::diameter::helpers::APPID__3GPP_Rx*/; // Unsigned32 - std::string OH = getOriginHost(); - std::string OR = getOriginRealm(); + std::string OH = getOriginHostName(); + std::string OR = getOriginRealmName(); std::string hostIP = anna::functions::getHostnameIP(); // Address int vendorId = anna::diameter::helpers::VENDORID__tgpp; // Unsigned32 std::string productName = "ANNA Diameter Client"; // UTF8String @@ -124,7 +125,7 @@ void comm::Engine::setClientCERandDWR(const std::string & cer, const std::string if (cer != "") { try { - diameterCER.loadXML(cer); + diameterCER.loadXMLFile(cer); } catch(anna::RuntimeException &ex) { //ex.trace(); encodeDefault = true; @@ -155,7 +156,7 @@ void comm::Engine::setClientCERandDWR(const std::string & cer, const std::string if (dwr != "") { try { - diameterDWR.loadXML(dwr); + diameterDWR.loadXMLFile(dwr); } catch(anna::RuntimeException &ex) { //ex.trace(); encodeDefault = true; @@ -344,15 +345,14 @@ throw(anna::RuntimeException) { // Assignments (it could be done at allocate): if((a_cer.isEmpty()) || (a_dwr.isEmpty())) - throw anna::RuntimeException("Must define valid CER and DWR messages by mean setCERandDWR()", ANNA_FILE_LOCATION); + throw anna::RuntimeException("Must define valid CER and DWR messages by mean setClientCERandDWR()", ANNA_FILE_LOCATION); result->a_cer.setBody(a_cer); result->a_dwr.setBody(a_dwr); result->setWatchdogPeriod(a_watchdogPeriod); result->a_parent = server; result->a_socketId = socketId; - result->initializeSequences(); // despu�s de asignar el server y el socketId (*) - // (*) Las secuencias se basan en la semilla: srand(::time(NULL) + anna::functions::exclusiveHash(anna::functions::asString("%s:%d|%d", getAddress().c_str(), getPort(), a_socketId))); + result->initializeSequences(); // despues de asignar el server y el socketId (sequences are seed-based by mean exclusive hash) result->a_engine = this; clientSession_key key = ClientSession::getKey(server->getAddress(), server->getPort(), socketId); a_clientSessions.insert(clientSession_value_type(key, result)); @@ -768,13 +768,13 @@ int comm::Engine::getOTARequestsForLocalServers() const throw() { } -void comm::Engine::setOriginRealm(const std::string & originRealm) throw() { - a_originRealm = ((originRealm != "") ? originRealm : anna::functions::getDomainname()); +void comm::Engine::setOriginRealmName(const std::string & originRealmName) throw() { + a_originRealm = ((originRealmName != "") ? originRealmName : anna::functions::getDomainname()); } -void comm::Engine::setOriginHost(const std::string & originHost) throw() { - a_originHost = ((originHost != "") ? originHost : anna::functions::getHostname()); +void comm::Engine::setOriginHostName(const std::string & originHostName) throw() { + a_originHost = ((originHostName != "") ? originHostName : anna::functions::getHostname()); } @@ -918,7 +918,6 @@ comm::Engine::entity_key comm::Engine::getEntityKey(const socket_v &v) const thr } result.erase(result.size() - 1, 1); // remove last space - //return anna::functions::exclusiveHash(result); return result; } @@ -927,9 +926,9 @@ void comm::Engine::availabilityLostForEntities() throw() { a_availableForEntities = false; LOGDEBUG( std::string msg = "diameter::comm::Engine { Origin-Realm: "; - msg += getOriginRealm(); + msg += getOriginRealmName(); msg += " | Origin-Host: "; - msg += getOriginHost(); + msg += getOriginHostName(); msg += " } has lost its availability for entities"; anna::Logger::debug(msg, ANNA_FILE_LOCATION); ); @@ -946,9 +945,9 @@ void comm::Engine::availabilityRecoveredForEntities() throw() { a_availableForEntities = true; LOGDEBUG( std::string msg = "diameter::comm::Engine { Origin-Realm: "; - msg += getOriginRealm(); + msg += getOriginRealmName(); msg += " | Origin-Host: "; - msg += getOriginHost(); + msg += getOriginHostName(); msg += " } has recovered its availability for entities"; anna::Logger::debug(msg, ANNA_FILE_LOCATION); ); @@ -965,9 +964,9 @@ void comm::Engine::availabilityLostForLocalServers() throw() { a_availableForLocalServers = false; LOGDEBUG( std::string msg = "diameter::comm::Engine { Origin-Realm: "; - msg += getOriginRealm(); + msg += getOriginRealmName(); msg += " | Origin-Host: "; - msg += getOriginHost(); + msg += getOriginHostName(); msg += " } has lost its availability for local servers"; anna::Logger::debug(msg, ANNA_FILE_LOCATION); ); @@ -984,9 +983,9 @@ void comm::Engine::availabilityRecoveredForLocalServers() throw() { a_availableForLocalServers = true; LOGDEBUG( std::string msg = "diameter::comm::Engine { Origin-Realm: "; - msg += getOriginRealm(); + msg += getOriginRealmName(); msg += " | Origin-Host: "; - msg += getOriginHost(); + msg += getOriginHostName(); msg += " } has recovered its availability for local servers"; anna::Logger::debug(msg, ANNA_FILE_LOCATION); ); @@ -1055,7 +1054,13 @@ bool comm::Engine::refreshAvailabilityForLocalServers() throw() { void comm::Engine::readDPA(anna::DataBlock &dpa, const anna::DataBlock & dpr) throw() { // Check for base protocol codec engine health: - assertBaseProtocolHealth(); + try { + assertBaseProtocolHealth(); + } + catch(anna::RuntimeException &ex) { + ex.trace(); + return; + } // Default DPA implementation: // @@ -1102,11 +1107,30 @@ void comm::Engine::readDPA(anna::DataBlock &dpa, const anna::DataBlock & dpr) th } -void comm::Engine::readCEA(anna::DataBlock &cea, const anna::DataBlock & cer) throw() { +void comm::Engine::readCEA(anna::DataBlock &cea, const anna::DataBlock &cer) throw() { // Check for base protocol codec engine health: assertBaseProtocolHealth(); + if (a_ceaPathfile != "") { + anna::diameter::codec::Message diameterCEA(getBaseProtocolCodecEngine()); + + try { + diameterCEA.loadXMLFile(a_ceaPathfile); + diameterCEA.setHopByHop(anna::diameter::codec::functions::getHopByHop(cer)); + diameterCEA.setEndToEnd(anna::diameter::codec::functions::getEndToEnd(cer)); + cea = diameterCEA.code(); + + } catch(anna::RuntimeException &ex) { + ex.trace(); + LOGWARNING(anna::Logger::warning("CEA file not found or unable to parse. Encoding harcoded default version ...", ANNA_FILE_LOCATION)); + //return anna::diameter::comm::Engine::readCEA(cea, cer); + // will fail with empty cea + } + + return; + } + // Default CEA implementation: // // 'Capabilities-Exchange-Answer' (257,answer)