X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Ftransport%2Fplugin_transport_http.h;h=cbd780a585d68d1ccce50184dad7b203f767f61f;hb=658c3cf583b0c09e55c41a78a9ec8dbe28cb515e;hp=5264df5f942430ac56fe8f03f7e8886dcc9441bd;hpb=aa390e34b0b9e793e1c9f82a606ad0c10fcc84ca;p=oweals%2Fgnunet.git diff --git a/src/transport/plugin_transport_http.h b/src/transport/plugin_transport_http.h index 5264df5f9..cbd780a58 100644 --- a/src/transport/plugin_transport_http.h +++ b/src/transport/plugin_transport_http.h @@ -1,6 +1,6 @@ /* This file is part of GNUnet - (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Christian Grothoff (and other contributing authors) + Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 GNUnet e.V. GNUnet is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published @@ -14,8 +14,8 @@ You should have received a copy of the GNU General Public License along with GNUnet; see the file COPYING. If not, write to the - Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ /** @@ -23,6 +23,8 @@ * @brief http transport service plugin * @author Matthias Wachs */ +#ifndef PLUGIN_TRANSPORT_HTTP_H +#define PLUGIN_TRANSPORT_HTTP_H #include "platform.h" #include "gnunet_common.h" @@ -39,13 +41,17 @@ #include "gnunet_os_lib.h" #include "gnunet_nat_lib.h" #include "microhttpd.h" +#if HAVE_CURL_CURL_H #include +#elif HAVE_GNURL_CURL_H +#include +#endif -#define DEBUG_HTTP GNUNET_YES -#define VERBOSE_SERVER GNUNET_YES -#define VERBOSE_CLIENT GNUNET_YES -#define VERBOSE_CURL GNUNET_YES +#define DEBUG_HTTP GNUNET_EXTRA_LOGGING +#define VERBOSE_SERVER GNUNET_EXTRA_LOGGING +#define VERBOSE_CLIENT GNUNET_EXTRA_LOGGING +#define VERBOSE_CURL GNUNET_NO #if BUILD_HTTPS #define LIBGNUNET_PLUGIN_TRANSPORT_INIT libgnunet_plugin_transport_https_init @@ -59,7 +65,7 @@ #define OUTBOUND GNUNET_NO -#define HTTP_NOT_VALIDATED_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 3) +#define HTTP_NOT_VALIDATED_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 15) /** * Encapsulation of all of the state of the plugin. @@ -72,117 +78,312 @@ struct Plugin struct GNUNET_TRANSPORT_PluginEnvironment *env; /** - * List of open sessions. + * Head of linked list of open sessions. */ - struct Session *head; + struct GNUNET_ATS_Session *head; - struct Session *tail; + /** + * Tail of linked list of open sessions. + */ + struct GNUNET_ATS_Session *tail; /** * NAT handle & address management */ struct GNUNET_NAT_Handle *nat; - /** - * ipv4 DLL head + * Our own IPv4 addresses DLL head */ - struct IPv4HttpAddressWrapper *ipv4_addr_head; + struct HttpAddressWrapper *addr_head; /** - * ipv4 DLL tail + * Our own IPv4 addresses DLL tail */ - struct IPv4HttpAddressWrapper *ipv4_addr_tail; + struct HttpAddressWrapper *addr_tail; /** - * ipv6 DLL head + * External hostname the plugin can be connected to, can be different to + * the host's FQDN, used e.g. for reverse proxying */ - struct IPv6HttpAddressWrapper *ipv6_addr_head; + char *external_hostname; /** - * ipv6 DLL tail + * External hostname the plugin can be connected to, can be different to + * the host's FQDN, used e.g. for reverse proxying */ - struct IPv6HttpAddressWrapper *ipv6_addr_tail; + struct HttpAddress *ext_addr; + /** + * External address length + */ + size_t ext_addr_len; - /* Plugin configuration */ + /** + * Task calling transport service about external address + */ + struct GNUNET_SCHEDULER_Task * notify_ext_task; + /** + * Plugin name. + * Equals configuration section: transport-http, transport-https + */ char *name; + /** + * Plugin protocol + * http, https + */ char *protocol; + /** + * Use IPv4? #GNUNET_YES or #GNUNET_NO + */ int ipv4; + /** + * Use IPv6? #GNUNET_YES or #GNUNET_NO + */ int ipv6; + /** + * Does plugin just use outbound connections and not accept inbound? + */ + int client_only; + + /** + * Port used + */ uint16_t port; + /** + * Maximum number of sockets the plugin can use + * Each http inbound /outbound connections are two connections + */ int max_connections; + /** + * Number of outbound sessions + */ + unsigned int outbound_sessions; + /** + * Number of inbound sessions + */ + unsigned int inbound_sessions; - /* Plugin values */ + /** + * libCurl TLS crypto init string, can be set to enhance performance + * + * Example: + * + * Use RC4-128 instead of AES: + * NONE:+VERS-TLS1.0:+ARCFOUR-128:+SHA1:+RSA:+COMP-NULL + */ + char *crypto_init; + /** + * TLS key + */ + char *key; + /** + * TLS certificate + */ + char *cert; + + /** + * Current number of establishes connections + */ int cur_connections; - uint32_t last_tag; - /* - * Server handles + + /** + * Last used unique HTTP connection tag */ + uint32_t last_tag; + /** + * MHD IPv4 daemon + */ struct MHD_Daemon *server_v4; - GNUNET_SCHEDULER_TaskIdentifier server_v4_task; - struct MHD_Daemon *server_v6; - GNUNET_SCHEDULER_TaskIdentifier server_v6_task; + /** + * MHD IPv4 task + */ + struct GNUNET_SCHEDULER_Task * server_v4_task; - struct sockaddr_in * server_addr_v4; - struct sockaddr_in6 * server_addr_v6; + /** + * The IPv4 server is scheduled to run asap + */ + int server_v4_immediately; - char *crypto_init; - char *key; - char *cert; + /** + * MHD IPv6 daemon + */ + struct MHD_Daemon *server_v6; - struct Session *server_semi_head; + /** + * MHD IPv4 task + */ + struct GNUNET_SCHEDULER_Task * server_v6_task; - struct Session *server_semi_tail; + /** + * The IPv6 server is scheduled to run asap + */ + int server_v6_immediately; + /** + * IPv4 server socket to bind to + */ + struct sockaddr_in *server_addr_v4; + /** + * IPv6 server socket to bind to + */ + struct sockaddr_in6 *server_addr_v6; - /* - * Client handles + /** + * Head of server semi connections + * A full session consists of 2 semi-connections: send and receive + * If not both directions are established the server keeps this sessions here */ + struct GNUNET_ATS_Session *server_semi_head; + + /** + * Tail of server semi connections + * A full session consists of 2 semi-connections: send and receive + * If not both directions are established the server keeps this sessions here + */ + struct GNUNET_ATS_Session *server_semi_tail; /** * cURL Multihandle */ CURLM *client_mh; - GNUNET_SCHEDULER_TaskIdentifier client_perform_task; + /** + * curl perform task + */ + struct GNUNET_SCHEDULER_Task * client_perform_task; + +}; + +GNUNET_NETWORK_STRUCT_BEGIN + +/** + * HTTP addresses including a full URI + */ +struct HttpAddress +{ + /** + * Length of the address following in NBO + */ + uint32_t addr_len GNUNET_PACKED; + /** + * Address following + */ + void *addr GNUNET_PACKED; }; +/** + * IPv4 addresses + */ +struct IPv4HttpAddress +{ + /** + * IPv4 address, in network byte order. + */ + uint32_t ipv4_addr GNUNET_PACKED; + + /** + * Port number, in network byte order. + */ + uint16_t u4_port GNUNET_PACKED; +}; + +/** + * IPv4 addresses + */ +struct IPv6HttpAddress +{ + /** + * IPv6 address. + */ + struct in6_addr ipv6_addr GNUNET_PACKED; + + /** + * Port number, in network byte order. + */ + uint16_t u6_port GNUNET_PACKED; +}; +GNUNET_NETWORK_STRUCT_END + + +struct ServerRequest +{ + /** + * _RECV or _SEND + */ + int direction; + + /** + * Should this connection get disconnected? #GNUNET_YES / #GNUNET_NO + */ + int disconnect; + + /** + * The session this server connection belongs to + */ + struct GNUNET_ATS_Session *session; + + /** + * The MHD connection + */ + struct MHD_Connection *mhd_conn; +}; + + /** * Session handle for connections. */ -struct Session +struct GNUNET_ATS_Session { + /** + * To whom are we talking to + */ + struct GNUNET_PeerIdentity target; /** * Stored in a linked list. */ - struct Session *next; + struct GNUNET_ATS_Session *next; /** * Stored in a linked list. */ - struct Session *prev; + struct GNUNET_ATS_Session *prev; /** * Pointer to the global plugin struct. */ struct Plugin *plugin; + /** + * Address + */ + void *addr; + + /** + * Address length + */ + size_t addrlen; + + /** + * ATS network type in NBO + */ + uint32_t ats_address_network_type; + /** * next pointer for double linked list */ @@ -193,67 +394,67 @@ struct Session */ struct HTTP_Message *msg_tail; - /** - * message stream tokenizer for incoming data + * Message stream tokenizer for incoming data */ struct GNUNET_SERVER_MessageStreamTokenizer *msg_tk; /** - * Continuation function to call once the transmission buffer - * has again space available. NULL if there is no - * continuation to call. + * Absolute time when to receive data again + * Used for receive throttling */ - GNUNET_TRANSPORT_TransmitContinuation transmit_cont; - - - void *addr; - - size_t addrlen; + struct GNUNET_TIME_Absolute next_receive; /** - * Closure for transmit_cont. + * Inbound or outbound connection + * Outbound: #GNUNET_NO (client is used to send and receive) + * Inbound : #GNUNET_YES (server is used to send and receive) */ - void *transmit_cont_cls; + int inbound; /** - * To whom are we talking to (set to our identity - * if we are still waiting for the welcome message) + * Unique HTTP/S connection tag for this connection */ - struct GNUNET_PeerIdentity target; + uint32_t tag; /** - * At what time did we reset last_received last? + * Client send handle */ - //struct GNUNET_TIME_Absolute last_quota_update; + void *client_put; /** - * How many bytes have we received since the "last_quota_update" - * timestamp? + * Client receive handle */ - //uint64_t last_received; + void *client_get; /** - * Number of bytes per ms that this peer is allowed - * to send to us. + * Task to wake up client receive handle when receiving is allowed again */ - //uint32_t quota; + struct GNUNET_SCHEDULER_Task * recv_wakeup_task; + /** + * Session timeout task + */ + struct GNUNET_SCHEDULER_Task * timeout_task; - int inbound; - - void *client_put; - void *client_get; - int put_paused; + /** + * Is client send handle paused since there are no data to send? + * #GNUNET_YES or #GNUNET_NO + */ + int client_put_paused; - void *server_recv; - void *server_send; - struct GNUNET_TIME_Absolute delay; - GNUNET_SCHEDULER_TaskIdentifier reset_task; - uint32_t tag; + /** + * Client send handle + */ + struct ServerRequest *server_recv; + /** + * Client send handle + */ + struct ServerRequest *server_send; }; + /** * Message to send using http */ @@ -292,59 +493,90 @@ struct HTTP_Message GNUNET_TRANSPORT_TransmitContinuation transmit_cont; /** - * Closure for transmit_cont. + * Closure for @e transmit_cont. */ void *transmit_cont_cls; }; + +struct GNUNET_ATS_Session * +create_session (struct Plugin *plugin, + const struct GNUNET_PeerIdentity *target, + const void *addr, + size_t addrlen); + + +int +exist_session (struct Plugin *plugin, + struct GNUNET_ATS_Session *s); + + void -delete_session (struct Session *s); +delete_session (struct GNUNET_ATS_Session *s); + + +int +exist_session (struct Plugin *plugin, + struct GNUNET_ATS_Session *s); -struct Session * -create_session (struct Plugin *plugin, const struct GNUNET_PeerIdentity *target, - const void *addr, size_t addrlen, - GNUNET_TRANSPORT_TransmitContinuation cont, void *cont_cls); struct GNUNET_TIME_Relative -http_plugin_receive (void *cls, const struct GNUNET_PeerIdentity * peer, - const struct GNUNET_MessageHeader * message, - struct Session * session, - const char *sender_address, - uint16_t sender_address_len); +http_plugin_receive (void *cls, + const struct GNUNET_PeerIdentity *peer, + const struct GNUNET_MessageHeader *message, + struct GNUNET_ATS_Session *session, + const char *sender_address, + uint16_t sender_address_len); + const char * -http_plugin_address_to_string (void *cls, const void *addr, size_t addrlen); +http_plugin_address_to_string (void *cls, + const void *addr, + size_t addrlen); + int -client_disconnect (struct Session *s); +client_disconnect (struct GNUNET_ATS_Session *s); + int -client_connect (struct Session *s); +client_connect (struct GNUNET_ATS_Session *s); + int -client_send (struct Session *s, struct HTTP_Message *msg); +client_send (struct GNUNET_ATS_Session *s, struct HTTP_Message *msg); + int client_start (struct Plugin *plugin); + void client_stop (struct Plugin *plugin); + int -server_disconnect (struct Session *s); +server_disconnect (struct GNUNET_ATS_Session *s); + int -server_send (struct Session *s, struct HTTP_Message * msg); +server_send (struct GNUNET_ATS_Session *s, struct HTTP_Message *msg); + int server_start (struct Plugin *plugin); + void server_stop (struct Plugin *plugin); + void notify_session_end (void *cls, - const struct GNUNET_PeerIdentity * - peer, struct Session * s); + const struct GNUNET_PeerIdentity *peer, + struct GNUNET_ATS_Session *s); + +/*#ifndef PLUGIN_TRANSPORT_HTTP_H*/ +#endif /* end of plugin_transport_http.h */