aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Wachs <wachs@net.in.tum.de>2011-10-14 11:07:15 +0000
committerMatthias Wachs <wachs@net.in.tum.de>2011-10-14 11:07:15 +0000
commit7e28666043970cb1489cca22d21397e45af946ac (patch)
treef0a81c3295c42a393f145b5b62561e9b31ac4a49
parentfd5dc253ee8bb65127fd4180b0458b952ad6f877 (diff)
downloadgnunet-7e28666043970cb1489cca22d21397e45af946ac.tar.gz
gnunet-7e28666043970cb1489cca22d21397e45af946ac.zip
-rw-r--r--src/ats/gnunet-service-ats_addresses.c105
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
84struct ATS_Address *
85find_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
100static void
101merge_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
79void 118void
80GAS_address_update (const struct GNUNET_PeerIdentity *peer, 119GAS_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
131void 200void
132GAS_addresses_request_address (const struct GNUNET_PeerIdentity *peer) 201GAS_addresses_request_address (const struct GNUNET_PeerIdentity *peer)
133{ 202{
203
204
134} 205}
135 206
136 207