aboutsummaryrefslogtreecommitdiff
path: root/src/transport/plugin_transport_tcp.c
diff options
context:
space:
mode:
authorMatthias Wachs <wachs@net.in.tum.de>2012-02-16 12:29:06 +0000
committerMatthias Wachs <wachs@net.in.tum.de>2012-02-16 12:29:06 +0000
commit3641ca940fad5f897733f2f83c3779ae2b2fc1d4 (patch)
tree3ac29c0536db5f23baa208445d2495972048bc4c /src/transport/plugin_transport_tcp.c
parente686141383bfc85a709d125f6d37d23918937028 (diff)
downloadgnunet-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.c76
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
1192int 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
1203tcp_plugin_disconnect (void *cls, const struct GNUNET_PeerIdentity *target) 1229tcp_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);