aboutsummaryrefslogtreecommitdiff
path: root/src/transport/plugin_transport_tcp.c
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2013-12-11 22:50:10 +0000
committerChristian Grothoff <christian@grothoff.org>2013-12-11 22:50:10 +0000
commit9dbf3b587010260ad2e26450a86a37ecd298df11 (patch)
treeb475c461b0dd6906f885b9992a98e13cec5f36d2 /src/transport/plugin_transport_tcp.c
parent6f5773151141852cdb07a14edb2d5974d89814c2 (diff)
downloadgnunet-9dbf3b587010260ad2e26450a86a37ecd298df11.tar.gz
gnunet-9dbf3b587010260ad2e26450a86a37ecd298df11.zip
-more logging, etc.
Diffstat (limited to 'src/transport/plugin_transport_tcp.c')
-rw-r--r--src/transport/plugin_transport_tcp.c217
1 files changed, 120 insertions, 97 deletions
diff --git a/src/transport/plugin_transport_tcp.c b/src/transport/plugin_transport_tcp.c
index 113cb70c5..273d39873 100644
--- a/src/transport/plugin_transport_tcp.c
+++ b/src/transport/plugin_transport_tcp.c
@@ -139,10 +139,10 @@ GNUNET_NETWORK_STRUCT_BEGIN
139 */ 139 */
140struct IPv4TcpAddress 140struct IPv4TcpAddress
141{ 141{
142 /** 142 /**
143 * Optional options and flags for this address 143 * Optional options and flags for this address
144 */ 144 */
145 uint32_t options; 145 uint32_t options;
146 146
147 /** 147 /**
148 * IPv4 address, in network byte order. 148 * IPv4 address, in network byte order.
@@ -162,10 +162,10 @@ struct IPv4TcpAddress
162 */ 162 */
163struct IPv6TcpAddress 163struct IPv6TcpAddress
164{ 164{
165 /** 165 /**
166 * Optional flags for this address 166 * Optional flags for this address
167 */ 167 */
168 uint32_t options; 168 uint32_t options;
169 169
170 /** 170 /**
171 * IPv6 address. 171 * IPv6 address.
@@ -314,12 +314,12 @@ struct Session
314 struct GNUNET_TIME_Absolute last_activity; 314 struct GNUNET_TIME_Absolute last_activity;
315 315
316 /** 316 /**
317 * Are we still expecting the welcome message? (GNUNET_YES/GNUNET_NO) 317 * Are we still expecting the welcome message? (#GNUNET_YES/#GNUNET_NO)
318 */ 318 */
319 int expecting_welcome; 319 int expecting_welcome;
320 320
321 /** 321 /**
322 * Was this a connection that was inbound (we accepted)? (GNUNET_YES/GNUNET_NO) 322 * Was this a connection that was inbound (we accepted)? (#GNUNET_YES/#GNUNET_NO)
323 */ 323 */
324 int inbound; 324 int inbound;
325 325
@@ -441,6 +441,8 @@ reschedule_session_timeout (struct Session *s);
441 441
442/** 442/**
443 * Cancel timeout 443 * Cancel timeout
444 *
445 * @param s session to cancel timeout for
444 */ 446 */
445static void 447static void
446stop_session_timeout (struct Session *s); 448stop_session_timeout (struct Session *s);
@@ -458,34 +460,39 @@ static void
458inc_sessions (struct Plugin *plugin, struct Session *session, int line) 460inc_sessions (struct Plugin *plugin, struct Session *session, int line)
459{ 461{
460 sessions++; 462 sessions++;
461 unsigned int size = GNUNET_CONTAINER_multipeermap_size(plugin->sessionmap); 463 unsigned int size = GNUNET_CONTAINER_multipeermap_size (plugin->sessionmap);
462 if (sessions != size) 464 if (sessions != size)
463 LOG (GNUNET_ERROR_TYPE_DEBUG, "Inconsistent sessions %u <-> session map size: %u\n", 465 LOG (GNUNET_ERROR_TYPE_DEBUG,
464 sessions, size); 466 "Inconsistent sessions %u <-> session map size: %u\n",
465 LOG (GNUNET_ERROR_TYPE_DEBUG, "%4i Session increased to %u (session map size: %u): `%s' `%s'\n", 467 sessions, size);
466 line, 468 LOG (GNUNET_ERROR_TYPE_DEBUG,
467 sessions, 469 "%4i Session increased to %u (session map size: %u): `%s' `%s'\n",
468 size, 470 line,
469 GNUNET_i2s (&session->target), 471 sessions,
470 tcp_address_to_string (NULL, session->addr, session->addrlen)); 472 size,
473 GNUNET_i2s (&session->target),
474 tcp_address_to_string (NULL, session->addr, session->addrlen));
471} 475}
472 476
473 477
474static void 478static void
475dec_sessions (struct Plugin *plugin, struct Session *session, int line) 479dec_sessions (struct Plugin *plugin,
480 struct Session *session, int line)
476{ 481{
477 GNUNET_assert (sessions > 0); 482 GNUNET_assert (sessions > 0);
478 unsigned int size = GNUNET_CONTAINER_multipeermap_size(plugin->sessionmap); 483 unsigned int size = GNUNET_CONTAINER_multipeermap_size(plugin->sessionmap);
479 sessions--; 484 sessions--;
480 if (sessions != size) 485 if (sessions != size)
481 LOG (GNUNET_ERROR_TYPE_DEBUG, "Inconsistent sessions %u <-> session map size: %u\n", 486 LOG (GNUNET_ERROR_TYPE_DEBUG,
482 sessions, size); 487 "Inconsistent sessions %u <-> session map size: %u\n",
483 LOG (GNUNET_ERROR_TYPE_DEBUG, "%4i Session decreased to %u (session map size: %u): `%s' `%s'\n", 488 sessions, size);
484 line, 489 LOG (GNUNET_ERROR_TYPE_DEBUG,
485 sessions, 490 "%4i Session decreased to %u (session map size: %u): `%s' `%s'\n",
486 size, 491 line,
487 GNUNET_i2s (&session->target), 492 sessions,
488 tcp_address_to_string (NULL, session->addr, session->addrlen)); 493 size,
494 GNUNET_i2s (&session->target),
495 tcp_address_to_string (NULL, session->addr, session->addrlen));
489} 496}
490/* DEBUG CODE */ 497/* DEBUG CODE */
491 498
@@ -499,7 +506,7 @@ dec_sessions (struct Plugin *plugin, struct Session *session, int line)
499 * @param ucred credentials, if available, otherwise NULL 506 * @param ucred credentials, if available, otherwise NULL
500 * @param addr address 507 * @param addr address
501 * @param addrlen length of address 508 * @param addrlen length of address
502 * @return GNUNET_YES to allow, GNUNET_NO to deny, GNUNET_SYSERR 509 * @return #GNUNET_YES to allow, #GNUNET_NO to deny, #GNUNET_SYSERR
503 * for unknown address family (will be denied). 510 * for unknown address family (will be denied).
504 */ 511 */
505static int 512static int
@@ -522,7 +529,7 @@ plugin_tcp_access_check (void *cls,
522 * Our external IP address/port mapping has changed. 529 * Our external IP address/port mapping has changed.
523 * 530 *
524 * @param cls closure, the 'struct LocalAddrList' 531 * @param cls closure, the 'struct LocalAddrList'
525 * @param add_remove GNUNET_YES to mean the new public IP address, GNUNET_NO to mean 532 * @param add_remove #GNUNET_YES to mean the new public IP address, #GNUNET_NO to mean
526 * the previous (now invalid) one 533 * the previous (now invalid) one
527 * @param addr either the previous or the new public IP address 534 * @param addr either the previous or the new public IP address
528 * @param addrlen actual lenght of the address 535 * @param addrlen actual lenght of the address
@@ -647,12 +654,14 @@ tcp_address_to_string (void *cls, const void *addr, size_t addrlen)
647 * @param addrlen length of the address 654 * @param addrlen length of the address
648 * @param buf location to store the buffer 655 * @param buf location to store the buffer
649 * @param added location to store the number of bytes in the buffer. 656 * @param added location to store the number of bytes in the buffer.
650 * If the function returns GNUNET_SYSERR, its contents are undefined. 657 * If the function returns #GNUNET_SYSERR, its contents are undefined.
651 * @return GNUNET_OK on success, GNUNET_SYSERR on failure 658 * @return #GNUNET_OK on success, #GNUNET_SYSERR on failure
652 */ 659 */
653static int 660static int
654tcp_string_to_address (void *cls, const char *addr, uint16_t addrlen, 661tcp_string_to_address (void *cls,
655 void **buf, size_t *added) 662 const char *addr,
663 uint16_t addrlen,
664 void **buf, size_t *added)
656{ 665{
657 struct sockaddr_storage socket_address; 666 struct sockaddr_storage socket_address;
658 char *address; 667 char *address;
@@ -1024,17 +1033,25 @@ disconnect_session (struct Session *session)
1024 1033
1025 stop_session_timeout (session); 1034 stop_session_timeout (session);
1026 1035
1027 if (GNUNET_YES == GNUNET_CONTAINER_multipeermap_remove (plugin->sessionmap, &session->target, session)) 1036 if (GNUNET_YES ==
1037 GNUNET_CONTAINER_multipeermap_remove (plugin->sessionmap,
1038 &session->target,
1039 session))
1028 { 1040 {
1029 GNUNET_STATISTICS_update (session->plugin->env->stats, 1041 GNUNET_STATISTICS_update (session->plugin->env->stats,
1030 gettext_noop ("# TCP sessions active"), -1, 1042 gettext_noop ("# TCP sessions active"), -1,
1031 GNUNET_NO); 1043 GNUNET_NO);
1032 dec_sessions (plugin, session, __LINE__); 1044 dec_sessions (plugin, session, __LINE__);
1033 } 1045 }
1034 else GNUNET_assert (GNUNET_YES == GNUNET_CONTAINER_multipeermap_remove (plugin->nat_wait_conns, &session->target, session)); 1046 else
1035 1047 {
1048 GNUNET_assert (GNUNET_YES ==
1049 GNUNET_CONTAINER_multipeermap_remove (plugin->nat_wait_conns,
1050 &session->target,
1051 session));
1052 }
1036 /* clean up state */ 1053 /* clean up state */
1037 if (session->transmit_handle != NULL) 1054 if (NULL != session->transmit_handle)
1038 { 1055 {
1039 GNUNET_SERVER_notify_transmit_ready_cancel (session->transmit_handle); 1056 GNUNET_SERVER_notify_transmit_ready_cancel (session->transmit_handle);
1040 session->transmit_handle = NULL; 1057 session->transmit_handle = NULL;
@@ -1630,29 +1647,29 @@ struct PrettyPrinterContext
1630}; 1647};
1631 1648
1632 1649
1633 1650static void
1634void 1651ppc_cancel_task (void *cls,
1635ppc_cancel_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) 1652 const struct GNUNET_SCHEDULER_TaskContext *tc)
1636{ 1653{
1637 int count = 0; 1654 int count = 0;
1638 struct PrettyPrinterContext *ppc = cls; 1655 struct PrettyPrinterContext *ppc = cls;
1639 struct PrettyPrinterContext *cur; 1656 struct PrettyPrinterContext *cur;
1640 for (cur = ppc_dll_head; (NULL != cur); cur = cur->next) 1657
1641 { 1658 for (cur = ppc_dll_head; (NULL != cur); cur = cur->next)
1642 if (cur != ppc) 1659 {
1643 count++; 1660 if (cur != ppc)
1644 } 1661 count++;
1645 1662 }
1646 // GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Cancel request %p, %u pending\n", ppc, count); 1663
1647 ppc->timeout_task = GNUNET_SCHEDULER_NO_TASK; 1664 // GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Cancel request %p, %u pending\n", ppc, count);
1648 if (NULL != ppc->resolver_handle) 1665 ppc->timeout_task = GNUNET_SCHEDULER_NO_TASK;
1649 { 1666 if (NULL != ppc->resolver_handle)
1650 GNUNET_RESOLVER_request_cancel (ppc->resolver_handle); 1667 {
1651 ppc->resolver_handle = NULL; 1668 GNUNET_RESOLVER_request_cancel (ppc->resolver_handle);
1652 } 1669 ppc->resolver_handle = NULL;
1653 1670 }
1654 GNUNET_CONTAINER_DLL_remove (ppc_dll_head, ppc_dll_tail, ppc); 1671 GNUNET_CONTAINER_DLL_remove (ppc_dll_head, ppc_dll_tail, ppc);
1655 GNUNET_free (ppc); 1672 GNUNET_free (ppc);
1656} 1673}
1657 1674
1658 1675
@@ -1670,12 +1687,12 @@ append_port (void *cls, const char *hostname)
1670 char *ret; 1687 char *ret;
1671 int count = 0; 1688 int count = 0;
1672 1689
1673 for (cur = ppc_dll_head; (NULL != cur); cur = cur->next) 1690 for (cur = ppc_dll_head; (NULL != cur); cur = cur->next)
1674 { 1691 {
1675 if (cur != ppc) 1692 if (cur != ppc)
1676 count++; 1693 count++;
1677 } 1694 }
1678 //GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Callback request %p == %s, %u pending\n", ppc, hostname, count); 1695 //GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Callback request %p == %s, %u pending\n", ppc, hostname, count);
1679 if (hostname == NULL) 1696 if (hostname == NULL)
1680 { 1697 {
1681 ppc->asc (ppc->asc_cls, NULL); 1698 ppc->asc (ppc->asc_cls, NULL);
@@ -1786,19 +1803,20 @@ tcp_plugin_address_pretty_printer (void *cls, const char *type,
1786 ppc->port = port; 1803 ppc->port = port;
1787 ppc->options = options; 1804 ppc->options = options;
1788 ppc->timeout_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply(timeout, 2), 1805 ppc->timeout_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply(timeout, 2),
1789 &ppc_cancel_task, ppc); 1806 &ppc_cancel_task, ppc);
1790 ppc->resolver_handle = GNUNET_RESOLVER_hostname_get (sb, sbs, !numeric, 1807 ppc->resolver_handle = GNUNET_RESOLVER_hostname_get (sb, sbs, !numeric,
1791 timeout, &append_port, ppc); 1808 timeout,
1792 if (NULL != ppc->resolver_handle) 1809 &append_port, ppc);
1793 { 1810 if (NULL != ppc->resolver_handle)
1794 //GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Adding request %p\n", ppc); 1811 {
1795 GNUNET_CONTAINER_DLL_insert (ppc_dll_head, ppc_dll_tail, ppc); 1812 //GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Adding request %p\n", ppc);
1796 } 1813 GNUNET_CONTAINER_DLL_insert (ppc_dll_head, ppc_dll_tail, ppc);
1797 else 1814 }
1798 { 1815 else
1799 GNUNET_break (0); 1816 {
1800 GNUNET_free (ppc); 1817 GNUNET_break (0);
1801 } 1818 GNUNET_free (ppc);
1819 }
1802} 1820}
1803 1821
1804 1822
@@ -2372,7 +2390,7 @@ notify_send_probe (void *cls, size_t size, void *buf)
2372 * 2390 *
2373 * @param cls closure 2391 * @param cls closure
2374 * @param addr address to try 2392 * @param addr address to try
2375 * @param addrlen number of bytes in addr 2393 * @param addrlen number of bytes in @a addr
2376 */ 2394 */
2377static void 2395static void
2378try_connection_reversal (void *cls, const struct sockaddr *addr, 2396try_connection_reversal (void *cls, const struct sockaddr *addr,
@@ -2421,9 +2439,9 @@ try_connection_reversal (void *cls, const struct sockaddr *addr,
2421 * Session was idle, so disconnect it 2439 * Session was idle, so disconnect it
2422 */ 2440 */
2423static void 2441static void
2424session_timeout (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) 2442session_timeout (void *cls,
2443 const struct GNUNET_SCHEDULER_TaskContext *tc)
2425{ 2444{
2426 GNUNET_assert (NULL != cls);
2427 struct Session *s = cls; 2445 struct Session *s = cls;
2428 2446
2429 s->timeout_task = GNUNET_SCHEDULER_NO_TASK; 2447 s->timeout_task = GNUNET_SCHEDULER_NO_TASK;
@@ -2433,7 +2451,7 @@ session_timeout (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
2433 GNUNET_STRINGS_relative_time_to_string (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT, 2451 GNUNET_STRINGS_relative_time_to_string (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT,
2434 GNUNET_YES)); 2452 GNUNET_YES));
2435 /* call session destroy function */ 2453 /* call session destroy function */
2436 disconnect_session(s); 2454 disconnect_session (s);
2437} 2455}
2438 2456
2439 2457
@@ -2445,7 +2463,7 @@ start_session_timeout (struct Session *s)
2445{ 2463{
2446 GNUNET_assert (NULL != s); 2464 GNUNET_assert (NULL != s);
2447 GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == s->timeout_task); 2465 GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == s->timeout_task);
2448 s->timeout_task = GNUNET_SCHEDULER_add_delayed (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT, 2466 s->timeout_task = GNUNET_SCHEDULER_add_delayed (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT,
2449 &session_timeout, 2467 &session_timeout,
2450 s); 2468 s);
2451 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 2469 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -2466,9 +2484,9 @@ reschedule_session_timeout (struct Session *s)
2466 GNUNET_assert (GNUNET_SCHEDULER_NO_TASK != s->timeout_task); 2484 GNUNET_assert (GNUNET_SCHEDULER_NO_TASK != s->timeout_task);
2467 2485
2468 GNUNET_SCHEDULER_cancel (s->timeout_task); 2486 GNUNET_SCHEDULER_cancel (s->timeout_task);
2469 s->timeout_task = GNUNET_SCHEDULER_add_delayed (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT, 2487 s->timeout_task = GNUNET_SCHEDULER_add_delayed (GNUNET_CONSTANTS_IDLE_CONNECTION_TIMEOUT,
2470 &session_timeout, 2488 &session_timeout,
2471 s); 2489 s);
2472 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 2490 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
2473 "Timeout rescheduled for session %p set to %s\n", 2491 "Timeout rescheduled for session %p set to %s\n",
2474 s, 2492 s,
@@ -2478,7 +2496,9 @@ reschedule_session_timeout (struct Session *s)
2478 2496
2479 2497
2480/** 2498/**
2481 * Cancel timeout 2499 * Cancel timeout.
2500 *
2501 * @param s session to cancel timeout for
2482 */ 2502 */
2483static void 2503static void
2484stop_session_timeout (struct Session *s) 2504stop_session_timeout (struct Session *s)
@@ -2634,7 +2654,7 @@ libgnunet_plugin_transport_tcp_init (void *cls)
2634 GNUNET_YES, 0, 0, NULL, NULL, NULL, 2654 GNUNET_YES, 0, 0, NULL, NULL, NULL,
2635 &try_connection_reversal, plugin); 2655 &try_connection_reversal, plugin);
2636 } 2656 }
2637 api = GNUNET_malloc (sizeof (struct GNUNET_TRANSPORT_PluginFunctions)); 2657 api = GNUNET_new (struct GNUNET_TRANSPORT_PluginFunctions);
2638 api->cls = plugin; 2658 api->cls = plugin;
2639 api->send = &tcp_plugin_send; 2659 api->send = &tcp_plugin_send;
2640 api->get_session = &tcp_plugin_get_session; 2660 api->get_session = &tcp_plugin_get_session;
@@ -2716,23 +2736,26 @@ libgnunet_plugin_transport_tcp_done (void *cls)
2716 GNUNET_free (api); 2736 GNUNET_free (api);
2717 return NULL; 2737 return NULL;
2718 } 2738 }
2719 LOG (GNUNET_ERROR_TYPE_DEBUG, "Shutting down TCP plugin\n"); 2739 LOG (GNUNET_ERROR_TYPE_DEBUG,
2740 "Shutting down TCP plugin\n");
2720 2741
2721 /* Removing leftover sessions */ 2742 /* Removing leftover sessions */
2722 GNUNET_CONTAINER_multipeermap_iterate(plugin->sessionmap, &session_disconnect_it, NULL); 2743 GNUNET_CONTAINER_multipeermap_iterate (plugin->sessionmap,
2744 &session_disconnect_it, NULL);
2723 /* Removing leftover NAT sessions */ 2745 /* Removing leftover NAT sessions */
2724 GNUNET_CONTAINER_multipeermap_iterate(plugin->nat_wait_conns, &session_disconnect_it, NULL); 2746 GNUNET_CONTAINER_multipeermap_iterate (plugin->nat_wait_conns,
2747 &session_disconnect_it, NULL);
2725 2748
2726 next = ppc_dll_head; 2749 next = ppc_dll_head;
2727 for (cur = next; NULL != cur; cur = next) 2750 for (cur = next; NULL != cur; cur = next)
2728 { 2751 {
2729 next = cur->next; 2752 next = cur->next;
2730 GNUNET_CONTAINER_DLL_remove (ppc_dll_head, ppc_dll_tail, cur); 2753 GNUNET_CONTAINER_DLL_remove (ppc_dll_head, ppc_dll_tail, cur);
2731 if (NULL != cur->resolver_handle) 2754 if (NULL != cur->resolver_handle)
2732 GNUNET_RESOLVER_request_cancel (cur->resolver_handle); 2755 GNUNET_RESOLVER_request_cancel (cur->resolver_handle);
2733 GNUNET_SCHEDULER_cancel (cur->timeout_task); 2756 GNUNET_SCHEDULER_cancel (cur->timeout_task);
2734 GNUNET_free (cur); 2757 GNUNET_free (cur);
2735 GNUNET_break (0); 2758 GNUNET_break (0);
2736 } 2759 }
2737 2760
2738 if (plugin->service != NULL) 2761 if (plugin->service != NULL)