diff options
author | Christian Grothoff <christian@grothoff.org> | 2015-01-22 21:32:12 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2015-01-22 21:32:12 +0000 |
commit | 2a51624aec1b1a5bc464853c5446f628fa3b99f0 (patch) | |
tree | c14871c53cd71245fa473b729aa9fec0d66fd788 /src/ats/gnunet-service-ats_addresses.c | |
parent | 750da2796162b92c533f9666104c47407ed09e46 (diff) | |
download | gnunet-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.c | 112 |
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 | */ | ||
1045 | struct 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 | */ | ||
1073 | static int | ||
1074 | destroy_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 | */ |
1127 | void | 1049 | void |
1128 | GAS_addresses_destroy (struct GAS_Addresses_Handle *handle, | 1050 | GAS_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 | ||