gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r21575 - gnunet/src/transport


From: gnunet
Subject: [GNUnet-SVN] r21575 - gnunet/src/transport
Date: Fri, 25 May 2012 16:04:41 +0200

Author: wachs
Date: 2012-05-25 16:04:41 +0200 (Fri, 25 May 2012)
New Revision: 21575

Modified:
   gnunet/src/transport/plugin_transport_http.c
   gnunet/src/transport/plugin_transport_http.h
Log:
- timeout for http/s


Modified: gnunet/src/transport/plugin_transport_http.c
===================================================================
--- gnunet/src/transport/plugin_transport_http.c        2012-05-25 11:05:34 UTC 
(rev 21574)
+++ gnunet/src/transport/plugin_transport_http.c        2012-05-25 14:04:41 UTC 
(rev 21575)
@@ -106,9 +106,25 @@
  */
 struct Plugin;
 
+/**
+ * Start session timeout
+ */
+static void
+start_session_timeout (struct Session *s);
 
+/**
+ * Increment session timeout due to activity
+ */
+static void
+reschedule_session_timeout (struct Session *s);
 
 /**
+ * Cancel timeout
+ */
+static void
+stop_session_timeout (struct Session *s);
+
+/**
  * Append our port and forward the result.
  *
  * @param cls the 'struct PrettyPrinterContext*'
@@ -320,6 +336,8 @@
   atsi[1].value = session->ats_address_network_type;
   GNUNET_break (session->ats_address_network_type != ntohl 
(GNUNET_ATS_NET_UNSPECIFIED));
 
+  reschedule_session_timeout (session);
+
   delay =
       plugin->env->receive (plugin->env->cls, &s->target, message,
                             (const struct GNUNET_ATS_Information *) &atsi,
@@ -575,6 +593,8 @@
 void
 delete_session (struct Session *s)
 {
+  stop_session_timeout(s);
+
   if (s->msg_tk != NULL)
   {
     GNUNET_SERVER_mst_destroy (s->msg_tk);
@@ -588,8 +608,7 @@
 
 struct Session *
 create_session (struct Plugin *plugin, const struct GNUNET_PeerIdentity 
*target,
-                const void *addr, size_t addrlen,
-                GNUNET_TRANSPORT_TransmitContinuation cont, void *cont_cls)
+                const void *addr, size_t addrlen)
 {
   struct Session *s = NULL;
 
@@ -604,9 +623,12 @@
   s->next = NULL;
   s->next_receive = GNUNET_TIME_absolute_get_zero ();
   s->ats_address_network_type = htonl (GNUNET_ATS_NET_UNSPECIFIED);
+  start_session_timeout(s);
   return s;
 }
 
+
+
 void
 notify_session_end (void *cls, const struct GNUNET_PeerIdentity *peer,
                     struct Session *s)
@@ -662,16 +684,7 @@
   GNUNET_assert ((addrlen == sizeof (struct IPv6HttpAddress)) ||
                  (addrlen == sizeof (struct IPv4HttpAddress)));
 
-  s = GNUNET_malloc (sizeof (struct Session));
-  memcpy (&s->target, &address->peer, sizeof (struct GNUNET_PeerIdentity));
-  s->plugin = plugin;
-  s->addr = GNUNET_malloc (address->address_length);
-  memcpy (s->addr, address->address, address->address_length);
-  s->addrlen = addrlen;
-  s->next = NULL;
-  s->next_receive = GNUNET_TIME_absolute_get_zero ();
-  s->inbound = GNUNET_NO;
-  s->ats_address_network_type = htonl (GNUNET_ATS_NET_UNSPECIFIED);
+  s = create_session (plugin, &address->peer, address->address, 
address->address_length);
 
   /* Get ATS type */
   if (addrlen == sizeof (struct IPv4HttpAddress))
@@ -790,6 +803,8 @@
   msg->transmit_cont_cls = cont_cls;
   memcpy (msg->buf, msgbuf, msgbuf_size);
 
+  reschedule_session_timeout (session);
+
   if (session->inbound == GNUNET_NO)
   {
     GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, plugin->name,
@@ -1468,7 +1483,89 @@
   return res;
 }
 
+
 /**
+ * Session was idle, so disconnect it
+ */
+static void
+session_timeout (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+  GNUNET_assert (NULL != cls);
+  struct Session *s = cls;
+
+  s->timeout_task = GNUNET_SCHEDULER_NO_TASK;
+
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Session %p was idle for %llu, 
disconnecting\n",
+      s, GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT.rel_value);
+
+  /* call session destroy function */
+  if (s->inbound == GNUNET_NO)
+    GNUNET_assert (GNUNET_OK == client_disconnect (s));
+  else
+    GNUNET_assert (GNUNET_OK == server_disconnect (s));
+
+}
+
+/**
+ * Start session timeout
+ */
+static void
+start_session_timeout (struct Session *s)
+{
+  GNUNET_assert (NULL != s);
+  GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == s->timeout_task);
+
+  s->timeout_task =  GNUNET_SCHEDULER_add_delayed 
(GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT,
+                                                   &session_timeout,
+                                                   s);
+
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Timeout for session %p set to %llu\n",
+      s, GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT.rel_value);
+}
+
+/**
+ * Increment session timeout due to activity
+ */
+static void
+reschedule_session_timeout (struct Session *s)
+{
+  GNUNET_assert (NULL != s);
+  GNUNET_assert (GNUNET_SCHEDULER_NO_TASK != s->timeout_task);
+
+  GNUNET_SCHEDULER_cancel (s->timeout_task);
+  s->timeout_task =  GNUNET_SCHEDULER_add_delayed 
(GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT,
+                                                   &session_timeout,
+                                                   s);
+
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Timeout rescheduled for session %p set 
to %llu\n",
+      s, GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT.rel_value);
+}
+
+/**
+ * Cancel timeout
+ */
+static void
+stop_session_timeout (struct Session *s)
+{
+  GNUNET_assert (NULL != s);
+
+  if (GNUNET_SCHEDULER_NO_TASK != s->timeout_task)
+  {
+    GNUNET_SCHEDULER_cancel (s->timeout_task);
+    s->timeout_task = GNUNET_SCHEDULER_NO_TASK;
+
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Timeout rescheduled for session %p 
canceled\n",
+      s, GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT.rel_value);
+  }
+  else
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Timeout for session %p was not 
active\n",
+      s);
+  }
+}
+
+
+/**
  * Entry point for the plugin.
  */
 void *

Modified: gnunet/src/transport/plugin_transport_http.h
===================================================================
--- gnunet/src/transport/plugin_transport_http.h        2012-05-25 11:05:34 UTC 
(rev 21574)
+++ gnunet/src/transport/plugin_transport_http.h        2012-05-25 14:04:41 UTC 
(rev 21575)
@@ -400,6 +400,11 @@
   GNUNET_SCHEDULER_TaskIdentifier recv_wakeup_task;
 
   /**
+   * Session timeout task
+   */
+  GNUNET_SCHEDULER_TaskIdentifier timeout_task;
+
+  /**
    * Is client send handle paused since there are no data to send?
    * GNUNET_YES/NO
    */
@@ -469,11 +474,6 @@
 void
 delete_session (struct Session *s);
 
-struct Session *
-create_session (struct Plugin *plugin, const struct GNUNET_PeerIdentity 
*target,
-                const void *addr, size_t addrlen,
-                GNUNET_TRANSPORT_TransmitContinuation cont, void *cont_cls);
-
 int
 exist_session (struct Plugin *plugin, struct Session *s);
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]