stuff
[oweals/gnunet.git] / src / transport / plugin_transport_tcp.c
index a8eee970c1a3afbd3bb5c91aa6c3b98f8c029b38..e796dacf4ffe20cce4c1a2427ca7ca744153bda0 100644 (file)
@@ -24,6 +24,7 @@
  */
 #include "platform.h"
 #include "gnunet_hello_lib.h"
+#include "gnunet_constants.h"
 #include "gnunet_connection_lib.h"
 #include "gnunet_container_lib.h"
 #include "gnunet_nat_lib.h"
 #include "gnunet_transport_plugin.h"
 #include "transport.h"
 
-#define DEBUG_TCP GNUNET_YES
-
-#define DEBUG_TCP_NAT GNUNET_YES
+#define DEBUG_TCP GNUNET_NO
 
+#define DEBUG_TCP_NAT GNUNET_NO
 
 /**
  * Initial handshake message for a session.
@@ -651,6 +651,7 @@ do_transmit (void *cls, size_t size, void *buf)
   char *cbuf;
   size_t ret;
 
+  GNUNET_assert (session != NULL);
   session->transmit_handle = NULL;
   plugin = session->plugin;
   if (buf == NULL)
@@ -867,18 +868,20 @@ disconnect_session (struct Session *session)
        GNUNET_SERVER_receive_done (session->client,
                                    GNUNET_SYSERR);     
     }
-  else if (session->client != NULL)
-    GNUNET_SERVER_client_drop (session->client);
+  if (session->client != NULL)
+    {
+      GNUNET_SERVER_client_drop (session->client);
+      session->client = NULL;
+    }
   GNUNET_STATISTICS_update (session->plugin->env->stats,
                            gettext_noop ("# TCP sessions active"),
                            -1,
                            GNUNET_NO);
   GNUNET_free_non_null (session->connect_addr);
-
   session->plugin->env->session_end (session->plugin->env->cls,
                                      &session->target,
                                      session);
-
+  GNUNET_assert (NULL == session->transmit_handle);
   GNUNET_free (session);
 }
 
@@ -1110,6 +1113,7 @@ tcp_plugin_send (void *cls,
                                     target,
                                     NULL, 
                                    GNUNET_YES);
+          GNUNET_assert (session != NULL);
 
           /* create new message entry */
           pm = GNUNET_malloc (sizeof (struct PendingMessage) + msgbuf_size);
@@ -1186,8 +1190,23 @@ tcp_plugin_send (void *cls,
              addrlen);
       session->connect_alen = addrlen;
     }
+  else  /* session != NULL */
+    {
+      /* check if session is valid */
+      struct Session * ses = plugin->sessions;
+      while ((ses != NULL) && (ses != session))
+        ses = ses->next;
+      if (ses == NULL)
+       {
+         GNUNET_break (0);
+         return -1;
+       }
+    }
   GNUNET_assert (session != NULL);
   GNUNET_assert (session->client != NULL);
+
+
+  GNUNET_SERVER_client_set_timeout(session->client, GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT);
   GNUNET_STATISTICS_update (plugin->env->stats,
                            gettext_noop ("# bytes currently in TCP buffers"),
                            msgbuf_size,
@@ -1517,7 +1536,6 @@ handle_tcp_nat_probe (void *cls,
     }
 
   tcp_nat_probe = (const struct TCP_NAT_ProbeMessage *)message;
-
   if (0 == memcmp (&tcp_nat_probe->clientIdentity,
                    plugin->env->my_identity,
                    sizeof (struct GNUNET_PeerIdentity)))
@@ -1737,6 +1755,7 @@ handle_tcp_welcome (void *cls,
     }
   session->last_activity = GNUNET_TIME_absolute_get ();
   session->expecting_welcome = GNUNET_NO;
+  GNUNET_SERVER_client_set_timeout(client, GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT);
   GNUNET_SERVER_receive_done (client, GNUNET_OK);
 }
 
@@ -2076,7 +2095,11 @@ libgnunet_plugin_transport_tcp_init (void *cls)
                                         &try_connection_reversal,
                                         plugin);
       while (ret > 0)
-       GNUNET_free (addrs[--ret]);
+      {
+        ret--;
+        GNUNET_assert (addrs[ret] != NULL);
+       GNUNET_free (addrs[ret]);
+      }
       GNUNET_free_non_null (addrs);
       GNUNET_free_non_null (addrlens);
     }
@@ -2181,6 +2204,7 @@ libgnunet_plugin_transport_tcp_done (void *cls)
       GNUNET_CONNECTION_destroy (tcp_probe->sock, GNUNET_NO);
       GNUNET_free (tcp_probe);
     }
+  GNUNET_CONTAINER_multihashmap_destroy (plugin->nat_wait_conns);
   GNUNET_free (plugin);
   GNUNET_free (api);
   return NULL;