X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fmesh%2Fmesh.h;h=d8fc404e19462433a6a6180b523afaddb9810f5b;hb=1e1865f39492df814911c4448155df6b09ab802d;hp=e51b0c890e50a4b250a7c6b91e39fe020e643029;hpb=562b33143ee9fa431a68ea6741e4feb3ba388f83;p=oweals%2Fgnunet.git diff --git a/src/mesh/mesh.h b/src/mesh/mesh.h index e51b0c890..d8fc404e1 100644 --- a/src/mesh/mesh.h +++ b/src/mesh/mesh.h @@ -21,180 +21,243 @@ /** * @author Bartlomiej Polot * @file mesh/mesh.h - * - * TODO: - * - soft stateing (keep-alive (CHANGE?) / timeout / disconnect) -- not a message issue - * - error reporting (CREATE/CHANGE/ADD/DEL?) -- new message! - * - partial disconnect reporting -- same as error reporting? - * - add vs create? change vs. keep-alive? same msg or different ones? -- thinking... - * - speed requirement specification (change?) in mesh API -- API call - * - * - API messages! */ - #ifndef MESH_H_ #define MESH_H_ #include + +#define MESH_DEBUG GNUNET_YES + + +#include "platform.h" #include "gnunet_common.h" +#include "gnunet_util_lib.h" +#include "gnunet_peer_lib.h" +#include "gnunet_core_service.h" +#include "gnunet_protocols.h" +#include + +/******************************************************************************/ +/******************** MESH LOCAL MESSAGES *************************/ +/******************************************************************************/ +/* Any API call should be documented in the folowing table under API CALL. + * Also, any message type should be documented in the following table, with the + * associated event. + * + * API CALL (GNUNET_MESH_*) MESSAGE USED + * ------------------------ ------------ + * connect GNUNET_MESH_ClientConnect + * disconnect None (network level disconnect) + * + * tunnel_create GNUNET_MESH_TunnelMessage + * tunnel_destroy GNUNET_MESH_TunnelMessage + * + * peer_request_connect_add GNUNET_MESH_PeerControl + * peer_request_connect_del GNUNET_MESH_PeerControl + * peer_request_connect_by_type GNUNET_MESH_ConnectPeerByType + * + * notify_transmit_ready *GNUNET_MESH_TransmitReady?* + * notify_transmit_ready_cancel None (clear of internal data structures) + * + * + * + * EVENT MESSAGE USED + * ----- ------------ + * data GNUNET_MESH_Data OR + * GNUNET_MESH_DataBroadcast + * new incoming tunnel GNUNET_MESH_PeerControl + * peer connects to a tunnel GNUNET_MESH_PeerControl + * peer disconnects from a tunnel GNUNET_MESH_PeerControl + */ + +/******************************************************************************/ +/************************** CONSTANTS ******************************/ +/******************************************************************************/ + +#define GNUNET_MESH_LOCAL_TUNNEL_ID_CLI 0x80000000 +#define GNUNET_MESH_LOCAL_TUNNEL_ID_SERV 0xB0000000 + +#define CORE_QUEUE_SIZE 10 +#define LOCAL_QUEUE_SIZE 100 + +/******************************************************************************/ +/************************** MESSAGES ******************************/ +/******************************************************************************/ + +GNUNET_NETWORK_STRUCT_BEGIN /** - * Message for mesh path management + * Message for a client to register to the service */ -struct GNUNET_MESH_ManipulatePath +struct GNUNET_MESH_ClientConnect { /** - * Type: GNUNET_MESSAGE_TYPE_MESH_PATH_[CREATE|CHANGE|ADD|DEL] + * Type: GNUNET_MESSAGE_TYPE_MESH_LOCAL_CONNECT * - * Size: sizeof(struct GNUNET_MESH_ManipulatePath) + path_length * sizeof (struct GNUNET_PeerIdentity) - */ - struct GNUNET_MessageHeader header; - - /** - * Id of the tunnel this path belongs to, unique in conjunction with the origin. + * Size: sizeof(struct GNUNET_MESH_ClientConnect) + + * sizeof(MESH_ApplicationType) * applications + + * sizeof(uint16_t) * types */ - uint32_t tid GNUNET_PACKED; + struct GNUNET_MessageHeader header; + uint16_t applications GNUNET_PACKED; + uint16_t types GNUNET_PACKED; + /* uint16_t list_apps[applications] */ + /* uint16_t list_types[types] */ +}; - /** - * Information about speed requirements. If the tunnel cannot sustain the - * minimum bandwidth, packets are to be dropped. - */ - uint32_t speed_min GNUNET_PACKED; - /** - * path_length structs defining the *whole* path from the origin [0] to the - * final destination [path_length-1]. - */ - // struct GNUNET_PeerIdentity peers[path_length]; -}; +/** + * Type for tunnel numbering. + * - Local tunnel numbers given by the service (incoming) are >= 0xB0000000 + * - Local tunnel numbers given by the client (created) are >= 0x80000000 + * - Global tunnel numbers are < 0x80000000 + */ +typedef uint32_t MESH_TunnelNumber; /** - * Message for mesh data traffic to all tunnel targets. + * Message for a client to create and destroy tunnels. */ -struct GNUNET_MESH_OriginMulticast +struct GNUNET_MESH_TunnelMessage { /** - * Type: GNUNET_MESSAGE_TYPE_DATA_MULTICAST + * Type: GNUNET_MESSAGE_TYPE_MESH_LOCAL_TUNNEL_[CREATE|DESTROY] + * + * Size: sizeof(struct GNUNET_MESH_TunnelMessage) */ - struct GNUNET_MessageHeader header; + struct GNUNET_MessageHeader header; /** - * TID of the tunnel + * ID of a tunnel controlled by this client. */ - uint32_t tid GNUNET_PACKED; + MESH_TunnelNumber tunnel_id GNUNET_PACKED; +}; + +/** + * Message for the service to let a client know about created tunnels. + */ +struct GNUNET_MESH_TunnelNotification +{ /** - * OID of the tunnel + * Type: GNUNET_MESSAGE_TYPE_MESH_LOCAL_TUNNEL_CREATE + * + * Size: sizeof(struct GNUNET_MESH_TunnelMessage) */ - struct GNUNET_PeerIdentity oid; + struct GNUNET_MessageHeader header; /** - * FIXME: Some form of authentication + * ID of a tunnel controlled by this client. */ - // uint32_t token; + MESH_TunnelNumber tunnel_id GNUNET_PACKED; /** - * Payload follows + * Peer at the other end, if any */ + struct GNUNET_PeerIdentity peer; }; - /** - * Message for mesh data traffic to a particular destination from origin. + * Message for: + * - request adding and deleting peers from a tunnel + * - notify the client that peers have connected: + * -- requested + * -- unrequested (new incoming tunnels) + * - notify the client that peers have disconnected */ -struct GNUNET_MESH_DataMessageFromOrigin +struct GNUNET_MESH_PeerControl { - /** - * Type: GNUNET_MESSAGE_TYPE_DATA_MESSAGE_FROM_ORIGIN - */ - struct GNUNET_MessageHeader header; - /** - * TID of the tunnel - */ - uint32_t tid GNUNET_PACKED; + /** + * Type: GNUNET_MESSAGE_TYPE_MESH_LOCAL_CONNECT_PEER_[ADD|DEL] + * (client to service, client created tunnel) + * GNUNET_MESSAGE_TYPE_MESH_LOCAL_PEER_[CONNECTED|DISCONNECTED] + * (service to client) + * + * Size: sizeof(struct GNUNET_MESH_PeerControl) + */ + struct GNUNET_MessageHeader header; + + /** + * ID of a tunnel controlled by this client. + */ + MESH_TunnelNumber tunnel_id GNUNET_PACKED; + + /** + * Peer to connect/disconnect. + */ + struct GNUNET_PeerIdentity peer; +}; - /** - * OID of the tunnel - */ - struct GNUNET_PeerIdentity oid; +/** + * Message for connecting to peers offering a certain service. + */ +struct GNUNET_MESH_ConnectPeerByType +{ /** - * Destination. + * Type: GNUNET_MESSAGE_TYPE_MESH_LOCAL_CONNECT_PEER_BY_TYPE | + * GNUNET_MESSAGE_TYPE_MESH_LOCAL_DISCONNECT_PEER_BY_TYPE */ - struct GNUNET_PeerIdentity destination; + struct GNUNET_MessageHeader header; - /** - * FIXME: Some form of authentication - */ - // uint32_t token; + /** + * ID of a tunnel controlled by this client. + */ + MESH_TunnelNumber tunnel_id GNUNET_PACKED; - /** - * Payload follows - */ + /** + * Type specification + */ + GNUNET_MESH_ApplicationType type GNUNET_PACKED; }; +GNUNET_NETWORK_STRUCT_END +/******************************************************************************/ +/************************ ENUMERATIONS ****************************/ +/******************************************************************************/ /** - * Message for mesh data traffic from a tunnel participant to origin. + * All the states a peer participating in a tunnel can be in. */ -struct GNUNET_MESH_DataMessageToOrigin +enum MeshPeerState { /** - * Type: GNUNET_MESSAGE_TYPE_DATA_MESSAGE_TO_ORIGIN - */ - struct GNUNET_MessageHeader header; - - /** - * TID of the tunnel - */ - uint32_t tid GNUNET_PACKED; - - /** - * OID of the tunnel + * Uninitialized status, should never appear in operation. */ - struct GNUNET_PeerIdentity oid; + MESH_PEER_INVALID, /** - * Sender of the message. + * Peer is the root and owner of the tree */ - struct GNUNET_PeerIdentity sender; + MESH_PEER_ROOT, /** - * FIXME: Some form of authentication + * Peer only retransmits traffic, is not a final destination */ - // uint32_t token; + MESH_PEER_RELAY, /** - * Payload follows + * Path to the peer not known yet */ -}; + MESH_PEER_SEARCHING, -/** - * Message for mesh flow control - */ -struct GNUNET_MESH_SpeedNotify -{ /** - * Type: GNUNET_MESSAGE_TYPE_DATA_SPEED_NOTIFY + * Request sent, not yet answered. */ - struct GNUNET_MessageHeader header; + MESH_PEER_WAITING, /** - * TID of the tunnel + * Peer connected and ready to accept data */ - uint32_t tid GNUNET_PACKED; + MESH_PEER_READY, /** - * OID of the tunnel + * Peer connected previosly but not responding */ - struct GNUNET_PeerIdentity oid; + MESH_PEER_RECONNECTING +}; - /** - * Slowest link down the path (above minimum speed requirement). - */ - uint32_t speed_min; -}; #endif