X-Git-Url: https://git.teslayout.com/public/public/public/?a=blobdiff_plain;f=source%2Fdiameter.comm%2FEngine.cpp;h=56aa1b64f0123904d05a2bc810e54e63bf81d805;hb=d723d5bf571eb48c641b092058eaa38bb6c4fcc8;hp=9bfaf60dc0ffa88e07048d245f7550f048c20805;hpb=2921c651c9945cefec0715167201596aaa079e8d;p=anna.git diff --git a/source/diameter.comm/Engine.cpp b/source/diameter.comm/Engine.cpp index 9bfaf60..56aa1b6 100644 --- a/source/diameter.comm/Engine.cpp +++ b/source/diameter.comm/Engine.cpp @@ -16,7 +16,6 @@ #include #include #include - #include #include #include @@ -60,14 +59,14 @@ comm::Engine::Engine(const char *className, const stack::Dictionary *baseProtoco a_watchdogPeriod(ClientSession::DefaultWatchdogPeriod), a_maxConnectionDelay(anna::comm::ClientSocket::DefaultMaxConnectionDelay /* 200 ms*/), a_numberOfClientSessionsPerServer(1), - a_baseProtocolCodecEngine((std::string("baseProtocolCodecEngine_for_") + std::string(className)).c_str()) + 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.setDictionary(baseProtocolDictionary); a_baseProtocolCodecEngine.setValidationMode(anna::diameter::codec::Engine::ValidationMode::Always); // default was: after decoding } @@ -117,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 @@ -275,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); @@ -316,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); @@ -770,13 +769,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()); } @@ -928,8 +927,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); ); @@ -945,8 +946,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); ); @@ -962,8 +965,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); ); @@ -979,8 +984,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); ); @@ -1077,11 +1084,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); @@ -1096,11 +1103,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) @@ -1138,11 +1164,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); @@ -1153,7 +1179,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(); @@ -1257,11 +1283,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);