X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fmesh%2Fgnunet-mesh.c;h=7677b244f85e853b57e030e608a30a52625a51ce;hb=1fdcd4fa20f76fa8266e77567d12ce4b627c3d71;hp=afdd94a9cfc948ac226ee0c68e23e7f7aed6decc;hpb=0ccd26a719e7f197ccfb053b9517162f51c9da2c;p=oweals%2Fgnunet.git diff --git a/src/mesh/gnunet-mesh.c b/src/mesh/gnunet-mesh.c index afdd94a9c..7677b244f 100644 --- a/src/mesh/gnunet-mesh.c +++ b/src/mesh/gnunet-mesh.c @@ -26,6 +26,7 @@ #include "platform.h" #include "gnunet_util_lib.h" #include "gnunet_mesh_service.h" +#include "mesh.h" /** @@ -34,9 +35,14 @@ static int monitor_connections; /** - * Option -i. + * Option -P. */ -static int get_info; +static int request_peers; + +/** + * Option -T. + */ +static int request_tunnels; /** * Option --tunnel @@ -425,6 +431,36 @@ data_callback (void *cls, } +/** + * Method called to retrieve information about all peers in MESH, called + * once per peer. + * + * After last peer has been reported, an additional call with NULL is done. + * + * @param cls Closure. + * @param peer Peer, or NULL on "EOF". + * @param tunnel Do we have a tunnel towards this peer? + * @param n_paths Number of known paths towards this peer. + * @param best_path How long is the best path? + * (0 = unknown, 1 = ourselves, 2 = neighbor) + */ +static void +peers_callback (void *cls, const struct GNUNET_PeerIdentity *peer, + int tunnel, unsigned int n_paths, unsigned int best_path) +{ + if (NULL == peer) + { + if (GNUNET_YES != monitor_connections) + { + GNUNET_SCHEDULER_shutdown(); + } + return; + } + FPRINTF (stdout, "%s tunnel: %c, paths: %u\n", + GNUNET_i2s_full (peer), tunnel ? 'Y' : 'N', n_paths); +} + + /** * Method called to retrieve information about all tunnels in MESH. * @@ -462,29 +498,65 @@ tunnels_callback (void *cls, * * @param cls Closure. * @param peer Peer towards whom the tunnel is directed. - * @param channels Number of channels. - * @param connections Number of connections. + * @param n_channels Number of channels. + * @param n_connections Number of connections. + * @param channels Channels. + * @param connections Connections. * @param estate Encryption status. * @param cstate Connectivity status. */ void tunnel_callback (void *cls, const struct GNUNET_PeerIdentity *peer, - unsigned int channels, - unsigned int connections, + unsigned int n_channels, + unsigned int n_connections, + uint32_t *channels, + struct GNUNET_MeshHash *connections, unsigned int estate, unsigned int cstate) { - FPRINTF (stdout, "Tunnel %s\n", GNUNET_i2s_full (peer)); - FPRINTF (stdout, "- %u channels\n", channels); - FPRINTF (stdout, "- %u connections\n", connections); - FPRINTF (stdout, "- enc state: %u\n", estate); - FPRINTF (stdout, "- con state: %u\n", cstate); + unsigned int i; + + if (NULL != peer) + { + FPRINTF (stdout, "Tunnel %s\n", GNUNET_i2s_full (peer)); + FPRINTF (stdout, "- %u channels\n", n_channels); + for (i = 0; i < n_channels; i++) + FPRINTF (stdout, " %u\n", channels[i]); + FPRINTF (stdout, "- %u connections\n", n_connections); + for (i = 0; i < n_connections; i++) + FPRINTF (stdout, " %s\n", GM_h2s (&connections[i])); + FPRINTF (stdout, "- enc state: %u\n", estate); + FPRINTF (stdout, "- con state: %u\n", cstate); + } + if (GNUNET_YES != monitor_connections) + { + GNUNET_SCHEDULER_shutdown(); + } + return; + } /** - * Call MESH's monitor API, get all tunnels known to peer. + * Call MESH's meta API, get all peers known to a peer. + * + * @param cls Closure (unused). + * @param tc TaskContext + */ +static void +get_peers (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) +{ + if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN)) + { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Shutdown\n"); + return; + } + GNUNET_MESH_get_peers (mh, &peers_callback, NULL); +} + +/** + * Call MESH's meta API, get all tunnels known to a peer. * * @param cls Closure (unused). * @param tc TaskContext @@ -492,9 +564,9 @@ tunnel_callback (void *cls, static void get_tunnels (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Shutdown\n"); if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN)) { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Shutdown\n"); return; } GNUNET_MESH_get_tunnels (mh, &tunnels_callback, NULL); @@ -576,14 +648,16 @@ run (void *cls, char *const *args, const char *cfgfile, target_id = args[0]; target_port = args[0] && args[1] ? atoi(args[1]) : 0; - if ( (0 != get_info + if ( (0 != (request_peers | request_tunnels) || 0 != monitor_connections || NULL != tunnel_id || NULL != conn_id || NULL != channel_id) && target_id != NULL) { - FPRINTF (stderr, _("You must NOT give a TARGET when using options\n")); + FPRINTF (stderr, + _("You must NOT give a TARGET" + "when using 'request all' options\n")); return; } @@ -618,7 +692,12 @@ run (void *cls, char *const *args, const char *cfgfile, GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Show connection\n"); GNUNET_SCHEDULER_add_now (&show_connection, NULL); } - else if (GNUNET_YES == get_info) + else if (GNUNET_YES == request_peers) + { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Show all peers\n"); + GNUNET_SCHEDULER_add_now (&get_peers, NULL); + } + else if (GNUNET_YES == request_tunnels) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Show all tunnels\n"); GNUNET_SCHEDULER_add_now (&get_tunnels, NULL); @@ -659,31 +738,36 @@ main (int argc, char *const *argv) int res; const char helpstr[] = "Create channels and retreive info about meshs status."; static const struct GNUNET_GETOPT_CommandLineOption options[] = { - {'a', "channel", "TUNNEL_ID:CHANNEL_ID", - gettext_noop ("provide information about a particular channel"), - GNUNET_YES, &GNUNET_GETOPT_set_string, &channel_id}, - {'b', "connection", "TUNNEL_ID:CONNECTION_ID", +// {'a', "channel", "TUNNEL_ID:CHANNEL_ID", +// gettext_noop ("provide information about a particular channel"), +// GNUNET_YES, &GNUNET_GETOPT_set_string, &channel_id}, + {'C', "connection", "CONNECTION_ID", gettext_noop ("provide information about a particular connection"), GNUNET_YES, &GNUNET_GETOPT_set_string, &conn_id}, {'e', "echo", NULL, gettext_noop ("activate echo mode"), GNUNET_NO, &GNUNET_GETOPT_set_one, &echo}, - {'i', "info", NULL, - gettext_noop ("provide information about all tunnels"), - GNUNET_NO, &GNUNET_GETOPT_set_one, &get_info}, - {'m', "monitor", NULL, - gettext_noop ("provide information about all tunnels (continuously) NOT IMPLEMENTED"), /* FIXME */ - GNUNET_NO, &GNUNET_GETOPT_set_one, &monitor_connections}, +// {'m', "monitor", NULL, +// gettext_noop ("provide information about all tunnels (continuously) NOT IMPLEMENTED"), /* FIXME */ +// GNUNET_NO, &GNUNET_GETOPT_set_one, &monitor_connections}, {'p', "port", NULL, gettext_noop ("port to listen to (default; 0)"), GNUNET_YES, &GNUNET_GETOPT_set_uint, &listen_port}, + {'P', "peers", NULL, + gettext_noop ("provide information about all peers"), + GNUNET_NO, &GNUNET_GETOPT_set_one, &request_peers}, {'t', "tunnel", "TUNNEL_ID", gettext_noop ("provide information about a particular tunnel"), GNUNET_YES, &GNUNET_GETOPT_set_string, &tunnel_id}, + {'T', "tunnels", NULL, + gettext_noop ("provide information about all tunnels"), + GNUNET_NO, &GNUNET_GETOPT_set_one, &request_tunnels}, GNUNET_GETOPT_OPTION_END }; + monitor_connections = GNUNET_NO; + if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv)) return 2;