+void MyDiameterEntity::eventRequestRetransmission(const anna::diameter::comm::ClientSession* clientSession, anna::diameter::comm::Message *request) throw() {
+
+ LOGMETHOD(anna::TraceMethod tm("launcher::MyDiameterEntity", "eventRequestRetransmission", ANNA_FILE_LOCATION));
+
+ // Base class:
+ Entity::eventRequestRetransmission(clientSession, request); // warning trace
+
+ // Performance stats:
+ Launcher& my_app = static_cast <Launcher&>(anna::app::functions::getApp());
+ RealmNode * my_node = my_app.getRealmNode(getEngine()->getRealm());
+ // CommandId:
+ anna::diameter::CommandId cid = anna::diameter::codec::functions::getCommandId(request->getBody());
+ LOGDEBUG
+ (
+ std::string msg = "Request retransmitted: ";
+ msg += anna::diameter::functions::commandIdAsPairString(cid);
+ msg += " | DiameterServer: ";
+ msg += anna::functions::socketLiteralAsString(clientSession->getAddress(), clientSession->getPort());
+ msg += " | EventTime: ";
+ msg += anna::time::functions::currentTimeAsString();
+ anna::Logger::debug(msg, ANNA_FILE_LOCATION);
+ );
+
+ // Write retransmission
+ if(my_node->logEnabled()) my_node->writeLogFile(request->getBody(), "retry", clientSession->asString());
+}
+
+
+int MyDiameterEntity::readSocketId(const anna::diameter::comm::Message* message, int maxClientSessions) const throw() {
+
+ if(a_sessionBasedModelsType == "RoundRobin") return -1; // IEC also would return -1
+
+ try {
+ // Service-Context-Id:
+ anna::diameter::helpers::dcca::ChargingContext::_v chargingContext;
+ std::string scid = anna::diameter::helpers::dcca::functions::getServiceContextId(message->getBody(), chargingContext);
+
+ switch(chargingContext) {
+ case anna::diameter::helpers::dcca::ChargingContext::Data:
+ case anna::diameter::helpers::dcca::ChargingContext::Voice:
+ case anna::diameter::helpers::dcca::ChargingContext::Content: {
+ // Session-Id: '<DiameterIdentity>;<high 32 bits>;<low 32 bits>[;<optional value>="">]'
+ std::string sid = anna::diameter::helpers::base::functions::getSessionId(message->getBody());
+ std::string diameterIdentity, optional;
+ anna::U32 high, low;
+ anna::diameter::helpers::base::functions::decodeSessionId(sid, diameterIdentity, high, low /* context-teid */, optional);
+
+ if(a_sessionBasedModelsType == "SessionIdLowPart") return (low % maxClientSessions);
+
+ if(a_sessionBasedModelsType == "SessionIdHighPart") return (high % maxClientSessions);
+
+ if(a_sessionBasedModelsType == "SessionIdOptionalPart") return (atoi(optional.c_str()) % maxClientSessions);
+ }
+ case anna::diameter::helpers::dcca::ChargingContext::SMS:
+ case anna::diameter::helpers::dcca::ChargingContext::MMS:
+ case anna::diameter::helpers::dcca::ChargingContext::Unknown:
+ default:
+ return -1; // IEC model and Unknown traffic types
+ }
+ } catch(anna::RuntimeException &ex) {
+ LOGDEBUG(
+ std::string msg = ex.getText();
+ msg += " | Round-robin between sessions will be used to send";
+ anna::Logger::debug(msg, ANNA_FILE_LOCATION);
+ );
+ }
+
+ return -1;
+}
+