aboutsummaryrefslogtreecommitdiff
path: root/src/transport/gnunet-service-transport_validation.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/transport/gnunet-service-transport_validation.c')
-rw-r--r--src/transport/gnunet-service-transport_validation.c146
1 files changed, 68 insertions, 78 deletions
diff --git a/src/transport/gnunet-service-transport_validation.c b/src/transport/gnunet-service-transport_validation.c
index 006a318f6..641214b39 100644
--- a/src/transport/gnunet-service-transport_validation.c
+++ b/src/transport/gnunet-service-transport_validation.c
@@ -333,9 +333,7 @@ validation_entry_match (void *cls, const GNUNET_HashCode * key, void *value)
333 struct ValidationEntryMatchContext *vemc = cls; 333 struct ValidationEntryMatchContext *vemc = cls;
334 struct ValidationEntry *ve = value; 334 struct ValidationEntry *ve = value;
335 335
336 if (0 == 336 if (0 == GNUNET_HELLO_address_cmp (ve->address, vemc->address))
337 GNUNET_HELLO_address_cmp (ve->address,
338 vemc->address))
339 { 337 {
340 vemc->ve = ve; 338 vemc->ve = ve;
341 return GNUNET_NO; 339 return GNUNET_NO;
@@ -397,15 +395,13 @@ timeout_hello_validation (void *cls,
397 struct GNUNET_TIME_Relative left; 395 struct GNUNET_TIME_Relative left;
398 396
399 ve->timeout_task = GNUNET_SCHEDULER_NO_TASK; 397 ve->timeout_task = GNUNET_SCHEDULER_NO_TASK;
400 max = GNUNET_TIME_absolute_max (ve->valid_until, 398 max = GNUNET_TIME_absolute_max (ve->valid_until, ve->revalidation_block);
401 ve->revalidation_block);
402 left = GNUNET_TIME_absolute_get_remaining (max); 399 left = GNUNET_TIME_absolute_get_remaining (max);
403 if (left.rel_value > 0) 400 if (left.rel_value > 0)
404 { 401 {
405 /* should wait a bit longer */ 402 /* should wait a bit longer */
406 ve->timeout_task = GNUNET_SCHEDULER_add_delayed (left, 403 ve->timeout_task =
407 &timeout_hello_validation, 404 GNUNET_SCHEDULER_add_delayed (left, &timeout_hello_validation, ve);
408 ve);
409 return; 405 return;
410 } 406 }
411 GNUNET_STATISTICS_update (GST_stats, 407 GNUNET_STATISTICS_update (GST_stats,
@@ -443,10 +439,13 @@ transmit_ping_if_allowed (void *cls, const struct GNUNET_PeerIdentity *pid,
443 slen = strlen (ve->address->transport_name) + 1; 439 slen = strlen (ve->address->transport_name) + 1;
444 hello = GST_hello_get (); 440 hello = GST_hello_get ();
445 hsize = ntohs (hello->size); 441 hsize = ntohs (hello->size);
446 tsize = sizeof (struct TransportPingMessage) + ve->address->address_length + slen + hsize; 442 tsize =
443 sizeof (struct TransportPingMessage) + ve->address->address_length +
444 slen + hsize;
447 445
448 ping.header.size = 446 ping.header.size =
449 htons (sizeof (struct TransportPingMessage) + ve->address->address_length + slen); 447 htons (sizeof (struct TransportPingMessage) +
448 ve->address->address_length + slen);
450 ping.header.type = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_PING); 449 ping.header.type = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_PING);
451 ping.challenge = htonl (ve->challenge); 450 ping.challenge = htonl (ve->challenge);
452 ping.target = *pid; 451 ping.target = *pid;
@@ -459,7 +458,9 @@ transmit_ping_if_allowed (void *cls, const struct GNUNET_PeerIdentity *pid,
459 "HELLO", "PING", (unsigned int) tsize); 458 "HELLO", "PING", (unsigned int) tsize);
460 /* message too big (!?), get rid of HELLO */ 459 /* message too big (!?), get rid of HELLO */
461 hsize = 0; 460 hsize = 0;
462 tsize = sizeof (struct TransportPingMessage) + ve->address->address_length + slen + hsize; 461 tsize =
462 sizeof (struct TransportPingMessage) + ve->address->address_length +
463 slen + hsize;
463 } 464 }
464 { 465 {
465 char message_buf[tsize]; 466 char message_buf[tsize];
@@ -481,8 +482,8 @@ transmit_ping_if_allowed (void *cls, const struct GNUNET_PeerIdentity *pid,
481 ret = 482 ret =
482 papi->send (papi->cls, pid, message_buf, tsize, PING_PRIORITY, 483 papi->send (papi->cls, pid, message_buf, tsize, PING_PRIORITY,
483 ACCEPTABLE_PING_DELAY, NULL /* no session */ , 484 ACCEPTABLE_PING_DELAY, NULL /* no session */ ,
484 ve->address->address, ve->address->address_length, 485 ve->address->address, ve->address->address_length,
485 GNUNET_YES, NULL, NULL); 486 GNUNET_YES, NULL, NULL);
486 } 487 }
487 } 488 }
488 if (-1 != ret) 489 if (-1 != ret)
@@ -515,12 +516,11 @@ revalidate_address (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
515 ve->revalidation_task = GNUNET_SCHEDULER_NO_TASK; 516 ve->revalidation_task = GNUNET_SCHEDULER_NO_TASK;
516 delay = GNUNET_TIME_absolute_get_remaining (ve->revalidation_block); 517 delay = GNUNET_TIME_absolute_get_remaining (ve->revalidation_block);
517 /* How long until we can possibly permit the next PING? */ 518 /* How long until we can possibly permit the next PING? */
518 canonical_delay = 519 canonical_delay =
519 (ve->in_use == GNUNET_YES) 520 (ve->in_use ==
520 ? CONNECTED_PING_FREQUENCY 521 GNUNET_YES) ? CONNECTED_PING_FREQUENCY
521 : ( (GNUNET_TIME_absolute_get_remaining (ve->valid_until).rel_value > 0) 522 : ((GNUNET_TIME_absolute_get_remaining (ve->valid_until).rel_value >
522 ? VALIDATED_PING_FREQUENCY 523 0) ? VALIDATED_PING_FREQUENCY : UNVALIDATED_PING_KEEPALIVE);
523 : UNVALIDATED_PING_KEEPALIVE);
524 if (delay.rel_value > canonical_delay.rel_value * 2) 524 if (delay.rel_value > canonical_delay.rel_value * 2)
525 { 525 {
526 /* situation changed, recalculate delay */ 526 /* situation changed, recalculate delay */
@@ -534,28 +534,28 @@ revalidate_address (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
534 GNUNET_SCHEDULER_add_delayed (delay, &revalidate_address, ve); 534 GNUNET_SCHEDULER_add_delayed (delay, &revalidate_address, ve);
535 return; 535 return;
536 } 536 }
537 ve->revalidation_block = 537 ve->revalidation_block = GNUNET_TIME_relative_to_absolute (canonical_delay);
538 GNUNET_TIME_relative_to_absolute (canonical_delay);
539 538
540 /* schedule next PINGing with some extra random delay to avoid synchronous re-validations */ 539 /* schedule next PINGing with some extra random delay to avoid synchronous re-validations */
541 rdelay = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, 540 rdelay =
542 canonical_delay.rel_value); 541 GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK,
542 canonical_delay.rel_value);
543 delay = 543 delay =
544 GNUNET_TIME_relative_add (canonical_delay, 544 GNUNET_TIME_relative_add (canonical_delay,
545 GNUNET_TIME_relative_multiply 545 GNUNET_TIME_relative_multiply
546 (GNUNET_TIME_UNIT_MILLISECONDS, rdelay)); 546 (GNUNET_TIME_UNIT_MILLISECONDS, rdelay));
547 ve->revalidation_task = 547 ve->revalidation_task =
548 GNUNET_SCHEDULER_add_delayed (delay, &revalidate_address, ve); 548 GNUNET_SCHEDULER_add_delayed (delay, &revalidate_address, ve);
549 549
550 /* start PINGing by checking blacklist */ 550 /* start PINGing by checking blacklist */
551 GNUNET_STATISTICS_update (GST_stats, 551 GNUNET_STATISTICS_update (GST_stats,
552 gettext_noop ("# address revalidations started"), 1, 552 gettext_noop ("# address revalidations started"), 1,
553 GNUNET_NO); 553 GNUNET_NO);
554 bc = GST_blacklist_test_allowed (&ve->pid, ve->address->transport_name, 554 bc = GST_blacklist_test_allowed (&ve->pid, ve->address->transport_name,
555 &transmit_ping_if_allowed, ve); 555 &transmit_ping_if_allowed, ve);
556 if (NULL != bc) 556 if (NULL != bc)
557 ve->bc = bc; /* only set 'bc' if 'transmit_ping_if_allowed' was not already 557 ve->bc = bc; /* only set 'bc' if 'transmit_ping_if_allowed' was not already
558 called... */ 558 * called... */
559} 559}
560 560
561 561
@@ -592,9 +592,11 @@ find_validation_entry (const struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded
592 ve->latency = GNUNET_TIME_UNIT_FOREVER_REL; 592 ve->latency = GNUNET_TIME_UNIT_FOREVER_REL;
593 ve->challenge = 593 ve->challenge =
594 GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_NONCE, UINT32_MAX); 594 GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_NONCE, UINT32_MAX);
595 ve->timeout_task = GNUNET_SCHEDULER_add_delayed (UNVALIDATED_PING_KEEPALIVE, 595 ve->timeout_task =
596 &timeout_hello_validation, ve); 596 GNUNET_SCHEDULER_add_delayed (UNVALIDATED_PING_KEEPALIVE,
597 GNUNET_CONTAINER_multihashmap_put (validation_map, &address->peer.hashPubKey, ve, 597 &timeout_hello_validation, ve);
598 GNUNET_CONTAINER_multihashmap_put (validation_map, &address->peer.hashPubKey,
599 ve,
598 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE); 600 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
599 ve->expecting_pong = GNUNET_NO; 601 ve->expecting_pong = GNUNET_NO;
600 return ve; 602 return ve;
@@ -611,8 +613,7 @@ find_validation_entry (const struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded
611 * @return GNUNET_OK (keep the address) 613 * @return GNUNET_OK (keep the address)
612 */ 614 */
613static int 615static int
614add_valid_address (void *cls, 616add_valid_address (void *cls, const struct GNUNET_HELLO_Address *address,
615 const struct GNUNET_HELLO_Address *address,
616 struct GNUNET_TIME_Absolute expiration) 617 struct GNUNET_TIME_Absolute expiration)
617{ 618{
618 const struct GNUNET_HELLO_Message *hello = cls; 619 const struct GNUNET_HELLO_Message *hello = cls;
@@ -628,7 +629,7 @@ add_valid_address (void *cls,
628 GNUNET_break (0); 629 GNUNET_break (0);
629 return GNUNET_OK; /* invalid HELLO !? */ 630 return GNUNET_OK; /* invalid HELLO !? */
630 } 631 }
631 if (0 == memcmp(&GST_my_identity, &pid, sizeof (struct GNUNET_PeerIdentity))) 632 if (0 == memcmp (&GST_my_identity, &pid, sizeof (struct GNUNET_PeerIdentity)))
632 { 633 {
633 /* Peerinfo returned own identity, skip validation */ 634 /* Peerinfo returned own identity, skip validation */
634 return GNUNET_OK; 635 return GNUNET_OK;
@@ -639,8 +640,7 @@ add_valid_address (void *cls,
639 640
640 if (GNUNET_SCHEDULER_NO_TASK == ve->revalidation_task) 641 if (GNUNET_SCHEDULER_NO_TASK == ve->revalidation_task)
641 ve->revalidation_task = GNUNET_SCHEDULER_add_now (&revalidate_address, ve); 642 ve->revalidation_task = GNUNET_SCHEDULER_add_now (&revalidate_address, ve);
642 GNUNET_ATS_address_update (GST_ats, address, NULL, NULL, 643 GNUNET_ATS_address_update (GST_ats, address, NULL, NULL, 0);
643 0);
644 return GNUNET_OK; 644 return GNUNET_OK;
645} 645}
646 646
@@ -716,8 +716,7 @@ GST_validation_stop ()
716static void 716static void
717multicast_pong (void *cls, 717multicast_pong (void *cls,
718 const struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded 718 const struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded
719 *public_key, 719 *public_key, struct GNUNET_TIME_Absolute valid_until,
720 struct GNUNET_TIME_Absolute valid_until,
721 struct GNUNET_TIME_Absolute validation_block, 720 struct GNUNET_TIME_Absolute validation_block,
722 const struct GNUNET_HELLO_Address *address) 721 const struct GNUNET_HELLO_Address *address)
723{ 722{
@@ -729,8 +728,7 @@ multicast_pong (void *cls,
729 return; 728 return;
730 (void) papi->send (papi->cls, &address->peer, (const char *) pong, 729 (void) papi->send (papi->cls, &address->peer, (const char *) pong,
731 ntohs (pong->header.size), PONG_PRIORITY, 730 ntohs (pong->header.size), PONG_PRIORITY,
732 ACCEPTABLE_PING_DELAY, NULL, 731 ACCEPTABLE_PING_DELAY, NULL, address->address,
733 address->address,
734 address->address_length, GNUNET_YES, NULL, NULL); 732 address->address_length, GNUNET_YES, NULL, NULL);
735} 733}
736 734
@@ -747,7 +745,7 @@ void
747GST_validation_handle_ping (const struct GNUNET_PeerIdentity *sender, 745GST_validation_handle_ping (const struct GNUNET_PeerIdentity *sender,
748 const struct GNUNET_MessageHeader *hdr, 746 const struct GNUNET_MessageHeader *hdr,
749 const struct GNUNET_HELLO_Address *sender_address, 747 const struct GNUNET_HELLO_Address *sender_address,
750 struct Session *session) 748 struct Session *session)
751{ 749{
752 const struct TransportPingMessage *ping; 750 const struct TransportPingMessage *ping;
753 struct TransportPongMessage *pong; 751 struct TransportPongMessage *pong;
@@ -804,8 +802,7 @@ GST_validation_handle_ping (const struct GNUNET_PeerIdentity *sender,
804 address.transport_name = addr; 802 address.transport_name = addr;
805 address.peer = *sender; 803 address.peer = *sender;
806 if (GNUNET_YES != 804 if (GNUNET_YES !=
807 GST_hello_test_address (&address, &sig_cache, 805 GST_hello_test_address (&address, &sig_cache, &sig_cache_exp))
808 &sig_cache_exp))
809 { 806 {
810 GNUNET_log (GNUNET_ERROR_TYPE_INFO, 807 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
811 _ 808 _
@@ -867,10 +864,8 @@ GST_validation_handle_ping (const struct GNUNET_PeerIdentity *sender,
867 ret = 864 ret =
868 papi->send (papi->cls, sender, (const char *) pong, 865 papi->send (papi->cls, sender, (const char *) pong,
869 ntohs (pong->header.size), PONG_PRIORITY, 866 ntohs (pong->header.size), PONG_PRIORITY,
870 ACCEPTABLE_PING_DELAY, session, 867 ACCEPTABLE_PING_DELAY, session, sender_address->address,
871 sender_address->address, 868 sender_address->address_length, GNUNET_SYSERR, NULL, NULL);
872 sender_address->address_length,
873 GNUNET_SYSERR, NULL, NULL);
874 if (ret != -1) 869 if (ret != -1)
875 { 870 {
876 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 871 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -922,9 +917,9 @@ struct ValidateAddressContext
922 * @return GNUNET_OK (keep the address) 917 * @return GNUNET_OK (keep the address)
923 */ 918 */
924static int 919static int
925validate_address_iterator (void *cls, 920validate_address_iterator (void *cls,
926 const struct GNUNET_HELLO_Address *address, 921 const struct GNUNET_HELLO_Address *address,
927 struct GNUNET_TIME_Absolute expiration) 922 struct GNUNET_TIME_Absolute expiration)
928{ 923{
929 const struct ValidateAddressContext *vac = cls; 924 const struct ValidateAddressContext *vac = cls;
930 struct ValidationEntry *ve; 925 struct ValidationEntry *ve;
@@ -933,8 +928,7 @@ validate_address_iterator (void *cls,
933 return GNUNET_OK; /* expired */ 928 return GNUNET_OK; /* expired */
934 ve = find_validation_entry (&vac->public_key, address); 929 ve = find_validation_entry (&vac->public_key, address);
935 if (GNUNET_SCHEDULER_NO_TASK == ve->revalidation_task) 930 if (GNUNET_SCHEDULER_NO_TASK == ve->revalidation_task)
936 ve->revalidation_task = GNUNET_SCHEDULER_add_now (&revalidate_address, 931 ve->revalidation_task = GNUNET_SCHEDULER_add_now (&revalidate_address, ve);
937 ve);
938 return GNUNET_OK; 932 return GNUNET_OK;
939} 933}
940 934
@@ -956,8 +950,7 @@ add_valid_peer_address (void *cls, size_t max, void *buf)
956 if (GNUNET_YES == ve->copied) 950 if (GNUNET_YES == ve->copied)
957 return 0; /* terminate */ 951 return 0; /* terminate */
958 ve->copied = GNUNET_YES; 952 ve->copied = GNUNET_YES;
959 return GNUNET_HELLO_add_address (ve->address, ve->valid_until, 953 return GNUNET_HELLO_add_address (ve->address, ve->valid_until, buf, max);
960 buf, max);
961} 954}
962 955
963 956
@@ -1056,7 +1049,7 @@ GST_validation_handle_pong (const struct GNUNET_PeerIdentity *sender,
1056 struct GNUNET_ATS_Information ats; 1049 struct GNUNET_ATS_Information ats;
1057 1050
1058 ats.type = htonl (GNUNET_ATS_QUALITY_NET_DELAY); 1051 ats.type = htonl (GNUNET_ATS_QUALITY_NET_DELAY);
1059 ats.value = htonl ((uint32_t) ve->latency.rel_value); 1052 ats.value = htonl ((uint32_t) ve->latency.rel_value);
1060 GNUNET_ATS_address_update (GST_ats, ve->address, NULL, &ats, 1); 1053 GNUNET_ATS_address_update (GST_ats, ve->address, NULL, &ats, 1);
1061 } 1054 }
1062 /* build HELLO to store in PEERINFO */ 1055 /* build HELLO to store in PEERINFO */
@@ -1102,7 +1095,8 @@ GST_validation_handle_hello (const struct GNUNET_MessageHeader *hello)
1102 GNUNET_free (h); 1095 GNUNET_free (h);
1103 GNUNET_assert (NULL == 1096 GNUNET_assert (NULL ==
1104 GNUNET_HELLO_iterate_addresses (hm, GNUNET_NO, 1097 GNUNET_HELLO_iterate_addresses (hm, GNUNET_NO,
1105 &validate_address_iterator, &vac)); 1098 &validate_address_iterator,
1099 &vac));
1106} 1100}
1107 1101
1108 1102
@@ -1138,8 +1132,8 @@ iterate_addresses (void *cls, const GNUNET_HashCode * key, void *value)
1138 struct IteratorContext *ic = cls; 1132 struct IteratorContext *ic = cls;
1139 struct ValidationEntry *ve = value; 1133 struct ValidationEntry *ve = value;
1140 1134
1141 ic->cb (ic->cb_cls, &ve->public_key, ve->valid_until, 1135 ic->cb (ic->cb_cls, &ve->public_key, ve->valid_until, ve->revalidation_block,
1142 ve->revalidation_block, ve->address); 1136 ve->address);
1143 return GNUNET_OK; 1137 return GNUNET_OK;
1144} 1138}
1145 1139
@@ -1178,16 +1172,15 @@ GST_validation_get_addresses (const struct GNUNET_PeerIdentity *target,
1178 */ 1172 */
1179void 1173void
1180GST_validation_set_address_use (const struct GNUNET_PeerIdentity *sender, 1174GST_validation_set_address_use (const struct GNUNET_PeerIdentity *sender,
1181 const struct GNUNET_HELLO_Address *address, 1175 const struct GNUNET_HELLO_Address *address,
1182 struct Session *session, 1176 struct Session *session, int in_use)
1183 int in_use)
1184{ 1177{
1185 struct ValidationEntry *ve; 1178 struct ValidationEntry *ve;
1186 1179
1187 if (NULL != address) 1180 if (NULL != address)
1188 ve = find_validation_entry (NULL, address); 1181 ve = find_validation_entry (NULL, address);
1189 else 1182 else
1190 ve = NULL; /* FIXME: lookup based on session... */ 1183 ve = NULL; /* FIXME: lookup based on session... */
1191 if (NULL == ve) 1184 if (NULL == ve)
1192 { 1185 {
1193 /* this can happen for inbound connections (sender_address_len == 0); */ 1186 /* this can happen for inbound connections (sender_address_len == 0); */
@@ -1195,19 +1188,16 @@ GST_validation_set_address_use (const struct GNUNET_PeerIdentity *sender,
1195 } 1188 }
1196 if (ve->in_use == in_use) 1189 if (ve->in_use == in_use)
1197 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 1190 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
1198 "GST_validation_set_address_use: %s %s: ve->in_use %i <-> in_use %i\n", 1191 "GST_validation_set_address_use: %s %s: ve->in_use %i <-> in_use %i\n",
1199 GNUNET_i2s(sender), 1192 GNUNET_i2s (sender), GST_plugins_a2s (address), ve->in_use,
1200 GST_plugins_a2s(address), 1193 in_use);
1201 ve->in_use, 1194 GNUNET_break (ve->in_use != in_use); /* should be different... */
1202 in_use);
1203 GNUNET_break (ve->in_use != in_use); /* should be different... */
1204 ve->in_use = in_use; 1195 ve->in_use = in_use;
1205 if (in_use == GNUNET_YES) 1196 if (in_use == GNUNET_YES)
1206 { 1197 {
1207 /* from now on, higher frequeny, so reschedule now */ 1198 /* from now on, higher frequeny, so reschedule now */
1208 GNUNET_SCHEDULER_cancel (ve->revalidation_task); 1199 GNUNET_SCHEDULER_cancel (ve->revalidation_task);
1209 ve->revalidation_task = 1200 ve->revalidation_task = GNUNET_SCHEDULER_add_now (&revalidate_address, ve);
1210 GNUNET_SCHEDULER_add_now (&revalidate_address, ve);
1211 } 1201 }
1212} 1202}
1213 1203
@@ -1218,20 +1208,20 @@ GST_validation_set_address_use (const struct GNUNET_PeerIdentity *sender,
1218 * 1208 *
1219 * @param sender peer 1209 * @param sender peer
1220 * @param address the address 1210 * @param address the address
1221 * @param session session 1211 * @param session session
1222 * @return observed latency of the address, FOREVER if the address was 1212 * @return observed latency of the address, FOREVER if the address was
1223 * never successfully validated 1213 * never successfully validated
1224 */ 1214 */
1225struct GNUNET_TIME_Relative 1215struct GNUNET_TIME_Relative
1226GST_validation_get_address_latency (const struct GNUNET_PeerIdentity *sender, 1216GST_validation_get_address_latency (const struct GNUNET_PeerIdentity *sender,
1227 const struct GNUNET_HELLO_Address *address, 1217 const struct GNUNET_HELLO_Address *address,
1228 struct Session *session) 1218 struct Session *session)
1229{ 1219{
1230 struct ValidationEntry *ve; 1220 struct ValidationEntry *ve;
1231 1221
1232 if (NULL == address) 1222 if (NULL == address)
1233 { 1223 {
1234 GNUNET_break (0); // FIXME: support having latency only with session... 1224 GNUNET_break (0); // FIXME: support having latency only with session...
1235 return GNUNET_TIME_UNIT_FOREVER_REL; 1225 return GNUNET_TIME_UNIT_FOREVER_REL;
1236 } 1226 }
1237 ve = find_validation_entry (NULL, address); 1227 ve = find_validation_entry (NULL, address);