aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMatthias Wachs <wachs@net.in.tum.de>2011-11-10 09:50:37 +0000
committerMatthias Wachs <wachs@net.in.tum.de>2011-11-10 09:50:37 +0000
commitbeda377f4ab06a563f8f91768196e1858939e5ec (patch)
tree5050e4350182b6fbe24e994cfce006ba81fa8eaf /src
parent6e29a6969fd9fa6eb772fb77751fca5a85f4e717 (diff)
downloadgnunet-beda377f4ab06a563f8f91768196e1858939e5ec.tar.gz
gnunet-beda377f4ab06a563f8f91768196e1858939e5ec.zip
handle PONG only if expected
Diffstat (limited to 'src')
-rw-r--r--src/transport/gnunet-service-transport_validation.c26
1 files changed, 17 insertions, 9 deletions
diff --git a/src/transport/gnunet-service-transport_validation.c b/src/transport/gnunet-service-transport_validation.c
index 29dfb17cc..7e0803a9d 100644
--- a/src/transport/gnunet-service-transport_validation.c
+++ b/src/transport/gnunet-service-transport_validation.c
@@ -245,6 +245,10 @@ struct ValidationEntry
245 */ 245 */
246 int in_use; 246 int in_use;
247 247
248 /**
249 * Are we expecting a PONG message for this validation entry?
250 */
251 int expecting_pong;
248}; 252};
249 253
250 254
@@ -488,6 +492,7 @@ transmit_ping_if_allowed (void *cls, const struct GNUNET_PeerIdentity *pid,
488 gettext_noop 492 gettext_noop
489 ("# PING without HELLO messages sent"), 1, 493 ("# PING without HELLO messages sent"), 1,
490 GNUNET_NO); 494 GNUNET_NO);
495 ve->expecting_pong = GNUNET_YES;
491 } 496 }
492} 497}
493 498
@@ -591,6 +596,7 @@ find_validation_entry (const struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded
591 &timeout_hello_validation, ve); 596 &timeout_hello_validation, ve);
592 GNUNET_CONTAINER_multihashmap_put (validation_map, &address->peer.hashPubKey, ve, 597 GNUNET_CONTAINER_multihashmap_put (validation_map, &address->peer.hashPubKey, ve,
593 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE); 598 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
599 ve->expecting_pong = GNUNET_NO;
594 return ve; 600 return ve;
595} 601}
596 602
@@ -995,7 +1001,7 @@ GST_validation_handle_pong (const struct GNUNET_PeerIdentity *sender,
995 address.address_length = addrlen; 1001 address.address_length = addrlen;
996 address.transport_name = tname; 1002 address.transport_name = tname;
997 ve = find_validation_entry (NULL, &address); 1003 ve = find_validation_entry (NULL, &address);
998 if (NULL == ve) 1004 if ((NULL == ve) || (ve->expecting_pong == GNUNET_NO))
999 { 1005 {
1000 GNUNET_STATISTICS_update (GST_stats, 1006 GNUNET_STATISTICS_update (GST_stats,
1001 gettext_noop 1007 gettext_noop
@@ -1010,6 +1016,16 @@ GST_validation_handle_pong (const struct GNUNET_PeerIdentity *sender,
1010 return; 1016 return;
1011 } 1017 }
1012 1018
1019 if (GNUNET_OK !=
1020 GNUNET_CRYPTO_rsa_verify (GNUNET_SIGNATURE_PURPOSE_TRANSPORT_PONG_OWN,
1021 &pong->purpose, &pong->signature,
1022 &ve->public_key))
1023 {
1024 GNUNET_break_op (0);
1025 return;
1026 }
1027
1028 ve->expecting_pong = GNUNET_NO;
1013 if (GNUNET_TIME_absolute_get_remaining 1029 if (GNUNET_TIME_absolute_get_remaining
1014 (GNUNET_TIME_absolute_ntoh (pong->expiration)).rel_value == 0) 1030 (GNUNET_TIME_absolute_ntoh (pong->expiration)).rel_value == 0)
1015 { 1031 {
@@ -1019,14 +1035,6 @@ GST_validation_handle_pong (const struct GNUNET_PeerIdentity *sender,
1019 GNUNET_NO); 1035 GNUNET_NO);
1020 return; 1036 return;
1021 } 1037 }
1022 if (GNUNET_OK !=
1023 GNUNET_CRYPTO_rsa_verify (GNUNET_SIGNATURE_PURPOSE_TRANSPORT_PONG_OWN,
1024 &pong->purpose, &pong->signature,
1025 &ve->public_key))
1026 {
1027 GNUNET_break_op (0);
1028 return;
1029 }
1030#if DEBUG_TRANSPORT 1038#if DEBUG_TRANSPORT
1031 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 1039 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1032 "Address validated for peer `%s' with plugin `%s': `%s'\n", 1040 "Address validated for peer `%s' with plugin `%s': `%s'\n",