2 This file is part of GNUnet.
3 (C) 2001 - 2011 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
24 * @author Bartlomiej Polot
27 * - MESH NETWORK MESSAGES
30 * - MESH NETWORK HANDLES
31 * - MESH LOCAL HANDLES
32 * - MAIN FUNCTIONS (main & run)
35 * - soft stateing (keep-alive (CHANGE?) / timeout / disconnect) -- not a message issue
36 * - error reporting (CREATE/CHANGE/ADD/DEL?) -- new message!
37 * - partial disconnect reporting -- same as error reporting?
38 * - add vs create? change vs. keep-alive? same msg or different ones? -- thinking...
39 * - speed requirement specification (change?) in mesh API -- API call
43 #include "gnunet_common.h"
44 #include "gnunet_util_lib.h"
45 #include "gnunet_peer_lib.h"
46 #include "gnunet_core_service.h"
47 #include "gnunet_protocols.h"
51 /******************************************************************************/
52 /******************** MESH NETWORK MESSAGES **************************/
53 /******************************************************************************/
56 * Message for mesh path management
58 struct GNUNET_MESH_ManipulatePath
61 * Type: GNUNET_MESSAGE_TYPE_MESH_PATH_[CREATE|CHANGE|ADD|DEL]
63 * Size: sizeof(struct GNUNET_MESH_ManipulatePath) +
64 * path_length * sizeof (struct GNUNET_PeerIdentity)
66 struct GNUNET_MessageHeader header;
69 * Global id of the tunnel this path belongs to,
70 * unique in conjunction with the origin.
72 uint32_t tid GNUNET_PACKED;
75 * Information about speed requirements. If the tunnel cannot sustain the
76 * minimum bandwidth, packets are to be dropped.
78 uint32_t speed_min GNUNET_PACKED;
83 uint32_t reserved GNUNET_PACKED;
86 * path_length structs defining the *whole* path from the origin [0] to the
87 * final destination [path_length-1].
89 /* struct GNUNET_PeerIdentity peers[path_length]; */
93 * Message for mesh data traffic to all tunnel targets.
95 struct GNUNET_MESH_OriginMulticast
98 * Type: GNUNET_MESSAGE_TYPE_DATA_MULTICAST
100 struct GNUNET_MessageHeader header;
105 uint32_t tid GNUNET_PACKED;
110 struct GNUNET_PeerIdentity oid;
119 * Message for mesh data traffic to a particular destination from origin.
121 struct GNUNET_MESH_DataMessageFromOrigin
124 * Type: GNUNET_MESSAGE_TYPE_DATA_MESSAGE_FROM_ORIGIN
126 struct GNUNET_MessageHeader header;
131 uint32_t tid GNUNET_PACKED;
136 struct GNUNET_PeerIdentity oid;
141 struct GNUNET_PeerIdentity destination;
150 * Message for mesh data traffic from a tunnel participant to origin.
152 struct GNUNET_MESH_DataMessageToOrigin
155 * Type: GNUNET_MESSAGE_TYPE_DATA_MESSAGE_TO_ORIGIN
157 struct GNUNET_MessageHeader header;
162 uint32_t tid GNUNET_PACKED;
167 struct GNUNET_PeerIdentity oid;
170 * Sender of the message.
172 struct GNUNET_PeerIdentity sender;
180 * Message for mesh flow control
182 struct GNUNET_MESH_SpeedNotify
185 * Type: GNUNET_MESSAGE_TYPE_DATA_SPEED_NOTIFY
187 struct GNUNET_MessageHeader header;
192 uint32_t tid GNUNET_PACKED;
197 struct GNUNET_PeerIdentity oid;
200 * Slowest link down the path (above minimum speed requirement).
206 /******************************************************************************/
207 /************************ DATA STRUCTURES ****************************/
208 /******************************************************************************/
211 * All the states a peer participating in a tunnel can be in.
216 * Request sent, not yet answered.
221 * Peer connected and ready to accept data
226 * Peer connected previosly but not responding
228 MESH_PEER_RECONNECTING,
233 * Struct containing all information regarding a given peer
243 * Is the peer reachable? Is the peer even connected?
245 enum PeerState state;
248 * Who to send the data to --- what about multiple (alternate) paths?
250 GNUNET_PEER_Id first_hop;
253 * Max data rate to this peer
258 typedef uint32_t MESH_PathID;
260 * Information regarding a path
265 * Id of the path, in case it's needed
270 * Whether the path is serving traffic in a tunnel or is a backup
275 * List of all the peers that form the path from origin to target
277 GNUNET_PEER_Id *peers;
280 typedef uint32_t MESH_TunnelID;
282 * Struct containing all information regarding a tunnel
283 * For an intermediate node the improtant info used will be:
284 * - OID \ To identify
286 * - paths[0] | To know where to send it next
287 * - metainfo: ready, speeds, accounting
288 * For an end node more fields will be needed (client-handling)
296 struct MESH_tunnel *next;
297 struct MESH_tunnel *prev;
300 * Origin ID: Node that created the tunnel
305 * Tunnel number (unique for a given oid)
310 * Whether the tunnel is in a state to transmit data
315 * Minimal speed for this tunnel in kb/s
320 * Maximal speed for this tunnel in kb/s
325 * Last time the tunnel was used
327 struct GNUNET_TIME_Absolute timestamp;
330 * Peers in the tunnel, for future optimizations
332 struct PeerInfo *peers;
335 * Paths (used and backup)
340 * Messages ready to transmit??? -- FIXME real queues needed
342 struct GNUNET_MessageHeader *msg_out;
345 * Messages received and not processed??? -- FIXME real queues needed
347 struct GNUNET_MessageHeader *msg_in;
350 * If this tunnel was created by a local client, what's its handle?
352 struct GNUNET_SERVER_Client *initiator;
356 * So, I'm an endpoint. Why am I receiveing traffic?
357 * Who is interested in this? How to communicate with them?
368 * Tunnels that belong to this client
370 struct MESH_tunnel *my_tunnels_head;
371 struct MESH_tunnel *my_tunnels_tail;
374 * If this tunnel was created by a local client, what's its handle?
376 struct GNUNET_SERVER_Client *handle;
379 * Messages that this client has declared interest in
381 uint16_t *messages_subscribed;
382 unsigned int messages_subscribed_counter;
386 /******************************************************************************/
387 /*********************** GLOBAL VARIABLES ****************************/
388 /******************************************************************************/
393 // static struct Client clients_head;
394 // static struct Client clients_tail;
399 // static struct MESH_tunnel *tunnel_participation_head;
400 // static struct MESH_tunnel *tunnel_participation_tail;
403 /******************************************************************************/
404 /******************** MESH NETWORK HANDLERS **************************/
405 /******************************************************************************/
408 * Core handler for path creation
409 * struct GNUNET_CORE_MessageHandler
412 * @param message message
413 * @param peer peer identity this notification is about
414 * @param atsi performance data
415 * @return GNUNET_OK to keep the connection open,
416 * GNUNET_SYSERR to close it (signal serious error)
420 handle_mesh_path_create (void *cls,
421 const struct GNUNET_PeerIdentity *peer,
422 const struct GNUNET_MessageHeader *message,
423 const struct GNUNET_TRANSPORT_ATS_Information
427 * EXAMPLE OF USING THE API
428 * NOT ACTUAL CODE!!!!!
434 GNUNET_CONTAINER_DLL_insert (c->my_tunnels_head,
438 while (NULL != (t = c->my_tunnels_head))
440 GNUNET_CONTAINER_DLL_remove (c->my_tunnels_head,
449 /* Find origin & self */
450 /* Search for origin in local tunnels */
451 /* Create tunnel / add path */
452 /* Retransmit to next link in chain, if any (core_notify + callback) */
457 * Core handler for mesh network traffic
460 * @param message message
461 * @param peer peer identity this notification is about
462 * @param atsi performance data
463 * @return GNUNET_OK to keep the connection open,
464 * GNUNET_SYSERR to close it (signal serious error)
467 handle_mesh_network_traffic (void *cls,
468 const struct GNUNET_PeerIdentity *peer,
469 const struct GNUNET_MessageHeader *message,
470 const struct GNUNET_TRANSPORT_ATS_Information
473 if(GNUNET_MESSAGE_TYPE_MESH_DATA_GO == ntohs(message->type)) {
474 /* Retransmit to next in path of tunnel identified by message */
476 } else { /* GNUNET_MESSAGE_TYPE_MESH_DATA_BACK */
477 /* Retransmit to previous in path of tunnel identified by message */
483 * Functions to handle messages from core
485 static struct GNUNET_CORE_MessageHandler core_handlers[] = {
486 {&handle_mesh_path_create, GNUNET_MESSAGE_TYPE_MESH_PATH_CREATE, 0},
487 {&handle_mesh_network_traffic, GNUNET_MESSAGE_TYPE_MESH_DATA_GO, 0},
488 {&handle_mesh_network_traffic, GNUNET_MESSAGE_TYPE_MESH_DATA_BACK, 0},
494 /******************************************************************************/
495 /********************* MESH LOCAL HANDLES **************************/
496 /******************************************************************************/
499 * Handler for client disconnection
502 * @param client identification of the client; NULL
503 * for the last call when the server is destroyed
506 handle_client_disconnect (void *cls, struct GNUNET_SERVER_Client *client)
508 /* Remove client from list, delete all timers and queues associated */
513 * Handler for new clients
516 * @param client identification of the client
517 * @param message the actual message, which includes messages the client wants
520 handle_local_new_client (void *cls,
521 struct GNUNET_SERVER_Client *client,
522 const struct GNUNET_MessageHeader *message)
528 * Handler for connection requests
531 * @param client identification of the client
532 * @param message the actual message
535 handle_local_connect (void *cls,
536 struct GNUNET_SERVER_Client *client,
537 const struct GNUNET_MessageHeader *message)
543 * Handler for client traffic
546 * @param client identification of the client
547 * @param message the actual message
550 handle_local_network_traffic (void *cls,
551 struct GNUNET_SERVER_Client *client,
552 const struct GNUNET_MessageHeader *message)
558 * Functions to handle messages from clients
561 #define GNUNET_MESSAGE_TYPE_MESH_LOCAL_CONNECT 272
562 #define GNUNET_MESSAGE_TYPE_MESH_LOCAL_CONNECT_PEER_ANY 273
563 #define GNUNET_MESSAGE_TYPE_MESH_LOCAL_CONNECT_PEER_ALL 274
564 #define GNUNET_MESSAGE_TYPE_MESH_LOCAL_CONNECT_PEER_ADD 275
565 #define GNUNET_MESSAGE_TYPE_MESH_LOCAL_CONNECT_PEER_DEL 276
566 #define GNUNET_MESSAGE_TYPE_MESH_LOCAL_CONNECT_PEER_BY_TYPE 277
567 #define GNUNET_MESSAGE_TYPE_MESH_LOCAL_CONNECT_PEER_CANCEL 278
568 #define GNUNET_MESSAGE_TYPE_MESH_LOCAL_TRANSMIT_READY 279
569 #define GNUNET_MESSAGE_TYPE_MESH_LOCAL_TUNNEL_CREATED 280
570 #define GNUNET_MESSAGE_TYPE_MESH_LOCAL_TUNNEL_DESTROYED 281
571 #define GNUNET_MESSAGE_TYPE_MESH_LOCAL_DATA 282
572 #define GNUNET_MESSAGE_TYPE_MESH_LOCAL_DATA_BROADCAST 283
574 static struct GNUNET_SERVER_MessageHandler plugin_handlers[] = {
575 {&handle_local_new_client, NULL, GNUNET_MESSAGE_TYPE_MESH_LOCAL_CONNECT, 0},
576 {&handle_local_connect, NULL, GNUNET_MESSAGE_TYPE_MESH_LOCAL_CONNECT_PEER_ADD, 0},
577 {&handle_local_connect, NULL, GNUNET_MESSAGE_TYPE_MESH_LOCAL_CONNECT_PEER_DEL, 0},
578 {&handle_local_connect, NULL, GNUNET_MESSAGE_TYPE_MESH_LOCAL_CONNECT_PEER_BY_TYPE, sizeof(struct GNUNET_MESH_ConnectPeerByType)},
579 {&handle_local_connect, NULL, GNUNET_MESSAGE_TYPE_MESH_LOCAL_CONNECT_PEER_CANCEL, 0},
580 {&handle_local_network_traffic, NULL, GNUNET_MESSAGE_TYPE_MESH_LOCAL_TRANSMIT_READY, 0},
581 {&handle_local_network_traffic, NULL, GNUNET_MESSAGE_TYPE_MESH_LOCAL_DATA, 0}, /* FIXME needed? */
582 {&handle_local_network_traffic, NULL, GNUNET_MESSAGE_TYPE_MESH_LOCAL_DATA_BROADCAST, 0}, /* FIXME needed? */
588 * To be called on core init/fail.
590 * @param cls service closure
591 * @param server handle to the server for this service
592 * @param identity the public identity of this peer
593 * @param publicKey the public key of this peer
596 core_init (void *cls,
597 struct GNUNET_CORE_Handle *server,
598 const struct GNUNET_PeerIdentity *identity,
599 const struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded *publicKey)
605 * Method called whenever a given peer connects.
608 * @param peer peer identity this notification is about
609 * @param atsi performance data for the connection
612 core_connect (void *cls,
613 const struct GNUNET_PeerIdentity *peer,
614 const struct GNUNET_TRANSPORT_ATS_Information *atsi)
620 * Method called whenever a peer disconnects.
623 * @param peer peer identity this notification is about
626 core_disconnect (void *cls,
628 GNUNET_PeerIdentity *peer)
633 /******************************************************************************/
634 /************************ MAIN FUNCTIONS ****************************/
635 /******************************************************************************/
638 * Process mesh requests. FIXME NON FUNCTIONAL, SKELETON
641 * @param server the initialized server
642 * @param c configuration to use
646 struct GNUNET_SERVER_Handle *server,
647 const struct GNUNET_CONFIGURATION_Handle *c)
649 struct GNUNET_CORE_Handle *core;
651 GNUNET_SERVER_add_handlers (server, plugin_handlers);
652 GNUNET_SERVER_disconnect_notify (server, &handle_client_disconnect, NULL);
653 core = GNUNET_CORE_connect (c, /* Main configuration */
655 NULL, /* Closure passed to MESH functions */
656 &core_init, /* Call core_init once connected */
657 &core_connect, /* Handle connects */
658 &core_disconnect, /* remove peers on disconnects */
659 NULL, /* Do we care about "status" updates? */
660 NULL, /* Don't notify about all incoming messages */
661 GNUNET_NO, /* For header only in notification */
662 NULL, /* Don't notify about all outbound messages */
663 GNUNET_NO, /* For header-only out notification */
664 core_handlers); /* Register these handlers */
671 * The main function for the mesh service.
673 * @param argc number of arguments from the command line
674 * @param argv command line arguments
675 * @return 0 ok, 1 on error
678 main (int argc, char *const *argv)
683 GNUNET_SERVICE_run (argc,
686 GNUNET_SERVICE_OPTION_NONE, &run, NULL)) ? 0 : 1;