X-Git-Url: https://git.teslayout.com/public/public/public/?a=blobdiff_plain;f=source%2Fdiameter.comm%2FEngine.cpp;h=d00724b80f038aa7fb0ddb20f5fd1880ae61cdbc;hb=64d7c531cdf5f4bca4fa2d8c9736de98247dfe13;hp=489a093c148880813088ddb595254022ad34aa61;hpb=e80e62a5cf9aacad1a9551c68c432147ef98cd29;p=anna.git diff --git a/source/diameter.comm/Engine.cpp b/source/diameter.comm/Engine.cpp index 489a093..d00724b 100644 --- a/source/diameter.comm/Engine.cpp +++ b/source/diameter.comm/Engine.cpp @@ -16,7 +16,6 @@ #include #include #include - #include #include #include @@ -63,8 +62,9 @@ comm::Engine::Engine(const char *className, const stack::Dictionary *baseProtoco a_baseProtocolCodecEngine((std::string("baseProtocolCodecEngine_for_") + std::string(className)).c_str(), baseProtocolDictionary) { anna::diameter::sccs::activate(); - a_realm = anna::functions::getDomainname(); - a_host = anna::functions::getHostname(); + 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 @@ -116,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 = getHost(); - std::string OR = getRealm(); + 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 @@ -274,7 +274,7 @@ throw(anna::RuntimeException) { result->setCategory(category); result->setDescription(description); result->setAllowedInactivityTime(allowedInactivityTime); - result->initializeStatisticConcepts(); + result->initializeStatisticResources(); // Los saco con metodos virtuales readXXX del motor: // if ((a_cea.isEmpty()) || (a_dwa.isEmpty())) // throw anna::RuntimeException("Must define valid CEA and DWA messages by mean setCEAandDWA()", ANNA_FILE_LOCATION); @@ -315,7 +315,7 @@ throw(anna::RuntimeException) { result->a_socket = socket; result->setMaxClientSessions(a_numberOfClientSessionsPerServer /* engine */); result->a_engine = this; - result->initializeStatisticConcepts(); + result->initializeStatisticResources(); for(int k = 0; k < a_numberOfClientSessionsPerServer; k++) result->addClientSession(k); @@ -345,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)); @@ -769,13 +768,13 @@ int comm::Engine::getOTARequestsForLocalServers() const throw() { } -void comm::Engine::setRealm(const std::string & name) throw() { - a_realm = ((name != "") ? name : anna::functions::getDomainname()); +void comm::Engine::setOriginRealmName(const std::string & originRealmName) throw() { + a_originRealm = ((originRealmName != "") ? originRealmName : anna::functions::getDomainname()); } -void comm::Engine::setHost(const std::string & name) throw() { - a_host = ((name != "") ? name : anna::functions::getHostname()); +void comm::Engine::setOriginHostName(const std::string & originHostName) throw() { + a_originHost = ((originHostName != "") ? originHostName : anna::functions::getHostname()); } @@ -919,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,8 +925,10 @@ comm::Engine::entity_key comm::Engine::getEntityKey(const socket_v &v) const thr void comm::Engine::availabilityLostForEntities() throw() { a_availableForEntities = false; LOGDEBUG( - std::string msg = "diameter::comm::Engine { Realm: "; - msg += getRealm(); + std::string msg = "diameter::comm::Engine { Origin-Realm: "; + msg += getOriginRealmName(); + msg += " | Origin-Host: "; + msg += getOriginHostName(); msg += " } has lost its availability for entities"; anna::Logger::debug(msg, ANNA_FILE_LOCATION); ); @@ -944,8 +944,10 @@ void comm::Engine::availabilityLostForEntities() throw() { void comm::Engine::availabilityRecoveredForEntities() throw() { a_availableForEntities = true; LOGDEBUG( - std::string msg = "diameter::comm::Engine { Realm: "; - msg += getRealm(); + std::string msg = "diameter::comm::Engine { Origin-Realm: "; + msg += getOriginRealmName(); + msg += " | Origin-Host: "; + msg += getOriginHostName(); msg += " } has recovered its availability for entities"; anna::Logger::debug(msg, ANNA_FILE_LOCATION); ); @@ -961,8 +963,10 @@ void comm::Engine::availabilityRecoveredForEntities() throw() { void comm::Engine::availabilityLostForLocalServers() throw() { a_availableForLocalServers = false; LOGDEBUG( - std::string msg = "diameter::comm::Engine { Realm: "; - msg += getRealm(); + std::string msg = "diameter::comm::Engine { Origin-Realm: "; + msg += getOriginRealmName(); + msg += " | Origin-Host: "; + msg += getOriginHostName(); msg += " } has lost its availability for local servers"; anna::Logger::debug(msg, ANNA_FILE_LOCATION); ); @@ -978,8 +982,10 @@ void comm::Engine::availabilityLostForLocalServers() throw() { void comm::Engine::availabilityRecoveredForLocalServers() throw() { a_availableForLocalServers = true; LOGDEBUG( - std::string msg = "diameter::comm::Engine { Realm: "; - msg += getRealm(); + std::string msg = "diameter::comm::Engine { Origin-Realm: "; + msg += getOriginRealmName(); + msg += " | Origin-Host: "; + msg += getOriginHostName(); msg += " } has recovered its availability for local servers"; anna::Logger::debug(msg, ANNA_FILE_LOCATION); ); @@ -1048,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: // @@ -1076,11 +1088,11 @@ void comm::Engine::readDPA(anna::DataBlock &dpa, const anna::DataBlock & dpr) th // Origin-Host avpOH.setId(anna::diameter::helpers::base::AVPID__Origin_Host); avpOH.setMandatoryBit(); - avpOH.getDiameterIdentity()->fromPrintableString(a_host.c_str()); + avpOH.getDiameterIdentity()->fromPrintableString(a_originHost.c_str()); // Origin-Realm avpOR.setId(anna::diameter::helpers::base::AVPID__Origin_Realm); avpOR.setMandatoryBit(); - avpOR.getDiameterIdentity()->fromPrintableString(a_realm.c_str()); + avpOR.getDiameterIdentity()->fromPrintableString(a_originRealm.c_str()); diameterDPA.addAvp(&avpRC); diameterDPA.addAvp(&avpOH); diameterDPA.addAvp(&avpOR); @@ -1095,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.loadXML(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) @@ -1137,11 +1168,11 @@ void comm::Engine::readCEA(anna::DataBlock &cea, const anna::DataBlock & cer) th // Origin-Host avpOH.setId(anna::diameter::helpers::base::AVPID__Origin_Host); avpOH.setMandatoryBit(); - avpOH.getDiameterIdentity()->fromPrintableString(a_host.c_str()); + avpOH.getDiameterIdentity()->fromPrintableString(a_originHost.c_str()); // Origin-Realm avpOR.setId(anna::diameter::helpers::base::AVPID__Origin_Realm); avpOR.setMandatoryBit(); - avpOR.getDiameterIdentity()->fromPrintableString(a_realm.c_str()); + avpOR.getDiameterIdentity()->fromPrintableString(a_originRealm.c_str()); diameterCEA.addAvp(&avpRC); diameterCEA.addAvp(&avpOH); diameterCEA.addAvp(&avpOR); @@ -1152,7 +1183,7 @@ void comm::Engine::readCEA(anna::DataBlock &cea, const anna::DataBlock & cer) th int vendorId = anna::diameter::helpers::VENDORID__tgpp; // Unsigned32 diameterCEA.addAvp(anna::diameter::helpers::base::AVPID__Vendor_Id)->getUnsigned32()->setValue(vendorId); // Product-Name - std::string productName = "OCS Diameter Server"; // UTF8String + std::string productName = "Diameter Server"; // UTF8String diameterCEA.addAvp(anna::diameter::helpers::base::AVPID__Product_Name)->getUTF8String()->setValue(productName); // Encode cea = diameterCEA.code(); @@ -1256,11 +1287,11 @@ void comm::Engine::readDWA(anna::DataBlock &dwa, const anna::DataBlock & dwr) th // Origin-Host avpOH.setId(anna::diameter::helpers::base::AVPID__Origin_Host); avpOH.setMandatoryBit(); - avpOH.getDiameterIdentity()->fromPrintableString(a_host.c_str()); + avpOH.getDiameterIdentity()->fromPrintableString(a_originHost.c_str()); // Origin-Realm avpOR.setId(anna::diameter::helpers::base::AVPID__Origin_Realm); avpOR.setMandatoryBit(); - avpOR.getDiameterIdentity()->fromPrintableString(a_realm.c_str()); + avpOR.getDiameterIdentity()->fromPrintableString(a_originRealm.c_str()); diameterDWA.addAvp(&avpRC); diameterDWA.addAvp(&avpOH); diameterDWA.addAvp(&avpOR);