X-Git-Url: https://git.teslayout.com/public/public/public/?p=anna.git;a=blobdiff_plain;f=source%2Fdiameter.comm%2FSession.cpp;h=d80175ff1ad16016954a226775a45c5efaac7208;hp=4fb5ab49cb4a2980e0493caf84a28dadfe6b4e42;hb=HEAD;hpb=7681cb4079366eb6908dd5d0dc0124c3fcef4b6b diff --git a/source/diameter.comm/Session.cpp b/source/diameter.comm/Session.cpp index 4fb5ab4..d80175f 100644 --- a/source/diameter.comm/Session.cpp +++ b/source/diameter.comm/Session.cpp @@ -24,6 +24,8 @@ #include #include #include +#include +#include #include #include @@ -53,10 +55,8 @@ const int Session::DefaultPort(3868); Session::Session(const char *className, const char *timerName) : anna::timex::Timer(timerName, (anna::Millisecond)0) /* not assigned */, a_className(className), a_timeController(NULL), - a_engine(NULL), a_notifyOrphansOnExpiration(true), - a_actionTimer(NULL), - a_dpr(ClassCode::ApplicationMessage) { // realmente no es necesario, los Message son por defecto de aplicacion + a_actionTimer(NULL) { initialize(); } @@ -114,11 +114,11 @@ void Session::initializeSequences() { a_nextEndToEnd = ((::time(NULL) & 0xFFF) << 20) + (rand() & 0xFFFFF); } -void Session::sendDPA() +void Session::sendDPA(const Engine *commEngine, const anna::DataBlock &dprDataBlock) noexcept(false) { LOGMETHOD(anna::TraceMethod traceMethod("anna::diameter::comm::Session", "sendDPA", ANNA_FILE_LOCATION)); anna::DataBlock dpa(true); - a_engine->readDPA(dpa, a_dpr.getBody()); // Asume that DPA is valid ... + commEngine->readDPA(dpa, dprDataBlock); // Asume that DPA is valid ... if(dpa.isEmpty()) { LOGWARNING(anna::Logger::warning("This diameter agent defines an empty DPA message. Remote disconnection DPR will be ignored going to the Bound state", ANNA_FILE_LOCATION)); @@ -252,9 +252,17 @@ void Session::expireResponse(diameter::comm::Response* response) doUnbind = true; // (*) + // Get origin host corresponding to the message: + anna::diameter::comm::OriginHostManager &ohm = anna::diameter::comm::OriginHostManager::instantiate(); + + // Extract OriginHost from datablock (db): + std::string originHostName = anna::diameter::helpers::base::functions::getOriginHost(response->getRequest()->getBody()); + LOGDEBUG(anna::Logger::debug(anna::functions::asString("ORIGIN HOST FOR THE MESSAGE WHICH WAS EXPIRED: %s", originHostName.c_str()), ANNA_FILE_LOCATION)); + anna::diameter::comm::OriginHost *originHost = ohm.getOriginHost(originHostName); + try { response->setMessage(NULL); - eventResponse(*response); + eventResponse(*response, originHost); } catch(anna::RuntimeException& ex) { ex.trace(); } @@ -338,7 +346,9 @@ void Session::finalize() { try { response->setMessage(NULL); - eventResponse(*response); + eventResponse(*response, nullptr); // upstream, we need to check second argument to know if comes from here. + // If originHost is NULL, and we are client, we could access through engine: a_engine->getOriginHostName(), and then ohm.getOriginHost(name). BUT CLIENTS DO NOTHING WITH THIS ARGUMENT. + // If server, we must return there: add protection for second argument. } catch(anna::RuntimeException& ex) { ex.trace(); } @@ -370,7 +380,10 @@ void Session::response_erase(Response* response) Response::release(response); if(a_state == State::Disconnecting) // only OnDisconnect::WaitPendings arrives here (the other disconnect suddently) - if(getOTARequests() == 0) sendDPA(); + if(getOTARequests() == 0) { + // TODO: decode response->getRequest(), which is a comm message, so we get Origin-Host, and then, from OriginHostManager, we get the commEngine to provide: + //sendDPA(commEngine, dprDataBlock); + } if(a_state == State::Closing) // only OnDisconnect::WaitPendings arrives here (the other disconnect suddently) if(getOTARequests() == 0) unbind();