api changes
[oweals/gnunet.git] / src / integration-tests / connection_watchdog.c
index 89ec25c7d64dac5bb0e80bab91103da9b4b62e95..942059c915587635bde741d6b7b85a4c2085db17 100644 (file)
@@ -44,6 +44,7 @@
  * Final status code.
  */
 static int ret;
+static int ping;
 
 static int have_tcp;
 static int have_udp;
@@ -378,34 +379,6 @@ int stats_check_cb (void *cls, const char *subsystem,
   return GNUNET_OK;
 }
 
-
-static void
-stats_check (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
-{
-  statistics_task = GNUNET_SCHEDULER_NO_TASK;
-
-  if (GNUNET_YES == stat_check_running)
-  {
-    statistics_task = GNUNET_SCHEDULER_add_delayed(STATS_DELAY, &stats_check, NULL);
-  }
-
-  stat_check_running = GNUNET_YES;
-
-  statistics_transport_connections = 0 ;
-  statistics_core_entries_session_map = 0;
-  statistics_core_neighbour_entries = 0;
-
-  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);
-
-  /* TCP plugin specific checks */
-  if (GNUNET_YES == have_tcp)
-    GNUNET_STATISTICS_get (stats, "transport", "# TCP sessions active", GNUNET_TIME_UNIT_MINUTES, NULL, &stats_check_cb, &statistics_transport_tcp_connections);
-
-
-}
-
 GNUNET_NETWORK_STRUCT_BEGIN
 
 struct PING
@@ -424,31 +397,7 @@ struct PONG
 GNUNET_NETWORK_STRUCT_END
 
 
- size_t send_transport_ping_cb (void *cls, size_t size, void *buf)
-{
-  struct PeerContainer * pc = cls;
-  struct PING ping;
-  size_t mlen = sizeof (struct PING);
-
-  if (size < mlen)
-  {
-    GNUNET_break (0);
-    return 0;
-  }
-
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-       "Sending transport ping to `%s'\n", GNUNET_i2s  (&pc->id));
-  ping.header.size = htons (mlen);
-  ping.header.type = htons (1234);
-  ping.src = htons (0);
-
-  pc->th_ping = NULL;
-
-  memcpy (buf, &ping, mlen);
-  return mlen;
-}
-
-size_t send_core_ping_cb (void *cls, size_t size, void *buf)
+size_t send_transport_ping_cb (void *cls, size_t size, void *buf)
 {
  struct PeerContainer * pc = cls;
  struct PING ping;
@@ -461,17 +410,99 @@ size_t send_core_ping_cb (void *cls, size_t size, void *buf)
  }
 
  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-      "Sending core ping to `%s'\n", GNUNET_i2s  (&pc->id));
+      "Sending transport ping to `%s'\n", GNUNET_i2s  (&pc->id));
  ping.header.size = htons (mlen);
  ping.header.type = htons (1234);
- ping.src = htons (1);
+ ping.src = htons (0);
 
- pc->ch_ping = NULL;
+ pc->th_ping = NULL;
 
  memcpy (buf, &ping, mlen);
  return mlen;
 }
 
+size_t send_core_ping_cb (void *cls, size_t size, void *buf)
+{
+struct PeerContainer * pc = cls;
+struct PING ping;
+size_t mlen = sizeof (struct PING);
+
+if (size < mlen)
+{
+  GNUNET_break (0);
+  return 0;
+}
+
+GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+     "Sending core ping to `%s'\n", GNUNET_i2s  (&pc->id));
+ping.header.size = htons (mlen);
+ping.header.type = htons (1234);
+ping.src = htons (1);
+
+pc->ch_ping = NULL;
+
+memcpy (buf, &ping, mlen);
+return mlen;
+}
+
+
+int map_ping_it (void *cls,
+                  const GNUNET_HashCode * key,
+                  void *value)
+{
+  struct PeerContainer *pc = value;
+
+  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_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);
+  }
+  return GNUNET_OK;
+}
+
+
+static void
+stats_check (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+  statistics_task = GNUNET_SCHEDULER_NO_TASK;
+
+  if (GNUNET_YES == stat_check_running)
+  {
+    statistics_task = GNUNET_SCHEDULER_add_delayed(STATS_DELAY, &stats_check, NULL);
+  }
+
+  GNUNET_CONTAINER_multihashmap_iterate (peers, &map_ping_it, NULL);
+
+  stat_check_running = GNUNET_YES;
+
+  statistics_transport_connections = 0 ;
+  statistics_core_entries_session_map = 0;
+  statistics_core_neighbour_entries = 0;
+
+  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);
+
+  /* TCP plugin specific checks */
+  if (GNUNET_YES == have_tcp)
+    GNUNET_STATISTICS_get (stats, "transport", "# TCP sessions active", GNUNET_TIME_UNIT_MINUTES, NULL, &stats_check_cb, &statistics_transport_tcp_connections);
+}
+
+
 
 size_t send_transport_pong_cb (void *cls, size_t size, void *buf)
 {
@@ -541,10 +572,13 @@ map_connect (const struct GNUNET_PeerIdentity *peer, void * source)
     if (GNUNET_NO == pc->transport_connected)
     {
       pc->transport_connected = GNUNET_YES;
-      if (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_relative_get_forever(), &send_transport_ping_cb, pc);
+        else
+          GNUNET_break(0);
+      }
     }
     else
     {
@@ -561,15 +595,18 @@ map_connect (const struct GNUNET_PeerIdentity *peer, void * source)
     if (GNUNET_NO == pc->core_connected)
     {
       pc->core_connected = GNUNET_YES;
-      if (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(),
                                                  peer,
                                                  sizeof (struct PING),
                                                  send_core_ping_cb, pc);
-      else
-        GNUNET_break (0);
+        else
+          GNUNET_break (0);
+      }
     }
     else
     {
@@ -795,13 +832,16 @@ transport_notify_receive_cb (void *cls,
         "TRANSPORT",
         "PING",
         GNUNET_i2s (peer)) ;
-    if (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(),
           &send_transport_pong_cb, pc);
-    else
-      GNUNET_break (0);
+      else
+        GNUNET_break (0);
+    }
 
   }
   if ((message->size == ntohs (sizeof (struct PONG))) && (message->type == ntohs (4321)))
@@ -835,15 +875,18 @@ int core_notify_receive_cb (void *cls,
         "CORE",
         "PING",
         GNUNET_i2s (peer));
-    if (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(),
                                                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)))
@@ -1028,8 +1071,10 @@ run (void *cls, char *const *args, const char *cfgfile,
 int
 main (int argc, char *const *argv)
 {
+  ping = GNUNET_NO;
   static const struct GNUNET_GETOPT_CommandLineOption options[] = {
-    /* FIMXE: add options here */
+   {'p', "ping", NULL, gettext_noop ("Send ping messages to test connectivity (default == NO)"),
+    GNUNET_NO, &GNUNET_GETOPT_set_one, &ping},
     GNUNET_GETOPT_OPTION_END
   };
   return (GNUNET_OK ==