diff options
author | Matthias Wachs <wachs@net.in.tum.de> | 2011-11-10 09:50:37 +0000 |
---|---|---|
committer | Matthias Wachs <wachs@net.in.tum.de> | 2011-11-10 09:50:37 +0000 |
commit | beda377f4ab06a563f8f91768196e1858939e5ec (patch) | |
tree | 5050e4350182b6fbe24e994cfce006ba81fa8eaf /src | |
parent | 6e29a6969fd9fa6eb772fb77751fca5a85f4e717 (diff) | |
download | gnunet-beda377f4ab06a563f8f91768196e1858939e5ec.tar.gz gnunet-beda377f4ab06a563f8f91768196e1858939e5ec.zip |
handle PONG only if expected
Diffstat (limited to 'src')
-rw-r--r-- | src/transport/gnunet-service-transport_validation.c | 26 |
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", |