- changes
[oweals/gnunet.git] / src / integration-tests / connection_watchdog.c
index 7ee858cfa0d8c671373c0970079a080a0d0458f0..456782ddd2ff115a12479adcfbd5fbc86a3de292 100644 (file)
@@ -35,8 +35,8 @@
 #include "gnunet_statistics_service.h"
 
 
-#define CHECK_DELAY GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 5)
-#define STATS_DELAY GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 5)
+#define CHECK_DELAY GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 10)
+#define STATS_DELAY GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 10)
 #define REPEATED_STATS_DELAY GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 10)
 #define STATS_VALUES 4
 
@@ -119,9 +119,10 @@ struct TransportPlugin
 struct TransportPlugin *phead;
 struct TransportPlugin *ptail;
 
-int map_check_it (void *cls,
-                  const GNUNET_HashCode * key,
-                  void *value)
+static int 
+map_check_it (void *cls,
+             const struct GNUNET_HashCode * key,
+             void *value)
 {
   int *fail = cls;
   struct PeerContainer *pc = value;
@@ -139,12 +140,13 @@ int map_check_it (void *cls,
 }
 
 
-int map_cleanup_it (void *cls,
-                  const GNUNET_HashCode * key,
-                  void *value)
+static int 
+map_cleanup_it (void *cls,
+               const struct GNUNET_HashCode * key,
+               void *value)
 {
   struct PeerContainer *pc = value;
-  GNUNET_CONTAINER_multihashmap_remove(peers, key, value);
+  GNUNET_assert (GNUNET_OK == GNUNET_CONTAINER_multihashmap_remove(peers, key, value));
   if (NULL != pc->th_ping)
   {
     GNUNET_TRANSPORT_notify_transmit_ready_cancel(pc->th_ping);
@@ -228,8 +230,8 @@ check_lowlevel_connections (int port, int protocol)
       break;
   }
 
-
-  GNUNET_asprintf(&cmdline, "netstat -n %s | grep %u", proto, port);
+  /* Use netstat to get a numeric list of all connections on port 'port' in state 'ESTABLISHED' */
+  GNUNET_asprintf(&cmdline, "netstat -n %s | grep %u | grep ESTABLISHED", proto, port);
 
   if (system ("netstat -n > /dev/null 2> /dev/null"))
     if (system ("netstat -n > /dev/null 2> /dev/null") == 0)
@@ -268,7 +270,7 @@ find_plugin (char * name)
 {
   struct TransportPlugin *cur = NULL;
 
-  for (cur = phead; cur != NULL; cur = phead)
+  for (cur = phead; cur != NULL; cur = cur->next)
   {
     if (0 == strcmp(name, cur->short_name))
       return cur;
@@ -276,9 +278,10 @@ find_plugin (char * name)
   return cur;
 }
 
-int stats_check_cb (void *cls, const char *subsystem,
-                   const char *name, uint64_t value,
-                   int is_persistent)
+static int 
+stats_check_cb (void *cls, const char *subsystem,
+               const char *name, uint64_t value,
+               int is_persistent)
 {
   static int counter;
 
@@ -397,7 +400,8 @@ struct PONG
 GNUNET_NETWORK_STRUCT_END
 
 
-size_t send_transport_ping_cb (void *cls, size_t size, void *buf)
+static size_t 
+send_transport_ping_cb (void *cls, size_t size, void *buf)
 {
  struct PeerContainer * pc = cls;
  struct PING ping;
@@ -447,28 +451,30 @@ return mlen;
 
 
 int map_ping_it (void *cls,
-                  const GNUNET_HashCode * key,
+                  const struct GNUNET_HashCode * key,
                   void *value)
 {
   struct PeerContainer *pc = value;
 
-  if ((GNUNET_YES == pc->transport_connected) && (NULL == pc->th_ping))
-    pc->th_ping = GNUNET_TRANSPORT_notify_transmit_ready(th, &pc->id,
-        sizeof (struct PING), UINT_MAX,
-        GNUNET_TIME_relative_get_forever(), &send_transport_ping_cb, pc);
-  else
-    GNUNET_break(0);
-
-  if ((GNUNET_YES == pc->core_connected) && (NULL == pc->ch_ping))
-    pc->ch_ping = GNUNET_CORE_notify_transmit_ready(ch,
-                                             GNUNET_NO, UINT_MAX,
-                                             GNUNET_TIME_relative_get_forever(),
-                                             &pc->id,
-                                             sizeof (struct PING),
-                                             send_core_ping_cb, pc);
-  else
-    GNUNET_break (0);
+  if (ping == GNUNET_YES)
+  {
+    if ((GNUNET_YES == pc->transport_connected) && (NULL == pc->th_ping))
+      pc->th_ping = GNUNET_TRANSPORT_notify_transmit_ready(th, &pc->id,
+          sizeof (struct PING), UINT_MAX,
+          GNUNET_TIME_UNIT_FOREVER_REL, &send_transport_ping_cb, pc);
+    else
+      GNUNET_break(0);
 
+    if ((GNUNET_YES == pc->core_connected) && (NULL == pc->ch_ping))
+      pc->ch_ping = GNUNET_CORE_notify_transmit_ready(ch,
+                                               GNUNET_NO, UINT_MAX,
+                                                     GNUNET_TIME_UNIT_FOREVER_REL,
+                                               &pc->id,
+                                               sizeof (struct PING),
+                                               send_core_ping_cb, pc);
+    else
+      GNUNET_break (0);
+  }
   return GNUNET_OK;
 }
 
@@ -493,7 +499,7 @@ stats_check (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 
   GNUNET_STATISTICS_get (stats, "transport", "# peers connected", GNUNET_TIME_UNIT_MINUTES, NULL, &stats_check_cb, &statistics_transport_connections);
   GNUNET_STATISTICS_get (stats, "core", "# neighbour entries allocated", GNUNET_TIME_UNIT_MINUTES, NULL, &stats_check_cb, &statistics_core_neighbour_entries);
-  GNUNET_STATISTICS_get (stats, "core", "# entries in session map", GNUNET_TIME_UNIT_MINUTES, NULL, &stats_check_cb, &statistics_core_entries_session_map);
+  GNUNET_STATISTICS_get (stats, "core", "# peers connected", GNUNET_TIME_UNIT_MINUTES, NULL, &stats_check_cb, &statistics_core_entries_session_map);
 
   /* TCP plugin specific checks */
   if (GNUNET_YES == have_tcp)
@@ -526,7 +532,8 @@ size_t send_transport_pong_cb (void *cls, size_t size, void *buf)
  return mlen;
 }
 
-size_t send_core_pong_cb (void *cls, size_t size, void *buf)
+static size_t 
+send_core_pong_cb (void *cls, size_t size, void *buf)
 {
 struct PeerContainer * pc = cls;
 struct PING ping;
@@ -565,15 +572,20 @@ map_connect (const struct GNUNET_PeerIdentity *peer, void * source)
   }
 
   pc = GNUNET_CONTAINER_multihashmap_get(peers, &peer->hashPubKey);
+  GNUNET_assert (NULL != pc);
+
   if (source == th)
   {
     if (GNUNET_NO == pc->transport_connected)
     {
       pc->transport_connected = GNUNET_YES;
-      if ((GNUNET_YES == ping) && (NULL == pc->th_ping))
-        pc->th_ping = GNUNET_TRANSPORT_notify_transmit_ready(th, peer, sizeof (struct PING), UINT_MAX, GNUNET_TIME_relative_get_forever(), &send_transport_ping_cb, pc);
-      else
-        GNUNET_break(0);
+      if (GNUNET_YES == ping)
+      {
+        if (NULL == pc->th_ping)
+          pc->th_ping = GNUNET_TRANSPORT_notify_transmit_ready(th, peer, sizeof (struct PING), UINT_MAX, GNUNET_TIME_UNIT_FOREVER_REL, &send_transport_ping_cb, pc);
+        else
+          GNUNET_break(0);
+      }
     }
     else
     {
@@ -590,15 +602,18 @@ map_connect (const struct GNUNET_PeerIdentity *peer, void * source)
     if (GNUNET_NO == pc->core_connected)
     {
       pc->core_connected = GNUNET_YES;
-      if ((GNUNET_YES == ping) && (NULL == pc->ch_ping))
-        pc->ch_ping = GNUNET_CORE_notify_transmit_ready(ch,
+      if (GNUNET_YES == ping)
+      {
+        if (NULL == pc->ch_ping)
+          pc->ch_ping = GNUNET_CORE_notify_transmit_ready(ch,
                                                  GNUNET_NO, UINT_MAX,
-                                                 GNUNET_TIME_relative_get_forever(),
+                                                         GNUNET_TIME_UNIT_FOREVER_REL,
                                                  peer,
                                                  sizeof (struct PING),
                                                  send_core_ping_cb, pc);
-      else
-        GNUNET_break (0);
+        else
+          GNUNET_break (0);
+      }
     }
     else
     {
@@ -645,6 +660,8 @@ map_disconnect (const struct GNUNET_PeerIdentity * peer, void * source)
   }
 
   pc = GNUNET_CONTAINER_multihashmap_get(peers, &peer->hashPubKey);
+  GNUNET_assert (NULL != pc);
+
   if (source == th)
   {
     if (NULL != pc->th_ping)
@@ -761,7 +778,7 @@ cleanup_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
   check_task = GNUNET_SCHEDULER_add_now (&map_check, &map_cleanup);
 }
 
-void
+static void
 transport_notify_connect_cb (void *cls,
                 const struct GNUNET_PeerIdentity
                 * peer,
@@ -782,7 +799,7 @@ transport_notify_connect_cb (void *cls,
  * @param cls closure
  * @param peer the peer that disconnected
  */
-void
+static void
 transport_notify_disconnect_cb (void *cls,
                                const struct
                                GNUNET_PeerIdentity * peer)
@@ -824,13 +841,16 @@ transport_notify_receive_cb (void *cls,
         "TRANSPORT",
         "PING",
         GNUNET_i2s (peer)) ;
-    if ((GNUNET_YES == ping) && (NULL == pc->th_pong))
-      pc->th_pong = GNUNET_TRANSPORT_notify_transmit_ready(th,
+    if (GNUNET_YES == ping)
+    {
+      if (NULL == pc->th_pong)
+        pc->th_pong = GNUNET_TRANSPORT_notify_transmit_ready(th,
           peer, sizeof (struct PONG),
-          UINT_MAX, GNUNET_TIME_relative_get_forever(),
+                                                            UINT_MAX, GNUNET_TIME_UNIT_FOREVER_REL,
           &send_transport_pong_cb, pc);
-    else
-      GNUNET_break (0);
+      else
+        GNUNET_break (0);
+    }
 
   }
   if ((message->size == ntohs (sizeof (struct PONG))) && (message->type == ntohs (4321)))
@@ -842,11 +862,12 @@ transport_notify_receive_cb (void *cls,
   }
 }
 
-int core_notify_receive_cb (void *cls,
-                                const struct GNUNET_PeerIdentity * peer,
-                                const struct GNUNET_MessageHeader * message,
-                                const struct GNUNET_ATS_Information* atsi,
-                                unsigned int atsi_count)
+static int 
+core_notify_receive_cb (void *cls,
+                       const struct GNUNET_PeerIdentity * peer,
+                       const struct GNUNET_MessageHeader * message,
+                       const struct GNUNET_ATS_Information* atsi,
+                       unsigned int atsi_count)
 {
   struct PeerContainer *pc = NULL;
 
@@ -854,6 +875,13 @@ int core_notify_receive_cb (void *cls,
 
   if (NULL == pc)
   {
+    if (0 == memcmp (peer, &my_peer_id, sizeof (my_peer_id)))
+        return GNUNET_OK;
+
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Received unexpected message type %u from unknown peer `%s'\n",
+        ntohs (message->type),
+        GNUNET_i2s (peer));
+
     GNUNET_break (0);
     return GNUNET_OK;
   }
@@ -864,15 +892,18 @@ int core_notify_receive_cb (void *cls,
         "CORE",
         "PING",
         GNUNET_i2s (peer));
-    if ((GNUNET_YES == ping) && (NULL == pc->ch_pong))
-      pc->ch_pong = GNUNET_CORE_notify_transmit_ready(ch,
+    if (GNUNET_YES == ping)
+    {
+      if (NULL == pc->ch_pong)
+        pc->ch_pong = GNUNET_CORE_notify_transmit_ready(ch,
                                                GNUNET_NO, UINT_MAX,
-                                               GNUNET_TIME_relative_get_forever(),
+                                                       GNUNET_TIME_UNIT_FOREVER_REL,
                                                peer,
                                                sizeof (struct PONG),
                                                send_core_pong_cb, pc);
-    else
-      GNUNET_break (0);
+      else
+        GNUNET_break (0);
+    }
   }
 
   if ((message->size == ntohs (sizeof (struct PONG))) && (message->type == ntohs (4321)))
@@ -913,7 +944,7 @@ core_disconnect_cb (void *cls,
 {
   if (0 != memcmp (peer, &my_peer_id, sizeof (struct GNUNET_PeerIdentity)))
   {
-    GNUNET_assert (core_connections >= 0);
+    GNUNET_assert (core_connections > 0);
     GNUNET_log (GNUNET_ERROR_TYPE_INFO, "CORE      disconnect for peer `%s' (%u total)\n",
       GNUNET_i2s (peer), core_connections);
     map_disconnect (peer, ch);
@@ -944,7 +975,7 @@ init ()
   char *pos;
   char *secname;
   int counter;
-  long long unsigned int port;
+  unsigned long long port;
 
   have_tcp = GNUNET_NO;
   have_udp = GNUNET_NO;
@@ -969,7 +1000,7 @@ init ()
 
     GNUNET_log (GNUNET_ERROR_TYPE_INFO, _("Transport plugin: `%s' port %llu\n"), pos, port);
     cur = GNUNET_malloc(sizeof (struct TransportPlugin));
-    cur->short_name = strdup (pos);
+    cur->short_name = GNUNET_strdup (pos);
     cur->port = port;
     if (0 == strcmp("tcp", pos))
     {
@@ -1033,7 +1064,7 @@ run (void *cls, char *const *args, const char *cfgfile,
                                 &transport_notify_disconnect_cb);
   GNUNET_assert (th != NULL);
   GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Connected to transport service\n");
-  ch =  GNUNET_CORE_connect (cfg, 1, NULL,
+  ch =  GNUNET_CORE_connect (cfg, NULL,
                              &core_init_cb,
                              &core_connect_cb,
                              &core_disconnect_cb,
@@ -1063,6 +1094,10 @@ main (int argc, char *const *argv)
     GNUNET_NO, &GNUNET_GETOPT_set_one, &ping},
     GNUNET_GETOPT_OPTION_END
   };
+
+  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+    return 2;
+
   return (GNUNET_OK ==
           GNUNET_PROGRAM_run (argc, argv, "cn",
                               gettext_noop ("help text"), options, &run,