aboutsummaryrefslogtreecommitdiff
path: root/src/transport/plugin_transport_tcp.c
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2012-10-07 18:19:32 +0000
committerChristian Grothoff <christian@grothoff.org>2012-10-07 18:19:32 +0000
commita60b958f984d08525b636a2c7eae564ebec54ae6 (patch)
tree6dcbbf91d734834f804b2fd9ab790244e2d60e6c /src/transport/plugin_transport_tcp.c
parentdecf459805cdb3f6811f979df4831bc2ce9a2858 (diff)
downloadgnunet-a60b958f984d08525b636a2c7eae564ebec54ae6.tar.gz
gnunet-a60b958f984d08525b636a2c7eae564ebec54ae6.zip
-chaning multihashmap API to allow option for avoiding key allocation
Diffstat (limited to 'src/transport/plugin_transport_tcp.c')
-rw-r--r--src/transport/plugin_transport_tcp.c74
1 files changed, 43 insertions, 31 deletions
diff --git a/src/transport/plugin_transport_tcp.c b/src/transport/plugin_transport_tcp.c
index 9d23c5121..877356c16 100644
--- a/src/transport/plugin_transport_tcp.c
+++ b/src/transport/plugin_transport_tcp.c
@@ -734,7 +734,7 @@ static struct Session *
734create_session (struct Plugin *plugin, const struct GNUNET_PeerIdentity *target, 734create_session (struct Plugin *plugin, const struct GNUNET_PeerIdentity *target,
735 struct GNUNET_SERVER_Client *client, int is_nat) 735 struct GNUNET_SERVER_Client *client, int is_nat)
736{ 736{
737 struct Session *ret; 737 struct Session *session;
738 struct PendingMessage *pm; 738 struct PendingMessage *pm;
739 struct WelcomeMessage welcome; 739 struct WelcomeMessage welcome;
740 740
@@ -746,14 +746,14 @@ create_session (struct Plugin *plugin, const struct GNUNET_PeerIdentity *target,
746 LOG (GNUNET_ERROR_TYPE_DEBUG, 746 LOG (GNUNET_ERROR_TYPE_DEBUG,
747 "Creating new session for peer `%4s'\n", 747 "Creating new session for peer `%4s'\n",
748 GNUNET_i2s (target)); 748 GNUNET_i2s (target));
749 ret = GNUNET_malloc (sizeof (struct Session)); 749 session = GNUNET_malloc (sizeof (struct Session));
750 ret->last_activity = GNUNET_TIME_absolute_get (); 750 session->last_activity = GNUNET_TIME_absolute_get ();
751 ret->plugin = plugin; 751 session->plugin = plugin;
752 ret->is_nat = is_nat; 752 session->is_nat = is_nat;
753 ret->client = client; 753 session->client = client;
754 ret->target = *target; 754 session->target = *target;
755 ret->expecting_welcome = GNUNET_YES; 755 session->expecting_welcome = GNUNET_YES;
756 ret->ats_address_network_type = htonl (GNUNET_ATS_NET_UNSPECIFIED); 756 session->ats_address_network_type = htonl (GNUNET_ATS_NET_UNSPECIFIED);
757 pm = GNUNET_malloc (sizeof (struct PendingMessage) + 757 pm = GNUNET_malloc (sizeof (struct PendingMessage) +
758 sizeof (struct WelcomeMessage)); 758 sizeof (struct WelcomeMessage));
759 pm->msg = (const char *) &pm[1]; 759 pm->msg = (const char *) &pm[1];
@@ -766,17 +766,17 @@ create_session (struct Plugin *plugin, const struct GNUNET_PeerIdentity *target,
766 GNUNET_STATISTICS_update (plugin->env->stats, 766 GNUNET_STATISTICS_update (plugin->env->stats,
767 gettext_noop ("# bytes currently in TCP buffers"), 767 gettext_noop ("# bytes currently in TCP buffers"),
768 pm->message_size, GNUNET_NO); 768 pm->message_size, GNUNET_NO);
769 GNUNET_CONTAINER_DLL_insert (ret->pending_messages_head, 769 GNUNET_CONTAINER_DLL_insert (session->pending_messages_head,
770 ret->pending_messages_tail, pm); 770 session->pending_messages_tail, pm);
771 if (GNUNET_YES != is_nat) 771 if (GNUNET_YES != is_nat)
772 { 772 {
773 GNUNET_STATISTICS_update (plugin->env->stats, 773 GNUNET_STATISTICS_update (plugin->env->stats,
774 gettext_noop ("# TCP sessions active"), 1, 774 gettext_noop ("# TCP sessions active"), 1,
775 GNUNET_NO); 775 GNUNET_NO);
776 } 776 }
777 start_session_timeout (ret); 777 start_session_timeout (session);
778 778
779 return ret; 779 return session;
780} 780}
781 781
782 782
@@ -1120,7 +1120,9 @@ tcp_plugin_send (void *cls,
1120 "Asked to transmit %u bytes to `%s', added message to list.\n", 1120 "Asked to transmit %u bytes to `%s', added message to list.\n",
1121 msgbuf_size, GNUNET_i2s (&session->target)); 1121 msgbuf_size, GNUNET_i2s (&session->target));
1122 1122
1123 if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains_value(plugin->sessionmap, &session->target.hashPubKey, session)) 1123 if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains_value (plugin->sessionmap,
1124 &session->target.hashPubKey,
1125 session))
1124 { 1126 {
1125 GNUNET_assert (session->client != NULL); 1127 GNUNET_assert (session->client != NULL);
1126 reschedule_session_timeout (session); 1128 reschedule_session_timeout (session);
@@ -1246,8 +1248,8 @@ static struct Session *
1246tcp_plugin_get_session (void *cls, 1248tcp_plugin_get_session (void *cls,
1247 const struct GNUNET_HELLO_Address *address) 1249 const struct GNUNET_HELLO_Address *address)
1248{ 1250{
1249 struct Plugin * plugin = cls; 1251 struct Plugin *plugin = cls;
1250 struct Session * session = NULL; 1252 struct Session *session = NULL;
1251 int af; 1253 int af;
1252 const void *sb; 1254 const void *sb;
1253 size_t sbs; 1255 size_t sbs;
@@ -1270,7 +1272,8 @@ tcp_plugin_get_session (void *cls,
1270 1272
1271 /* look for existing session */ 1273 /* look for existing session */
1272 if (GNUNET_YES == 1274 if (GNUNET_YES ==
1273 GNUNET_CONTAINER_multihashmap_contains(plugin->sessionmap, &address->peer.hashPubKey)) 1275 GNUNET_CONTAINER_multihashmap_contains (plugin->sessionmap,
1276 &address->peer.hashPubKey))
1274 { 1277 {
1275 struct SessionItCtx si_ctx; 1278 struct SessionItCtx si_ctx;
1276 1279
@@ -1279,7 +1282,9 @@ tcp_plugin_get_session (void *cls,
1279 1282
1280 si_ctx.result = NULL; 1283 si_ctx.result = NULL;
1281 1284
1282 GNUNET_CONTAINER_multihashmap_get_multiple(plugin->sessionmap, &address->peer.hashPubKey, &session_lookup_it, &si_ctx); 1285 GNUNET_CONTAINER_multihashmap_get_multiple (plugin->sessionmap,
1286 &address->peer.hashPubKey,
1287 &session_lookup_it, &si_ctx);
1283 if (si_ctx.result != NULL) 1288 if (si_ctx.result != NULL)
1284 { 1289 {
1285 session = si_ctx.result; 1290 session = si_ctx.result;
@@ -1372,13 +1377,15 @@ tcp_plugin_get_session (void *cls,
1372 session->addrlen = 0; 1377 session->addrlen = 0;
1373 session->addr = NULL; 1378 session->addr = NULL;
1374 session->ats_address_network_type = ats.value; 1379 session->ats_address_network_type = ats.value;
1375 session->nat_connection_timeout = GNUNET_SCHEDULER_add_delayed(NAT_TIMEOUT, 1380 session->nat_connection_timeout = GNUNET_SCHEDULER_add_delayed (NAT_TIMEOUT,
1376 &nat_connect_timeout, 1381 &nat_connect_timeout,
1377 session); 1382 session);
1378 GNUNET_assert (session != NULL); 1383 GNUNET_assert (session != NULL);
1379 GNUNET_assert (GNUNET_CONTAINER_multihashmap_put 1384 GNUNET_assert (GNUNET_OK ==
1380 (plugin->nat_wait_conns, &address->peer.hashPubKey, session, 1385 GNUNET_CONTAINER_multihashmap_put (plugin->nat_wait_conns,
1381 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY) == GNUNET_OK); 1386 &session->target.hashPubKey,
1387 session,
1388 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
1382 1389
1383 LOG (GNUNET_ERROR_TYPE_DEBUG, 1390 LOG (GNUNET_ERROR_TYPE_DEBUG,
1384 "Created NAT WAIT connection to `%4s' at `%s'\n", 1391 "Created NAT WAIT connection to `%4s' at `%s'\n",
@@ -1421,7 +1428,9 @@ tcp_plugin_get_session (void *cls,
1421 session->addrlen = addrlen; 1428 session->addrlen = addrlen;
1422 session->ats_address_network_type = ats.value; 1429 session->ats_address_network_type = ats.value;
1423 1430
1424 GNUNET_CONTAINER_multihashmap_put(plugin->sessionmap, &address->peer.hashPubKey, session, GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE); 1431 GNUNET_CONTAINER_multihashmap_put (plugin->sessionmap,
1432 &session->target.hashPubKey,
1433 session, GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
1425 inc_sessions (plugin, session, __LINE__); 1434 inc_sessions (plugin, session, __LINE__);
1426 LOG (GNUNET_ERROR_TYPE_DEBUG, 1435 LOG (GNUNET_ERROR_TYPE_DEBUG,
1427 "Creating new session for `%s' address `%s' session %p\n", 1436 "Creating new session for `%s' address `%s' session %p\n",
@@ -1763,9 +1772,9 @@ handle_tcp_nat_probe (void *cls, struct GNUNET_SERVER_Client *client,
1763 (plugin->nat_wait_conns, 1772 (plugin->nat_wait_conns,
1764 &tcp_nat_probe->clientIdentity.hashPubKey, 1773 &tcp_nat_probe->clientIdentity.hashPubKey,
1765 session) == GNUNET_YES); 1774 session) == GNUNET_YES);
1766 GNUNET_CONTAINER_multihashmap_put(plugin->sessionmap, 1775 GNUNET_CONTAINER_multihashmap_put (plugin->sessionmap,
1767 &session->target.hashPubKey, session, 1776 &session->target.hashPubKey, session,
1768 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE); 1777 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
1769 session->last_activity = GNUNET_TIME_absolute_get (); 1778 session->last_activity = GNUNET_TIME_absolute_get ();
1770 session->inbound = GNUNET_NO; 1779 session->inbound = GNUNET_NO;
1771 LOG (GNUNET_ERROR_TYPE_DEBUG, 1780 LOG (GNUNET_ERROR_TYPE_DEBUG,
@@ -1896,7 +1905,10 @@ handle_tcp_welcome (void *cls, struct GNUNET_SERVER_Client *client,
1896 LOG (GNUNET_ERROR_TYPE_DEBUG, 1905 LOG (GNUNET_ERROR_TYPE_DEBUG,
1897 "Did not obtain TCP socket address for incoming connection\n"); 1906 "Did not obtain TCP socket address for incoming connection\n");
1898 } 1907 }
1899 GNUNET_CONTAINER_multihashmap_put(plugin->sessionmap, &wm->clientIdentity.hashPubKey, session, GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE); 1908 GNUNET_CONTAINER_multihashmap_put (plugin->sessionmap,
1909 &session->target.hashPubKey,
1910 session,
1911 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
1900 inc_sessions (plugin, session, __LINE__); 1912 inc_sessions (plugin, session, __LINE__);
1901 } 1913 }
1902 1914
@@ -2332,7 +2344,7 @@ libgnunet_plugin_transport_tcp_init (void *cls)
2332 service = NULL; 2344 service = NULL;
2333 2345
2334 plugin = GNUNET_malloc (sizeof (struct Plugin)); 2346 plugin = GNUNET_malloc (sizeof (struct Plugin));
2335 plugin->sessionmap = GNUNET_CONTAINER_multihashmap_create(max_connections); 2347 plugin->sessionmap = GNUNET_CONTAINER_multihashmap_create (max_connections, GNUNET_YES);
2336 plugin->max_connections = max_connections; 2348 plugin->max_connections = max_connections;
2337 plugin->open_port = bport; 2349 plugin->open_port = bport;
2338 plugin->adv_port = aport; 2350 plugin->adv_port = aport;
@@ -2405,7 +2417,7 @@ libgnunet_plugin_transport_tcp_init (void *cls)
2405 plugin->handlers[i].callback_cls = plugin; 2417 plugin->handlers[i].callback_cls = plugin;
2406 GNUNET_SERVER_add_handlers (plugin->server, plugin->handlers); 2418 GNUNET_SERVER_add_handlers (plugin->server, plugin->handlers);
2407 GNUNET_SERVER_disconnect_notify (plugin->server, &disconnect_notify, plugin); 2419 GNUNET_SERVER_disconnect_notify (plugin->server, &disconnect_notify, plugin);
2408 plugin->nat_wait_conns = GNUNET_CONTAINER_multihashmap_create (16); 2420 plugin->nat_wait_conns = GNUNET_CONTAINER_multihashmap_create (16, GNUNET_YES);
2409 if (bport != 0) 2421 if (bport != 0)
2410 LOG (GNUNET_ERROR_TYPE_INFO, 2422 LOG (GNUNET_ERROR_TYPE_INFO,
2411 _("TCP transport listening on port %llu\n"), bport); 2423 _("TCP transport listening on port %llu\n"), bport);