diff options
author | Christian Grothoff <christian@grothoff.org> | 2012-10-07 18:19:32 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2012-10-07 18:19:32 +0000 |
commit | a60b958f984d08525b636a2c7eae564ebec54ae6 (patch) | |
tree | 6dcbbf91d734834f804b2fd9ab790244e2d60e6c /src/transport/plugin_transport_tcp.c | |
parent | decf459805cdb3f6811f979df4831bc2ce9a2858 (diff) | |
download | gnunet-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.c | 74 |
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 * | |||
734 | create_session (struct Plugin *plugin, const struct GNUNET_PeerIdentity *target, | 734 | create_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 * | |||
1246 | tcp_plugin_get_session (void *cls, | 1248 | tcp_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); |