Remove warnings
[anna.git] / source / diameter.comm / Session.cpp
index 9a5c447..736635c 100644 (file)
@@ -1,37 +1,9 @@
-// ANNA - Anna is Not Nothingness Anymore
-//
-// (c) Copyright 2005-2014 Eduardo Ramos Testillano & Francisco Ruiz Rayo
-//
-// https://bitbucket.org/testillano/anna
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions
-// are met:
-//
-//     * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-//     * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-// Authors: eduardo.ramos.testillano@gmail.com
-//          cisco.tierra@gmail.com
+// ANNA - Anna is Not Nothingness Anymore                                                         //
+//                                                                                                //
+// (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo                         //
+//                                                                                                //
+// See project site at http://redmine.teslayout.com/projects/anna-suite                           //
+// See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
 
 
 #include <anna/core/functions.hpp>
@@ -137,7 +109,7 @@ void Session::initializeSequences() throw() {
   //      affect any state that was set when the original request was
   //      processed.  Duplicate answer messages that are to be locally
   //      consumed (see Section 6.2) SHOULD be silently discarded.
-  srand(::time(NULL) + anna::functions::exclusiveHash(anna::functions::asString("%s:%d|%d", getAddress().c_str(), getPort(), a_socketId)));
+  srand(::time(NULL) + anna::functions::hash(anna::functions::asString("%s:%d|%d", getAddress().c_str(), getPort(), a_socketId).c_str()));
   a_nextHopByHop = rand();
   a_nextEndToEnd = ((::time(NULL) & 0xFFF) << 20) + (rand() & 0xFFFFF);
 }
@@ -266,16 +238,20 @@ void Session::expireResponse(diameter::comm::Response* response)
 throw() {
   LOGMETHOD(anna::TraceMethod traceMethod("anna::diameter::comm::Session", "expireResponse", ANNA_FILE_LOCATION));
   bool doUnbind = false;
+  bool doRetransmission = false;
 
-  // Quitar el OnExpiry: no tiene sentido habiendo keep-alive (DWR)
   if(response->getClassCode() != ClassCode::Bind) {
     if(response->getRequest()->getOnExpiry() == Message::OnExpiry::Abandon) {
       a_onDisconnect = OnDisconnect::IgnorePendings; // Abandon is not graceful
       doUnbind = true;
     }
+    else if(response->getRequest()->getOnExpiry() == Message::OnExpiry::Retransmit) {
+      doRetransmission = true;
+    }
   } else
     doUnbind = true; // (*)
 
+
   try {
     response->setMessage(NULL);
     eventResponse(*response);
@@ -291,6 +267,24 @@ throw() {
     setState(State::Bound);
   }
 
+  if(doRetransmission) {
+    diameter::comm::Message *request = const_cast<Message*>(response->getRequest());
+    int retries = request->getRetries();
+    if (retries > 0) {
+      retries--;
+      request->setRetries(retries);
+      LOGDEBUG
+      (
+        std::string msg(asString());
+        msg += anna::functions::asString(" | Retransmission initiated for request with HopByHop: %u; remaining %d retries", response->getHopByHop(), retries);
+        anna::Logger::debug(msg, ANNA_FILE_LOCATION);
+      );
+      diameter::codec::functions::setPotentiallyReTransmittedMessageBit(*request);
+      eventRequestRetransmission(request);
+      send(request);
+    }
+  }
+
   response_erase(response);
 
   if(doUnbind) unbind();
@@ -303,7 +297,7 @@ void Session::finalize() throw() {
   cancelActionTimer(); // Action timer
   eventPeerShutdown();
 ///////////////////////////////////////////////////////////////////////
-// Notificar la finalización de las respuestas pendientes de recibir //
+// Notificar la finalizacin de las respuestas pendientes de recibir //
 ///////////////////////////////////////////////////////////////////////
 // RFC 3588 - 5.5.4.  Failover and Failback Procedures
 //
@@ -445,7 +439,6 @@ throw() {
 
   // Messages
   anna::xml::Node* messages = result->createChild("diameter.comm.Messages");
-  const Response* response;
   const Message* message;
 
   for(const_response_iterator ii = response_begin(), maxii = response_end(); ii != maxii; ii ++) {
@@ -502,4 +495,3 @@ void Session::updateOutgoingActivityTime(void) throw() {
     anna::Logger::debug(msg, ANNA_FILE_LOCATION);
   );
 }
-