- debug
[oweals/gnunet.git] / src / mesh / gnunet-service-mesh-enc.c
1 /*
2      This file is part of GNUnet.
3      (C) 2001-2013 Christian Grothoff (and other contributing authors)
4
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.
9
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.
14
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.
19 */
20
21 /**
22  * @file mesh/gnunet-service-mesh-enc.c
23  * @brief GNUnet MESH service with encryption
24  * @author Bartlomiej Polot
25  *
26  *  FIXME in progress:
27  * - when sending in-order buffered data, wait for client ACKs
28  * - add signatures
29  * - add encryption
30  * - set connection IDs independently from tunnel, tunnel has no ID
31  *
32  * TODO:
33  * - relay corking down to core
34  * - set ttl relative to path length
35  * TODO END
36  *
37  * Dictionary:
38  * - peer: other mesh instance. If there is direct connection it's a neighbor.
39  * - tunnel: encrypted connection to a peer, neighbor or not.
40  * - channel: connection between two clients, on the same or different peers.
41  *            have properties like reliability.
42  * - path: series of directly connected peer from one peer to another.
43  * - connection: path which is being used in a tunnel.
44  */
45
46 #include "platform.h"
47 #include "gnunet_util_lib.h"
48 #include "mesh_enc.h"
49 #include "gnunet_statistics_service.h"
50
51 #include "gnunet-service-mesh_local.h"
52 #include "gnunet-service-mesh_channel.h"
53 #include "gnunet-service-mesh_connection.h"
54 #include "gnunet-service-mesh_tunnel.h"
55 #include "gnunet-service-mesh_dht.h"
56 #include "gnunet-service-mesh_peer.h"
57
58
59 /******************************************************************************/
60 /************************      DATA STRUCTURES     ****************************/
61 /******************************************************************************/
62
63
64
65 /******************************************************************************/
66 /************************      DEBUG FUNCTIONS     ****************************/
67 /******************************************************************************/
68
69
70 /******************************************************************************/
71 /***********************      GLOBAL VARIABLES     ****************************/
72 /******************************************************************************/
73
74 /****************************** Global variables ******************************/
75
76 /**
77  * Handle to the statistics service.
78  */
79 struct GNUNET_STATISTICS_Handle *stats;
80
81 /**
82  * Local peer own ID (memory efficient handle).
83  */
84 GNUNET_PEER_Id myid;
85
86 /**
87  * Local peer own ID (full value).
88  */
89 struct GNUNET_PeerIdentity my_full_id;
90
91 /*************************** Static global variables **************************/
92
93 /**
94  * Own private key.
95  */
96 static struct GNUNET_CRYPTO_EddsaPrivateKey *my_private_key;
97
98
99 /******************************************************************************/
100 /***********************         DECLARATIONS        **************************/
101 /******************************************************************************/
102
103
104 /******************************************************************************/
105 /******************      GENERAL HELPER FUNCTIONS      ************************/
106 /******************************************************************************/
107
108
109
110 /******************************************************************************/
111 /****************      MESH NETWORK HANDLER HELPERS     ***********************/
112 /******************************************************************************/
113
114
115
116 /******************************************************************************/
117 /********************      MESH NETWORK HANDLERS     **************************/
118 /******************************************************************************/
119
120
121 /******************************************************************************/
122 /************************      MAIN FUNCTIONS      ****************************/
123 /******************************************************************************/
124
125
126 /**
127  * Task run during shutdown.
128  *
129  * @param cls unused
130  * @param tc unused
131  */
132 static void
133 shutdown_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
134 {
135   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "shutting down\n");
136
137   GML_shutdown ();
138   GMD_shutdown ();
139   GMP_shutdown ();
140   GMC_shutdown ();
141   GMT_shutdown ();
142
143   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "shut down\n");
144 }
145
146
147 /**
148  * Process mesh requests.
149  *
150  * @param cls closure
151  * @param server the initialized server
152  * @param c configuration to use
153  */
154 static void
155 run (void *cls, struct GNUNET_SERVER_Handle *server,
156      const struct GNUNET_CONFIGURATION_Handle *c)
157 {
158   struct GNUNET_CRYPTO_EddsaPrivateKey *pk;
159
160   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "starting to run\n");
161
162   stats = GNUNET_STATISTICS_create ("mesh", c);
163
164   /* Scheduled the task to clean up when shutdown is called */
165   GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, &shutdown_task,
166                                 NULL);
167   GNUNET_log (GNUNET_ERROR_TYPE_INFO, "reading key\n");
168   pk = GNUNET_CRYPTO_eddsa_key_create_from_configuration (c);
169   GNUNET_assert (NULL != pk);
170   my_private_key = pk;
171   GNUNET_CRYPTO_eddsa_key_get_public (my_private_key, &my_full_id.public_key);
172   myid = GNUNET_PEER_intern (&my_full_id);
173   GNUNET_log (GNUNET_ERROR_TYPE_INFO,
174               "Mesh for peer [%s] starting\n",
175               GNUNET_i2s (&my_full_id));
176
177   GML_init (server);    /* Local clients */
178   GMC_init (c);         /* Connections */
179   GMP_init (c);         /* Peers */
180   GMD_init (c);         /* DHT */
181   GMT_init (c, my_private_key); /* Tunnels */
182
183   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Mesh service running\n");
184 }
185
186
187 /**
188  * The main function for the mesh service.
189  *
190  * @param argc number of arguments from the command line
191  * @param argv command line arguments
192  * @return 0 ok, 1 on error
193  */
194 int
195 main (int argc, char *const *argv)
196 {
197   int ret;
198   int r;
199
200   fprintf (stderr, "main()\n");
201   r = GNUNET_SERVICE_run (argc, argv, "mesh", GNUNET_SERVICE_OPTION_NONE, &run,
202                           NULL);
203   ret = (GNUNET_OK == r) ? 0 : 1;
204   fprintf (stderr, "main() END\n");
205
206   return ret;
207 }