diff options
Diffstat (limited to 'src/mesh/mesh.h')
-rw-r--r-- | src/mesh/mesh.h | 247 |
1 files changed, 219 insertions, 28 deletions
diff --git a/src/mesh/mesh.h b/src/mesh/mesh.h index d8fc404..a5a817c 100644 --- a/src/mesh/mesh.h +++ b/src/mesh/mesh.h @@ -25,10 +25,21 @@ #ifndef MESH_H_ #define MESH_H_ + +#ifdef __cplusplus +extern "C" +{ +#if 0 /* keep Emacsens' auto-indent happy */ +} +#endif +#endif + #include <stdint.h> #define MESH_DEBUG GNUNET_YES +#define INITIAL_WINDOW_SIZE 8 +#define ACK_THRESHOLD INITIAL_WINDOW_SIZE / 2 #include "platform.h" #include "gnunet_common.h" @@ -52,20 +63,29 @@ * * tunnel_create GNUNET_MESH_TunnelMessage * tunnel_destroy GNUNET_MESH_TunnelMessage + * tunnel_speed_max GNUNET_MESH_TunnelMessage + * tunnel_speed_min GNUNET_MESH_TunnelMessage + * tunnel_buffer 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 + * peer_request_connect_by_string GNUNET_MESH_ConnectPeerByString + * + * peer_blacklist GNUNET_MESH_PeerControl + * peer_unblacklist GNUNET_MESH_PeerControl * - * notify_transmit_ready *GNUNET_MESH_TransmitReady?* + * notify_transmit_ready None (queue / GNUNET_CLIENT_ntf_tmt_rdy) * notify_transmit_ready_cancel None (clear of internal data structures) * - * - * + * * EVENT MESSAGE USED * ----- ------------ - * data GNUNET_MESH_Data OR - * GNUNET_MESH_DataBroadcast + * data GNUNET_MESH_Unicast OR + * GNUNET_MESH_Multicast OR + * GNUNET_MESH_ToOrigin + * data ack GNUNET_MESH_LocalAck + * * new incoming tunnel GNUNET_MESH_PeerControl * peer connects to a tunnel GNUNET_MESH_PeerControl * peer disconnects from a tunnel GNUNET_MESH_PeerControl @@ -75,11 +95,13 @@ /************************** CONSTANTS ******************************/ /******************************************************************************/ -#define GNUNET_MESH_LOCAL_TUNNEL_ID_CLI 0x80000000 -#define GNUNET_MESH_LOCAL_TUNNEL_ID_SERV 0xB0000000 +#define GNUNET_MESH_LOCAL_TUNNEL_ID_CLI 0x80000000 +#define GNUNET_MESH_LOCAL_TUNNEL_ID_SERV 0xB0000000 + +#define HIGH_PID 0xFFFF0000 +#define LOW_PID 0x0000FFFF -#define CORE_QUEUE_SIZE 10 -#define LOCAL_QUEUE_SIZE 100 +#define PID_OVERFLOW(pid, max) (pid > HIGH_PID && max < LOW_PID) /******************************************************************************/ /************************** MESSAGES ******************************/ @@ -102,7 +124,7 @@ struct GNUNET_MESH_ClientConnect struct GNUNET_MessageHeader header; uint16_t applications GNUNET_PACKED; uint16_t types GNUNET_PACKED; - /* uint16_t list_apps[applications] */ + /* uint32_t list_apps[applications] */ /* uint16_t list_types[types] */ }; @@ -122,6 +144,7 @@ struct GNUNET_MESH_TunnelMessage { /** * Type: GNUNET_MESSAGE_TYPE_MESH_LOCAL_TUNNEL_[CREATE|DESTROY] + * GNUNET_MESSAGE_TYPE_MESH_LOCAL_TUNNEL_[MAX|MIN] * * Size: sizeof(struct GNUNET_MESH_TunnelMessage) */ @@ -155,8 +178,39 @@ struct GNUNET_MESH_TunnelNotification * Peer at the other end, if any */ struct GNUNET_PeerIdentity peer; + + /** + * Tunnel options (speed, buffering) + */ + uint32_t opt; +}; + +/** + * Message for announce of regular expressions. + */ +struct GNUNET_MESH_RegexAnnounce +{ + /** + * Type: GNUNET_MESSAGE_TYPE_MESH_LOCAL_ANNOUNCE_REGEX + * + * Size: sizeof(struct GNUNET_MESH_RegexAnnounce) + strlen (regex) + */ + struct GNUNET_MessageHeader header; + + /** + * How many characters do we want to put in an edge label. + */ + uint16_t compression_characters; + + /** + * Is this the last message for this regex? (for regex > 65k) + */ + int16_t last; + + /* regex payload */ }; + /** * Message for: * - request adding and deleting peers from a tunnel @@ -168,49 +222,131 @@ struct GNUNET_MESH_TunnelNotification struct GNUNET_MESH_PeerControl { - /** - * 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_CONNECT_PEER_[ADD|DEL|[UN]BLACKLIST] + * (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. - */ + /** + * ID of a tunnel controlled by this client. + */ MESH_TunnelNumber tunnel_id GNUNET_PACKED; - /** - * Peer to connect/disconnect. - */ + /** + * Peer to connect/disconnect. + */ struct GNUNET_PeerIdentity peer; }; /** - * Message for connecting to peers offering a certain service. + * Message for connecting to peers offering a service, by service number. */ struct GNUNET_MESH_ConnectPeerByType { /** * Type: GNUNET_MESSAGE_TYPE_MESH_LOCAL_CONNECT_PEER_BY_TYPE | * GNUNET_MESSAGE_TYPE_MESH_LOCAL_DISCONNECT_PEER_BY_TYPE + * + * Size: sizeof(struct GNUNET_MESH_ConnectPeerByType) */ struct GNUNET_MessageHeader header; + /** + * ID of a tunnel controlled by this client. + */ + MESH_TunnelNumber tunnel_id GNUNET_PACKED; + + /** + * Type specification + */ + GNUNET_MESH_ApplicationType type GNUNET_PACKED; +}; + + +/** + * Message for connecting to peers offering a service, by service string. + */ +struct GNUNET_MESH_ConnectPeerByString +{ + /** + * Type: GNUNET_MESSAGE_TYPE_MESH_LOCAL_PEER_ADD_BY_STRING + * + * Size: sizeof(struct GNUNET_MESH_ConnectPeerByString) + strlen (string) + */ + struct GNUNET_MessageHeader header; + + /** + * ID of a tunnel controlled by this client. + */ + MESH_TunnelNumber tunnel_id GNUNET_PACKED; + + /* String describing the service */ +}; + + +/** + * Message to allow the client send more data to the service + * (always service -> client). + */ +struct GNUNET_MESH_LocalAck +{ + /** + * Type: GNUNET_MESSAGE_TYPE_MESH_LOCAL_ACK + */ + struct GNUNET_MessageHeader header; + + /** + * ID of the tunnel allowed to send more data. + */ + MESH_TunnelNumber tunnel_id GNUNET_PACKED; + + /** + * ID of the last packet allowed. + */ + uint32_t max_pid GNUNET_PACKED; +}; + + +/** + * Message to inform the client about tunnels in the service. + */ +struct GNUNET_MESH_LocalMonitor +{ /** - * ID of a tunnel controlled by this client. + * Type: GNUNET_MESSAGE_TYPE_MESH_LOCAL_MONITOR[_TUNNEL] + */ + struct GNUNET_MessageHeader header; + + /** + * ID of the tunnel allowed to send more data. */ MESH_TunnelNumber tunnel_id GNUNET_PACKED; /** - * Type specification + * Number of peers in the tunnel. */ - GNUNET_MESH_ApplicationType type GNUNET_PACKED; + uint32_t npeers GNUNET_PACKED; + + /** + * Alignment. + */ + uint32_t reserved GNUNET_PACKED; + + /** + * ID of the owner of the tunnel (can be local peer). + */ + struct GNUNET_PeerIdentity owner; + + /* struct GNUNET_PeerIdentity peers[npeers] */ }; + + GNUNET_NETWORK_STRUCT_END /******************************************************************************/ @@ -259,5 +395,60 @@ enum MeshPeerState }; +/** + * 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 +GMC_is_pid_bigger (uint32_t bigger, uint32_t smaller); + + +/** + * 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 +GMC_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 +GMC_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 * +GNUNET_MESH_DEBUG_M2S (uint16_t m); + +#if 0 /* keep Emacsens' auto-indent happy */ +{ +#endif +#ifdef __cplusplus +} +#endif #endif |