diff options
author | Matthias Wachs <wachs@net.in.tum.de> | 2011-10-14 11:07:15 +0000 |
---|---|---|
committer | Matthias Wachs <wachs@net.in.tum.de> | 2011-10-14 11:07:15 +0000 |
commit | 7e28666043970cb1489cca22d21397e45af946ac (patch) | |
tree | f0a81c3295c42a393f145b5b62561e9b31ac4a49 | |
parent | fd5dc253ee8bb65127fd4180b0458b952ad6f877 (diff) | |
download | gnunet-7e28666043970cb1489cca22d21397e45af946ac.tar.gz gnunet-7e28666043970cb1489cca22d21397e45af946ac.zip |
-rw-r--r-- | src/ats/gnunet-service-ats_addresses.c | 105 |
1 files changed, 88 insertions, 17 deletions
diff --git a/src/ats/gnunet-service-ats_addresses.c b/src/ats/gnunet-service-ats_addresses.c index 5ba430a76..e7da7dca3 100644 --- a/src/ats/gnunet-service-ats_addresses.c +++ b/src/ats/gnunet-service-ats_addresses.c | |||
@@ -65,6 +65,12 @@ compare_address_it (void *cls, | |||
65 | { | 65 | { |
66 | struct CompareAddressContext * cac = cls; | 66 | struct CompareAddressContext * cac = cls; |
67 | struct ATS_Address * aa = (struct ATS_Address *) value; | 67 | struct ATS_Address * aa = (struct ATS_Address *) value; |
68 | |||
69 | /* compare sessions */ | ||
70 | if ((aa->session_client != cac->search->session_client) || | ||
71 | (aa->session_id != cac->search->session_id)) | ||
72 | return GNUNET_YES; | ||
73 | |||
68 | if (0 == strcmp(aa->plugin, cac->search->plugin)) | 74 | if (0 == strcmp(aa->plugin, cac->search->plugin)) |
69 | { | 75 | { |
70 | if ((aa->addr_len == cac->search->addr_len) && | 76 | if ((aa->addr_len == cac->search->addr_len) && |
@@ -75,6 +81,39 @@ compare_address_it (void *cls, | |||
75 | return GNUNET_YES; | 81 | return GNUNET_YES; |
76 | } | 82 | } |
77 | 83 | ||
84 | struct ATS_Address * | ||
85 | find_address (const struct GNUNET_PeerIdentity *peer, | ||
86 | struct ATS_Address * addr) | ||
87 | { | ||
88 | struct CompareAddressContext cac; | ||
89 | cac.result = NULL; | ||
90 | cac.search = addr; | ||
91 | |||
92 | GNUNET_CONTAINER_multihashmap_get_multiple(addresses, | ||
93 | &peer->hashPubKey, | ||
94 | compare_address_it, | ||
95 | &cac); | ||
96 | |||
97 | return cac.result; | ||
98 | } | ||
99 | |||
100 | static void | ||
101 | merge_ats (struct ATS_Address * dest, struct ATS_Address * source) | ||
102 | { | ||
103 | int c_src = 0; | ||
104 | int c_dest = 0; | ||
105 | struct GNUNET_TRANSPORT_ATS_Information * a_src = source->ats; | ||
106 | struct GNUNET_TRANSPORT_ATS_Information * a_dest = dest->ats; | ||
107 | |||
108 | for (c_dest = 0; c_dest < dest->ats_count; c_dest ++) | ||
109 | { | ||
110 | for (c_src = 0; c_src < source->ats_count; c_src ++) | ||
111 | { | ||
112 | if (a_src[c_src].type == a_dest[c_dest].type) | ||
113 | a_src[c_src].value = a_dest[c_dest].value; | ||
114 | } | ||
115 | } | ||
116 | } | ||
78 | 117 | ||
79 | void | 118 | void |
80 | GAS_address_update (const struct GNUNET_PeerIdentity *peer, | 119 | GAS_address_update (const struct GNUNET_PeerIdentity *peer, |
@@ -86,26 +125,43 @@ GAS_address_update (const struct GNUNET_PeerIdentity *peer, | |||
86 | uint32_t atsi_count) | 125 | uint32_t atsi_count) |
87 | { | 126 | { |
88 | struct ATS_Address * aa; | 127 | struct ATS_Address * aa; |
128 | struct ATS_Address * old; | ||
89 | 129 | ||
90 | /* FIXME: should test first if address already exists! */ | ||
91 | aa = GNUNET_malloc (sizeof (struct ATS_Address) + | 130 | aa = GNUNET_malloc (sizeof (struct ATS_Address) + |
92 | atsi_count * sizeof (struct GNUNET_TRANSPORT_ATS_Information) + | 131 | atsi_count * sizeof (struct GNUNET_TRANSPORT_ATS_Information) + |
93 | plugin_addr_len); | 132 | plugin_addr_len); |
94 | aa->peer = *peer; | 133 | aa->peer = *peer; |
95 | aa->addr_len = plugin_addr_len; | 134 | aa->addr_len = plugin_addr_len; |
96 | aa->ats_count = atsi_count; | 135 | aa->ats_count = atsi_count; |
97 | aa->ats = (struct GNUNET_TRANSPORT_ATS_Information *) &aa[1]; | 136 | aa->ats = (struct GNUNET_TRANSPORT_ATS_Information *) &aa[1]; |
98 | memcpy (&aa->ats, atsi, atsi_count * sizeof (struct GNUNET_TRANSPORT_ATS_Information)); | 137 | memcpy (&aa->ats, atsi, atsi_count * sizeof (struct GNUNET_TRANSPORT_ATS_Information)); |
99 | memcpy (aa->addr, plugin_addr, plugin_addr_len); | 138 | aa->addr = &aa->ats[atsi_count]; |
139 | memcpy (&aa->addr, plugin_addr, plugin_addr_len); | ||
100 | aa->plugin = GNUNET_strdup (plugin_name); | 140 | aa->plugin = GNUNET_strdup (plugin_name); |
101 | aa->session_client = session_client; | 141 | aa->session_client = session_client; |
102 | aa->session_id = session_id; | 142 | aa->session_id = session_id; |
103 | 143 | ||
104 | GNUNET_assert (GNUNET_OK == | 144 | old = find_address (peer, aa); |
105 | GNUNET_CONTAINER_multihashmap_put(addresses, | 145 | if (old == NULL) |
106 | &peer->hashPubKey, | 146 | { |
107 | aa, | 147 | GNUNET_assert (GNUNET_OK == |
108 | GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE)); | 148 | GNUNET_CONTAINER_multihashmap_put(addresses, |
149 | &peer->hashPubKey, | ||
150 | aa, | ||
151 | GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE)); | ||
152 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | ||
153 | "Added new address for peer `%s' \n", | ||
154 | GNUNET_i2s (peer)); | ||
155 | } | ||
156 | else | ||
157 | { | ||
158 | merge_ats (old, aa); | ||
159 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | ||
160 | "Updated existing address for peer `%s' \n", | ||
161 | GNUNET_i2s (peer)); | ||
162 | GNUNET_free (aa); | ||
163 | } | ||
164 | |||
109 | } | 165 | } |
110 | 166 | ||
111 | 167 | ||
@@ -116,21 +172,36 @@ GAS_address_destroyed (const struct GNUNET_PeerIdentity *peer, | |||
116 | struct GNUNET_SERVER_Client *session_client, | 172 | struct GNUNET_SERVER_Client *session_client, |
117 | uint32_t session_id) | 173 | uint32_t session_id) |
118 | { | 174 | { |
119 | #if 0 | ||
120 | struct ATS_Address * aa; | ||
121 | 175 | ||
122 | aa = find_address (peer, plugin_name, plugin_addr, plugin_addr_len, | 176 | struct ATS_Address *aa; |
123 | session_client, session_id); | 177 | struct ATS_Address *res; |
178 | |||
179 | aa = GNUNET_malloc (sizeof (struct ATS_Address) + | ||
180 | plugin_addr_len); | ||
181 | |||
182 | aa->peer = *peer; | ||
183 | aa->addr_len = plugin_addr_len; | ||
184 | aa->addr = &aa[1]; | ||
185 | memcpy (aa->addr, plugin_addr, plugin_addr_len); | ||
186 | aa->plugin = GNUNET_strdup (plugin_name); | ||
187 | aa->session_client = session_client; | ||
188 | aa->session_id = session_id; | ||
189 | |||
190 | res = find_address (peer, aa); | ||
191 | |||
124 | GNUNET_break (GNUNET_YES == | 192 | GNUNET_break (GNUNET_YES == |
125 | GNUNET_CONTAINER_multihashmap_remove(addresses, &peer->hashPubKey, aa)); | 193 | GNUNET_CONTAINER_multihashmap_remove(addresses, &peer->hashPubKey, res)); |
126 | GNUNET_free (aa); | 194 | GNUNET_free (res->plugin); |
127 | #endif | 195 | GNUNET_free (res); |
196 | |||
128 | } | 197 | } |
129 | 198 | ||
130 | 199 | ||
131 | void | 200 | void |
132 | GAS_addresses_request_address (const struct GNUNET_PeerIdentity *peer) | 201 | GAS_addresses_request_address (const struct GNUNET_PeerIdentity *peer) |
133 | { | 202 | { |
203 | |||
204 | |||
134 | } | 205 | } |
135 | 206 | ||
136 | 207 | ||