diff options
author | Matthias Wachs <wachs@net.in.tum.de> | 2012-02-16 12:29:06 +0000 |
---|---|---|
committer | Matthias Wachs <wachs@net.in.tum.de> | 2012-02-16 12:29:06 +0000 |
commit | 3641ca940fad5f897733f2f83c3779ae2b2fc1d4 (patch) | |
tree | 3ac29c0536db5f23baa208445d2495972048bc4c /src/transport/plugin_transport_tcp.c | |
parent | e686141383bfc85a709d125f6d37d23918937028 (diff) | |
download | gnunet-3641ca940fad5f897733f2f83c3779ae2b2fc1d4.tar.gz gnunet-3641ca940fad5f897733f2f83c3779ae2b2fc1d4.zip |
- clean up pending nat sessions
Diffstat (limited to 'src/transport/plugin_transport_tcp.c')
-rw-r--r-- | src/transport/plugin_transport_tcp.c | 76 |
1 files changed, 56 insertions, 20 deletions
diff --git a/src/transport/plugin_transport_tcp.c b/src/transport/plugin_transport_tcp.c index 83db537fc..97d1cb37c 100644 --- a/src/transport/plugin_transport_tcp.c +++ b/src/transport/plugin_transport_tcp.c | |||
@@ -1004,6 +1004,7 @@ tcp_plugin_get_session (void *cls, | |||
1004 | struct sockaddr_in6 a6; | 1004 | struct sockaddr_in6 a6; |
1005 | const struct IPv4TcpAddress *t4; | 1005 | const struct IPv4TcpAddress *t4; |
1006 | const struct IPv6TcpAddress *t6; | 1006 | const struct IPv6TcpAddress *t6; |
1007 | struct GNUNET_ATS_Information ats; | ||
1007 | unsigned int is_natd = GNUNET_NO; | 1008 | unsigned int is_natd = GNUNET_NO; |
1008 | size_t addrlen = 0; | 1009 | size_t addrlen = 0; |
1009 | 1010 | ||
@@ -1082,17 +1083,28 @@ tcp_plugin_get_session (void *cls, | |||
1082 | return NULL; | 1083 | return NULL; |
1083 | } | 1084 | } |
1084 | 1085 | ||
1086 | ats = plugin->env->get_address_type (plugin->env->cls, sb ,sbs); | ||
1087 | |||
1085 | if ((is_natd == GNUNET_YES) && (addrlen == sizeof (struct IPv6TcpAddress))) | 1088 | if ((is_natd == GNUNET_YES) && (addrlen == sizeof (struct IPv6TcpAddress))) |
1086 | return NULL; /* NAT client only works with IPv4 addresses */ | 1089 | { |
1090 | /* NAT client only works with IPv4 addresses */ | ||
1091 | return NULL; | ||
1092 | } | ||
1087 | 1093 | ||
1088 | if (0 == plugin->max_connections) | 1094 | if (0 == plugin->max_connections) |
1089 | return NULL; /* saturated */ | 1095 | { |
1096 | /* saturated */ | ||
1097 | return NULL; | ||
1098 | } | ||
1090 | 1099 | ||
1091 | if ((is_natd == GNUNET_YES) && | 1100 | if ((is_natd == GNUNET_YES) && |
1092 | (GNUNET_YES == | 1101 | (GNUNET_YES == |
1093 | GNUNET_CONTAINER_multihashmap_contains (plugin->nat_wait_conns, | 1102 | GNUNET_CONTAINER_multihashmap_contains (plugin->nat_wait_conns, |
1094 | &address->peer.hashPubKey))) | 1103 | &address->peer.hashPubKey))) |
1095 | return NULL; /* Only do one NAT punch attempt per peer identity */ | 1104 | { |
1105 | /* Only do one NAT punch attempt per peer identity */ | ||
1106 | return NULL; | ||
1107 | } | ||
1096 | 1108 | ||
1097 | if ((is_natd == GNUNET_YES) && (NULL != plugin->nat) && | 1109 | if ((is_natd == GNUNET_YES) && (NULL != plugin->nat) && |
1098 | (GNUNET_NO == | 1110 | (GNUNET_NO == |
@@ -1106,6 +1118,7 @@ tcp_plugin_get_session (void *cls, | |||
1106 | session = create_session (plugin, &address->peer, NULL, GNUNET_YES); | 1118 | session = create_session (plugin, &address->peer, NULL, GNUNET_YES); |
1107 | session->addrlen = 0; | 1119 | session->addrlen = 0; |
1108 | session->addr = NULL; | 1120 | session->addr = NULL; |
1121 | session->ats_address_network_type = ats.value; | ||
1109 | GNUNET_assert (session != NULL); | 1122 | GNUNET_assert (session != NULL); |
1110 | 1123 | ||
1111 | GNUNET_assert (GNUNET_CONTAINER_multihashmap_put | 1124 | GNUNET_assert (GNUNET_CONTAINER_multihashmap_put |
@@ -1145,14 +1158,7 @@ tcp_plugin_get_session (void *cls, | |||
1145 | session->addr = GNUNET_malloc (addrlen); | 1158 | session->addr = GNUNET_malloc (addrlen); |
1146 | memcpy (session->addr, address->address, addrlen); | 1159 | memcpy (session->addr, address->address, addrlen); |
1147 | session->addrlen = addrlen; | 1160 | session->addrlen = addrlen; |
1148 | if (addrlen != 0) | 1161 | session->ats_address_network_type = ats.value; |
1149 | { | ||
1150 | struct GNUNET_ATS_Information ats; | ||
1151 | ats = plugin->env->get_address_type (plugin->env->cls, sb ,sbs); | ||
1152 | session->ats_address_network_type = ats.value; | ||
1153 | } | ||
1154 | else | ||
1155 | GNUNET_break (0); | ||
1156 | 1162 | ||
1157 | GNUNET_CONTAINER_multihashmap_put(plugin->sessionmap, &address->peer.hashPubKey, session, GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE); | 1163 | GNUNET_CONTAINER_multihashmap_put(plugin->sessionmap, &address->peer.hashPubKey, session, GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE); |
1158 | 1164 | ||
@@ -1183,6 +1189,26 @@ int session_disconnect_it (void *cls, | |||
1183 | return GNUNET_YES; | 1189 | return GNUNET_YES; |
1184 | } | 1190 | } |
1185 | 1191 | ||
1192 | int session_nat_disconnect_it (void *cls, | ||
1193 | const GNUNET_HashCode * key, | ||
1194 | void *value) | ||
1195 | { | ||
1196 | struct Session *session = value; | ||
1197 | |||
1198 | if (session != NULL) | ||
1199 | { | ||
1200 | GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "tcp", | ||
1201 | "Cleaning up pending NAT session for peer `%4s'\n", GNUNET_i2s (&session->target)); | ||
1202 | GNUNET_CONTAINER_multihashmap_remove (session->plugin->nat_wait_conns, &session->target.hashPubKey, session); | ||
1203 | GNUNET_SERVER_client_drop (session->client); | ||
1204 | GNUNET_SERVER_receive_done (session->client, GNUNET_SYSERR); | ||
1205 | GNUNET_free (session); | ||
1206 | } | ||
1207 | |||
1208 | return GNUNET_YES; | ||
1209 | } | ||
1210 | |||
1211 | |||
1186 | /** | 1212 | /** |
1187 | * Function that can be called to force a disconnect from the | 1213 | * Function that can be called to force a disconnect from the |
1188 | * specified neighbour. This should also cancel all previously | 1214 | * specified neighbour. This should also cancel all previously |
@@ -1203,11 +1229,23 @@ static void | |||
1203 | tcp_plugin_disconnect (void *cls, const struct GNUNET_PeerIdentity *target) | 1229 | tcp_plugin_disconnect (void *cls, const struct GNUNET_PeerIdentity *target) |
1204 | { | 1230 | { |
1205 | struct Plugin *plugin = cls; | 1231 | struct Plugin *plugin = cls; |
1232 | struct Session *nat_session = NULL; | ||
1206 | 1233 | ||
1207 | GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "tcp", | 1234 | GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "tcp", |
1208 | "Disconnecting peer `%4s'\n", GNUNET_i2s (target)); | 1235 | "Disconnecting peer `%4s'\n", GNUNET_i2s (target)); |
1209 | 1236 | ||
1210 | GNUNET_CONTAINER_multihashmap_get_multiple(plugin->sessionmap, &target->hashPubKey, session_disconnect_it, plugin); | 1237 | GNUNET_CONTAINER_multihashmap_get_multiple (plugin->sessionmap, &target->hashPubKey, session_disconnect_it, plugin); |
1238 | |||
1239 | nat_session = GNUNET_CONTAINER_multihashmap_get(plugin->nat_wait_conns, &target->hashPubKey); | ||
1240 | if (nat_session != NULL) | ||
1241 | { | ||
1242 | GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "tcp", | ||
1243 | "Cleaning up pending NAT session for peer `%4s'\n", GNUNET_i2s (target)); | ||
1244 | GNUNET_CONTAINER_multihashmap_remove (plugin->nat_wait_conns, &target->hashPubKey, nat_session); | ||
1245 | GNUNET_SERVER_client_drop (nat_session->client); | ||
1246 | GNUNET_SERVER_receive_done (nat_session->client, GNUNET_SYSERR); | ||
1247 | GNUNET_free (nat_session); | ||
1248 | } | ||
1211 | } | 1249 | } |
1212 | 1250 | ||
1213 | 1251 | ||
@@ -1424,9 +1462,8 @@ handle_tcp_nat_probe (void *cls, struct GNUNET_SERVER_Client *client, | |||
1424 | const struct sockaddr_in *s4; | 1462 | const struct sockaddr_in *s4; |
1425 | const struct sockaddr_in6 *s6; | 1463 | const struct sockaddr_in6 *s6; |
1426 | 1464 | ||
1427 | #if DEBUG_TCP_NAT | ||
1428 | GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "tcp", "received NAT probe\n"); | 1465 | GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "tcp", "received NAT probe\n"); |
1429 | #endif | 1466 | |
1430 | /* We have received a TCP NAT probe, meaning we (hopefully) initiated | 1467 | /* We have received a TCP NAT probe, meaning we (hopefully) initiated |
1431 | * a connection to this peer by running gnunet-nat-client. This peer | 1468 | * a connection to this peer by running gnunet-nat-client. This peer |
1432 | * received the punch message and now wants us to use the new connection | 1469 | * received the punch message and now wants us to use the new connection |
@@ -1456,17 +1493,14 @@ handle_tcp_nat_probe (void *cls, struct GNUNET_SERVER_Client *client, | |||
1456 | clientIdentity.hashPubKey); | 1493 | clientIdentity.hashPubKey); |
1457 | if (session == NULL) | 1494 | if (session == NULL) |
1458 | { | 1495 | { |
1459 | #if DEBUG_TCP_NAT | ||
1460 | GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "tcp", | 1496 | GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "tcp", |
1461 | "Did NOT find session for NAT probe!\n"); | 1497 | "Did NOT find session for NAT probe!\n"); |
1462 | #endif | ||
1463 | GNUNET_SERVER_receive_done (client, GNUNET_OK); | 1498 | GNUNET_SERVER_receive_done (client, GNUNET_OK); |
1464 | return; | 1499 | return; |
1465 | } | 1500 | } |
1466 | #if DEBUG_TCP_NAT | ||
1467 | GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "tcp", | 1501 | GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "tcp", |
1468 | "Found session for NAT probe!\n"); | 1502 | "Found session for NAT probe!\n"); |
1469 | #endif | 1503 | |
1470 | GNUNET_assert (GNUNET_CONTAINER_multihashmap_remove | 1504 | GNUNET_assert (GNUNET_CONTAINER_multihashmap_remove |
1471 | (plugin->nat_wait_conns, | 1505 | (plugin->nat_wait_conns, |
1472 | &tcp_nat_probe->clientIdentity.hashPubKey, | 1506 | &tcp_nat_probe->clientIdentity.hashPubKey, |
@@ -1509,11 +1543,11 @@ handle_tcp_nat_probe (void *cls, struct GNUNET_SERVER_Client *client, | |||
1509 | break; | 1543 | break; |
1510 | default: | 1544 | default: |
1511 | GNUNET_break_op (0); | 1545 | GNUNET_break_op (0); |
1512 | #if DEBUG_TCP_NAT | 1546 | |
1513 | GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "tcp", | 1547 | GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "tcp", |
1514 | "Bad address for incoming connection!\n"); | 1548 | "Bad address for incoming connection!\n"); |
1515 | #endif | ||
1516 | GNUNET_free (vaddr); | 1549 | GNUNET_free (vaddr); |
1550 | |||
1517 | GNUNET_SERVER_client_drop (client); | 1551 | GNUNET_SERVER_client_drop (client); |
1518 | GNUNET_free (session); | 1552 | GNUNET_free (session); |
1519 | GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); | 1553 | GNUNET_SERVER_receive_done (client, GNUNET_SYSERR); |
@@ -2054,6 +2088,8 @@ libgnunet_plugin_transport_tcp_done (void *cls) | |||
2054 | 2088 | ||
2055 | /* Removing leftover sessions */ | 2089 | /* Removing leftover sessions */ |
2056 | GNUNET_CONTAINER_multihashmap_iterate(plugin->sessionmap, &session_disconnect_it, NULL); | 2090 | GNUNET_CONTAINER_multihashmap_iterate(plugin->sessionmap, &session_disconnect_it, NULL); |
2091 | /* Removing leftover NAT sessions */ | ||
2092 | GNUNET_CONTAINER_multihashmap_iterate(plugin->nat_wait_conns, &session_nat_disconnect_it, NULL); | ||
2057 | 2093 | ||
2058 | if (plugin->service != NULL) | 2094 | if (plugin->service != NULL) |
2059 | GNUNET_SERVICE_stop (plugin->service); | 2095 | GNUNET_SERVICE_stop (plugin->service); |