/*
This file is part of GNUnet.
- (C) 2009, 2010 Christian Grothoff (and other contributing authors)
+ (C) 2009, 2010, 2013 Christian Grothoff (and other contributing authors)
GNUnet is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published
* @author Matthias Wachs
*/
#include "platform.h"
-#include "gnunet_common.h"
+#include "gnunet_util_lib.h"
#include "gnunet_constants.h"
#include "gnunet_arm_service.h"
#include "gnunet_core_service.h"
-#include "gnunet_getopt_lib.h"
-#include "gnunet_os_lib.h"
-#include "gnunet_program_lib.h"
-#include "gnunet_scheduler_lib.h"
#include "gnunet_transport_service.h"
#include "gnunet_statistics_service.h"
static uint64_t statistics_core_neighbour_entries;
static uint64_t statistics_core_entries_session_map;
-int stat_check_running;
+static int stat_check_running;
-static struct GNUNET_CONTAINER_MultiHashMap *peers;
+static struct GNUNET_CONTAINER_MultiPeerMap *peers;
struct PeerContainer
{
int protocol;
};
-struct TransportPlugin *phead;
-struct TransportPlugin *ptail;
-static int
+static struct TransportPlugin *phead;
+static struct TransportPlugin *ptail;
+
+
+static int
map_check_it (void *cls,
- const GNUNET_HashCode * key,
+ const struct GNUNET_PeerIdentity * key,
void *value)
{
int *fail = cls;
}
-static int
+static int
map_cleanup_it (void *cls,
- const GNUNET_HashCode * key,
+ const struct GNUNET_PeerIdentity * key,
void *value)
{
struct PeerContainer *pc = value;
- GNUNET_assert (GNUNET_OK == GNUNET_CONTAINER_multihashmap_remove(peers, key, value));
+ GNUNET_assert (GNUNET_OK == GNUNET_CONTAINER_multipeermap_remove(peers, key, value));
if (NULL != pc->th_ping)
{
GNUNET_TRANSPORT_notify_transmit_ready_cancel(pc->th_ping);
static void
map_cleanup (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
{
- GNUNET_CONTAINER_multihashmap_iterate (peers, &map_cleanup_it, NULL);
- GNUNET_CONTAINER_multihashmap_destroy(peers);
+ GNUNET_CONTAINER_multipeermap_iterate (peers, &map_cleanup_it, NULL);
+ GNUNET_CONTAINER_multipeermap_destroy(peers);
}
static void
{
int fail = 0;
check_task = GNUNET_SCHEDULER_NO_TASK;
- GNUNET_CONTAINER_multihashmap_iterate (peers, &map_check_it, &fail);
+ GNUNET_CONTAINER_multipeermap_iterate (peers, &map_check_it, &fail);
if (0 > fail)
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Inconsistent peers after connection consistency check: %u\n", fail);
static void
stats_check (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc);
+
static int
check_lowlevel_connections (int port, int protocol)
{
+#ifdef MINGW
+ #define DEVNULL "NUL"
+#else
+ #define DEVNULL "/dev/null"
+#endif
+
FILE *f;
char * cmdline;
char * proto;
char line[1024];
int count = -1;
-#ifdef MINGW
- /* not supported */
- return count;
-#else
- switch (protocol) {
+ switch (protocol)
+ {
case tcp:
+#ifdef MINGW
+ proto = "-p TCP";
+#else
proto = "-t";
+#endif
break;
case udp:
+#ifdef MINGW
+ proto = "-p UDP";
+#else
proto = "-u";
+#endif
break;
case unixdomain:
+#ifdef MINGW
+ proto = "-p UNIX";
+#else
proto = "-x";
+#endif
break;
default:
proto = "";
/* 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)
+ if (system ("netstat -n > " DEVNULL " 2> " DEVNULL))
+ if (system ("netstat -n > " DEVNULL " 2> "DEVNULL) == 0)
f = popen (cmdline, "r");
else
f = NULL;
{
/* read */
//printf ("%s", line);
- count ++;
+ count++;
}
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "%i TCP connections established with port %u\n",
- count, port);
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "%i TCP connections established with port %u\n",
+ count, port);
pclose (f);
GNUNET_free (cmdline);
return count;
-#endif
}
return cur;
}
-static int
+static int
stats_check_cb (void *cls, const char *subsystem,
const char *name, uint64_t value,
int is_persistent)
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"%u transport tcp sessions <-> %i established tcp connections\n",
statistics_transport_tcp_connections, low_level_connections_tcp);
- fail = GNUNET_YES;
}
else if (low_level_connections_tcp != -1)
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"%u transport notifications <-> %u in statistics (statistics_transport_tcp_connections)\n",
transport_connections, statistics_transport_tcp_connections);
- fail = GNUNET_YES;
}
else
{
GNUNET_NETWORK_STRUCT_END
-static size_t
+static 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);
+ struct PeerContainer * pc = cls;
+ struct PING ping;
+ size_t mlen = sizeof (struct PING);
- if (size < mlen)
- {
- GNUNET_break (0);
- return 0;
- }
+ 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);
+ 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;
+ pc->th_ping = NULL;
- memcpy (buf, &ping, mlen);
- return mlen;
+ 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)
+static size_t
+send_core_ping_cb (void *cls, size_t size, void *buf)
{
- GNUNET_break (0);
- return 0;
-}
+ 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);
+ 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;
+ pc->ch_ping = NULL;
-memcpy (buf, &ping, mlen);
-return mlen;
+ memcpy (buf, &ping, mlen);
+ return mlen;
}
-int map_ping_it (void *cls,
- const GNUNET_HashCode * key,
- void *value)
+static int
+map_ping_it (void *cls,
+ const struct GNUNET_PeerIdentity * key,
+ void *value)
{
struct PeerContainer *pc = value;
statistics_task = GNUNET_SCHEDULER_add_delayed(STATS_DELAY, &stats_check, NULL);
}
- GNUNET_CONTAINER_multihashmap_iterate (peers, &map_ping_it, NULL);
+ GNUNET_CONTAINER_multipeermap_iterate (peers, &map_ping_it, NULL);
stat_check_running = GNUNET_YES;
}
-
-size_t send_transport_pong_cb (void *cls, size_t size, void *buf)
+static size_t
+send_transport_pong_cb (void *cls, size_t size, void *buf)
{
struct PeerContainer * pc = cls;
struct PING ping;
return mlen;
}
-static size_t
+
+static size_t
send_core_pong_cb (void *cls, size_t size, void *buf)
{
-struct PeerContainer * pc = cls;
-struct PING ping;
-size_t mlen = sizeof (struct PING);
+ struct PeerContainer * pc = cls;
+ struct PING ping;
+ size_t mlen = sizeof (struct PING);
-if (size < mlen)
-{
- GNUNET_break (0);
- return 0;
-}
+ if (size < mlen)
+ {
+ GNUNET_break (0);
+ return 0;
+ }
-GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Sending core pong to `%s'\n", GNUNET_i2s (&pc->id));
-ping.header.size = htons (mlen);
-ping.header.type = htons (4321);
-ping.src = htons (1);
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Sending core pong to `%s'\n", GNUNET_i2s (&pc->id));
+ ping.header.size = htons (mlen);
+ ping.header.type = htons (4321);
+ ping.src = htons (1);
-pc->ch_pong = NULL;
+ pc->ch_pong = NULL;
-memcpy (buf, &ping, mlen);
-return mlen;
+ memcpy (buf, &ping, mlen);
+ return mlen;
}
map_connect (const struct GNUNET_PeerIdentity *peer, void * source)
{
struct PeerContainer * pc;
- if (GNUNET_NO == GNUNET_CONTAINER_multihashmap_contains(peers, &peer->hashPubKey))
+ if (GNUNET_NO == GNUNET_CONTAINER_multipeermap_contains(peers, peer))
{
pc = GNUNET_malloc (sizeof (struct PeerContainer));
pc->id = *peer;
pc->core_connected = GNUNET_NO;
pc->transport_connected = GNUNET_NO;
- GNUNET_assert (GNUNET_OK == GNUNET_CONTAINER_multihashmap_put(peers, &peer->hashPubKey, pc, GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
+ GNUNET_assert (GNUNET_OK == GNUNET_CONTAINER_multipeermap_put(peers, peer, pc, GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
}
- pc = GNUNET_CONTAINER_multihashmap_get(peers, &peer->hashPubKey);
+ pc = GNUNET_CONTAINER_multipeermap_get(peers, peer);
+ GNUNET_assert (NULL != pc);
+
if (source == th)
{
if (GNUNET_NO == pc->transport_connected)
{
struct PeerContainer * pc;
- if (GNUNET_NO == GNUNET_CONTAINER_multihashmap_contains(peers, &peer->hashPubKey))
+ if (GNUNET_NO == GNUNET_CONTAINER_multipeermap_contains(peers, peer))
{
if (source == th)
{
}
}
- pc = GNUNET_CONTAINER_multihashmap_get(peers, &peer->hashPubKey);
+ pc = GNUNET_CONTAINER_multipeermap_get(peers, peer);
+ GNUNET_assert (NULL != pc);
+
if (source == th)
{
if (NULL != pc->th_ping)
if ((GNUNET_NO == pc->core_connected) && (GNUNET_NO == pc->transport_connected))
{
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Removing peer `%s'\n", GNUNET_i2s (&pc->id));
- GNUNET_assert (GNUNET_OK == GNUNET_CONTAINER_multihashmap_remove (peers, &peer->hashPubKey, pc));
+ GNUNET_assert (GNUNET_OK == GNUNET_CONTAINER_multipeermap_remove (peers, peer, pc));
GNUNET_free (pc);
static void
cleanup_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
{
- struct TransportPlugin * cur = phead;
+ struct TransportPlugin *cur;
if (NULL != th)
{
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Disconnecting from transport service\n");
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ "Disconnecting from transport service\n");
GNUNET_TRANSPORT_disconnect (th);
th = NULL;
}
if (NULL != ch)
{
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Disconnecting from core service\n");
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ "Disconnecting from core service\n");
GNUNET_CORE_disconnect (ch);
ch = NULL;
}
check_task = GNUNET_SCHEDULER_NO_TASK;
}
- for (cur = phead; cur != NULL; cur = phead)
+ for (cur = phead; NULL != cur; cur = phead)
{
GNUNET_CONTAINER_DLL_remove(phead, ptail, cur);
GNUNET_free (cur->short_name);
check_task = GNUNET_SCHEDULER_add_now (&map_check, &map_cleanup);
}
+
static void
transport_notify_connect_cb (void *cls,
- const struct GNUNET_PeerIdentity
- * peer,
- const struct
- GNUNET_ATS_Information * ats,
- uint32_t ats_count)
+ const struct GNUNET_PeerIdentity* peer)
{
transport_connections ++;
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "TRANSPORT connect for peer `%s' (%u total)\n",
- GNUNET_i2s (peer), transport_connections);
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ "TRANSPORT connect for peer `%s' (%u total)\n",
+ GNUNET_i2s (peer),
+ transport_connections);
map_connect (peer, th);
}
+
/**
* Function called to notify transport users that another
* peer disconnected from us.
*/
static void
transport_notify_disconnect_cb (void *cls,
- const struct
- GNUNET_PeerIdentity * peer)
+ const struct GNUNET_PeerIdentity *peer)
{
GNUNET_assert (transport_connections > 0);
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "TRANSPORT disconnect for peer `%s' (%u total)\n",
- GNUNET_i2s (peer), transport_connections) ;
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ "TRANSPORT disconnect for peer `%s' (%u total)\n",
+ GNUNET_i2s (peer),
+ transport_connections);
map_disconnect (peer, th);
transport_connections --;
-
}
+
static void
transport_notify_receive_cb (void *cls,
const struct
GNUNET_PeerIdentity * peer,
const struct
GNUNET_MessageHeader *
- message,
- const struct
- GNUNET_ATS_Information * ats,
- uint32_t ats_count)
+ message)
{
+ struct PeerContainer *pc;
-
- struct PeerContainer *pc = NULL;
-
- pc = GNUNET_CONTAINER_multihashmap_get(peers, &peer->hashPubKey);
-
+ pc = GNUNET_CONTAINER_multipeermap_get (peers, peer);
if (NULL == pc)
{
GNUNET_break (0);
return;
}
- if ((message->size == ntohs (sizeof (struct PING))) && (message->type == ntohs (1234)))
+ if ((message->size == ntohs (sizeof (struct PING))) &&
+ (message->type == ntohs (1234)))
{
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Received %s %s from peer `%s'\n",
- "TRANSPORT",
- "PING",
- GNUNET_i2s (peer)) ;
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ "Received %s %s from peer `%s'\n",
+ "TRANSPORT",
+ "PING",
+ GNUNET_i2s (peer)) ;
if (GNUNET_YES == ping)
{
if (NULL == pc->th_pong)
}
}
-static int
+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)
+ const struct GNUNET_MessageHeader * message)
{
struct PeerContainer *pc = NULL;
- pc = GNUNET_CONTAINER_multihashmap_get(peers, &peer->hashPubKey);
+ pc = GNUNET_CONTAINER_multipeermap_get(peers, peer);
if (NULL == pc)
{
}
static void
-core_connect_cb (void *cls, const struct GNUNET_PeerIdentity *peer,
- const struct GNUNET_ATS_Information *atsi,
- unsigned int atsi_count)
+core_connect_cb (void *cls, const struct GNUNET_PeerIdentity *peer)
{
if (0 != memcmp (peer, &my_peer_id, sizeof (struct GNUNET_PeerIdentity)))
{
GNUNET_log (GNUNET_ERROR_TYPE_INFO, "CORE disconnect for myself `%s' (%u total)\n",
GNUNET_i2s (peer), core_connections);
}
-
}
+
static void
-core_init_cb (void *cls, struct GNUNET_CORE_Handle *server,
- const struct GNUNET_PeerIdentity *my_identity)
+core_init_cb (void *cls,
+ const struct GNUNET_PeerIdentity *my_identity)
{
my_peer_id = *my_identity;
GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Connected to core service\n");
GNUNET_free (plugs);
}
+
/**
* Main function that will be run by the scheduler.
*
init();
stats = GNUNET_STATISTICS_create ("watchdog", cfg);
- peers = GNUNET_CONTAINER_multihashmap_create (20);
+ peers = GNUNET_CONTAINER_multipeermap_create (32, GNUNET_NO);
th = GNUNET_TRANSPORT_connect(cfg, NULL, NULL,
&transport_notify_receive_cb,
GNUNET_NO, &GNUNET_GETOPT_set_one, &ping},
GNUNET_GETOPT_OPTION_END
};
- return (GNUNET_OK ==
- GNUNET_PROGRAM_run (argc, argv, "cn",
- gettext_noop ("help text"), options, &run,
- NULL)) ? ret : 1;
+
+ if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+ return 2;
+ ret = (GNUNET_OK ==
+ GNUNET_PROGRAM_run (argc, argv, "cn",
+ gettext_noop ("help text"), options, &run,
+ NULL)) ? ret : 1;
+ GNUNET_free ((void*) argv);
+ return ret;
}
/* end of connection_watchdog.c */