2 This file is part of GNUnet.
3 (C) 2001-2013 Christian Grothoff (and other contributing authors)
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA.
22 * @file mesh/gnunet-service-mesh.c
23 * @brief GNUnet MESH service with encryption
24 * @author Bartlomiej Polot
27 * - rekey - reliability interaction
28 * - channel retransmit timing
31 * - relay corking down to core
32 * - set ttl relative to path length
36 * - peer: other mesh instance. If there is direct connection it's a neighbor.
37 * - tunnel: encrypted connection to a peer, neighbor or not.
38 * - channel: connection between two clients, on the same or different peers.
39 * have properties like reliability.
40 * - path: series of directly connected peer from one peer to another.
41 * - connection: path which is being used in a tunnel.
45 #include "gnunet_util_lib.h"
47 #include "gnunet_statistics_service.h"
49 #include "gnunet-service-mesh_local.h"
50 #include "gnunet-service-mesh_channel.h"
51 #include "gnunet-service-mesh_connection.h"
52 #include "gnunet-service-mesh_tunnel.h"
53 #include "gnunet-service-mesh_dht.h"
54 #include "gnunet-service-mesh_peer.h"
57 /******************************************************************************/
58 /*********************** GLOBAL VARIABLES ****************************/
59 /******************************************************************************/
61 /****************************** Global variables ******************************/
64 * Handle to the statistics service.
66 struct GNUNET_STATISTICS_Handle *stats;
69 * Local peer own ID (memory efficient handle).
74 * Local peer own ID (full value).
76 struct GNUNET_PeerIdentity my_full_id;
80 * Signal that shutdown is happening: prevent recover measures.
84 /*************************** Static global variables **************************/
89 static struct GNUNET_CRYPTO_EddsaPrivateKey *my_private_key;
92 /******************************************************************************/
93 /************************ MAIN FUNCTIONS ****************************/
94 /******************************************************************************/
97 * Task run during shutdown.
103 shutdown_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
105 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "shutting down\n");
107 shutting_down = GNUNET_YES;
115 GNUNET_STATISTICS_destroy (stats, GNUNET_NO);
117 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "shut down\n");
122 * Process mesh requests.
125 * @param server the initialized server
126 * @param c configuration to use
129 run (void *cls, struct GNUNET_SERVER_Handle *server,
130 const struct GNUNET_CONFIGURATION_Handle *c)
132 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "starting to run\n");
134 stats = GNUNET_STATISTICS_create ("mesh", c);
136 /* Scheduled the task to clean up when shutdown is called */
137 GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, &shutdown_task,
139 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "reading key\n");
140 my_private_key = GNUNET_CRYPTO_eddsa_key_create_from_configuration (c);
141 GNUNET_assert (NULL != my_private_key);
142 GNUNET_CRYPTO_eddsa_key_get_public (my_private_key, &my_full_id.public_key);
143 myid = GNUNET_PEER_intern (&my_full_id);
144 GNUNET_log (GNUNET_ERROR_TYPE_INFO,
145 "Mesh for peer [%s] starting\n",
146 GNUNET_i2s (&my_full_id));
148 GML_init (server); /* Local clients */
149 GMC_init (c); /* Connections */
150 GMP_init (c); /* Peers */
151 GMD_init (c); /* DHT */
152 GMT_init (c, my_private_key); /* Tunnels */
154 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Mesh service running\n");
159 * The main function for the mesh service.
161 * @param argc number of arguments from the command line
162 * @param argv command line arguments
163 * @return 0 ok, 1 on error
166 main (int argc, char *const *argv)
171 shutting_down = GNUNET_NO;
172 r = GNUNET_SERVICE_run (argc, argv, "mesh", GNUNET_SERVICE_OPTION_NONE, &run,
174 GNUNET_free (my_private_key);
175 ret = (GNUNET_OK == r) ? 0 : 1;