aboutsummaryrefslogtreecommitdiff
path: root/src/ats/gnunet-service-ats_addresses.c
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2015-01-22 21:32:12 +0000
committerChristian Grothoff <christian@grothoff.org>2015-01-22 21:32:12 +0000
commit2a51624aec1b1a5bc464853c5446f628fa3b99f0 (patch)
treec14871c53cd71245fa473b729aa9fec0d66fd788 /src/ats/gnunet-service-ats_addresses.c
parent750da2796162b92c533f9666104c47407ed09e46 (diff)
downloadgnunet-2a51624aec1b1a5bc464853c5446f628fa3b99f0.tar.gz
gnunet-2a51624aec1b1a5bc464853c5446f628fa3b99f0.zip
simplifying IPC for address destruction
Diffstat (limited to 'src/ats/gnunet-service-ats_addresses.c')
-rw-r--r--src/ats/gnunet-service-ats_addresses.c112
1 files changed, 15 insertions, 97 deletions
diff --git a/src/ats/gnunet-service-ats_addresses.c b/src/ats/gnunet-service-ats_addresses.c
index ff7b2b024..21f6ac448 100644
--- a/src/ats/gnunet-service-ats_addresses.c
+++ b/src/ats/gnunet-service-ats_addresses.c
@@ -1040,101 +1040,18 @@ GAS_addresses_update (struct GAS_Addresses_Handle *handle,
1040 1040
1041 1041
1042/** 1042/**
1043 * Closure for #destroy_by_session_id().
1044 */
1045struct DestroyContext
1046{
1047 /**
1048 * FIXME.
1049 */
1050 struct ATS_Address *aa;
1051
1052 /**
1053 * FIXME.
1054 */
1055 struct GAS_Addresses_Handle *handle;
1056
1057 /**
1058 * #GNUNET_NO : full address
1059 * #GNUNET_YES : just session
1060 */
1061 int result;
1062};
1063
1064
1065/**
1066 * Delete an address.
1067 *
1068 * @param cls unused
1069 * @param key unused
1070 * @param value the `struct ATS_Address *`
1071 * @return #GNUNET_OK (continue to iterate)
1072 */
1073static int
1074destroy_by_session_id (void *cls,
1075 const struct GNUNET_PeerIdentity *key,
1076 void *value)
1077{
1078 struct DestroyContext *dc = cls;
1079 struct GAS_Addresses_Handle *handle = dc->handle;
1080 const struct ATS_Address *des = dc->aa;
1081 struct ATS_Address *aa = value;
1082
1083 GNUNET_assert (0 ==
1084 memcmp (&aa->peer,
1085 &des->peer,
1086 sizeof (struct GNUNET_PeerIdentity)));
1087 if ( (0 != strcmp (des->plugin, aa->plugin)) ||
1088 (aa->addr_len != des->addr_len) ||
1089 (0 != memcmp (des->addr, aa->addr, aa->addr_len)))
1090 return GNUNET_OK; /* wrong entry */
1091 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
1092 "Deleting full address for peer `%s' session %u %p\n",
1093 GNUNET_i2s (&aa->peer),
1094 aa->session_id,
1095 aa);
1096 /* Notify solver about deletion */
1097 GNUNET_assert (GNUNET_YES ==
1098 GNUNET_CONTAINER_multipeermap_remove (handle->addresses,
1099 &aa->peer,
1100 aa));
1101 handle->env.sf.s_del (handle->solver, aa, GNUNET_NO);
1102 GAS_performance_notify_all_clients (&aa->peer,
1103 aa->plugin,
1104 aa->addr,
1105 aa->addr_len,
1106 GNUNET_SYSERR,
1107 NULL, 0,
1108 zero_bw,
1109 zero_bw);
1110 free_address (aa);
1111 dc->result = GNUNET_NO;
1112 return GNUNET_OK; /* Continue iteration */
1113}
1114
1115
1116/**
1117 * Remove an address or just a session for a peer. 1043 * Remove an address or just a session for a peer.
1118 * 1044 *
1119 * @param handle the address handle to use 1045 * @param handle the address handle to use
1120 * @param peer peer 1046 * @param peer peer
1121 * @param plugin_name transport plugin name
1122 * @param plugin_addr plugin address
1123 * @param plugin_addr_len length of the plugin address in @a plugin_addr
1124 * @param local_address_info the local address for the address
1125 * @param session_id session id, can never be 0 1047 * @param session_id session id, can never be 0
1126 */ 1048 */
1127void 1049void
1128GAS_addresses_destroy (struct GAS_Addresses_Handle *handle, 1050GAS_addresses_destroy (struct GAS_Addresses_Handle *handle,
1129 const struct GNUNET_PeerIdentity *peer, 1051 const struct GNUNET_PeerIdentity *peer,
1130 const char *plugin_name,
1131 const void *plugin_addr,
1132 size_t plugin_addr_len,
1133 uint32_t local_address_info,
1134 uint32_t session_id) 1052 uint32_t session_id)
1135{ 1053{
1136 struct ATS_Address *ea; 1054 struct ATS_Address *ea;
1137 struct DestroyContext dc;
1138 1055
1139 if (GNUNET_NO == handle->running) 1056 if (GNUNET_NO == handle->running)
1140 return; 1057 return;
@@ -1147,9 +1064,8 @@ GAS_addresses_destroy (struct GAS_Addresses_Handle *handle,
1147 { 1064 {
1148 GNUNET_break (0); 1065 GNUNET_break (0);
1149 GNUNET_log (GNUNET_ERROR_TYPE_INFO, 1066 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
1150 "Tried to destroy unknown address for peer `%s' `%s' session id %u\n", 1067 "Tried to destroy unknown address for peer `%s' session id %u\n",
1151 GNUNET_i2s (peer), 1068 GNUNET_i2s (peer),
1152 plugin_name,
1153 session_id); 1069 session_id);
1154 return; 1070 return;
1155 } 1071 }
@@ -1160,22 +1076,24 @@ GAS_addresses_destroy (struct GAS_Addresses_Handle *handle,
1160 GNUNET_i2s (peer), 1076 GNUNET_i2s (peer),
1161 ea, 1077 ea,
1162 session_id); 1078 session_id);
1163 GNUNET_break (0 < strlen (plugin_name)); 1079 GNUNET_CONTAINER_multipeermap_remove (handle->addresses,
1164 dc.handle = handle; 1080 peer,
1165 dc.aa = create_address (peer, 1081 ea);
1166 plugin_name, 1082
1167 plugin_addr, 1083 handle->env.sf.s_del (handle->solver, ea, GNUNET_NO);
1168 plugin_addr_len, 1084 GAS_performance_notify_all_clients (peer,
1169 local_address_info, 1085 ea->plugin,
1170 session_id); 1086 ea->addr,
1171 GNUNET_CONTAINER_multipeermap_get_multiple (handle->addresses, 1087 ea->addr_len,
1172 peer, 1088 GNUNET_SYSERR,
1173 &destroy_by_session_id, &dc); 1089 NULL, 0,
1090 zero_bw,
1091 zero_bw);
1092 free_address (ea);
1174 GNUNET_STATISTICS_set (handle->stat, 1093 GNUNET_STATISTICS_set (handle->stat,
1175 "# addresses", 1094 "# addresses",
1176 GNUNET_CONTAINER_multipeermap_size (handle->addresses), 1095 GNUNET_CONTAINER_multipeermap_size (handle->addresses),
1177 GNUNET_NO); 1096 GNUNET_NO);
1178 free_address (dc.aa);
1179} 1097}
1180 1098
1181 1099