aboutsummaryrefslogtreecommitdiff
path: root/src/ats/gnunet-service-ats_addresses.c
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2014-06-16 10:10:59 +0000
committerChristian Grothoff <christian@grothoff.org>2014-06-16 10:10:59 +0000
commit1eef01cd60f92a3d77061d655c0217bd6f9ffce4 (patch)
treedb83ba950eb0ece1efb9b682e379ccd1d0dd4b72 /src/ats/gnunet-service-ats_addresses.c
parentc1d89ed3cf92fa2492a5639e725aadd74742f135 (diff)
downloadgnunet-1eef01cd60f92a3d77061d655c0217bd6f9ffce4.tar.gz
gnunet-1eef01cd60f92a3d77061d655c0217bd6f9ffce4.zip
notify performance monitors about destroyed addresses (for #3406)
Diffstat (limited to 'src/ats/gnunet-service-ats_addresses.c')
-rw-r--r--src/ats/gnunet-service-ats_addresses.c203
1 files changed, 133 insertions, 70 deletions
diff --git a/src/ats/gnunet-service-ats_addresses.c b/src/ats/gnunet-service-ats_addresses.c
index ca8afecd9..93b9514fb 100644
--- a/src/ats/gnunet-service-ats_addresses.c
+++ b/src/ats/gnunet-service-ats_addresses.c
@@ -336,6 +336,13 @@ struct GAS_Addresses_Handle
336 char *plugin; 336 char *plugin;
337}; 337};
338 338
339
340/**
341 * Value we pass for zero bandwidth.
342 */
343const static struct GNUNET_BANDWIDTH_Value32NBO zero_bw;
344
345
339/** 346/**
340 * Disassemble ATS information and update performance information in address 347 * Disassemble ATS information and update performance information in address
341 * 348 *
@@ -343,23 +350,23 @@ struct GAS_Addresses_Handle
343 * 350 *
344 * @param dest destination address 351 * @param dest destination address
345 * @param update source ATS information 352 * @param update source ATS information
346 * @param update_count number of ATS information 353 * @param update_count number of ATS information in @a update
347 * @param delta_dest ats performance information which were updated 354 * @param delta_dest ats performance information which were updated
348 * including previous value 355 * including previous value
349 * @param delta_count number of ATS information in the delta 356 * @param delta_count number of ATS information in the @a delta_dest
350 * @return GNUNET_YES if address was address updated, GNUNET_NO otherwise 357 * @return #GNUNET_YES if address was address updated, GNUNET_NO otherwise
351 */ 358 */
352static unsigned int 359static unsigned int
353disassemble_ats_information (struct ATS_Address *dest, 360disassemble_ats_information (struct ATS_Address *dest,
354 const struct GNUNET_ATS_Information *update, uint32_t update_count, 361 const struct GNUNET_ATS_Information *update,
355 struct GNUNET_ATS_Information **delta_dest, uint32_t *delta_count) 362 uint32_t update_count,
363 struct GNUNET_ATS_Information **delta_dest,
364 uint32_t *delta_count)
356{ 365{
357
358 int c1; 366 int c1;
359 int c2; 367 int c2;
360 int found; 368 int found;
361 int change; 369 int change;
362
363 struct GNUNET_ATS_Information add_atsi[update_count]; 370 struct GNUNET_ATS_Information add_atsi[update_count];
364 struct GNUNET_ATS_Information delta_atsi[update_count]; 371 struct GNUNET_ATS_Information delta_atsi[update_count];
365 struct GNUNET_ATS_Information *tmp_atsi; 372 struct GNUNET_ATS_Information *tmp_atsi;
@@ -452,6 +459,7 @@ disassemble_ats_information (struct ATS_Address *dest,
452 return change; 459 return change;
453} 460}
454 461
462
455/** 463/**
456 * Free the given address 464 * Free the given address
457 * 465 *
@@ -504,10 +512,13 @@ create_address (const struct GNUNET_PeerIdentity *peer,
504 for (c2 = 0; c2 < GAS_normalization_queue_length; c2++) 512 for (c2 = 0; c2 < GAS_normalization_queue_length; c2++)
505 aa->atsin[c1].atsi_abs[c2] = GNUNET_ATS_VALUE_UNDEFINED; 513 aa->atsin[c1].atsi_abs[c2] = GNUNET_ATS_VALUE_UNDEFINED;
506 } 514 }
507
508 return aa; 515 return aa;
509} 516}
510 517
518
519/**
520 * Closure for #compare_address_it()
521 */
511struct CompareAddressContext 522struct CompareAddressContext
512{ 523{
513 const struct ATS_Address *search; 524 const struct ATS_Address *search;
@@ -599,6 +610,7 @@ compare_address_it (void *cls,
599 return GNUNET_NO; /* Stop iteration since we have an exact address */ 610 return GNUNET_NO; /* Stop iteration since we have an exact address */
600} 611}
601 612
613
602/** 614/**
603 * Find an existing equivalent address record. 615 * Find an existing equivalent address record.
604 * Compares by peer identity and network address OR by session ID 616 * Compares by peer identity and network address OR by session ID
@@ -611,7 +623,8 @@ compare_address_it (void *cls,
611 */ 623 */
612struct ATS_Address * 624struct ATS_Address *
613find_equivalent_address (struct GAS_Addresses_Handle *handle, 625find_equivalent_address (struct GAS_Addresses_Handle *handle,
614 const struct GNUNET_PeerIdentity *peer, const struct ATS_Address *addr) 626 const struct GNUNET_PeerIdentity *peer,
627 const struct ATS_Address *addr)
615{ 628{
616 struct CompareAddressContext cac; 629 struct CompareAddressContext cac;
617 630
@@ -643,29 +656,34 @@ find_equivalent_address (struct GAS_Addresses_Handle *handle,
643 656
644static struct ATS_Address * 657static struct ATS_Address *
645find_exact_address (struct GAS_Addresses_Handle *handle, 658find_exact_address (struct GAS_Addresses_Handle *handle,
646 const struct GNUNET_PeerIdentity *peer, 659 const struct GNUNET_PeerIdentity *peer,
647 const char *plugin_name, 660 const char *plugin_name,
648 const void *plugin_addr, 661 const void *plugin_addr,
649 size_t plugin_addr_len, 662 size_t plugin_addr_len,
650 uint32_t local_address_info, 663 uint32_t local_address_info,
651 uint32_t session_id) 664 uint32_t session_id)
652{ 665{
653 struct ATS_Address *aa; 666 struct ATS_Address *aa;
654 struct ATS_Address *ea; 667 struct ATS_Address *ea;
655 668
656 aa = create_address (peer, plugin_name, plugin_addr, plugin_addr_len, 669 aa = create_address (peer,
657 local_address_info, session_id); 670 plugin_name,
671 plugin_addr,
672 plugin_addr_len,
673 local_address_info,
674 session_id);
658 675
659 /* Get existing address or address with session == 0 */ 676 /* Get existing address or address with session == 0 */
660 ea = find_equivalent_address (handle, peer, aa); 677 ea = find_equivalent_address (handle, peer, aa);
661 free_address (aa); 678 free_address (aa);
662 if (ea == NULL ) 679 if (ea == NULL)
663 return NULL ; 680 return NULL;
664 else if (ea->session_id != session_id) 681 else if (ea->session_id != session_id)
665 return NULL ; 682 return NULL;
666 return ea; 683 return ea;
667} 684}
668 685
686
669/** 687/**
670 * Function allowing the solver to obtain normalized preference 688 * Function allowing the solver to obtain normalized preference
671 * values from solver 689 * values from solver
@@ -675,11 +693,13 @@ find_exact_address (struct GAS_Addresses_Handle *handle,
675 * @return array of double values with |GNUNET_ATS_PreferenceCount| elements 693 * @return array of double values with |GNUNET_ATS_PreferenceCount| elements
676 */ 694 */
677const double * 695const double *
678get_preferences_cb (void *cls, const struct GNUNET_PeerIdentity *id) 696get_preferences_cb (void *cls,
697 const struct GNUNET_PeerIdentity *id)
679{ 698{
680 return GAS_normalization_get_preferences_by_peer (id); 699 return GAS_normalization_get_preferences_by_peer (id);
681} 700}
682 701
702
683/** 703/**
684 * Function allowing the solver to obtain normalized property 704 * Function allowing the solver to obtain normalized property
685 * values for an address from solver 705 * values for an address from solver
@@ -694,6 +714,7 @@ get_property_cb (void *cls, const struct ATS_Address *address)
694 return GAS_normalization_get_properties ((struct ATS_Address *) address); 714 return GAS_normalization_get_properties ((struct ATS_Address *) address);
695} 715}
696 716
717
697/** 718/**
698 * Extract an ATS performance info from an address 719 * Extract an ATS performance info from an address
699 * 720 *
@@ -718,6 +739,7 @@ get_performance_info (struct ATS_Address *address, uint32_t type)
718 return GNUNET_ATS_VALUE_UNDEFINED; 739 return GNUNET_ATS_VALUE_UNDEFINED;
719} 740}
720 741
742
721/** 743/**
722 * Add a new address for a peer. 744 * Add a new address for a peer.
723 * 745 *
@@ -725,22 +747,22 @@ get_performance_info (struct ATS_Address *address, uint32_t type)
725 * @param peer peer 747 * @param peer peer
726 * @param plugin_name transport plugin name 748 * @param plugin_name transport plugin name
727 * @param plugin_addr plugin address 749 * @param plugin_addr plugin address
728 * @param plugin_addr_len length of the plugin address 750 * @param plugin_addr_len length of the plugin address in @a plugin_addr
729 * @param local_address_info the local address for the address 751 * @param local_address_info the local address for the address
730 * @param session_id session id, can be 0 752 * @param session_id session id, can be 0
731 * @param atsi performance information for this address 753 * @param atsi performance information for this address
732 * @param atsi_count number of performance information contained 754 * @param atsi_count number of performance information contained in @a atsi
733 */ 755 */
734void 756void
735GAS_addresses_add (struct GAS_Addresses_Handle *handle, 757GAS_addresses_add (struct GAS_Addresses_Handle *handle,
736 const struct GNUNET_PeerIdentity *peer, 758 const struct GNUNET_PeerIdentity *peer,
737 const char *plugin_name, 759 const char *plugin_name,
738 const void *plugin_addr, 760 const void *plugin_addr,
739 size_t plugin_addr_len, 761 size_t plugin_addr_len,
740 uint32_t local_address_info, 762 uint32_t local_address_info,
741 uint32_t session_id, 763 uint32_t session_id,
742 const struct GNUNET_ATS_Information *atsi, 764 const struct GNUNET_ATS_Information *atsi,
743 uint32_t atsi_count) 765 uint32_t atsi_count)
744{ 766{
745 struct ATS_Address *new_address; 767 struct ATS_Address *new_address;
746 struct ATS_Address *existing_address; 768 struct ATS_Address *existing_address;
@@ -750,16 +772,19 @@ GAS_addresses_add (struct GAS_Addresses_Handle *handle,
750 uint32_t previous_session; 772 uint32_t previous_session;
751 int c1; 773 int c1;
752 774
753 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Received `%s' for peer `%s'\n", 775 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
754 "ADDRESS ADD", GNUNET_i2s (peer)); 776 "Received `%s' for peer `%s'\n",
777 "ADDRESS ADD",
778 GNUNET_i2s (peer));
755 779
756 if (GNUNET_NO == handle->running) 780 if (GNUNET_NO == handle->running)
757 return; 781 return;
758 782
759 GNUNET_assert(NULL != handle->addresses); 783 GNUNET_assert(NULL != handle->addresses);
760 784
761 new_address = create_address (peer, plugin_name, plugin_addr, plugin_addr_len, 785 new_address = create_address (peer, plugin_name,
762 local_address_info, session_id); 786 plugin_addr, plugin_addr_len,
787 local_address_info, session_id);
763 atsi_delta = NULL; 788 atsi_delta = NULL;
764 disassemble_ats_information (new_address, atsi, atsi_count, &atsi_delta, 789 disassemble_ats_information (new_address, atsi, atsi_count, &atsi_delta,
765 &atsi_delta_count); 790 &atsi_delta_count);
@@ -775,11 +800,11 @@ GAS_addresses_add (struct GAS_Addresses_Handle *handle,
775 /* Add a new address */ 800 /* Add a new address */
776 new_address->t_added = GNUNET_TIME_absolute_get(); 801 new_address->t_added = GNUNET_TIME_absolute_get();
777 new_address->t_last_activity = GNUNET_TIME_absolute_get(); 802 new_address->t_last_activity = GNUNET_TIME_absolute_get();
778 GNUNET_assert( 803 GNUNET_assert(GNUNET_OK ==
779 GNUNET_OK == GNUNET_CONTAINER_multipeermap_put (handle->addresses, 804 GNUNET_CONTAINER_multipeermap_put (handle->addresses,
780 peer, 805 peer,
781 new_address, 806 new_address,
782 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE)); 807 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE));
783 808
784 GNUNET_STATISTICS_set (handle->stat, 809 GNUNET_STATISTICS_set (handle->stat,
785 "# addresses", 810 "# addresses",
@@ -899,6 +924,7 @@ GAS_addresses_add (struct GAS_Addresses_Handle *handle,
899 session_id, GNUNET_ATS_print_network_type (addr_net)); 924 session_id, GNUNET_ATS_print_network_type (addr_net));
900} 925}
901 926
927
902/** 928/**
903 * Update an address with a session or performance information for a peer. 929 * Update an address with a session or performance information for a peer.
904 * 930 *
@@ -913,7 +939,7 @@ GAS_addresses_add (struct GAS_Addresses_Handle *handle,
913 * @param local_address_info the local address for the address 939 * @param local_address_info the local address for the address
914 * @param session_id session id, can be 0 940 * @param session_id session id, can be 0
915 * @param atsi performance information for this address 941 * @param atsi performance information for this address
916 * @param atsi_count number of performance information contained 942 * @param atsi_count number of performance information contained in @a atsi
917 */ 943 */
918void 944void
919GAS_addresses_update (struct GAS_Addresses_Handle *handle, 945GAS_addresses_update (struct GAS_Addresses_Handle *handle,
@@ -1049,10 +1075,11 @@ destroy_by_session_id (void *cls,
1049 const struct ATS_Address *des = dc->aa; 1075 const struct ATS_Address *des = dc->aa;
1050 struct ATS_Address *aa = value; 1076 struct ATS_Address *aa = value;
1051 1077
1052 GNUNET_assert( 1078 GNUNET_assert(0 ==
1053 0 == memcmp (&aa->peer, &des->peer, sizeof(struct GNUNET_PeerIdentity))); 1079 memcmp (&aa->peer,
1054 1080 &des->peer,
1055 if (des->session_id == 0) 1081 sizeof (struct GNUNET_PeerIdentity)));
1082 if (0 == des->session_id)
1056 { 1083 {
1057 /* Session == 0, remove full address */ 1084 /* Session == 0, remove full address */
1058 if ((0 == strcmp (des->plugin, aa->plugin)) 1085 if ((0 == strcmp (des->plugin, aa->plugin))
@@ -1065,13 +1092,20 @@ destroy_by_session_id (void *cls,
1065 GNUNET_i2s (&aa->peer), 1092 GNUNET_i2s (&aa->peer),
1066 aa->session_id, 1093 aa->session_id,
1067 aa); 1094 aa);
1068
1069 /* Notify solver about deletion */ 1095 /* Notify solver about deletion */
1070 GNUNET_assert (GNUNET_YES == 1096 GNUNET_assert (GNUNET_YES ==
1071 GNUNET_CONTAINER_multipeermap_remove (handle->addresses, 1097 GNUNET_CONTAINER_multipeermap_remove (handle->addresses,
1072 &aa->peer, 1098 &aa->peer,
1073 aa)); 1099 aa));
1074 handle->env.sf.s_del (handle->solver, aa, GNUNET_NO); 1100 handle->env.sf.s_del (handle->solver, aa, GNUNET_NO);
1101 GAS_performance_notify_all_clients (&aa->peer,
1102 aa->plugin,
1103 aa->addr,
1104 aa->addr_len,
1105 GNUNET_SYSERR,
1106 NULL, 0,
1107 zero_bw,
1108 zero_bw);
1075 free_address (aa); 1109 free_address (aa);
1076 dc->result = GNUNET_NO; 1110 dc->result = GNUNET_NO;
1077 return GNUNET_OK; /* Continue iteration */ 1111 return GNUNET_OK; /* Continue iteration */
@@ -1107,6 +1141,14 @@ destroy_by_session_id (void *cls,
1107 GNUNET_CONTAINER_multipeermap_remove (handle->addresses, 1141 GNUNET_CONTAINER_multipeermap_remove (handle->addresses,
1108 &aa->peer, aa)); 1142 &aa->peer, aa));
1109 handle->env.sf.s_del (handle->solver, aa, GNUNET_NO); 1143 handle->env.sf.s_del (handle->solver, aa, GNUNET_NO);
1144 GAS_performance_notify_all_clients (&aa->peer,
1145 aa->plugin,
1146 aa->addr,
1147 aa->addr_len,
1148 GNUNET_SYSERR,
1149 NULL, 0,
1150 zero_bw,
1151 zero_bw);
1110 free_address (aa); 1152 free_address (aa);
1111 dc->result = GNUNET_NO; 1153 dc->result = GNUNET_NO;
1112 return GNUNET_OK; /* Continue iteration */ 1154 return GNUNET_OK; /* Continue iteration */
@@ -1114,14 +1156,22 @@ destroy_by_session_id (void *cls,
1114 else 1156 else
1115 { 1157 {
1116 /* Session died */ 1158 /* Session died */
1117 GNUNET_log(GNUNET_ERROR_TYPE_INFO, 1159 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
1118 "Deleting session for peer `%s': `%s' %u\n", 1160 "Deleting session for peer `%s': `%s' %u\n",
1119 GNUNET_i2s (&aa->peer), 1161 GNUNET_i2s (&aa->peer),
1120 aa->plugin, aa->session_id); 1162 aa->plugin, aa->session_id);
1121 /* Notify solver to delete session */ 1163 /* Notify solver to delete session */
1122 handle->env.sf.s_del (handle->solver, aa, GNUNET_YES); 1164 handle->env.sf.s_del (handle->solver, aa, GNUNET_YES);
1123 aa->session_id = 0; 1165 aa->session_id = 0;
1124 aa->active = GNUNET_NO; 1166 aa->active = GNUNET_NO;
1167 GAS_performance_notify_all_clients (&aa->peer,
1168 aa->plugin,
1169 aa->addr,
1170 aa->addr_len,
1171 GNUNET_NO,
1172 NULL, 0,
1173 zero_bw,
1174 zero_bw);
1125 return GNUNET_OK; 1175 return GNUNET_OK;
1126 } 1176 }
1127 } 1177 }
@@ -1136,7 +1186,7 @@ destroy_by_session_id (void *cls,
1136 * @param peer peer 1186 * @param peer peer
1137 * @param plugin_name transport plugin name 1187 * @param plugin_name transport plugin name
1138 * @param plugin_addr plugin address 1188 * @param plugin_addr plugin address
1139 * @param plugin_addr_len length of the plugin address 1189 * @param plugin_addr_len length of the plugin address in @a plugin_addr
1140 * @param local_address_info the local address for the address 1190 * @param local_address_info the local address for the address
1141 * @param session_id session id, can be 0 1191 * @param session_id session id, can be 0
1142 */ 1192 */
@@ -1156,11 +1206,16 @@ GAS_addresses_destroy (struct GAS_Addresses_Handle *handle,
1156 return; 1206 return;
1157 1207
1158 /* Get existing address */ 1208 /* Get existing address */
1159 ea = find_exact_address (handle, peer, plugin_name, plugin_addr, 1209 ea = find_exact_address (handle,
1160 plugin_addr_len, local_address_info, session_id); 1210 peer,
1161 if (ea == NULL ) 1211 plugin_name,
1212 plugin_addr,
1213 plugin_addr_len,
1214 local_address_info,
1215 session_id);
1216 if (NULL == ea)
1162 { 1217 {
1163 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, 1218 GNUNET_log(GNUNET_ERROR_TYPE_INFO,
1164 "Tried to destroy unknown address for peer `%s' `%s' session id %u\n", 1219 "Tried to destroy unknown address for peer `%s' `%s' session id %u\n",
1165 GNUNET_i2s (peer), 1220 GNUNET_i2s (peer),
1166 plugin_name, 1221 plugin_name,
@@ -1168,13 +1223,12 @@ GAS_addresses_destroy (struct GAS_Addresses_Handle *handle,
1168 return; 1223 return;
1169 } 1224 }
1170 1225
1171 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, 1226 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
1172 "Received `%s' for peer `%s' address %p session %u\n", "ADDRESS DESTROY", 1227 "Received `%s' for peer `%s' address %p session %u\n", "ADDRESS DESTROY",
1173 GNUNET_i2s (peer), 1228 GNUNET_i2s (peer),
1174 ea, 1229 ea,
1175 session_id); 1230 session_id);
1176 1231 GNUNET_break (0 < strlen (plugin_name));
1177 GNUNET_break(0 < strlen (plugin_name));
1178 dc.handle = handle; 1232 dc.handle = handle;
1179 dc.aa = create_address (peer, 1233 dc.aa = create_address (peer,
1180 plugin_name, 1234 plugin_name,
@@ -2037,8 +2091,15 @@ destroy_all_address_it (void *cls,
2037 /* Notify */ 2091 /* Notify */
2038 handle->env.sf.s_del (handle->solver, aa, GNUNET_NO); 2092 handle->env.sf.s_del (handle->solver, aa, GNUNET_NO);
2039 /* Destroy */ 2093 /* Destroy */
2094 GAS_performance_notify_all_clients (&aa->peer,
2095 aa->plugin,
2096 aa->addr,
2097 aa->addr_len,
2098 GNUNET_NO,
2099 NULL, 0,
2100 zero_bw,
2101 zero_bw);
2040 free_address (aa); 2102 free_address (aa);
2041
2042 return GNUNET_OK; 2103 return GNUNET_OK;
2043} 2104}
2044 2105
@@ -2054,9 +2115,10 @@ GAS_addresses_destroy_all (struct GAS_Addresses_Handle *handle)
2054 if (GNUNET_NO == handle->running) 2115 if (GNUNET_NO == handle->running)
2055 return; 2116 return;
2056 2117
2057 GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Destroying all addresses\n"); 2118 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
2119 "Destroying all addresses\n");
2058 handle->env.sf.s_bulk_start (handle->solver); 2120 handle->env.sf.s_bulk_start (handle->solver);
2059 if (handle->addresses != NULL ) 2121 if (NULL != handle->addresses)
2060 GNUNET_CONTAINER_multipeermap_iterate (handle->addresses, 2122 GNUNET_CONTAINER_multipeermap_iterate (handle->addresses,
2061 &destroy_all_address_it, 2123 &destroy_all_address_it,
2062 handle); 2124 handle);
@@ -2219,24 +2281,25 @@ GAS_addresses_get_peer_info (struct GAS_Addresses_Handle *handle,
2219 void *pi_it_cls) 2281 void *pi_it_cls)
2220{ 2282{
2221 struct PeerInfoIteratorContext pi_ctx; 2283 struct PeerInfoIteratorContext pi_ctx;
2222 struct GNUNET_BANDWIDTH_Value32NBO zero_bw;
2223 2284
2224 GNUNET_assert(NULL != peer); 2285 GNUNET_assert(NULL != peer);
2225 GNUNET_assert(NULL != handle->addresses); 2286 GNUNET_assert(NULL != handle->addresses);
2226 if (NULL == pi_it) 2287 if (NULL == pi_it)
2227 return; /* does not make sense without callback */ 2288 return; /* does not make sense without callback */
2228 2289
2229 zero_bw = GNUNET_BANDWIDTH_value_init (0);
2230 pi_ctx.it = pi_it; 2290 pi_ctx.it = pi_it;
2231 pi_ctx.it_cls = pi_it_cls; 2291 pi_ctx.it_cls = pi_it_cls;
2232
2233 GNUNET_CONTAINER_multipeermap_get_multiple (handle->addresses, 2292 GNUNET_CONTAINER_multipeermap_get_multiple (handle->addresses,
2234 peer, 2293 peer,
2235 &peerinfo_it, &pi_ctx); 2294 &peerinfo_it, &pi_ctx);
2236 2295
2237 if (NULL != pi_it) 2296 if (NULL != pi_it)
2238 pi_it (pi_it_cls, NULL, NULL, NULL, 0, GNUNET_NO, NULL, 0, zero_bw, 2297 pi_it (pi_it_cls,
2239 zero_bw); 2298 NULL, NULL, NULL, 0,
2299 GNUNET_NO,
2300 NULL, 0,
2301 zero_bw,
2302 zero_bw);
2240 2303
2241} 2304}
2242 2305