#include <anna/diameter/helpers/dcca/functions.hpp>
#include <anna/diameter/helpers/dcca/functions.hpp>
#include <anna/diameter.comm/OriginHost.hpp>
+#include <anna/diameter.comm/OriginHostManager.hpp>
// Local
#include "Procedure.hpp"
void usage (std::string &response) {
response += "\n\nInvalid arguments. Provide these ones:";
response += "\n";
- response += "\n<test timeout ms (0: no timeout step)><initial sequence>|<final sequence>|<digits>|<CCR-I xml file>[|CCR-T xml file]";
+ response += "\n<initial sequence>|<final sequence>|<test timeout ms (0: no timeout step)>|<digits>|<CCR-I xml file>[|CCR-T xml file]";
response += "\n";
response += "\nSequences are parsed when needed, over AVPs or internal values:";
response += "\n";
response += "\nThe same will be done in MSISDN and IMSI (Subscription-Data AVPs).";
response += "\nFramed-IP-Address will be sequenced with a direct correspondence to hex value.";
response += "\n";
- response += "\nThen, you could provide these arguments: \"5000|2000000|9000000|7|CCR-I.xml|CCR-T.xml\"";
+ response += "\nThen, you could provide these arguments: \"2000000|9000000|5000|7|CCR-I.xml|CCR-T.xml\"";
response += "\n";
}
}
-void Procedure::execute(const std::string &args, std::string &response, anna::diameter::comm::OriginHost *originHost) throw(anna::RuntimeException) {
+void Procedure::execute(const std::string &args, std::string &response) throw(anna::RuntimeException) {
response = "Dynamic procedure failed to process '"; response += args; response += "': ";
// Load xml messages:
anna::diameter::codec::Message ccri, ccrt;
anna::diameter::codec::Avp *ccri_sessionId, *ccrt_sessionId, *ccri_framedIPAddress, *ccrt_framedIPAddress, *ccri_msisdn, *ccri_imsi;
- anna::diameter::codec::Avp *si1, *si2, *sidata1, *sidata2, *sitype1, *sitype2;
+ anna::diameter::codec::Avp *si1, *si2, *sidata1, *sidata2, *sitype1;
+ anna::diameter::codec::Avp *ccri_originHost;
- try {
+ ///////// CCR-Initial:
+ ccri.loadXML(ccr_i);
- ///////// CCR-Initial:
- ccri.loadXML(ccr_i);
+ // Session-Id & Framed-Ip-Address AVPs
+ ccri_sessionId = ccri.getAvp("Session-Id");
+ ccri_framedIPAddress = ccri.getAvp("Framed-IP-Address");
+ ccri_originHost = ccri.getAvp("Origin-Host");
- // Session-Id & Framed-Ip-Address AVPs
- ccri_sessionId = ccri.getAvp("Session-Id");
- ccri_framedIPAddress = ccri.getAvp("Framed-IP-Address");
-
- // Subscription-Id AVPs
- if (ccri.countAvp("Subscription-Id") != 2) {
- response += "Both Subscription-Id MSISDN & IMSI Avps must be present in the CCR-Initial provided !";
- return;
- }
+ // Subscription-Id AVPs
+ if (ccri.countAvp("Subscription-Id") != 2) {
+ response += "Both Subscription-Id MSISDN & IMSI Avps must be present in the CCR-Initial provided !";
+ return;
+ }
- si1 = ccri.getAvp("Subscription-Id", 1, anna::Exception::Mode::Ignore);
- si2 = ccri.getAvp("Subscription-Id", 2, anna::Exception::Mode::Ignore);
+ si1 = ccri.getAvp("Subscription-Id", 1, anna::Exception::Mode::Ignore);
+ si2 = ccri.getAvp("Subscription-Id", 2, anna::Exception::Mode::Ignore);
- if (!si1 || !si2) {
- response += "Cannot found Subscription-Id MSISDN & IMSI Avps !" ;
- return;
- }
+ if (!si1 || !si2) {
+ response += "Cannot found Subscription-Id MSISDN & IMSI Avps !" ;
+ return;
+ }
- sidata1 = si1->getAvp("Subscription-Id-Data");
- sidata2 = si2->getAvp("Subscription-Id-Data");
- sitype1 = si1->getAvp("Subscription-Id-Type");
- //sitype2 = si2->getAvp("Subscription-Id-Type");
+ sidata1 = si1->getAvp("Subscription-Id-Data");
+ sidata2 = si2->getAvp("Subscription-Id-Data");
+ sitype1 = si1->getAvp("Subscription-Id-Type");
+ //sitype2 = si2->getAvp("Subscription-Id-Type");
- if (sitype1->getEnumerated()->getValue() == anna::diameter::helpers::dcca::AVPVALUES__Subscription_Id_Type::END_USER_E164) {
- ccri_msisdn = sidata1;
- ccri_imsi = sidata2;
- }
- else {
- ccri_msisdn = sidata2;
- ccri_imsi = sidata1;
- }
+ if (sitype1->getEnumerated()->getValue() == anna::diameter::helpers::dcca::AVPVALUES__Subscription_Id_Type::END_USER_E164) {
+ ccri_msisdn = sidata1;
+ ccri_imsi = sidata2;
+ }
+ else {
+ ccri_msisdn = sidata2;
+ ccri_imsi = sidata1;
+ }
- ///////// CCR-Termination:
- if (haveTermination) {
- ccrt.loadXML(ccr_t);
+ ///////// CCR-Termination:
+ if (haveTermination) {
+ ccrt.loadXML(ccr_t);
- // Session-Id & Framed-Ip-Address AVPs
- ccrt_sessionId = ccrt.getAvp("Session-Id");
- ccrt_framedIPAddress = ccrt.getAvp("Framed-IP-Address");
- }
- }
- catch(anna::RuntimeException &ex) {
- ex.trace();
+ // Session-Id & Framed-Ip-Address AVPs
+ ccrt_sessionId = ccrt.getAvp("Session-Id");
+ ccrt_framedIPAddress = ccrt.getAvp("Framed-IP-Address");
}
+
// Prepare session-id string:
std::string sessionId = ccri_sessionId->getUTF8String()->getValue();
std::size_t last_semicolon = sessionId.rfind(";");
char cad_framed[16];
anna::testing::TestCase *tc;
+ // Origin host manager:
+ anna::diameter::comm::OriginHostManager &ohm = anna::diameter::comm::OriginHostManager::instantiate();
+ // Assume the oh name from CCR-I (same as CCR-T):
+ std::string originHostName = ccri_originHost->getDiameterIdentity()->getValue();
+ anna::diameter::comm::OriginHost *originHost = ohm.getOriginHost(originHostName);
+
for (ll_index = 0; ll_index < ll_seq_size; ll_index++) {
// Calculate next values ////////////////////////////////////////////////////////////
}
// Step 2: sendxml2e: CCR-Initial
- tc->addSendxml2e(ccri.code(), originHost, -1 /* 'wait for request' step number for answers */);
+ tc->addSendDiameterXml2e(ccri.code(), originHost, -1 /* 'wait for request' step number for answers */);
// Step 3: waitfe: CCA with same session id
// PARAM: 1 2 3 4 5 6 7 8 9 10 11
// wait<fe/fc>|[code]|[bitR]|[hopByHop]|[applicationId]|[sessionId]|[resultCode]|[msisdn]|[imsi]|[serviceContextId]
- tc->addWait(true /* from entity */, "272", "0", "", "", sessionId, "2001", "", "", "");
+ tc->addWaitDiameter(true /* from entity */, "272", "0", "", "", sessionId, "2001", "", "", "");
if (haveTermination) {
// Step 4: sendxml2e: CCR-Termination
- tc->addSendxml2e(ccrt.code(), originHost, -1 /* 'wait for request' step number for answers */);
+ tc->addSendDiameterXml2e(ccrt.code(), originHost, -1 /* 'wait for request' step number for answers */);
// Step 5: waitfe: CCA with same session id
- tc->addWait(true /* from entity */, "272", "0", "", "", sessionId, "2001", "", "", "");
+ tc->addWaitDiameter(true /* from entity */, "272", "0", "", "", sessionId, "2001", "", "", "");
}
} // loop