X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fmesh%2Fmesh.h;h=7011bd51ac6ebf495b58ef6603c064d527e22c64;hb=e43078b68951ad8a3daa3a193473e9c321549e1d;hp=e51b0c890e50a4b250a7c6b91e39fe020e643029;hpb=562b33143ee9fa431a68ea6741e4feb3ba388f83;p=oweals%2Fgnunet.git diff --git a/src/mesh/mesh.h b/src/mesh/mesh.h index e51b0c890..7011bd51a 100644 --- a/src/mesh/mesh.h +++ b/src/mesh/mesh.h @@ -21,180 +21,283 @@ /** * @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_ + +#ifdef __cplusplus +extern "C" +{ +#if 0 /* keep Emacsens' auto-indent happy */ +} +#endif +#endif + #include -#include "gnunet_common.h" + +#define MESH_DEBUG GNUNET_YES + +#include "platform.h" +#include "gnunet_util_lib.h" +#include "gnunet_peer_lib.h" +#include "gnunet_core_service.h" +#include "gnunet_protocols.h" +#include + +/******************************************************************************/ +/************************** CONSTANTS ******************************/ +/******************************************************************************/ + +#define GNUNET_MESH_LOCAL_CHANNEL_ID_CLI 0x80000000 +#define GNUNET_MESH_LOCAL_CHANNEL_ID_SERV 0xB0000000 + +#define HIGH_PID 0xFFFF0000 +#define LOW_PID 0x0000FFFF + +#define PID_OVERFLOW(pid, max) (pid > HIGH_PID && max < LOW_PID) + +/******************************************************************************/ +/************************** 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) + * Size: sizeof(struct GNUNET_MESH_ClientConnect) + + * sizeof(MESH_ApplicationType) * applications + + * sizeof(uint16_t) * types */ - struct GNUNET_MessageHeader header; + struct GNUNET_MessageHeader header; + /* uint32_t list_ports[] */ +}; - /** - * Id of the tunnel this path belongs to, unique in conjunction with the origin. - */ - uint32_t tid GNUNET_PACKED; - /** - * Information about speed requirements. If the tunnel cannot sustain the - * minimum bandwidth, packets are to be dropped. - */ - uint32_t speed_min GNUNET_PACKED; +/** + * Type for channel numbering. + * - Local channel numbers given by the service (incoming) are >= 0xB0000000 + * - Local channel numbers given by the client (created) are >= 0x80000000 + * - Global channel numbers are < 0x80000000 + */ +typedef uint32_t MESH_ChannelNumber; - /** - * path_length structs defining the *whole* path from the origin [0] to the - * final destination [path_length-1]. - */ - // struct GNUNET_PeerIdentity peers[path_length]; -}; /** - * Message for mesh data traffic to all tunnel targets. + * Message for a client to create and destroy channels. */ -struct GNUNET_MESH_OriginMulticast +struct GNUNET_MESH_ChannelMessage { /** - * Type: GNUNET_MESSAGE_TYPE_DATA_MULTICAST + * Type: GNUNET_MESSAGE_TYPE_MESH_LOCAL_TUNNEL_[CREATE|DESTROY] + * + * Size: sizeof(struct GNUNET_MESH_ChannelMessage) */ - struct GNUNET_MessageHeader header; + struct GNUNET_MessageHeader header; /** - * TID of the tunnel + * ID of a channel controlled by this client. */ - uint32_t tid GNUNET_PACKED; + MESH_ChannelNumber channel_id GNUNET_PACKED; /** - * OID of the tunnel + * Channel's peer */ - struct GNUNET_PeerIdentity oid; + struct GNUNET_PeerIdentity peer; /** - * FIXME: Some form of authentication + * Port of the channel. */ - // uint32_t token; + uint32_t port GNUNET_PACKED; /** - * Payload follows + * Options. */ + uint32_t opt GNUNET_PACKED; }; /** - * Message for mesh data traffic to a particular destination from origin. + * Message for mesh data traffic. */ -struct GNUNET_MESH_DataMessageFromOrigin +struct GNUNET_MESH_LocalData { /** - * Type: GNUNET_MESSAGE_TYPE_DATA_MESSAGE_FROM_ORIGIN + * Type: GNUNET_MESSAGE_TYPE_MESH_LOCAL_DATA */ - struct GNUNET_MessageHeader header; + struct GNUNET_MessageHeader header; /** - * TID of the tunnel + * ID of the channel */ - uint32_t tid GNUNET_PACKED; + uint32_t id GNUNET_PACKED; /** - * OID of the tunnel + * Payload follows */ - struct GNUNET_PeerIdentity oid; +}; - /** - * Destination. - */ - struct GNUNET_PeerIdentity destination; +/** + * Message to allow the client send more data to the service + * (always service -> client). + */ +struct GNUNET_MESH_LocalAck +{ /** - * FIXME: Some form of authentication + * Type: GNUNET_MESSAGE_TYPE_MESH_LOCAL_ACK */ - // uint32_t token; + struct GNUNET_MessageHeader header; /** - * Payload follows + * ID of the channel allowed to send more data. */ + MESH_ChannelNumber channel_id GNUNET_PACKED; + }; /** - * Message for mesh data traffic from a tunnel participant to origin. + * Message to inform the client about channels in the service. */ -struct GNUNET_MESH_DataMessageToOrigin +struct GNUNET_MESH_LocalInfo { - /** - * Type: GNUNET_MESSAGE_TYPE_DATA_MESSAGE_TO_ORIGIN - */ - struct GNUNET_MessageHeader header; + /** + * Type: GNUNET_MESSAGE_TYPE_MESH_LOCAL_INFO[_TUNNEL] + */ + struct GNUNET_MessageHeader header; + + /** + * ID of the channel allowed to send more data. + */ + MESH_ChannelNumber channel_id GNUNET_PACKED; + + /** + * ID of the owner of the channel (can be local peer). + */ +// struct GNUNET_PeerIdentity owner; + + /** + * ID of the destination of the channel (can be local peer). + */ + struct GNUNET_PeerIdentity peer; +}; - /** - * TID of the tunnel - */ - uint32_t tid GNUNET_PACKED; +/** + * Message to inform the client about one of the tunnels in the service. + */ +struct GNUNET_MESH_LocalInfoTunnel +{ + /** + * Type: GNUNET_MESSAGE_TYPE_MESH_LOCAL_INFO_TUNNEL[S] + */ + struct GNUNET_MessageHeader header; + + /** + * Number of channels. + */ + uint32_t channels GNUNET_PACKED; + + /** + * ID of the destination of the tunnel (can be local peer). + */ + struct GNUNET_PeerIdentity destination; + + /** + * Number of connections. + */ + uint32_t connections GNUNET_PACKED; + + /** + * Encryption state. + */ + uint16_t estate GNUNET_PACKED; + + /** + * Connection state. + */ + uint16_t cstate GNUNET_PACKED; + + /* If TUNNEL (no 'S'): GNUNET_PeerIdentity connection_ids[connections] */ + /* If TUNNEL (no 'S'): uint32_t channel_ids[channels] */ +}; - /** - * OID of the tunnel - */ - struct GNUNET_PeerIdentity oid; - /** - * Sender of the message. - */ - struct GNUNET_PeerIdentity sender; +GNUNET_NETWORK_STRUCT_END - /** - * FIXME: Some form of authentication - */ - // uint32_t token; - /** - * Payload follows - */ -}; /** - * Message for mesh flow control + * @brief Translate a fwd variable into a string representation, for logging. + * + * @param fwd Is FWD? (#GNUNET_YES or #GNUNET_NO) + * + * @return String representing FWD or BCK. */ -struct GNUNET_MESH_SpeedNotify -{ - /** - * Type: GNUNET_MESSAGE_TYPE_DATA_SPEED_NOTIFY - */ - struct GNUNET_MessageHeader header; +char * +GM_f2s (int fwd); - /** - * TID of the tunnel - */ - uint32_t tid GNUNET_PACKED; - /** - * OID of the tunnel - */ - struct GNUNET_PeerIdentity oid; +/** + * Check if one pid is bigger than other, accounting for overflow. + * + * @param bigger Argument that should be bigger. + * @param smaller Argument that should be smaller. + * + * @return True if bigger (arg1) has a higher value than smaller (arg 2). + */ +int +GM_is_pid_bigger (uint32_t bigger, uint32_t smaller); - /** - * Slowest link down the path (above minimum speed requirement). - */ - uint32_t speed_min; -}; +/** + * Get the higher ACK value out of two values, taking in account overflow. + * + * @param a First ACK value. + * @param b Second ACK value. + * + * @return Highest ACK value from the two. + */ +uint32_t +GM_max_pid (uint32_t a, uint32_t b); + + +/** + * Get the lower ACK value out of two values, taking in account overflow. + * + * @param a First ACK value. + * @param b Second ACK value. + * + * @return Lowest ACK value from the two. + */ +uint32_t +GM_min_pid (uint32_t a, uint32_t b); + + +/** + * Convert a message type into a string to help debug + * Generated with: + * FIND: "#define ([^ ]+)[ ]*([0-9]+)" + * REPLACE: " case \2: return "\1"; break;" + * + * @param m Message type. + * + * @return Human readable string description. + */ +const char * +GM_m2s (uint16_t m); + +#if 0 /* keep Emacsens' auto-indent happy */ +{ +#endif +#ifdef __cplusplus +} +#endif #endif