#include <anna/comm/Network.hpp>
#include <anna/comm/Host.hpp>
#include <anna/comm/ClientSocket.hpp>
-
#include <anna/diameter.comm/Transport.hpp>
#include <anna/diameter.comm/Engine.hpp>
#include <anna/diameter.comm/Entity.hpp>
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
// * [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
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);
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);
// 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));
}
-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());
}
}
result.erase(result.size() - 1, 1); // remove last space
- //return anna::functions::exclusiveHash(result);
return result;
}
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);
);
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);
);
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);
);
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);
);
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:
//
// 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);
}
-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)
// 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);
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();
// 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);