aboutsummaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2015-03-08 13:11:48 +0000
committerChristian Grothoff <christian@grothoff.org>2015-03-08 13:11:48 +0000
commit247e63b4eb4db92cc0cfb2df9ca66632cc6c90b1 (patch)
tree86b02af3abd7c9ada2782c1fa3697c50b846c1db /src/core
parent77ea8dbe440a1a9780644876430292f65f5de51c (diff)
downloadgnunet-247e63b4eb4db92cc0cfb2df9ca66632cc6c90b1.tar.gz
gnunet-247e63b4eb4db92cc0cfb2df9ca66632cc6c90b1.zip
-try to avoid being stuck with key sent/received if PING/PONGs are lost
Diffstat (limited to 'src/core')
-rw-r--r--src/core/gnunet-service-core_kx.c27
1 files changed, 17 insertions, 10 deletions
diff --git a/src/core/gnunet-service-core_kx.c b/src/core/gnunet-service-core_kx.c
index 0fc5ecf25..6608725a5 100644
--- a/src/core/gnunet-service-core_kx.c
+++ b/src/core/gnunet-service-core_kx.c
@@ -789,6 +789,10 @@ GSC_KX_stop (struct GSC_KeyExchangeInfo *kx)
789static void 789static void
790send_ping (struct GSC_KeyExchangeInfo *kx) 790send_ping (struct GSC_KeyExchangeInfo *kx)
791{ 791{
792 GNUNET_STATISTICS_update (GSC_stats,
793 gettext_noop ("# PING messages transmitted"),
794 1,
795 GNUNET_NO);
792 GSC_NEIGHBOURS_transmit (&kx->peer, 796 GSC_NEIGHBOURS_transmit (&kx->peer,
793 &kx->ping.header, 797 &kx->ping.header,
794 MIN_PING_FREQUENCY); 798 MIN_PING_FREQUENCY);
@@ -955,7 +959,8 @@ GSC_KX_handle_ephemeral_key (struct GSC_KeyExchangeInfo *kx,
955 monitor_notify_all (kx); 959 monitor_notify_all (kx);
956 if (GNUNET_CORE_KX_STATE_KEY_SENT == sender_status) 960 if (GNUNET_CORE_KX_STATE_KEY_SENT == sender_status)
957 send_key (kx); 961 send_key (kx);
958 send_ping (kx); 962 else
963 send_ping (kx);
959 break; 964 break;
960 case GNUNET_CORE_KX_STATE_KEY_SENT: 965 case GNUNET_CORE_KX_STATE_KEY_SENT:
961 GNUNET_assert (NULL == kx->keep_alive_task); 966 GNUNET_assert (NULL == kx->keep_alive_task);
@@ -963,27 +968,29 @@ GSC_KX_handle_ephemeral_key (struct GSC_KeyExchangeInfo *kx,
963 monitor_notify_all (kx); 968 monitor_notify_all (kx);
964 if (GNUNET_CORE_KX_STATE_KEY_SENT == sender_status) 969 if (GNUNET_CORE_KX_STATE_KEY_SENT == sender_status)
965 send_key (kx); 970 send_key (kx);
966 send_ping (kx); 971 else
972 send_ping (kx);
967 break; 973 break;
968 case GNUNET_CORE_KX_STATE_KEY_RECEIVED: 974 case GNUNET_CORE_KX_STATE_KEY_RECEIVED:
969 GNUNET_assert (NULL == kx->keep_alive_task); 975 GNUNET_assert (NULL == kx->keep_alive_task);
970 if (GNUNET_CORE_KX_STATE_KEY_SENT == sender_status) 976 if (GNUNET_CORE_KX_STATE_KEY_SENT == sender_status)
971 send_key (kx); 977 send_key (kx);
972 send_ping (kx); 978 else
979 send_ping (kx);
973 break; 980 break;
974 case GNUNET_CORE_KX_STATE_UP: 981 case GNUNET_CORE_KX_STATE_UP:
975 kx->status = GNUNET_CORE_KX_STATE_REKEY_SENT; 982 kx->status = GNUNET_CORE_KX_STATE_REKEY_SENT;
976 monitor_notify_all (kx); 983 monitor_notify_all (kx);
977 if (GNUNET_CORE_KX_STATE_KEY_SENT == sender_status) 984 if (GNUNET_CORE_KX_STATE_KEY_SENT == sender_status)
978 send_key (kx); 985 send_key (kx);
979 /* we got a new key, need to reconfirm! */ 986 else
980 send_ping (kx); 987 send_ping (kx);
981 break; 988 break;
982 case GNUNET_CORE_KX_STATE_REKEY_SENT: 989 case GNUNET_CORE_KX_STATE_REKEY_SENT:
983 if (GNUNET_CORE_KX_STATE_KEY_SENT == sender_status) 990 if (GNUNET_CORE_KX_STATE_KEY_SENT == sender_status)
984 send_key (kx); 991 send_key (kx);
985 /* we got a new key, need to reconfirm! */ 992 else
986 send_ping (kx); 993 send_ping (kx);
987 break; 994 break;
988 default: 995 default:
989 GNUNET_break (0); 996 GNUNET_break (0);
@@ -1125,9 +1132,7 @@ send_keep_alive (void *cls,
1125 1, 1132 1,
1126 GNUNET_NO); 1133 GNUNET_NO);
1127 setup_fresh_ping (kx); 1134 setup_fresh_ping (kx);
1128 GSC_NEIGHBOURS_transmit (&kx->peer, 1135 send_ping (kx);
1129 &kx->ping.header,
1130 kx->set_key_retry_frequency);
1131 retry = 1136 retry =
1132 GNUNET_TIME_relative_max (GNUNET_TIME_relative_divide (left, 2), 1137 GNUNET_TIME_relative_max (GNUNET_TIME_relative_divide (left, 2),
1133 MIN_PING_FREQUENCY); 1138 MIN_PING_FREQUENCY);
@@ -1322,6 +1327,8 @@ send_key (struct GSC_KeyExchangeInfo *kx)
1322 GSC_NEIGHBOURS_transmit (&kx->peer, 1327 GSC_NEIGHBOURS_transmit (&kx->peer,
1323 &current_ekm.header, 1328 &current_ekm.header,
1324 kx->set_key_retry_frequency); 1329 kx->set_key_retry_frequency);
1330 if (GNUNET_CORE_KX_STATE_KEY_SENT != kx->status)
1331 send_ping (kx);
1325 kx->retry_set_key_task = 1332 kx->retry_set_key_task =
1326 GNUNET_SCHEDULER_add_delayed (kx->set_key_retry_frequency, 1333 GNUNET_SCHEDULER_add_delayed (kx->set_key_retry_frequency,
1327 &set_key_retry_task, kx); 1334 &set_key_retry_task, kx);