gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r17492 - gnunet/src/ats


From: gnunet
Subject: [GNUnet-SVN] r17492 - gnunet/src/ats
Date: Fri, 14 Oct 2011 13:07:15 +0200

Author: wachs
Date: 2011-10-14 13:07:15 +0200 (Fri, 14 Oct 2011)
New Revision: 17492

Modified:
   gnunet/src/ats/gnunet-service-ats_addresses.c
Log:


Modified: gnunet/src/ats/gnunet-service-ats_addresses.c
===================================================================
--- gnunet/src/ats/gnunet-service-ats_addresses.c       2011-10-14 09:54:04 UTC 
(rev 17491)
+++ gnunet/src/ats/gnunet-service-ats_addresses.c       2011-10-14 11:07:15 UTC 
(rev 17492)
@@ -65,6 +65,12 @@
 {
   struct CompareAddressContext * cac = cls;
   struct ATS_Address * aa = (struct ATS_Address *) value;
+
+  /* compare sessions */
+  if ((aa->session_client != cac->search->session_client) ||
+      (aa->session_id != cac->search->session_id))
+    return GNUNET_YES;
+
   if (0 == strcmp(aa->plugin, cac->search->plugin))
   {
     if ((aa->addr_len == cac->search->addr_len) &&
@@ -75,7 +81,40 @@
   return GNUNET_YES;
 }
 
+struct ATS_Address *
+find_address (const struct GNUNET_PeerIdentity *peer,
+              struct ATS_Address * addr)
+{
+  struct CompareAddressContext cac;
+  cac.result = NULL;
+  cac.search = addr;
 
+  GNUNET_CONTAINER_multihashmap_get_multiple(addresses,
+         &peer->hashPubKey,
+         compare_address_it,
+         &cac);
+
+  return cac.result;
+}
+
+static void
+merge_ats (struct ATS_Address * dest, struct ATS_Address * source)
+{
+  int c_src = 0;
+  int c_dest = 0;
+  struct GNUNET_TRANSPORT_ATS_Information * a_src = source->ats;
+  struct GNUNET_TRANSPORT_ATS_Information * a_dest = dest->ats;
+
+  for (c_dest = 0; c_dest < dest->ats_count; c_dest ++)
+  {
+    for (c_src = 0; c_src < source->ats_count; c_src ++)
+    {
+      if (a_src[c_src].type == a_dest[c_dest].type)
+        a_src[c_src].value = a_dest[c_dest].value;
+    }
+  }
+}
+
 void
 GAS_address_update (const struct GNUNET_PeerIdentity *peer,
                    const char *plugin_name,
@@ -86,26 +125,43 @@
                    uint32_t atsi_count)
 {
   struct ATS_Address * aa;
+  struct ATS_Address * old;
 
-  /* FIXME: should test first if address already exists! */
   aa = GNUNET_malloc (sizeof (struct ATS_Address) +
-                     atsi_count * sizeof (struct 
GNUNET_TRANSPORT_ATS_Information) +
-                     plugin_addr_len);
+                    atsi_count * sizeof (struct 
GNUNET_TRANSPORT_ATS_Information) +
+                    plugin_addr_len);
   aa->peer = *peer;
   aa->addr_len = plugin_addr_len;
   aa->ats_count = atsi_count;
-  aa->ats = (struct GNUNET_TRANSPORT_ATS_Information *) &aa[1];  
+  aa->ats = (struct GNUNET_TRANSPORT_ATS_Information *) &aa[1];
   memcpy (&aa->ats, atsi, atsi_count * sizeof (struct 
GNUNET_TRANSPORT_ATS_Information));
-  memcpy (aa->addr, plugin_addr, plugin_addr_len);
+  aa->addr = &aa->ats[atsi_count];
+  memcpy (&aa->addr, plugin_addr, plugin_addr_len);
   aa->plugin = GNUNET_strdup (plugin_name);
   aa->session_client = session_client;
   aa->session_id = session_id;
 
-  GNUNET_assert (GNUNET_OK == 
-                GNUNET_CONTAINER_multihashmap_put(addresses, 
-                                                  &peer->hashPubKey, 
-                                                  aa, 
-                                                  
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE));
+  old = find_address (peer, aa);
+  if (old == NULL)
+  {
+    GNUNET_assert (GNUNET_OK ==
+                   GNUNET_CONTAINER_multihashmap_put(addresses,
+                                                     &peer->hashPubKey,
+                                                     aa,
+                                                     
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE));
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+      "Added new address for peer `%s' \n",
+      GNUNET_i2s (peer));
+  }
+  else
+  {
+    merge_ats (old, aa);
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+      "Updated existing address for peer `%s' \n",
+      GNUNET_i2s (peer));
+    GNUNET_free (aa);
+  }
+
 }
 
 
@@ -116,21 +172,36 @@
                       struct GNUNET_SERVER_Client *session_client,
                       uint32_t session_id)
 {
-#if 0
-  struct ATS_Address * aa;
 
-  aa = find_address (peer, plugin_name, plugin_addr, plugin_addr_len, 
-                    session_client, session_id);
+  struct ATS_Address *aa;
+  struct ATS_Address *res;
+
+  aa = GNUNET_malloc (sizeof (struct ATS_Address) +
+                    plugin_addr_len);
+
+  aa->peer = *peer;
+  aa->addr_len = plugin_addr_len;
+  aa->addr = &aa[1];
+  memcpy (aa->addr, plugin_addr, plugin_addr_len);
+  aa->plugin = GNUNET_strdup (plugin_name);
+  aa->session_client = session_client;
+  aa->session_id = session_id;
+
+  res = find_address (peer, aa);
+
   GNUNET_break (GNUNET_YES ==
-               GNUNET_CONTAINER_multihashmap_remove(addresses, 
&peer->hashPubKey, aa));
-  GNUNET_free (aa);
-#endif
+               GNUNET_CONTAINER_multihashmap_remove(addresses, 
&peer->hashPubKey, res));
+  GNUNET_free (res->plugin);
+  GNUNET_free (res);
+
 }
 
 
 void
 GAS_addresses_request_address (const struct GNUNET_PeerIdentity *peer)
 {
+
+
 }
 
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]