[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r19816 - gnunet/src/transport
From: |
gnunet |
Subject: |
[GNUnet-SVN] r19816 - gnunet/src/transport |
Date: |
Thu, 16 Feb 2012 13:29:06 +0100 |
Author: wachs
Date: 2012-02-16 13:29:06 +0100 (Thu, 16 Feb 2012)
New Revision: 19816
Modified:
gnunet/src/transport/plugin_transport_tcp.c
Log:
- clean up pending nat sessions
Modified: gnunet/src/transport/plugin_transport_tcp.c
===================================================================
--- gnunet/src/transport/plugin_transport_tcp.c 2012-02-16 11:54:12 UTC (rev
19815)
+++ gnunet/src/transport/plugin_transport_tcp.c 2012-02-16 12:29:06 UTC (rev
19816)
@@ -1004,6 +1004,7 @@
struct sockaddr_in6 a6;
const struct IPv4TcpAddress *t4;
const struct IPv6TcpAddress *t6;
+ struct GNUNET_ATS_Information ats;
unsigned int is_natd = GNUNET_NO;
size_t addrlen = 0;
@@ -1082,17 +1083,28 @@
return NULL;
}
+ ats = plugin->env->get_address_type (plugin->env->cls, sb ,sbs);
+
if ((is_natd == GNUNET_YES) && (addrlen == sizeof (struct IPv6TcpAddress)))
- return NULL; /* NAT client only works with IPv4 addresses */
+ {
+ /* NAT client only works with IPv4 addresses */
+ return NULL;
+ }
if (0 == plugin->max_connections)
- return NULL; /* saturated */
+ {
+ /* saturated */
+ return NULL;
+ }
if ((is_natd == GNUNET_YES) &&
(GNUNET_YES ==
GNUNET_CONTAINER_multihashmap_contains (plugin->nat_wait_conns,
&address->peer.hashPubKey)))
- return NULL; /* Only do one NAT punch attempt per peer
identity */
+ {
+ /* Only do one NAT punch attempt per peer identity */
+ return NULL;
+ }
if ((is_natd == GNUNET_YES) && (NULL != plugin->nat) &&
(GNUNET_NO ==
@@ -1106,6 +1118,7 @@
session = create_session (plugin, &address->peer, NULL, GNUNET_YES);
session->addrlen = 0;
session->addr = NULL;
+ session->ats_address_network_type = ats.value;
GNUNET_assert (session != NULL);
GNUNET_assert (GNUNET_CONTAINER_multihashmap_put
@@ -1145,14 +1158,7 @@
session->addr = GNUNET_malloc (addrlen);
memcpy (session->addr, address->address, addrlen);
session->addrlen = addrlen;
- if (addrlen != 0)
- {
- struct GNUNET_ATS_Information ats;
- ats = plugin->env->get_address_type (plugin->env->cls, sb ,sbs);
- session->ats_address_network_type = ats.value;
- }
- else
- GNUNET_break (0);
+ session->ats_address_network_type = ats.value;
GNUNET_CONTAINER_multihashmap_put(plugin->sessionmap,
&address->peer.hashPubKey, session,
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
@@ -1183,6 +1189,26 @@
return GNUNET_YES;
}
+int session_nat_disconnect_it (void *cls,
+ const GNUNET_HashCode * key,
+ void *value)
+{
+ struct Session *session = value;
+
+ if (session != NULL)
+ {
+ GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "tcp",
+ "Cleaning up pending NAT session for peer `%4s'\n",
GNUNET_i2s (&session->target));
+ GNUNET_CONTAINER_multihashmap_remove (session->plugin->nat_wait_conns,
&session->target.hashPubKey, session);
+ GNUNET_SERVER_client_drop (session->client);
+ GNUNET_SERVER_receive_done (session->client, GNUNET_SYSERR);
+ GNUNET_free (session);
+ }
+
+ return GNUNET_YES;
+}
+
+
/**
* Function that can be called to force a disconnect from the
* specified neighbour. This should also cancel all previously
@@ -1203,11 +1229,23 @@
tcp_plugin_disconnect (void *cls, const struct GNUNET_PeerIdentity *target)
{
struct Plugin *plugin = cls;
+ struct Session *nat_session = NULL;
GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "tcp",
"Disconnecting peer `%4s'\n", GNUNET_i2s (target));
- GNUNET_CONTAINER_multihashmap_get_multiple(plugin->sessionmap,
&target->hashPubKey, session_disconnect_it, plugin);
+ GNUNET_CONTAINER_multihashmap_get_multiple (plugin->sessionmap,
&target->hashPubKey, session_disconnect_it, plugin);
+
+ nat_session = GNUNET_CONTAINER_multihashmap_get(plugin->nat_wait_conns,
&target->hashPubKey);
+ if (nat_session != NULL)
+ {
+ GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "tcp",
+ "Cleaning up pending NAT session for peer `%4s'\n",
GNUNET_i2s (target));
+ GNUNET_CONTAINER_multihashmap_remove (plugin->nat_wait_conns,
&target->hashPubKey, nat_session);
+ GNUNET_SERVER_client_drop (nat_session->client);
+ GNUNET_SERVER_receive_done (nat_session->client, GNUNET_SYSERR);
+ GNUNET_free (nat_session);
+ }
}
@@ -1424,9 +1462,8 @@
const struct sockaddr_in *s4;
const struct sockaddr_in6 *s6;
-#if DEBUG_TCP_NAT
GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "tcp", "received NAT probe\n");
-#endif
+
/* We have received a TCP NAT probe, meaning we (hopefully) initiated
* a connection to this peer by running gnunet-nat-client. This peer
* received the punch message and now wants us to use the new connection
@@ -1456,17 +1493,14 @@
clientIdentity.hashPubKey);
if (session == NULL)
{
-#if DEBUG_TCP_NAT
GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "tcp",
"Did NOT find session for NAT probe!\n");
-#endif
GNUNET_SERVER_receive_done (client, GNUNET_OK);
return;
}
-#if DEBUG_TCP_NAT
GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "tcp",
"Found session for NAT probe!\n");
-#endif
+
GNUNET_assert (GNUNET_CONTAINER_multihashmap_remove
(plugin->nat_wait_conns,
&tcp_nat_probe->clientIdentity.hashPubKey,
@@ -1509,11 +1543,11 @@
break;
default:
GNUNET_break_op (0);
-#if DEBUG_TCP_NAT
+
GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "tcp",
"Bad address for incoming connection!\n");
-#endif
GNUNET_free (vaddr);
+
GNUNET_SERVER_client_drop (client);
GNUNET_free (session);
GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
@@ -2054,6 +2088,8 @@
/* Removing leftover sessions */
GNUNET_CONTAINER_multihashmap_iterate(plugin->sessionmap,
&session_disconnect_it, NULL);
+ /* Removing leftover NAT sessions */
+ GNUNET_CONTAINER_multihashmap_iterate(plugin->nat_wait_conns,
&session_nat_disconnect_it, NULL);
if (plugin->service != NULL)
GNUNET_SERVICE_stop (plugin->service);
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r19816 - gnunet/src/transport,
gnunet <=