X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fmesh%2Fmesh.h;h=7011bd51ac6ebf495b58ef6603c064d527e22c64;hb=e43078b68951ad8a3daa3a193473e9c321549e1d;hp=38f0486fbe011a5dce1f83c0e758231d897fc68a;hpb=8153b07b74e4fc34992dee4360173389656bb366;p=oweals%2Fgnunet.git diff --git a/src/mesh/mesh.h b/src/mesh/mesh.h index 38f0486fb..7011bd51a 100644 --- a/src/mesh/mesh.h +++ b/src/mesh/mesh.h @@ -25,217 +25,279 @@ #ifndef MESH_H_ #define MESH_H_ + +#ifdef __cplusplus +extern "C" +{ +#if 0 /* keep Emacsens' auto-indent happy */ +} +#endif +#endif + #include -#include -#include "gnunet_common.h" +#define MESH_DEBUG GNUNET_YES -/******************************************************************************/ -/******************** 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 - * ----- ------------ - * notify_transmit_ready reply GNUNET_MESH_TransmitReady - * notify_transmit_ready 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 - */ +#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_TUNNEL_ID_MARK 0x80000000 +#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 a client to register to the service */ -struct GNUNET_MESH_ClientConnect { +struct GNUNET_MESH_ClientConnect +{ /** * Type: GNUNET_MESSAGE_TYPE_MESH_LOCAL_CONNECT * * Size: sizeof(struct GNUNET_MESH_ClientConnect) + - * sizeof(uint16_t) * types + - * sizeof(MESH_ApplicationType) * applications + * sizeof(MESH_ApplicationType) * applications + + * sizeof(uint16_t) * types */ - struct GNUNET_MessageHeader header; - uint16_t types GNUNET_PACKED; - uint16_t applications GNUNET_PACKED; - /* uint16_t list_types[types] */ - /* uint16_t list_apps[applications] */ + struct GNUNET_MessageHeader header; + /* uint32_t list_ports[] */ }; /** - * Type for tunnel numbering. - * - Local tunnel numbers are >= 0x80000000 - * - Global tunnel numbers are < 0x80000000 + * 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_TunnelNumber; +typedef uint32_t MESH_ChannelNumber; + /** - * Message for a client to create and destroy tunnels. + * Message for a client to create and destroy channels. */ -struct GNUNET_MESH_TunnelMessage { +struct GNUNET_MESH_ChannelMessage +{ /** * Type: GNUNET_MESSAGE_TYPE_MESH_LOCAL_TUNNEL_[CREATE|DESTROY] * - * Size: sizeof(struct GNUNET_MESH_TunnelMessage) + * Size: sizeof(struct GNUNET_MESH_ChannelMessage) + */ + struct GNUNET_MessageHeader header; + + /** + * ID of a channel controlled by this client. + */ + MESH_ChannelNumber channel_id GNUNET_PACKED; + + /** + * Channel's peer + */ + struct GNUNET_PeerIdentity peer; + + /** + * Port of the channel. + */ + uint32_t port GNUNET_PACKED; + + /** + * Options. + */ + uint32_t opt GNUNET_PACKED; +}; + + +/** + * Message for mesh data traffic. + */ +struct GNUNET_MESH_LocalData +{ + /** + * Type: GNUNET_MESSAGE_TYPE_MESH_LOCAL_DATA + */ + struct GNUNET_MessageHeader header; + + /** + * ID of the channel */ - struct GNUNET_MessageHeader header; + uint32_t id GNUNET_PACKED; /** - * ID of a tunnel controlled by this client. + * Payload follows */ - MESH_TunnelNumber tunnel_id GNUNET_PACKED; }; + /** - * 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 + * Message to allow the client send more data to the service + * (always service -> client). */ -struct GNUNET_MESH_PeerControl { +struct GNUNET_MESH_LocalAck +{ + /** + * Type: GNUNET_MESSAGE_TYPE_MESH_LOCAL_ACK + */ + struct GNUNET_MessageHeader header; + /** + * ID of the channel allowed to send more data. + */ + MESH_ChannelNumber channel_id GNUNET_PACKED; + +}; + + +/** + * Message to inform the client about channels in the service. + */ +struct GNUNET_MESH_LocalInfo +{ /** - * 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) + * Type: GNUNET_MESSAGE_TYPE_MESH_LOCAL_INFO[_TUNNEL] */ - struct GNUNET_MessageHeader header; + struct GNUNET_MessageHeader header; /** - * ID of a tunnel controlled by this client. + * ID of the channel allowed to send more data. */ - MESH_TunnelNumber tunnel_id GNUNET_PACKED; - + MESH_ChannelNumber channel_id GNUNET_PACKED; + /** - * Peer to connect/disconnect. + * ID of the owner of the channel (can be local peer). */ - struct GNUNET_PeerIdentity peer; -}; +// struct GNUNET_PeerIdentity owner; + /** + * ID of the destination of the channel (can be local peer). + */ + struct GNUNET_PeerIdentity peer; +}; /** - * Message for connecting to peers offering a certain service. + * Message to inform the client about one of the tunnels in the service. */ -struct GNUNET_MESH_ConnectPeerByType { - /** - * Type: GNUNET_MESSAGE_TYPE_MESH_LOCAL_CONNECT_PEER_BY_TYPE - */ - struct GNUNET_MessageHeader header; +struct GNUNET_MESH_LocalInfoTunnel +{ + /** + * Type: GNUNET_MESSAGE_TYPE_MESH_LOCAL_INFO_TUNNEL[S] + */ + struct GNUNET_MessageHeader header; /** - * ID of a tunnel controlled by this client. + * Number of channels. */ - MESH_TunnelNumber tunnel_id GNUNET_PACKED; - + uint32_t channels GNUNET_PACKED; + /** - * Type specification + * ID of the destination of the tunnel (can be local peer). */ - GNUNET_MESH_ApplicationType type GNUNET_PACKED; -}; + struct GNUNET_PeerIdentity destination; + /** + * Number of connections. + */ + uint32_t connections GNUNET_PACKED; -/** - * Message for notifying the service that the client wants to send data or - * notifying a client that the service is ready to accept data. - */ -struct GNUNET_MESH_TransmitReady { - /** - * Type: GNUNET_MESSAGE_TYPE_MESH_LOCAL_REQUEST_TRANSMIT_READY - * GNUNET_MESSAGE_TYPE_MESH_LOCAL_NOTIFY_TRANSMIT_READY - */ - struct GNUNET_MessageHeader header; + /** + * Encryption state. + */ + uint16_t estate GNUNET_PACKED; - /** - * ID of a tunnel controlled by this client. - */ - MESH_TunnelNumber tunnel_id GNUNET_PACKED; + /** + * Connection state. + */ + uint16_t cstate GNUNET_PACKED; - /** - * Size of message we would like to transmit to this tunnel - */ - uint32_t msg_size GNUNET_PACKED; + /* If TUNNEL (no 'S'): GNUNET_PeerIdentity connection_ids[connections] */ + /* If TUNNEL (no 'S'): uint32_t channel_ids[channels] */ }; +GNUNET_NETWORK_STRUCT_END + + + /** - * Message to encapsulate data transmitted to/from the service + * @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_Data { - /** - * Type: GNUNET_MESSAGE_TYPE_MESH_LOCAL_DATA - * (client to service, or service to client) - * Size: sizeof(struct GNUNET_MESH_Data) + sizeof (data) - */ - struct GNUNET_MessageHeader header; +char * +GM_f2s (int fwd); - /** - * ID of a tunnel in which this client participates. - */ - MESH_TunnelNumber tunnel_id GNUNET_PACKED; - /** - * Source or destination of the message (depending on direction). - */ - struct GNUNET_PeerIdentity peer_id; +/** + * 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); - /* uint8_t data[] */ -}; /** - * Message to encapsulate broadcast data transmitted to the service + * 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. */ -struct GNUNET_MESH_DataBroadcast { - /** - * Type: GNUNET_MESSAGE_TYPE_MESH_LOCAL_DATA_BROADCAST - * (client to service only, client created tunnel) - * Size: sizeof(struct GNUNET_MESH_DataBroadcast) + sizeof (data) - */ - struct GNUNET_MessageHeader header; +uint32_t +GM_max_pid (uint32_t a, uint32_t b); - /** - * ID of a tunnel controlled by this client. - */ - MESH_TunnelNumber tunnel_id GNUNET_PACKED; - /* uint8_t data[] */ -}; +/** + * 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