aboutsummaryrefslogtreecommitdiff
path: root/src/transport
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2015-02-20 23:01:47 +0000
committerChristian Grothoff <christian@grothoff.org>2015-02-20 23:01:47 +0000
commit5521294b45bc37a5adeb85ee78272a35ce90b26b (patch)
tree78338c014d327b34c9715569095ea34493bb7329 /src/transport
parentcacd1bd4aa5b91638bbf6217fbbdcc4aa5d14df6 (diff)
downloadgnunet-5521294b45bc37a5adeb85ee78272a35ce90b26b.tar.gz
gnunet-5521294b45bc37a5adeb85ee78272a35ce90b26b.zip
trying to fix #3687/3683/3684 by avoiding server's client reference counting (GNUNET_SERVER_client_keep) which should not be needed in the first place
Diffstat (limited to 'src/transport')
-rw-r--r--src/transport/plugin_transport_tcp.c120
1 files changed, 61 insertions, 59 deletions
diff --git a/src/transport/plugin_transport_tcp.c b/src/transport/plugin_transport_tcp.c
index f39b1edf6..1e73eda0b 100644
--- a/src/transport/plugin_transport_tcp.c
+++ b/src/transport/plugin_transport_tcp.c
@@ -754,7 +754,7 @@ tcp_plugin_string_to_address (void *cls,
754 address[0] = '\0'; 754 address[0] = '\0';
755 address++; 755 address++;
756 756
757 if (GNUNET_OK != 757 if (GNUNET_OK !=
758 GNUNET_STRINGS_to_address_ip (address, 758 GNUNET_STRINGS_to_address_ip (address,
759 strlen (address), 759 strlen (address),
760 &socket_address)) 760 &socket_address))
@@ -811,7 +811,8 @@ static struct Session *
811lookup_session_by_client (struct Plugin *plugin, 811lookup_session_by_client (struct Plugin *plugin,
812 struct GNUNET_SERVER_Client *client) 812 struct GNUNET_SERVER_Client *client)
813{ 813{
814 return GNUNET_SERVER_client_get_user_context (client, struct Session); 814 return GNUNET_SERVER_client_get_user_context (client,
815 struct Session);
815} 816}
816 817
817 818
@@ -851,7 +852,7 @@ tcp_plugin_disconnect_session (void *cls,
851 session)) 852 session))
852 { 853 {
853 GNUNET_STATISTICS_update (session->plugin->env->stats, 854 GNUNET_STATISTICS_update (session->plugin->env->stats,
854 gettext_noop ("# TCP sessions active"), 855 gettext_noop ("# TCP sessions active"),
855 -1, 856 -1,
856 GNUNET_NO); 857 GNUNET_NO);
857 } 858 }
@@ -929,12 +930,11 @@ tcp_plugin_disconnect_session (void *cls,
929 if (NULL != session->client) 930 if (NULL != session->client)
930 { 931 {
931 GNUNET_SERVER_client_disconnect (session->client); 932 GNUNET_SERVER_client_disconnect (session->client);
932 GNUNET_SERVER_client_drop (session->client);
933 session->client = NULL; 933 session->client = NULL;
934 } 934 }
935 GNUNET_HELLO_address_free (session->address); 935 GNUNET_HELLO_address_free (session->address);
936 GNUNET_assert(NULL == session->transmit_handle); 936 GNUNET_assert (NULL == session->transmit_handle);
937 GNUNET_free(session); 937 GNUNET_free (session);
938 return GNUNET_OK; 938 return GNUNET_OK;
939} 939}
940 940
@@ -987,7 +987,7 @@ session_timeout (void *cls,
987 GNUNET_STRINGS_relative_time_to_string (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT, 987 GNUNET_STRINGS_relative_time_to_string (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT,
988 GNUNET_YES)); 988 GNUNET_YES));
989 /* call session destroy function */ 989 /* call session destroy function */
990 tcp_plugin_disconnect_session (s->plugin, 990 tcp_plugin_disconnect_session (s->plugin,
991 s); 991 s);
992} 992}
993 993
@@ -1010,6 +1010,7 @@ reschedule_session_timeout (struct Session *s)
1010 * 1010 *
1011 * @param plugin the plugin 1011 * @param plugin the plugin
1012 * @param address the address to create the session for 1012 * @param address the address to create the session for
1013 * @param scope network scope the address is from
1013 * @param client client to use, reference counter must have already been increased 1014 * @param client client to use, reference counter must have already been increased
1014 * @param is_nat this a NAT session, we should wait for a client to 1015 * @param is_nat this a NAT session, we should wait for a client to
1015 * connect to us from an address, then assign that to 1016 * connect to us from an address, then assign that to
@@ -1019,6 +1020,7 @@ reschedule_session_timeout (struct Session *s)
1019static struct Session * 1020static struct Session *
1020create_session (struct Plugin *plugin, 1021create_session (struct Plugin *plugin,
1021 const struct GNUNET_HELLO_Address *address, 1022 const struct GNUNET_HELLO_Address *address,
1023 enum GNUNET_ATS_Network_Type scope,
1022 struct GNUNET_SERVER_Client *client, 1024 struct GNUNET_SERVER_Client *client,
1023 int is_nat) 1025 int is_nat)
1024{ 1026{
@@ -1040,7 +1042,12 @@ create_session (struct Plugin *plugin,
1040 session->last_activity = GNUNET_TIME_absolute_get (); 1042 session->last_activity = GNUNET_TIME_absolute_get ();
1041 session->plugin = plugin; 1043 session->plugin = plugin;
1042 session->is_nat = is_nat; 1044 session->is_nat = is_nat;
1043 session->client = client; 1045 if (NULL != client)
1046 {
1047 session->client = client;
1048 GNUNET_SERVER_client_set_user_context (client,
1049 session);
1050 }
1044 session->address = GNUNET_HELLO_address_copy (address); 1051 session->address = GNUNET_HELLO_address_copy (address);
1045 session->target = address->peer; 1052 session->target = address->peer;
1046 session->expecting_welcome = GNUNET_YES; 1053 session->expecting_welcome = GNUNET_YES;
@@ -1111,7 +1118,7 @@ process_pending_messages (struct Session *session);
1111 * @return number of bytes written to @a buf 1118 * @return number of bytes written to @a buf
1112 */ 1119 */
1113static size_t 1120static size_t
1114do_transmit (void *cls, 1121do_transmit (void *cls,
1115 size_t size, 1122 size_t size,
1116 void *buf) 1123 void *buf)
1117{ 1124{
@@ -1503,7 +1510,7 @@ delayed_done (void *cls,
1503 1510
1504 session->receive_delay_task = NULL; 1511 session->receive_delay_task = NULL;
1505 reschedule_session_timeout (session); 1512 reschedule_session_timeout (session);
1506 GNUNET_SERVER_receive_done (session->client, 1513 GNUNET_SERVER_receive_done (session->client,
1507 GNUNET_OK); 1514 GNUNET_OK);
1508} 1515}
1509 1516
@@ -1595,7 +1602,7 @@ tcp_plugin_get_session (void *cls,
1595 si_ctx.result = NULL; 1602 si_ctx.result = NULL;
1596 GNUNET_CONTAINER_multipeermap_get_multiple (plugin->sessionmap, 1603 GNUNET_CONTAINER_multipeermap_get_multiple (plugin->sessionmap,
1597 &address->peer, 1604 &address->peer,
1598 &session_lookup_it, 1605 &session_lookup_it,
1599 &si_ctx); 1606 &si_ctx);
1600 if (NULL != si_ctx.result) 1607 if (NULL != si_ctx.result)
1601 { 1608 {
@@ -1660,7 +1667,7 @@ tcp_plugin_get_session (void *cls,
1660 sbs); 1667 sbs);
1661 GNUNET_break (net_type != GNUNET_ATS_NET_UNSPECIFIED); 1668 GNUNET_break (net_type != GNUNET_ATS_NET_UNSPECIFIED);
1662 1669
1663 if ( (is_natd == GNUNET_YES) && 1670 if ( (is_natd == GNUNET_YES) &&
1664 (addrlen == sizeof(struct IPv6TcpAddress)) ) 1671 (addrlen == sizeof(struct IPv6TcpAddress)) )
1665 { 1672 {
1666 /* NAT client only works with IPv4 addresses */ 1673 /* NAT client only works with IPv4 addresses */
@@ -1674,7 +1681,7 @@ tcp_plugin_get_session (void *cls,
1674 } 1681 }
1675 1682
1676 if ( (is_natd == GNUNET_YES) && 1683 if ( (is_natd == GNUNET_YES) &&
1677 (GNUNET_YES == 1684 (GNUNET_YES ==
1678 GNUNET_CONTAINER_multipeermap_contains (plugin->nat_wait_conns, 1685 GNUNET_CONTAINER_multipeermap_contains (plugin->nat_wait_conns,
1679 &address->peer))) 1686 &address->peer)))
1680 { 1687 {
@@ -1692,17 +1699,17 @@ tcp_plugin_get_session (void *cls,
1692 "Found valid IPv4 NAT address (creating session)!\n"); 1699 "Found valid IPv4 NAT address (creating session)!\n");
1693 session = create_session (plugin, 1700 session = create_session (plugin,
1694 address, 1701 address,
1702 net_type,
1695 NULL, 1703 NULL,
1696 GNUNET_YES); 1704 GNUNET_YES);
1697 session->scope = net_type;
1698 session->nat_connection_timeout = GNUNET_SCHEDULER_add_delayed (NAT_TIMEOUT, 1705 session->nat_connection_timeout = GNUNET_SCHEDULER_add_delayed (NAT_TIMEOUT,
1699 &nat_connect_timeout, 1706 &nat_connect_timeout,
1700 session); 1707 session);
1701 GNUNET_assert(GNUNET_OK == 1708 GNUNET_assert (GNUNET_OK ==
1702 GNUNET_CONTAINER_multipeermap_put (plugin->nat_wait_conns, 1709 GNUNET_CONTAINER_multipeermap_put (plugin->nat_wait_conns,
1703 &session->target, 1710 &session->target,
1704 session, 1711 session,
1705 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)); 1712 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
1706 1713
1707 LOG (GNUNET_ERROR_TYPE_DEBUG, 1714 LOG (GNUNET_ERROR_TYPE_DEBUG,
1708 "Created NAT WAIT connection to `%4s' at `%s'\n", 1715 "Created NAT WAIT connection to `%4s' at `%s'\n",
@@ -1783,15 +1790,14 @@ tcp_plugin_get_session (void *cls,
1783 1790
1784 session = create_session (plugin, 1791 session = create_session (plugin,
1785 address, 1792 address,
1786 GNUNET_SERVER_connect_socket (plugin->server, sa), 1793 net_type,
1794 GNUNET_SERVER_connect_socket (plugin->server,
1795 sa),
1787 GNUNET_NO); 1796 GNUNET_NO);
1788 session->scope = net_type; 1797 (void) GNUNET_CONTAINER_multipeermap_put (plugin->sessionmap,
1789 GNUNET_SERVER_client_set_user_context (session->client, 1798 &session->target,
1790 session); 1799 session,
1791 GNUNET_CONTAINER_multipeermap_put (plugin->sessionmap, 1800 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
1792 &session->target,
1793 session,
1794 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
1795 /* Send TCP Welcome */ 1801 /* Send TCP Welcome */
1796 process_pending_messages (session); 1802 process_pending_messages (session);
1797 1803
@@ -1808,7 +1814,7 @@ tcp_plugin_get_session (void *cls,
1808 * @param key the peer which the session belongs to (unused) 1814 * @param key the peer which the session belongs to (unused)
1809 * @param value the `struct Session` 1815 * @param value the `struct Session`
1810 * @return #GNUNET_YES (continue to iterate) 1816 * @return #GNUNET_YES (continue to iterate)
1811 */ 1817 */
1812static int 1818static int
1813session_disconnect_it (void *cls, 1819session_disconnect_it (void *cls,
1814 const struct GNUNET_PeerIdentity *key, 1820 const struct GNUNET_PeerIdentity *key,
@@ -2018,10 +2024,10 @@ tcp_plugin_address_pretty_printer (void *cls,
2018 * @return #GNUNET_OK if port is either open_port or adv_port 2024 * @return #GNUNET_OK if port is either open_port or adv_port
2019 */ 2025 */
2020static int 2026static int
2021check_port (struct Plugin *plugin, 2027check_port (struct Plugin *plugin,
2022 uint16_t in_port) 2028 uint16_t in_port)
2023{ 2029{
2024 if ( (in_port == plugin->adv_port) || 2030 if ( (in_port == plugin->adv_port) ||
2025 (in_port == plugin->open_port) ) 2031 (in_port == plugin->open_port) )
2026 return GNUNET_OK; 2032 return GNUNET_OK;
2027 return GNUNET_SYSERR; 2033 return GNUNET_SYSERR;
@@ -2044,7 +2050,7 @@ check_port (struct Plugin *plugin,
2044 * and transport, #GNUNET_SYSERR if not 2050 * and transport, #GNUNET_SYSERR if not
2045 */ 2051 */
2046static int 2052static int
2047tcp_plugin_check_address (void *cls, 2053tcp_plugin_check_address (void *cls,
2048 const void *addr, 2054 const void *addr,
2049 size_t addrlen) 2055 size_t addrlen)
2050{ 2056{
@@ -2093,10 +2099,10 @@ tcp_plugin_check_address (void *cls,
2093 GNUNET_break (0); 2099 GNUNET_break (0);
2094 return GNUNET_SYSERR; 2100 return GNUNET_SYSERR;
2095 } 2101 }
2096 if (GNUNET_OK != check_port (plugin, 2102 if (GNUNET_OK != check_port (plugin,
2097 ntohs (v6->t6_port))) 2103 ntohs (v6->t6_port)))
2098 return GNUNET_SYSERR; 2104 return GNUNET_SYSERR;
2099 if (GNUNET_OK != 2105 if (GNUNET_OK !=
2100 GNUNET_NAT_test_address (plugin->nat, 2106 GNUNET_NAT_test_address (plugin->nat,
2101 &v6->ipv6_addr, 2107 &v6->ipv6_addr,
2102 sizeof(struct in6_addr))) 2108 sizeof(struct in6_addr)))
@@ -2172,13 +2178,13 @@ handle_tcp_nat_probe (void *cls,
2172 session->nat_connection_timeout = NULL; 2178 session->nat_connection_timeout = NULL;
2173 } 2179 }
2174 2180
2175 if (GNUNET_OK != 2181 if (GNUNET_OK !=
2176 GNUNET_SERVER_client_get_address (client, 2182 GNUNET_SERVER_client_get_address (client,
2177 &vaddr, 2183 &vaddr,
2178 &alen)) 2184 &alen))
2179 { 2185 {
2180 GNUNET_break(0); 2186 GNUNET_break(0);
2181 GNUNET_SERVER_receive_done (client, 2187 GNUNET_SERVER_receive_done (client,
2182 GNUNET_SYSERR); 2188 GNUNET_SYSERR);
2183 tcp_plugin_disconnect_session (plugin, 2189 tcp_plugin_disconnect_session (plugin,
2184 session); 2190 session);
@@ -2186,13 +2192,13 @@ handle_tcp_nat_probe (void *cls,
2186 } 2192 }
2187 GNUNET_assert (GNUNET_YES == 2193 GNUNET_assert (GNUNET_YES ==
2188 GNUNET_CONTAINER_multipeermap_remove (plugin->nat_wait_conns, 2194 GNUNET_CONTAINER_multipeermap_remove (plugin->nat_wait_conns,
2189 &tcp_nat_probe->clientIdentity, 2195 &tcp_nat_probe->clientIdentity,
2190 session)); 2196 session));
2191 GNUNET_SERVER_client_set_user_context (client, 2197 GNUNET_SERVER_client_set_user_context (client,
2192 session); 2198 session);
2193 (void) GNUNET_CONTAINER_multipeermap_put (plugin->sessionmap, 2199 (void) GNUNET_CONTAINER_multipeermap_put (plugin->sessionmap,
2194 &session->target, 2200 &session->target,
2195 session, 2201 session,
2196 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE); 2202 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
2197 session->last_activity = GNUNET_TIME_absolute_get (); 2203 session->last_activity = GNUNET_TIME_absolute_get ();
2198 LOG (GNUNET_ERROR_TYPE_DEBUG, 2204 LOG (GNUNET_ERROR_TYPE_DEBUG,
@@ -2236,14 +2242,13 @@ handle_tcp_nat_probe (void *cls,
2236 } 2242 }
2237 GNUNET_free (vaddr); 2243 GNUNET_free (vaddr);
2238 GNUNET_break (NULL == session->client); 2244 GNUNET_break (NULL == session->client);
2239 GNUNET_SERVER_client_keep (client);
2240 session->client = client; 2245 session->client = client;
2241 GNUNET_STATISTICS_update (plugin->env->stats, 2246 GNUNET_STATISTICS_update (plugin->env->stats,
2242 gettext_noop ("# TCP sessions active"), 2247 gettext_noop ("# TCP sessions active"),
2243 1, 2248 1,
2244 GNUNET_NO); 2249 GNUNET_NO);
2245 process_pending_messages (session); 2250 process_pending_messages (session);
2246 GNUNET_SERVER_receive_done (client, 2251 GNUNET_SERVER_receive_done (client,
2247 GNUNET_OK); 2252 GNUNET_OK);
2248} 2253}
2249 2254
@@ -2316,7 +2321,6 @@ handle_tcp_welcome (void *cls,
2316 } 2321 }
2317 else 2322 else
2318 { 2323 {
2319 GNUNET_SERVER_client_keep (client);
2320 if (GNUNET_OK == 2324 if (GNUNET_OK ==
2321 GNUNET_SERVER_client_get_address (client, &vaddr, &alen)) 2325 GNUNET_SERVER_client_get_address (client, &vaddr, &alen))
2322 { 2326 {
@@ -2354,13 +2358,12 @@ handle_tcp_welcome (void *cls,
2354 } 2358 }
2355 session = create_session (plugin, 2359 session = create_session (plugin,
2356 address, 2360 address,
2361 plugin->env->get_address_type (plugin->env->cls,
2362 vaddr,
2363 alen),
2357 client, 2364 client,
2358 GNUNET_NO); 2365 GNUNET_NO);
2359 GNUNET_HELLO_address_free (address); 2366 GNUNET_HELLO_address_free (address);
2360 session->scope
2361 = plugin->env->get_address_type (plugin->env->cls,
2362 vaddr,
2363 alen);
2364 LOG (GNUNET_ERROR_TYPE_DEBUG, 2367 LOG (GNUNET_ERROR_TYPE_DEBUG,
2365 "Creating new%s session %p for peer `%s' client %p\n", 2368 "Creating new%s session %p for peer `%s' client %p\n",
2366 GNUNET_HELLO_address_check_option (session->address, 2369 GNUNET_HELLO_address_check_option (session->address,
@@ -2372,11 +2375,10 @@ handle_tcp_welcome (void *cls,
2372 session->address->address_length), 2375 session->address->address_length),
2373 client); 2376 client);
2374 GNUNET_free (vaddr); 2377 GNUNET_free (vaddr);
2375 GNUNET_SERVER_client_set_user_context (session->client, session); 2378 (void) GNUNET_CONTAINER_multipeermap_put (plugin->sessionmap,
2376 GNUNET_CONTAINER_multipeermap_put (plugin->sessionmap, 2379 &session->target,
2377 &session->target, 2380 session,
2378 session, 2381 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
2379 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
2380 /* Notify transport and ATS about new session */ 2382 /* Notify transport and ATS about new session */
2381 plugin->env->session_start (plugin->env->cls, 2383 plugin->env->session_start (plugin->env->cls,
2382 session->address, 2384 session->address,
@@ -2407,7 +2409,7 @@ handle_tcp_welcome (void *cls,
2407 2409
2408 process_pending_messages (session); 2410 process_pending_messages (session);
2409 GNUNET_SERVER_client_set_timeout (client, 2411 GNUNET_SERVER_client_set_timeout (client,
2410 GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT); 2412 GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT);
2411 GNUNET_SERVER_receive_done (client, GNUNET_OK); 2413 GNUNET_SERVER_receive_done (client, GNUNET_OK);
2412} 2414}
2413 2415
@@ -2585,7 +2587,7 @@ disconnect_notify (void *cls,
2585 gettext_noop ("# network-level TCP disconnect events"), 2587 gettext_noop ("# network-level TCP disconnect events"),
2586 1, 2588 1,
2587 GNUNET_NO); 2589 GNUNET_NO);
2588 tcp_plugin_disconnect_session (plugin, 2590 tcp_plugin_disconnect_session (plugin,
2589 session); 2591 session);
2590} 2592}
2591 2593
@@ -2618,8 +2620,8 @@ notify_send_probe (void *cls,
2618 return 0; 2620 return 0;
2619 } 2621 }
2620 GNUNET_assert(size >= sizeof(tcp_probe_ctx->message)); 2622 GNUNET_assert(size >= sizeof(tcp_probe_ctx->message));
2621 memcpy (buf, 2623 memcpy (buf,
2622 &tcp_probe_ctx->message, 2624 &tcp_probe_ctx->message,
2623 sizeof(tcp_probe_ctx->message)); 2625 sizeof(tcp_probe_ctx->message));
2624 GNUNET_SERVER_connect_socket (tcp_probe_ctx->plugin->server, 2626 GNUNET_SERVER_connect_socket (tcp_probe_ctx->plugin->server,
2625 tcp_probe_ctx->sock); 2627 tcp_probe_ctx->sock);
@@ -2651,7 +2653,7 @@ try_connection_reversal (void *cls,
2651 * We have received an ICMP response, ostensibly from a peer 2653 * We have received an ICMP response, ostensibly from a peer
2652 * that wants to connect to us! Send a message to establish a connection. 2654 * that wants to connect to us! Send a message to establish a connection.
2653 */ 2655 */
2654 sock = GNUNET_CONNECTION_create_from_sockaddr (AF_INET, 2656 sock = GNUNET_CONNECTION_create_from_sockaddr (AF_INET,
2655 addr, 2657 addr,
2656 addrlen); 2658 addrlen);
2657 if (NULL == sock) 2659 if (NULL == sock)
@@ -2976,9 +2978,9 @@ libgnunet_plugin_transport_tcp_init (void *cls)
2976 } 2978 }
2977 plugin->server 2979 plugin->server
2978 = GNUNET_SERVER_create_with_sockets (NULL, 2980 = GNUNET_SERVER_create_with_sockets (NULL,
2979 plugin, 2981 plugin,
2980 NULL, 2982 NULL,
2981 idle_timeout, 2983 idle_timeout,
2982 GNUNET_YES); 2984 GNUNET_YES);
2983 } 2985 }
2984 plugin->handlers = GNUNET_malloc (sizeof (my_handlers)); 2986 plugin->handlers = GNUNET_malloc (sizeof (my_handlers));
@@ -3067,7 +3069,7 @@ libgnunet_plugin_transport_tcp_done (void *cls)
3067 cur); 3069 cur);
3068 GNUNET_RESOLVER_request_cancel (cur->resolver_handle); 3070 GNUNET_RESOLVER_request_cancel (cur->resolver_handle);
3069 cur->asc (cur->asc_cls, 3071 cur->asc (cur->asc_cls,
3070 NULL, 3072 NULL,
3071 GNUNET_OK); 3073 GNUNET_OK);
3072 GNUNET_free (cur); 3074 GNUNET_free (cur);
3073 } 3075 }