work on HELLO
authorChristian Grothoff <christian@grothoff.org>
Sat, 10 Apr 2010 21:05:27 +0000 (21:05 +0000)
committerChristian Grothoff <christian@grothoff.org>
Sat, 10 Apr 2010 21:05:27 +0000 (21:05 +0000)
AUTHORS
TODO
src/hello/hello.c
src/include/gnunet_hello_lib.h
src/peerinfo/gnunet-service-peerinfo.c

diff --git a/AUTHORS b/AUTHORS
index 6e30bb7a9fa66fa800bdd9139c658a21ef233c57..1e58d0b518ce806970c8a52930428476c48c5972 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -1,9 +1,10 @@
 Primary developers (0.9.x series):
 Christian Grothoff <christian@grothoff.org>
 Heikki Lindholm <holin@iki.fi>
-Nils Durner <durner@gnunet.org>
+Matthias Wachs <wachs@net.in.tum.de>
 Milan Bouchet-Valat <nalimilan@club.fr>
 Nathan Evans <evans@net.in.tum.de>
+Nils Durner <durner@gnunet.org>
 
 Code contributions also came from:
 Adam Warrington [ UPnP ]
@@ -76,8 +77,7 @@ new GNU in Net: Nicklas Larsson <whybill@gmail.com>
 
 Maintainers:
 FreeBSD         : Kirill Ponomarew <ponomarew@oberon.net>
-Debian GNU/Linux: Daniel Baumann <daniel.baumann@panthera-systems.net> and
-                  Arnaud Kyheng <Arnaud.Kyheng@free.fr>
+Debian GNU/Linux: Daniel Baumann <daniel.baumann@panthera-systems.net>
 OS X            : Jussi Eloranta <eloranta@cc.jyu.fi>
 
 
diff --git a/TODO b/TODO
index 83f25cf3a54f5294682f2c67705977b685cbf22b..868cc5b6221cf01a39de746b379d5d0294ed884a 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,5 +1,12 @@
 0.9.0pre0 [April]:
 * HOSTLIST: seems to have NO 'tcp' in it, so cannot have any addresses!? [CG]
+* FS-acceptance testing [CG]
+* Release checks:
+  - portability
+  - coverity
+  - clang
+  - cppcheck
+* ChangeLog update
 * WWW:
   - Get IPv6 hooked up [AK, after April 12th]
   - change DNS [CG, need DNS]
@@ -15,8 +22,6 @@
   - only connect() sockets that are ready (select()) [Nils]
     [On W32, we need to select after calling socket before
      doing connect etc.]
-* HELLO: [CG]
-  - need function to test "equivalency" of HELLOs (or integrate with "merge"?); use in PEERINFO
 * SETUP:
   - design & implement new setup tool
 * TBENCH: [MW]
index 4ddeebd037f3c7f78444391b5bf1c5f8ab1cc2ba..51575ebafdd8aa3b1f35d999c43393c2c59796bc 100644 (file)
@@ -510,6 +510,7 @@ GNUNET_HELLO_get_id (const struct GNUNET_HELLO_Message *hello,
   return GNUNET_OK;
 }
 
+
 /**
  * Get the header from a HELLO message, used so other code
  * can correctly send HELLO messages.
@@ -529,4 +530,125 @@ GNUNET_HELLO_get_header (struct GNUNET_HELLO_Message *hello)
   return &hello->header;
 }
 
+
+struct EqualsContext
+{
+  struct GNUNET_TIME_Absolute expiration_limit;
+
+  struct GNUNET_TIME_Absolute result;
+
+  const struct GNUNET_HELLO_Message *h2;
+  
+  const char *tname;
+  
+  const void *addr;
+  
+  struct GNUNET_TIME_Absolute expiration;
+
+  size_t addrlen;
+
+  int found;
+};
+
+
+static int
+find_other_matching (void *cls,
+                    const char *tname,
+                    struct GNUNET_TIME_Absolute expiration,
+                    const void *addr, size_t addrlen)
+{
+  struct EqualsContext *ec = cls;
+
+  if (expiration.value < ec->expiration_limit.value)
+    return GNUNET_YES;
+  if ( (addrlen == ec->addrlen) && 
+       (0 == strcmp (tname,
+                    ec->tname)) &&
+       (0 == memcmp (addr,
+                    ec->addr,
+                    addrlen)) )
+    {
+      ec->found = GNUNET_YES;
+      if (expiration.value < ec->expiration.value)
+       {
+         ec->result = GNUNET_TIME_absolute_min (expiration,
+                                                ec->result);
+       }
+      return GNUNET_SYSERR;
+    }
+  return GNUNET_YES;
+}
+
+
+static int
+find_matching (void *cls,
+               const char *tname,
+               struct GNUNET_TIME_Absolute expiration,
+               const void *addr, size_t addrlen)
+{
+  struct EqualsContext *ec = cls;
+
+  if (expiration.value < ec->expiration_limit.value)
+    return GNUNET_YES;
+  ec->tname = tname;
+  ec->expiration = expiration;
+  ec->addr = addr;
+  ec->addrlen = addrlen;
+  ec->found = GNUNET_NO;
+  GNUNET_HELLO_iterate_addresses (ec->h2,
+                                 GNUNET_NO,
+                                 &find_other_matching,
+                                 ec);
+  if (ec->found == GNUNET_NO)
+    {
+      ec->result = GNUNET_TIME_UNIT_ZERO_ABS;
+      return GNUNET_SYSERR;
+    }
+  return GNUNET_OK;
+}
+
+/**
+ * Test if two HELLO messages contain the same addresses.
+ * If they only differ in expiration time, the lowest
+ * expiration time larger than 'now' where they differ
+ * is returned.
+ *
+ * @param h1 first HELLO message
+ * @param h2 the second HELLO message
+ * @param now time to use for deciding which addresses have
+ *            expired and should not be considered at all
+ * @return absolute time zero if the two HELLOs are 
+ *         totally identical; smallest timestamp >= now if
+ *         they only differ in timestamps; 
+ *         forever if the some addresses with expirations >= now
+ *         do not match at all
+ */
+struct GNUNET_TIME_Absolute 
+GNUNET_HELLO_equals (const struct
+                    GNUNET_HELLO_Message *h1,
+                    const struct
+                    GNUNET_HELLO_Message *h2,
+                    struct GNUNET_TIME_Absolute now)
+{
+  struct EqualsContext ec;
+
+  ec.expiration_limit = now;
+  ec.result = GNUNET_TIME_UNIT_FOREVER_ABS;
+  ec.h2 = h2;
+  GNUNET_HELLO_iterate_addresses (h1,
+                                  GNUNET_NO,
+                                  &find_matching,
+                                  &ec);
+  if (ec.result.value ==
+      GNUNET_TIME_UNIT_ZERO.value)
+    return ec.result; 
+  ec.h2 = h1;
+  GNUNET_HELLO_iterate_addresses (h2,
+                                  GNUNET_NO,
+                                  &find_matching,
+                                  &ec);
+  return ec.result;
+}
+
+
 /* end of hello.c */
index 73f84bc43a0f7f67024feed3a2e794b462412d2a..ca5e2928457d754f0cb1562342660e2919e829bd 100644 (file)
@@ -120,6 +120,29 @@ struct GNUNET_HELLO_Message *GNUNET_HELLO_merge (const struct
                                                  GNUNET_HELLO_Message *h2);
 
 
+/**
+ * Test if two HELLO messages contain the same addresses.
+ * If they only differ in expiration time, the lowest
+ * expiration time larger than 'now' where they differ
+ * is returned.
+ *
+ * @param h1 first HELLO message
+ * @param h2 the second HELLO message
+ * @param now time to use for deciding which addresses have
+ *            expired and should not be considered at all
+ * @return absolute time forever if the two HELLOs are 
+ *         totally identical; smallest timestamp >= now if
+ *         they only differ in timestamps; 
+ *         zero if the some addresses with expirations >= now
+ *         do not match at all
+ */
+struct GNUNET_TIME_Absolute 
+GNUNET_HELLO_equals (const struct
+                    GNUNET_HELLO_Message *h1,
+                    const struct
+                    GNUNET_HELLO_Message *h2,
+                    struct GNUNET_TIME_Absolute now);
+
 
 /**
  * Iterator callback to go over all addresses.
index 5c3f2dfbf5fd1c26f310ba5b02ae30826e331ff3..aa2047c7cac1e5fd8eb385492d28b6881e3ba39e 100644 (file)
@@ -441,6 +441,7 @@ bind_address (const struct GNUNET_PeerIdentity *peer,
   char *fn;
   struct HostEntry *host;
   struct GNUNET_HELLO_Message *mrg;
+  struct GNUNET_TIME_Absolute delta;
 
   add_host_to_known_hosts (peer);
   host = lookup_host_entry (peer);
@@ -453,8 +454,14 @@ bind_address (const struct GNUNET_PeerIdentity *peer,
   else
     {
       mrg = GNUNET_HELLO_merge (host->hello, hello);
-      /* FIXME: check if old and merged hello are equal,
-        and if so, bail out early... */
+      delta = GNUNET_HELLO_equals (mrg,
+                                  host->hello,
+                                  GNUNET_TIME_absolute_get ());
+      if (delta.value == GNUNET_TIME_UNIT_FOREVER_ABS.value)
+       {
+         GNUNET_free (mrg);
+         return;
+       }
       GNUNET_free (host->hello);
       host->hello = mrg;
     }