1*663afb9bSAndroid Build Coastguard Worker /* 2*663afb9bSAndroid Build Coastguard Worker * Copyright (c) 2000-2007 Niels Provos <[email protected]> 3*663afb9bSAndroid Build Coastguard Worker * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson 4*663afb9bSAndroid Build Coastguard Worker * 5*663afb9bSAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without 6*663afb9bSAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions 7*663afb9bSAndroid Build Coastguard Worker * are met: 8*663afb9bSAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright 9*663afb9bSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer. 10*663afb9bSAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright 11*663afb9bSAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the 12*663afb9bSAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution. 13*663afb9bSAndroid Build Coastguard Worker * 3. The name of the author may not be used to endorse or promote products 14*663afb9bSAndroid Build Coastguard Worker * derived from this software without specific prior written permission. 15*663afb9bSAndroid Build Coastguard Worker * 16*663afb9bSAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17*663afb9bSAndroid Build Coastguard Worker * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18*663afb9bSAndroid Build Coastguard Worker * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19*663afb9bSAndroid Build Coastguard Worker * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 20*663afb9bSAndroid Build Coastguard Worker * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 21*663afb9bSAndroid Build Coastguard Worker * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22*663afb9bSAndroid Build Coastguard Worker * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23*663afb9bSAndroid Build Coastguard Worker * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24*663afb9bSAndroid Build Coastguard Worker * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 25*663afb9bSAndroid Build Coastguard Worker * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26*663afb9bSAndroid Build Coastguard Worker */ 27*663afb9bSAndroid Build Coastguard Worker #ifndef EVENT2_BUFFEREVENT_H_INCLUDED_ 28*663afb9bSAndroid Build Coastguard Worker #define EVENT2_BUFFEREVENT_H_INCLUDED_ 29*663afb9bSAndroid Build Coastguard Worker 30*663afb9bSAndroid Build Coastguard Worker /** 31*663afb9bSAndroid Build Coastguard Worker @file event2/bufferevent.h 32*663afb9bSAndroid Build Coastguard Worker 33*663afb9bSAndroid Build Coastguard Worker Functions for buffering data for network sending or receiving. Bufferevents 34*663afb9bSAndroid Build Coastguard Worker are higher level than evbuffers: each has an underlying evbuffer for reading 35*663afb9bSAndroid Build Coastguard Worker and one for writing, and callbacks that are invoked under certain 36*663afb9bSAndroid Build Coastguard Worker circumstances. 37*663afb9bSAndroid Build Coastguard Worker 38*663afb9bSAndroid Build Coastguard Worker A bufferevent provides input and output buffers that get filled and 39*663afb9bSAndroid Build Coastguard Worker drained automatically. The user of a bufferevent no longer deals 40*663afb9bSAndroid Build Coastguard Worker directly with the I/O, but instead is reading from input and writing 41*663afb9bSAndroid Build Coastguard Worker to output buffers. 42*663afb9bSAndroid Build Coastguard Worker 43*663afb9bSAndroid Build Coastguard Worker Once initialized, the bufferevent structure can be used repeatedly 44*663afb9bSAndroid Build Coastguard Worker with bufferevent_enable() and bufferevent_disable(). 45*663afb9bSAndroid Build Coastguard Worker 46*663afb9bSAndroid Build Coastguard Worker When reading is enabled, the bufferevent will try to read from the 47*663afb9bSAndroid Build Coastguard Worker file descriptor onto its input buffer, and call the read callback. 48*663afb9bSAndroid Build Coastguard Worker When writing is enabled, the bufferevent will try to write data onto its 49*663afb9bSAndroid Build Coastguard Worker file descriptor when the output buffer has enough data, and call the write 50*663afb9bSAndroid Build Coastguard Worker callback when the output buffer is sufficiently drained. 51*663afb9bSAndroid Build Coastguard Worker 52*663afb9bSAndroid Build Coastguard Worker Bufferevents come in several flavors, including: 53*663afb9bSAndroid Build Coastguard Worker 54*663afb9bSAndroid Build Coastguard Worker <dl> 55*663afb9bSAndroid Build Coastguard Worker <dt>Socket-based bufferevents</dt> 56*663afb9bSAndroid Build Coastguard Worker <dd>A bufferevent that reads and writes data onto a network 57*663afb9bSAndroid Build Coastguard Worker socket. Created with bufferevent_socket_new().</dd> 58*663afb9bSAndroid Build Coastguard Worker 59*663afb9bSAndroid Build Coastguard Worker <dt>Paired bufferevents</dt> 60*663afb9bSAndroid Build Coastguard Worker <dd>A pair of bufferevents that send and receive data to one 61*663afb9bSAndroid Build Coastguard Worker another without touching the network. Created with 62*663afb9bSAndroid Build Coastguard Worker bufferevent_pair_new().</dd> 63*663afb9bSAndroid Build Coastguard Worker 64*663afb9bSAndroid Build Coastguard Worker <dt>Filtering bufferevents</dt> 65*663afb9bSAndroid Build Coastguard Worker <dd>A bufferevent that transforms data, and sends or receives it 66*663afb9bSAndroid Build Coastguard Worker over another underlying bufferevent. Created with 67*663afb9bSAndroid Build Coastguard Worker bufferevent_filter_new().</dd> 68*663afb9bSAndroid Build Coastguard Worker 69*663afb9bSAndroid Build Coastguard Worker <dt>SSL-backed bufferevents</dt> 70*663afb9bSAndroid Build Coastguard Worker <dd>A bufferevent that uses the openssl library to send and 71*663afb9bSAndroid Build Coastguard Worker receive data over an encrypted connection. Created with 72*663afb9bSAndroid Build Coastguard Worker bufferevent_openssl_socket_new() or 73*663afb9bSAndroid Build Coastguard Worker bufferevent_openssl_filter_new().</dd> 74*663afb9bSAndroid Build Coastguard Worker </dl> 75*663afb9bSAndroid Build Coastguard Worker */ 76*663afb9bSAndroid Build Coastguard Worker 77*663afb9bSAndroid Build Coastguard Worker #include <event2/visibility.h> 78*663afb9bSAndroid Build Coastguard Worker 79*663afb9bSAndroid Build Coastguard Worker #ifdef __cplusplus 80*663afb9bSAndroid Build Coastguard Worker extern "C" { 81*663afb9bSAndroid Build Coastguard Worker #endif 82*663afb9bSAndroid Build Coastguard Worker 83*663afb9bSAndroid Build Coastguard Worker #include <event2/event-config.h> 84*663afb9bSAndroid Build Coastguard Worker #ifdef EVENT__HAVE_SYS_TYPES_H 85*663afb9bSAndroid Build Coastguard Worker #include <sys/types.h> 86*663afb9bSAndroid Build Coastguard Worker #endif 87*663afb9bSAndroid Build Coastguard Worker #ifdef EVENT__HAVE_SYS_TIME_H 88*663afb9bSAndroid Build Coastguard Worker #include <sys/time.h> 89*663afb9bSAndroid Build Coastguard Worker #endif 90*663afb9bSAndroid Build Coastguard Worker 91*663afb9bSAndroid Build Coastguard Worker /* For int types. */ 92*663afb9bSAndroid Build Coastguard Worker #include <event2/util.h> 93*663afb9bSAndroid Build Coastguard Worker 94*663afb9bSAndroid Build Coastguard Worker /** @name Bufferevent event codes 95*663afb9bSAndroid Build Coastguard Worker 96*663afb9bSAndroid Build Coastguard Worker These flags are passed as arguments to a bufferevent's event callback. 97*663afb9bSAndroid Build Coastguard Worker 98*663afb9bSAndroid Build Coastguard Worker @{ 99*663afb9bSAndroid Build Coastguard Worker */ 100*663afb9bSAndroid Build Coastguard Worker #define BEV_EVENT_READING 0x01 /**< error encountered while reading */ 101*663afb9bSAndroid Build Coastguard Worker #define BEV_EVENT_WRITING 0x02 /**< error encountered while writing */ 102*663afb9bSAndroid Build Coastguard Worker #define BEV_EVENT_EOF 0x10 /**< eof file reached */ 103*663afb9bSAndroid Build Coastguard Worker #define BEV_EVENT_ERROR 0x20 /**< unrecoverable error encountered */ 104*663afb9bSAndroid Build Coastguard Worker #define BEV_EVENT_TIMEOUT 0x40 /**< user-specified timeout reached */ 105*663afb9bSAndroid Build Coastguard Worker #define BEV_EVENT_CONNECTED 0x80 /**< connect operation finished. */ 106*663afb9bSAndroid Build Coastguard Worker /**@}*/ 107*663afb9bSAndroid Build Coastguard Worker 108*663afb9bSAndroid Build Coastguard Worker /** 109*663afb9bSAndroid Build Coastguard Worker An opaque type for handling buffered IO 110*663afb9bSAndroid Build Coastguard Worker 111*663afb9bSAndroid Build Coastguard Worker @see event2/bufferevent.h 112*663afb9bSAndroid Build Coastguard Worker */ 113*663afb9bSAndroid Build Coastguard Worker struct bufferevent 114*663afb9bSAndroid Build Coastguard Worker #ifdef EVENT_IN_DOXYGEN_ 115*663afb9bSAndroid Build Coastguard Worker {} 116*663afb9bSAndroid Build Coastguard Worker #endif 117*663afb9bSAndroid Build Coastguard Worker ; 118*663afb9bSAndroid Build Coastguard Worker struct event_base; 119*663afb9bSAndroid Build Coastguard Worker struct evbuffer; 120*663afb9bSAndroid Build Coastguard Worker struct sockaddr; 121*663afb9bSAndroid Build Coastguard Worker 122*663afb9bSAndroid Build Coastguard Worker /** 123*663afb9bSAndroid Build Coastguard Worker A read or write callback for a bufferevent. 124*663afb9bSAndroid Build Coastguard Worker 125*663afb9bSAndroid Build Coastguard Worker The read callback is triggered when new data arrives in the input 126*663afb9bSAndroid Build Coastguard Worker buffer and the amount of readable data exceed the low watermark 127*663afb9bSAndroid Build Coastguard Worker which is 0 by default. 128*663afb9bSAndroid Build Coastguard Worker 129*663afb9bSAndroid Build Coastguard Worker The write callback is triggered if the write buffer has been 130*663afb9bSAndroid Build Coastguard Worker exhausted or fell below its low watermark. 131*663afb9bSAndroid Build Coastguard Worker 132*663afb9bSAndroid Build Coastguard Worker @param bev the bufferevent that triggered the callback 133*663afb9bSAndroid Build Coastguard Worker @param ctx the user-specified context for this bufferevent 134*663afb9bSAndroid Build Coastguard Worker */ 135*663afb9bSAndroid Build Coastguard Worker typedef void (*bufferevent_data_cb)(struct bufferevent *bev, void *ctx); 136*663afb9bSAndroid Build Coastguard Worker 137*663afb9bSAndroid Build Coastguard Worker /** 138*663afb9bSAndroid Build Coastguard Worker An event/error callback for a bufferevent. 139*663afb9bSAndroid Build Coastguard Worker 140*663afb9bSAndroid Build Coastguard Worker The event callback is triggered if either an EOF condition or another 141*663afb9bSAndroid Build Coastguard Worker unrecoverable error was encountered. 142*663afb9bSAndroid Build Coastguard Worker 143*663afb9bSAndroid Build Coastguard Worker For bufferevents with deferred callbacks, this is a bitwise OR of all errors 144*663afb9bSAndroid Build Coastguard Worker that have happened on the bufferevent since the last callback invocation. 145*663afb9bSAndroid Build Coastguard Worker 146*663afb9bSAndroid Build Coastguard Worker @param bev the bufferevent for which the error condition was reached 147*663afb9bSAndroid Build Coastguard Worker @param what a conjunction of flags: BEV_EVENT_READING or BEV_EVENT_WRITING 148*663afb9bSAndroid Build Coastguard Worker to indicate if the error was encountered on the read or write path, 149*663afb9bSAndroid Build Coastguard Worker and one of the following flags: BEV_EVENT_EOF, BEV_EVENT_ERROR, 150*663afb9bSAndroid Build Coastguard Worker BEV_EVENT_TIMEOUT, BEV_EVENT_CONNECTED. 151*663afb9bSAndroid Build Coastguard Worker 152*663afb9bSAndroid Build Coastguard Worker @param ctx the user-specified context for this bufferevent 153*663afb9bSAndroid Build Coastguard Worker */ 154*663afb9bSAndroid Build Coastguard Worker typedef void (*bufferevent_event_cb)(struct bufferevent *bev, short what, void *ctx); 155*663afb9bSAndroid Build Coastguard Worker 156*663afb9bSAndroid Build Coastguard Worker /** Options that can be specified when creating a bufferevent */ 157*663afb9bSAndroid Build Coastguard Worker enum bufferevent_options { 158*663afb9bSAndroid Build Coastguard Worker /** If set, we close the underlying file 159*663afb9bSAndroid Build Coastguard Worker * descriptor/bufferevent/whatever when this bufferevent is freed. */ 160*663afb9bSAndroid Build Coastguard Worker BEV_OPT_CLOSE_ON_FREE = (1<<0), 161*663afb9bSAndroid Build Coastguard Worker 162*663afb9bSAndroid Build Coastguard Worker /** If set, and threading is enabled, operations on this bufferevent 163*663afb9bSAndroid Build Coastguard Worker * are protected by a lock */ 164*663afb9bSAndroid Build Coastguard Worker BEV_OPT_THREADSAFE = (1<<1), 165*663afb9bSAndroid Build Coastguard Worker 166*663afb9bSAndroid Build Coastguard Worker /** If set, callbacks are run deferred in the event loop. */ 167*663afb9bSAndroid Build Coastguard Worker BEV_OPT_DEFER_CALLBACKS = (1<<2), 168*663afb9bSAndroid Build Coastguard Worker 169*663afb9bSAndroid Build Coastguard Worker /** If set, callbacks are executed without locks being held on the 170*663afb9bSAndroid Build Coastguard Worker * bufferevent. This option currently requires that 171*663afb9bSAndroid Build Coastguard Worker * BEV_OPT_DEFER_CALLBACKS also be set; a future version of Libevent 172*663afb9bSAndroid Build Coastguard Worker * might remove the requirement.*/ 173*663afb9bSAndroid Build Coastguard Worker BEV_OPT_UNLOCK_CALLBACKS = (1<<3) 174*663afb9bSAndroid Build Coastguard Worker }; 175*663afb9bSAndroid Build Coastguard Worker 176*663afb9bSAndroid Build Coastguard Worker /** 177*663afb9bSAndroid Build Coastguard Worker Create a new socket bufferevent over an existing socket. 178*663afb9bSAndroid Build Coastguard Worker 179*663afb9bSAndroid Build Coastguard Worker @param base the event base to associate with the new bufferevent. 180*663afb9bSAndroid Build Coastguard Worker @param fd the file descriptor from which data is read and written to. 181*663afb9bSAndroid Build Coastguard Worker This file descriptor is not allowed to be a pipe(2). 182*663afb9bSAndroid Build Coastguard Worker It is safe to set the fd to -1, so long as you later 183*663afb9bSAndroid Build Coastguard Worker set it with bufferevent_setfd or bufferevent_socket_connect(). 184*663afb9bSAndroid Build Coastguard Worker @param options Zero or more BEV_OPT_* flags 185*663afb9bSAndroid Build Coastguard Worker @return a pointer to a newly allocated bufferevent struct, or NULL if an 186*663afb9bSAndroid Build Coastguard Worker error occurred 187*663afb9bSAndroid Build Coastguard Worker @see bufferevent_free() 188*663afb9bSAndroid Build Coastguard Worker */ 189*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 190*663afb9bSAndroid Build Coastguard Worker struct bufferevent *bufferevent_socket_new(struct event_base *base, evutil_socket_t fd, int options); 191*663afb9bSAndroid Build Coastguard Worker 192*663afb9bSAndroid Build Coastguard Worker /** 193*663afb9bSAndroid Build Coastguard Worker Launch a connect() attempt with a socket-based bufferevent. 194*663afb9bSAndroid Build Coastguard Worker 195*663afb9bSAndroid Build Coastguard Worker When the connect succeeds, the eventcb will be invoked with 196*663afb9bSAndroid Build Coastguard Worker BEV_EVENT_CONNECTED set. 197*663afb9bSAndroid Build Coastguard Worker 198*663afb9bSAndroid Build Coastguard Worker If the bufferevent does not already have a socket set, we allocate a new 199*663afb9bSAndroid Build Coastguard Worker socket here and make it nonblocking before we begin. 200*663afb9bSAndroid Build Coastguard Worker 201*663afb9bSAndroid Build Coastguard Worker If no address is provided, we assume that the socket is already connecting, 202*663afb9bSAndroid Build Coastguard Worker and configure the bufferevent so that a BEV_EVENT_CONNECTED event will be 203*663afb9bSAndroid Build Coastguard Worker yielded when it is done connecting. 204*663afb9bSAndroid Build Coastguard Worker 205*663afb9bSAndroid Build Coastguard Worker @param bufev an existing bufferevent allocated with 206*663afb9bSAndroid Build Coastguard Worker bufferevent_socket_new(). 207*663afb9bSAndroid Build Coastguard Worker @param addr the address we should connect to 208*663afb9bSAndroid Build Coastguard Worker @param socklen The length of the address 209*663afb9bSAndroid Build Coastguard Worker @return 0 on success, -1 on failure. 210*663afb9bSAndroid Build Coastguard Worker */ 211*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 212*663afb9bSAndroid Build Coastguard Worker int bufferevent_socket_connect(struct bufferevent *, const struct sockaddr *, int); 213*663afb9bSAndroid Build Coastguard Worker 214*663afb9bSAndroid Build Coastguard Worker struct evdns_base; 215*663afb9bSAndroid Build Coastguard Worker /** 216*663afb9bSAndroid Build Coastguard Worker Resolve the hostname 'hostname' and connect to it as with 217*663afb9bSAndroid Build Coastguard Worker bufferevent_socket_connect(). 218*663afb9bSAndroid Build Coastguard Worker 219*663afb9bSAndroid Build Coastguard Worker @param bufev An existing bufferevent allocated with bufferevent_socket_new() 220*663afb9bSAndroid Build Coastguard Worker @param evdns_base Optionally, an evdns_base to use for resolving hostnames 221*663afb9bSAndroid Build Coastguard Worker asynchronously. May be set to NULL for a blocking resolve. 222*663afb9bSAndroid Build Coastguard Worker @param family A preferred address family to resolve addresses to, or 223*663afb9bSAndroid Build Coastguard Worker AF_UNSPEC for no preference. Only AF_INET, AF_INET6, and AF_UNSPEC are 224*663afb9bSAndroid Build Coastguard Worker supported. 225*663afb9bSAndroid Build Coastguard Worker @param hostname The hostname to resolve; see below for notes on recognized 226*663afb9bSAndroid Build Coastguard Worker formats 227*663afb9bSAndroid Build Coastguard Worker @param port The port to connect to on the resolved address. 228*663afb9bSAndroid Build Coastguard Worker @return 0 if successful, -1 on failure. 229*663afb9bSAndroid Build Coastguard Worker 230*663afb9bSAndroid Build Coastguard Worker Recognized hostname formats are: 231*663afb9bSAndroid Build Coastguard Worker 232*663afb9bSAndroid Build Coastguard Worker www.example.com (hostname) 233*663afb9bSAndroid Build Coastguard Worker 1.2.3.4 (ipv4address) 234*663afb9bSAndroid Build Coastguard Worker ::1 (ipv6address) 235*663afb9bSAndroid Build Coastguard Worker [::1] ([ipv6address]) 236*663afb9bSAndroid Build Coastguard Worker 237*663afb9bSAndroid Build Coastguard Worker Performance note: If you do not provide an evdns_base, this function 238*663afb9bSAndroid Build Coastguard Worker may block while it waits for a DNS response. This is probably not 239*663afb9bSAndroid Build Coastguard Worker what you want. 240*663afb9bSAndroid Build Coastguard Worker */ 241*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 242*663afb9bSAndroid Build Coastguard Worker int bufferevent_socket_connect_hostname(struct bufferevent *, 243*663afb9bSAndroid Build Coastguard Worker struct evdns_base *, int, const char *, int); 244*663afb9bSAndroid Build Coastguard Worker 245*663afb9bSAndroid Build Coastguard Worker /** 246*663afb9bSAndroid Build Coastguard Worker Return the error code for the last failed DNS lookup attempt made by 247*663afb9bSAndroid Build Coastguard Worker bufferevent_socket_connect_hostname(). 248*663afb9bSAndroid Build Coastguard Worker 249*663afb9bSAndroid Build Coastguard Worker @param bev The bufferevent object. 250*663afb9bSAndroid Build Coastguard Worker @return DNS error code. 251*663afb9bSAndroid Build Coastguard Worker @see evutil_gai_strerror() 252*663afb9bSAndroid Build Coastguard Worker */ 253*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 254*663afb9bSAndroid Build Coastguard Worker int bufferevent_socket_get_dns_error(struct bufferevent *bev); 255*663afb9bSAndroid Build Coastguard Worker 256*663afb9bSAndroid Build Coastguard Worker /** 257*663afb9bSAndroid Build Coastguard Worker Assign a bufferevent to a specific event_base. 258*663afb9bSAndroid Build Coastguard Worker 259*663afb9bSAndroid Build Coastguard Worker NOTE that only socket bufferevents support this function. 260*663afb9bSAndroid Build Coastguard Worker 261*663afb9bSAndroid Build Coastguard Worker @param base an event_base returned by event_init() 262*663afb9bSAndroid Build Coastguard Worker @param bufev a bufferevent struct returned by bufferevent_new() 263*663afb9bSAndroid Build Coastguard Worker or bufferevent_socket_new() 264*663afb9bSAndroid Build Coastguard Worker @return 0 if successful, or -1 if an error occurred 265*663afb9bSAndroid Build Coastguard Worker @see bufferevent_new() 266*663afb9bSAndroid Build Coastguard Worker */ 267*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 268*663afb9bSAndroid Build Coastguard Worker int bufferevent_base_set(struct event_base *base, struct bufferevent *bufev); 269*663afb9bSAndroid Build Coastguard Worker 270*663afb9bSAndroid Build Coastguard Worker /** 271*663afb9bSAndroid Build Coastguard Worker Return the event_base used by a bufferevent 272*663afb9bSAndroid Build Coastguard Worker */ 273*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 274*663afb9bSAndroid Build Coastguard Worker struct event_base *bufferevent_get_base(struct bufferevent *bev); 275*663afb9bSAndroid Build Coastguard Worker 276*663afb9bSAndroid Build Coastguard Worker /** 277*663afb9bSAndroid Build Coastguard Worker Assign a priority to a bufferevent. 278*663afb9bSAndroid Build Coastguard Worker 279*663afb9bSAndroid Build Coastguard Worker Only supported for socket bufferevents. 280*663afb9bSAndroid Build Coastguard Worker 281*663afb9bSAndroid Build Coastguard Worker @param bufev a bufferevent struct 282*663afb9bSAndroid Build Coastguard Worker @param pri the priority to be assigned 283*663afb9bSAndroid Build Coastguard Worker @return 0 if successful, or -1 if an error occurred 284*663afb9bSAndroid Build Coastguard Worker */ 285*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 286*663afb9bSAndroid Build Coastguard Worker int bufferevent_priority_set(struct bufferevent *bufev, int pri); 287*663afb9bSAndroid Build Coastguard Worker 288*663afb9bSAndroid Build Coastguard Worker /** 289*663afb9bSAndroid Build Coastguard Worker Return the priority of a bufferevent. 290*663afb9bSAndroid Build Coastguard Worker 291*663afb9bSAndroid Build Coastguard Worker Only supported for socket bufferevents 292*663afb9bSAndroid Build Coastguard Worker */ 293*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 294*663afb9bSAndroid Build Coastguard Worker int bufferevent_get_priority(const struct bufferevent *bufev); 295*663afb9bSAndroid Build Coastguard Worker 296*663afb9bSAndroid Build Coastguard Worker /** 297*663afb9bSAndroid Build Coastguard Worker Deallocate the storage associated with a bufferevent structure. 298*663afb9bSAndroid Build Coastguard Worker 299*663afb9bSAndroid Build Coastguard Worker If there is pending data to write on the bufferevent, it probably won't be 300*663afb9bSAndroid Build Coastguard Worker flushed before the bufferevent is freed. 301*663afb9bSAndroid Build Coastguard Worker 302*663afb9bSAndroid Build Coastguard Worker @param bufev the bufferevent structure to be freed. 303*663afb9bSAndroid Build Coastguard Worker */ 304*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 305*663afb9bSAndroid Build Coastguard Worker void bufferevent_free(struct bufferevent *bufev); 306*663afb9bSAndroid Build Coastguard Worker 307*663afb9bSAndroid Build Coastguard Worker 308*663afb9bSAndroid Build Coastguard Worker /** 309*663afb9bSAndroid Build Coastguard Worker Changes the callbacks for a bufferevent. 310*663afb9bSAndroid Build Coastguard Worker 311*663afb9bSAndroid Build Coastguard Worker @param bufev the bufferevent object for which to change callbacks 312*663afb9bSAndroid Build Coastguard Worker @param readcb callback to invoke when there is data to be read, or NULL if 313*663afb9bSAndroid Build Coastguard Worker no callback is desired 314*663afb9bSAndroid Build Coastguard Worker @param writecb callback to invoke when the file descriptor is ready for 315*663afb9bSAndroid Build Coastguard Worker writing, or NULL if no callback is desired 316*663afb9bSAndroid Build Coastguard Worker @param eventcb callback to invoke when there is an event on the file 317*663afb9bSAndroid Build Coastguard Worker descriptor 318*663afb9bSAndroid Build Coastguard Worker @param cbarg an argument that will be supplied to each of the callbacks 319*663afb9bSAndroid Build Coastguard Worker (readcb, writecb, and errorcb) 320*663afb9bSAndroid Build Coastguard Worker @see bufferevent_new() 321*663afb9bSAndroid Build Coastguard Worker */ 322*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 323*663afb9bSAndroid Build Coastguard Worker void bufferevent_setcb(struct bufferevent *bufev, 324*663afb9bSAndroid Build Coastguard Worker bufferevent_data_cb readcb, bufferevent_data_cb writecb, 325*663afb9bSAndroid Build Coastguard Worker bufferevent_event_cb eventcb, void *cbarg); 326*663afb9bSAndroid Build Coastguard Worker 327*663afb9bSAndroid Build Coastguard Worker /** 328*663afb9bSAndroid Build Coastguard Worker Retrieves the callbacks for a bufferevent. 329*663afb9bSAndroid Build Coastguard Worker 330*663afb9bSAndroid Build Coastguard Worker @param bufev the bufferevent to examine. 331*663afb9bSAndroid Build Coastguard Worker @param readcb_ptr if readcb_ptr is nonnull, *readcb_ptr is set to the current 332*663afb9bSAndroid Build Coastguard Worker read callback for the bufferevent. 333*663afb9bSAndroid Build Coastguard Worker @param writecb_ptr if writecb_ptr is nonnull, *writecb_ptr is set to the 334*663afb9bSAndroid Build Coastguard Worker current write callback for the bufferevent. 335*663afb9bSAndroid Build Coastguard Worker @param eventcb_ptr if eventcb_ptr is nonnull, *eventcb_ptr is set to the 336*663afb9bSAndroid Build Coastguard Worker current event callback for the bufferevent. 337*663afb9bSAndroid Build Coastguard Worker @param cbarg_ptr if cbarg_ptr is nonnull, *cbarg_ptr is set to the current 338*663afb9bSAndroid Build Coastguard Worker callback argument for the bufferevent. 339*663afb9bSAndroid Build Coastguard Worker @see buffervent_setcb() 340*663afb9bSAndroid Build Coastguard Worker */ 341*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 342*663afb9bSAndroid Build Coastguard Worker void bufferevent_getcb(struct bufferevent *bufev, 343*663afb9bSAndroid Build Coastguard Worker bufferevent_data_cb *readcb_ptr, 344*663afb9bSAndroid Build Coastguard Worker bufferevent_data_cb *writecb_ptr, 345*663afb9bSAndroid Build Coastguard Worker bufferevent_event_cb *eventcb_ptr, 346*663afb9bSAndroid Build Coastguard Worker void **cbarg_ptr); 347*663afb9bSAndroid Build Coastguard Worker 348*663afb9bSAndroid Build Coastguard Worker /** 349*663afb9bSAndroid Build Coastguard Worker Changes the file descriptor on which the bufferevent operates. 350*663afb9bSAndroid Build Coastguard Worker Not supported for all bufferevent types. 351*663afb9bSAndroid Build Coastguard Worker 352*663afb9bSAndroid Build Coastguard Worker @param bufev the bufferevent object for which to change the file descriptor 353*663afb9bSAndroid Build Coastguard Worker @param fd the file descriptor to operate on 354*663afb9bSAndroid Build Coastguard Worker */ 355*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 356*663afb9bSAndroid Build Coastguard Worker int bufferevent_setfd(struct bufferevent *bufev, evutil_socket_t fd); 357*663afb9bSAndroid Build Coastguard Worker 358*663afb9bSAndroid Build Coastguard Worker /** 359*663afb9bSAndroid Build Coastguard Worker Returns the file descriptor associated with a bufferevent, or -1 if 360*663afb9bSAndroid Build Coastguard Worker no file descriptor is associated with the bufferevent. 361*663afb9bSAndroid Build Coastguard Worker */ 362*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 363*663afb9bSAndroid Build Coastguard Worker evutil_socket_t bufferevent_getfd(struct bufferevent *bufev); 364*663afb9bSAndroid Build Coastguard Worker 365*663afb9bSAndroid Build Coastguard Worker /** 366*663afb9bSAndroid Build Coastguard Worker Returns the underlying bufferevent associated with a bufferevent (if 367*663afb9bSAndroid Build Coastguard Worker the bufferevent is a wrapper), or NULL if there is no underlying bufferevent. 368*663afb9bSAndroid Build Coastguard Worker */ 369*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 370*663afb9bSAndroid Build Coastguard Worker struct bufferevent *bufferevent_get_underlying(struct bufferevent *bufev); 371*663afb9bSAndroid Build Coastguard Worker 372*663afb9bSAndroid Build Coastguard Worker /** 373*663afb9bSAndroid Build Coastguard Worker Write data to a bufferevent buffer. 374*663afb9bSAndroid Build Coastguard Worker 375*663afb9bSAndroid Build Coastguard Worker The bufferevent_write() function can be used to write data to the file 376*663afb9bSAndroid Build Coastguard Worker descriptor. The data is appended to the output buffer and written to the 377*663afb9bSAndroid Build Coastguard Worker descriptor automatically as it becomes available for writing. 378*663afb9bSAndroid Build Coastguard Worker 379*663afb9bSAndroid Build Coastguard Worker @param bufev the bufferevent to be written to 380*663afb9bSAndroid Build Coastguard Worker @param data a pointer to the data to be written 381*663afb9bSAndroid Build Coastguard Worker @param size the length of the data, in bytes 382*663afb9bSAndroid Build Coastguard Worker @return 0 if successful, or -1 if an error occurred 383*663afb9bSAndroid Build Coastguard Worker @see bufferevent_write_buffer() 384*663afb9bSAndroid Build Coastguard Worker */ 385*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 386*663afb9bSAndroid Build Coastguard Worker int bufferevent_write(struct bufferevent *bufev, 387*663afb9bSAndroid Build Coastguard Worker const void *data, size_t size); 388*663afb9bSAndroid Build Coastguard Worker 389*663afb9bSAndroid Build Coastguard Worker 390*663afb9bSAndroid Build Coastguard Worker /** 391*663afb9bSAndroid Build Coastguard Worker Write data from an evbuffer to a bufferevent buffer. The evbuffer is 392*663afb9bSAndroid Build Coastguard Worker being drained as a result. 393*663afb9bSAndroid Build Coastguard Worker 394*663afb9bSAndroid Build Coastguard Worker @param bufev the bufferevent to be written to 395*663afb9bSAndroid Build Coastguard Worker @param buf the evbuffer to be written 396*663afb9bSAndroid Build Coastguard Worker @return 0 if successful, or -1 if an error occurred 397*663afb9bSAndroid Build Coastguard Worker @see bufferevent_write() 398*663afb9bSAndroid Build Coastguard Worker */ 399*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 400*663afb9bSAndroid Build Coastguard Worker int bufferevent_write_buffer(struct bufferevent *bufev, struct evbuffer *buf); 401*663afb9bSAndroid Build Coastguard Worker 402*663afb9bSAndroid Build Coastguard Worker 403*663afb9bSAndroid Build Coastguard Worker /** 404*663afb9bSAndroid Build Coastguard Worker Read data from a bufferevent buffer. 405*663afb9bSAndroid Build Coastguard Worker 406*663afb9bSAndroid Build Coastguard Worker The bufferevent_read() function is used to read data from the input buffer. 407*663afb9bSAndroid Build Coastguard Worker 408*663afb9bSAndroid Build Coastguard Worker @param bufev the bufferevent to be read from 409*663afb9bSAndroid Build Coastguard Worker @param data pointer to a buffer that will store the data 410*663afb9bSAndroid Build Coastguard Worker @param size the size of the data buffer, in bytes 411*663afb9bSAndroid Build Coastguard Worker @return the amount of data read, in bytes. 412*663afb9bSAndroid Build Coastguard Worker */ 413*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 414*663afb9bSAndroid Build Coastguard Worker size_t bufferevent_read(struct bufferevent *bufev, void *data, size_t size); 415*663afb9bSAndroid Build Coastguard Worker 416*663afb9bSAndroid Build Coastguard Worker /** 417*663afb9bSAndroid Build Coastguard Worker Read data from a bufferevent buffer into an evbuffer. This avoids 418*663afb9bSAndroid Build Coastguard Worker memory copies. 419*663afb9bSAndroid Build Coastguard Worker 420*663afb9bSAndroid Build Coastguard Worker @param bufev the bufferevent to be read from 421*663afb9bSAndroid Build Coastguard Worker @param buf the evbuffer to which to add data 422*663afb9bSAndroid Build Coastguard Worker @return 0 if successful, or -1 if an error occurred. 423*663afb9bSAndroid Build Coastguard Worker */ 424*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 425*663afb9bSAndroid Build Coastguard Worker int bufferevent_read_buffer(struct bufferevent *bufev, struct evbuffer *buf); 426*663afb9bSAndroid Build Coastguard Worker 427*663afb9bSAndroid Build Coastguard Worker /** 428*663afb9bSAndroid Build Coastguard Worker Returns the input buffer. 429*663afb9bSAndroid Build Coastguard Worker 430*663afb9bSAndroid Build Coastguard Worker The user MUST NOT set the callback on this buffer. 431*663afb9bSAndroid Build Coastguard Worker 432*663afb9bSAndroid Build Coastguard Worker @param bufev the bufferevent from which to get the evbuffer 433*663afb9bSAndroid Build Coastguard Worker @return the evbuffer object for the input buffer 434*663afb9bSAndroid Build Coastguard Worker */ 435*663afb9bSAndroid Build Coastguard Worker 436*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 437*663afb9bSAndroid Build Coastguard Worker struct evbuffer *bufferevent_get_input(struct bufferevent *bufev); 438*663afb9bSAndroid Build Coastguard Worker 439*663afb9bSAndroid Build Coastguard Worker /** 440*663afb9bSAndroid Build Coastguard Worker Returns the output buffer. 441*663afb9bSAndroid Build Coastguard Worker 442*663afb9bSAndroid Build Coastguard Worker The user MUST NOT set the callback on this buffer. 443*663afb9bSAndroid Build Coastguard Worker 444*663afb9bSAndroid Build Coastguard Worker When filters are being used, the filters need to be manually 445*663afb9bSAndroid Build Coastguard Worker triggered if the output buffer was manipulated. 446*663afb9bSAndroid Build Coastguard Worker 447*663afb9bSAndroid Build Coastguard Worker @param bufev the bufferevent from which to get the evbuffer 448*663afb9bSAndroid Build Coastguard Worker @return the evbuffer object for the output buffer 449*663afb9bSAndroid Build Coastguard Worker */ 450*663afb9bSAndroid Build Coastguard Worker 451*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 452*663afb9bSAndroid Build Coastguard Worker struct evbuffer *bufferevent_get_output(struct bufferevent *bufev); 453*663afb9bSAndroid Build Coastguard Worker 454*663afb9bSAndroid Build Coastguard Worker /** 455*663afb9bSAndroid Build Coastguard Worker Enable a bufferevent. 456*663afb9bSAndroid Build Coastguard Worker 457*663afb9bSAndroid Build Coastguard Worker @param bufev the bufferevent to be enabled 458*663afb9bSAndroid Build Coastguard Worker @param event any combination of EV_READ | EV_WRITE. 459*663afb9bSAndroid Build Coastguard Worker @return 0 if successful, or -1 if an error occurred 460*663afb9bSAndroid Build Coastguard Worker @see bufferevent_disable() 461*663afb9bSAndroid Build Coastguard Worker */ 462*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 463*663afb9bSAndroid Build Coastguard Worker int bufferevent_enable(struct bufferevent *bufev, short event); 464*663afb9bSAndroid Build Coastguard Worker 465*663afb9bSAndroid Build Coastguard Worker /** 466*663afb9bSAndroid Build Coastguard Worker Disable a bufferevent. 467*663afb9bSAndroid Build Coastguard Worker 468*663afb9bSAndroid Build Coastguard Worker @param bufev the bufferevent to be disabled 469*663afb9bSAndroid Build Coastguard Worker @param event any combination of EV_READ | EV_WRITE. 470*663afb9bSAndroid Build Coastguard Worker @return 0 if successful, or -1 if an error occurred 471*663afb9bSAndroid Build Coastguard Worker @see bufferevent_enable() 472*663afb9bSAndroid Build Coastguard Worker */ 473*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 474*663afb9bSAndroid Build Coastguard Worker int bufferevent_disable(struct bufferevent *bufev, short event); 475*663afb9bSAndroid Build Coastguard Worker 476*663afb9bSAndroid Build Coastguard Worker /** 477*663afb9bSAndroid Build Coastguard Worker Return the events that are enabled on a given bufferevent. 478*663afb9bSAndroid Build Coastguard Worker 479*663afb9bSAndroid Build Coastguard Worker @param bufev the bufferevent to inspect 480*663afb9bSAndroid Build Coastguard Worker @return A combination of EV_READ | EV_WRITE 481*663afb9bSAndroid Build Coastguard Worker */ 482*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 483*663afb9bSAndroid Build Coastguard Worker short bufferevent_get_enabled(struct bufferevent *bufev); 484*663afb9bSAndroid Build Coastguard Worker 485*663afb9bSAndroid Build Coastguard Worker /** 486*663afb9bSAndroid Build Coastguard Worker Set the read and write timeout for a bufferevent. 487*663afb9bSAndroid Build Coastguard Worker 488*663afb9bSAndroid Build Coastguard Worker A bufferevent's timeout will fire the first time that the indicated 489*663afb9bSAndroid Build Coastguard Worker amount of time has elapsed since a successful read or write operation, 490*663afb9bSAndroid Build Coastguard Worker during which the bufferevent was trying to read or write. 491*663afb9bSAndroid Build Coastguard Worker 492*663afb9bSAndroid Build Coastguard Worker (In other words, if reading or writing is disabled, or if the 493*663afb9bSAndroid Build Coastguard Worker bufferevent's read or write operation has been suspended because 494*663afb9bSAndroid Build Coastguard Worker there's no data to write, or not enough bandwidth, or so on, the 495*663afb9bSAndroid Build Coastguard Worker timeout isn't active. The timeout only becomes active when we we're 496*663afb9bSAndroid Build Coastguard Worker willing to actually read or write.) 497*663afb9bSAndroid Build Coastguard Worker 498*663afb9bSAndroid Build Coastguard Worker Calling bufferevent_enable or setting a timeout for a bufferevent 499*663afb9bSAndroid Build Coastguard Worker whose timeout is already pending resets its timeout. 500*663afb9bSAndroid Build Coastguard Worker 501*663afb9bSAndroid Build Coastguard Worker If the timeout elapses, the corresponding operation (EV_READ or 502*663afb9bSAndroid Build Coastguard Worker EV_WRITE) becomes disabled until you re-enable it again. The 503*663afb9bSAndroid Build Coastguard Worker bufferevent's event callback is called with the 504*663afb9bSAndroid Build Coastguard Worker BEV_EVENT_TIMEOUT|BEV_EVENT_READING or 505*663afb9bSAndroid Build Coastguard Worker BEV_EVENT_TIMEOUT|BEV_EVENT_WRITING. 506*663afb9bSAndroid Build Coastguard Worker 507*663afb9bSAndroid Build Coastguard Worker @param bufev the bufferevent to be modified 508*663afb9bSAndroid Build Coastguard Worker @param timeout_read the read timeout, or NULL 509*663afb9bSAndroid Build Coastguard Worker @param timeout_write the write timeout, or NULL 510*663afb9bSAndroid Build Coastguard Worker */ 511*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 512*663afb9bSAndroid Build Coastguard Worker int bufferevent_set_timeouts(struct bufferevent *bufev, 513*663afb9bSAndroid Build Coastguard Worker const struct timeval *timeout_read, const struct timeval *timeout_write); 514*663afb9bSAndroid Build Coastguard Worker 515*663afb9bSAndroid Build Coastguard Worker /** 516*663afb9bSAndroid Build Coastguard Worker Sets the watermarks for read and write events. 517*663afb9bSAndroid Build Coastguard Worker 518*663afb9bSAndroid Build Coastguard Worker On input, a bufferevent does not invoke the user read callback unless 519*663afb9bSAndroid Build Coastguard Worker there is at least low watermark data in the buffer. If the read buffer 520*663afb9bSAndroid Build Coastguard Worker is beyond the high watermark, the bufferevent stops reading from the network. 521*663afb9bSAndroid Build Coastguard Worker But be aware that bufferevent input/read buffer can overrun high watermark 522*663afb9bSAndroid Build Coastguard Worker limit (typical example is openssl bufferevent), so you should not relay in 523*663afb9bSAndroid Build Coastguard Worker this. 524*663afb9bSAndroid Build Coastguard Worker 525*663afb9bSAndroid Build Coastguard Worker On output, the user write callback is invoked whenever the buffered data 526*663afb9bSAndroid Build Coastguard Worker falls below the low watermark. Filters that write to this bufev will try 527*663afb9bSAndroid Build Coastguard Worker not to write more bytes to this buffer than the high watermark would allow, 528*663afb9bSAndroid Build Coastguard Worker except when flushing. 529*663afb9bSAndroid Build Coastguard Worker 530*663afb9bSAndroid Build Coastguard Worker @param bufev the bufferevent to be modified 531*663afb9bSAndroid Build Coastguard Worker @param events EV_READ, EV_WRITE or both 532*663afb9bSAndroid Build Coastguard Worker @param lowmark the lower watermark to set 533*663afb9bSAndroid Build Coastguard Worker @param highmark the high watermark to set 534*663afb9bSAndroid Build Coastguard Worker */ 535*663afb9bSAndroid Build Coastguard Worker 536*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 537*663afb9bSAndroid Build Coastguard Worker void bufferevent_setwatermark(struct bufferevent *bufev, short events, 538*663afb9bSAndroid Build Coastguard Worker size_t lowmark, size_t highmark); 539*663afb9bSAndroid Build Coastguard Worker 540*663afb9bSAndroid Build Coastguard Worker /** 541*663afb9bSAndroid Build Coastguard Worker Retrieves the watermarks for read or write events. 542*663afb9bSAndroid Build Coastguard Worker Returns non-zero if events contains not only EV_READ or EV_WRITE. 543*663afb9bSAndroid Build Coastguard Worker Returns zero if events equal EV_READ or EV_WRITE 544*663afb9bSAndroid Build Coastguard Worker 545*663afb9bSAndroid Build Coastguard Worker @param bufev the bufferevent to be examined 546*663afb9bSAndroid Build Coastguard Worker @param events EV_READ or EV_WRITE 547*663afb9bSAndroid Build Coastguard Worker @param lowmark receives the lower watermark if not NULL 548*663afb9bSAndroid Build Coastguard Worker @param highmark receives the high watermark if not NULL 549*663afb9bSAndroid Build Coastguard Worker */ 550*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 551*663afb9bSAndroid Build Coastguard Worker int bufferevent_getwatermark(struct bufferevent *bufev, short events, 552*663afb9bSAndroid Build Coastguard Worker size_t *lowmark, size_t *highmark); 553*663afb9bSAndroid Build Coastguard Worker 554*663afb9bSAndroid Build Coastguard Worker /** 555*663afb9bSAndroid Build Coastguard Worker Acquire the lock on a bufferevent. Has no effect if locking was not 556*663afb9bSAndroid Build Coastguard Worker enabled with BEV_OPT_THREADSAFE. 557*663afb9bSAndroid Build Coastguard Worker */ 558*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 559*663afb9bSAndroid Build Coastguard Worker void bufferevent_lock(struct bufferevent *bufev); 560*663afb9bSAndroid Build Coastguard Worker 561*663afb9bSAndroid Build Coastguard Worker /** 562*663afb9bSAndroid Build Coastguard Worker Release the lock on a bufferevent. Has no effect if locking was not 563*663afb9bSAndroid Build Coastguard Worker enabled with BEV_OPT_THREADSAFE. 564*663afb9bSAndroid Build Coastguard Worker */ 565*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 566*663afb9bSAndroid Build Coastguard Worker void bufferevent_unlock(struct bufferevent *bufev); 567*663afb9bSAndroid Build Coastguard Worker 568*663afb9bSAndroid Build Coastguard Worker 569*663afb9bSAndroid Build Coastguard Worker /** 570*663afb9bSAndroid Build Coastguard Worker * Public interface to manually increase the reference count of a bufferevent 571*663afb9bSAndroid Build Coastguard Worker * this is useful in situations where a user may reference the bufferevent 572*663afb9bSAndroid Build Coastguard Worker * somewhere else (unknown to libevent) 573*663afb9bSAndroid Build Coastguard Worker * 574*663afb9bSAndroid Build Coastguard Worker * @param bufev the bufferevent to increase the refcount on 575*663afb9bSAndroid Build Coastguard Worker * 576*663afb9bSAndroid Build Coastguard Worker */ 577*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 578*663afb9bSAndroid Build Coastguard Worker void bufferevent_incref(struct bufferevent *bufev); 579*663afb9bSAndroid Build Coastguard Worker 580*663afb9bSAndroid Build Coastguard Worker /** 581*663afb9bSAndroid Build Coastguard Worker * Public interface to manually decrement the reference count of a bufferevent 582*663afb9bSAndroid Build Coastguard Worker * 583*663afb9bSAndroid Build Coastguard Worker * Warning: make sure you know what you're doing. This is mainly used in 584*663afb9bSAndroid Build Coastguard Worker * conjunction with bufferevent_incref(). This will free up all data associated 585*663afb9bSAndroid Build Coastguard Worker * with a bufferevent if the reference count hits 0. 586*663afb9bSAndroid Build Coastguard Worker * 587*663afb9bSAndroid Build Coastguard Worker * @param bufev the bufferevent to decrement the refcount on 588*663afb9bSAndroid Build Coastguard Worker * 589*663afb9bSAndroid Build Coastguard Worker * @return 1 if the bufferevent was freed, otherwise 0 (still referenced) 590*663afb9bSAndroid Build Coastguard Worker */ 591*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 592*663afb9bSAndroid Build Coastguard Worker int bufferevent_decref(struct bufferevent *bufev); 593*663afb9bSAndroid Build Coastguard Worker 594*663afb9bSAndroid Build Coastguard Worker /** 595*663afb9bSAndroid Build Coastguard Worker Flags that can be passed into filters to let them know how to 596*663afb9bSAndroid Build Coastguard Worker deal with the incoming data. 597*663afb9bSAndroid Build Coastguard Worker */ 598*663afb9bSAndroid Build Coastguard Worker enum bufferevent_flush_mode { 599*663afb9bSAndroid Build Coastguard Worker /** usually set when processing data */ 600*663afb9bSAndroid Build Coastguard Worker BEV_NORMAL = 0, 601*663afb9bSAndroid Build Coastguard Worker 602*663afb9bSAndroid Build Coastguard Worker /** want to checkpoint all data sent. */ 603*663afb9bSAndroid Build Coastguard Worker BEV_FLUSH = 1, 604*663afb9bSAndroid Build Coastguard Worker 605*663afb9bSAndroid Build Coastguard Worker /** encountered EOF on read or done sending data */ 606*663afb9bSAndroid Build Coastguard Worker BEV_FINISHED = 2 607*663afb9bSAndroid Build Coastguard Worker }; 608*663afb9bSAndroid Build Coastguard Worker 609*663afb9bSAndroid Build Coastguard Worker /** 610*663afb9bSAndroid Build Coastguard Worker Triggers the bufferevent to produce more data if possible. 611*663afb9bSAndroid Build Coastguard Worker 612*663afb9bSAndroid Build Coastguard Worker @param bufev the bufferevent object 613*663afb9bSAndroid Build Coastguard Worker @param iotype either EV_READ or EV_WRITE or both. 614*663afb9bSAndroid Build Coastguard Worker @param mode either BEV_NORMAL or BEV_FLUSH or BEV_FINISHED 615*663afb9bSAndroid Build Coastguard Worker @return -1 on failure, 0 if no data was produces, 1 if data was produced 616*663afb9bSAndroid Build Coastguard Worker */ 617*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 618*663afb9bSAndroid Build Coastguard Worker int bufferevent_flush(struct bufferevent *bufev, 619*663afb9bSAndroid Build Coastguard Worker short iotype, 620*663afb9bSAndroid Build Coastguard Worker enum bufferevent_flush_mode mode); 621*663afb9bSAndroid Build Coastguard Worker 622*663afb9bSAndroid Build Coastguard Worker /** 623*663afb9bSAndroid Build Coastguard Worker Flags for bufferevent_trigger(_event) that modify when and how to trigger 624*663afb9bSAndroid Build Coastguard Worker the callback. 625*663afb9bSAndroid Build Coastguard Worker */ 626*663afb9bSAndroid Build Coastguard Worker enum bufferevent_trigger_options { 627*663afb9bSAndroid Build Coastguard Worker /** trigger the callback regardless of the watermarks */ 628*663afb9bSAndroid Build Coastguard Worker BEV_TRIG_IGNORE_WATERMARKS = (1<<16), 629*663afb9bSAndroid Build Coastguard Worker 630*663afb9bSAndroid Build Coastguard Worker /** defer even if the callbacks are not */ 631*663afb9bSAndroid Build Coastguard Worker BEV_TRIG_DEFER_CALLBACKS = BEV_OPT_DEFER_CALLBACKS 632*663afb9bSAndroid Build Coastguard Worker 633*663afb9bSAndroid Build Coastguard Worker /* (Note: for internal reasons, these need to be disjoint from 634*663afb9bSAndroid Build Coastguard Worker * bufferevent_options, except when they mean the same thing. */ 635*663afb9bSAndroid Build Coastguard Worker }; 636*663afb9bSAndroid Build Coastguard Worker 637*663afb9bSAndroid Build Coastguard Worker /** 638*663afb9bSAndroid Build Coastguard Worker Triggers bufferevent data callbacks. 639*663afb9bSAndroid Build Coastguard Worker 640*663afb9bSAndroid Build Coastguard Worker The function will honor watermarks unless options contain 641*663afb9bSAndroid Build Coastguard Worker BEV_TRIG_IGNORE_WATERMARKS. If the options contain BEV_OPT_DEFER_CALLBACKS, 642*663afb9bSAndroid Build Coastguard Worker the callbacks are deferred. 643*663afb9bSAndroid Build Coastguard Worker 644*663afb9bSAndroid Build Coastguard Worker @param bufev the bufferevent object 645*663afb9bSAndroid Build Coastguard Worker @param iotype either EV_READ or EV_WRITE or both. 646*663afb9bSAndroid Build Coastguard Worker @param options 647*663afb9bSAndroid Build Coastguard Worker */ 648*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 649*663afb9bSAndroid Build Coastguard Worker void bufferevent_trigger(struct bufferevent *bufev, short iotype, 650*663afb9bSAndroid Build Coastguard Worker int options); 651*663afb9bSAndroid Build Coastguard Worker 652*663afb9bSAndroid Build Coastguard Worker /** 653*663afb9bSAndroid Build Coastguard Worker Triggers the bufferevent event callback. 654*663afb9bSAndroid Build Coastguard Worker 655*663afb9bSAndroid Build Coastguard Worker If the options contain BEV_OPT_DEFER_CALLBACKS, the callbacks are deferred. 656*663afb9bSAndroid Build Coastguard Worker 657*663afb9bSAndroid Build Coastguard Worker @param bufev the bufferevent object 658*663afb9bSAndroid Build Coastguard Worker @param what the flags to pass onto the event callback 659*663afb9bSAndroid Build Coastguard Worker @param options 660*663afb9bSAndroid Build Coastguard Worker */ 661*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 662*663afb9bSAndroid Build Coastguard Worker void bufferevent_trigger_event(struct bufferevent *bufev, short what, 663*663afb9bSAndroid Build Coastguard Worker int options); 664*663afb9bSAndroid Build Coastguard Worker 665*663afb9bSAndroid Build Coastguard Worker /** 666*663afb9bSAndroid Build Coastguard Worker @name Filtering support 667*663afb9bSAndroid Build Coastguard Worker 668*663afb9bSAndroid Build Coastguard Worker @{ 669*663afb9bSAndroid Build Coastguard Worker */ 670*663afb9bSAndroid Build Coastguard Worker /** 671*663afb9bSAndroid Build Coastguard Worker Values that filters can return. 672*663afb9bSAndroid Build Coastguard Worker */ 673*663afb9bSAndroid Build Coastguard Worker enum bufferevent_filter_result { 674*663afb9bSAndroid Build Coastguard Worker /** everything is okay */ 675*663afb9bSAndroid Build Coastguard Worker BEV_OK = 0, 676*663afb9bSAndroid Build Coastguard Worker 677*663afb9bSAndroid Build Coastguard Worker /** the filter needs to read more data before output */ 678*663afb9bSAndroid Build Coastguard Worker BEV_NEED_MORE = 1, 679*663afb9bSAndroid Build Coastguard Worker 680*663afb9bSAndroid Build Coastguard Worker /** the filter encountered a critical error, no further data 681*663afb9bSAndroid Build Coastguard Worker can be processed. */ 682*663afb9bSAndroid Build Coastguard Worker BEV_ERROR = 2 683*663afb9bSAndroid Build Coastguard Worker }; 684*663afb9bSAndroid Build Coastguard Worker 685*663afb9bSAndroid Build Coastguard Worker /** A callback function to implement a filter for a bufferevent. 686*663afb9bSAndroid Build Coastguard Worker 687*663afb9bSAndroid Build Coastguard Worker @param src An evbuffer to drain data from. 688*663afb9bSAndroid Build Coastguard Worker @param dst An evbuffer to add data to. 689*663afb9bSAndroid Build Coastguard Worker @param limit A suggested upper bound of bytes to write to dst. 690*663afb9bSAndroid Build Coastguard Worker The filter may ignore this value, but doing so means that 691*663afb9bSAndroid Build Coastguard Worker it will overflow the high-water mark associated with dst. 692*663afb9bSAndroid Build Coastguard Worker -1 means "no limit". 693*663afb9bSAndroid Build Coastguard Worker @param mode Whether we should write data as may be convenient 694*663afb9bSAndroid Build Coastguard Worker (BEV_NORMAL), or flush as much data as we can (BEV_FLUSH), 695*663afb9bSAndroid Build Coastguard Worker or flush as much as we can, possibly including an end-of-stream 696*663afb9bSAndroid Build Coastguard Worker marker (BEV_FINISH). 697*663afb9bSAndroid Build Coastguard Worker @param ctx A user-supplied pointer. 698*663afb9bSAndroid Build Coastguard Worker 699*663afb9bSAndroid Build Coastguard Worker @return BEV_OK if we wrote some data; BEV_NEED_MORE if we can't 700*663afb9bSAndroid Build Coastguard Worker produce any more output until we get some input; and BEV_ERROR 701*663afb9bSAndroid Build Coastguard Worker on an error. 702*663afb9bSAndroid Build Coastguard Worker */ 703*663afb9bSAndroid Build Coastguard Worker typedef enum bufferevent_filter_result (*bufferevent_filter_cb)( 704*663afb9bSAndroid Build Coastguard Worker struct evbuffer *src, struct evbuffer *dst, ev_ssize_t dst_limit, 705*663afb9bSAndroid Build Coastguard Worker enum bufferevent_flush_mode mode, void *ctx); 706*663afb9bSAndroid Build Coastguard Worker 707*663afb9bSAndroid Build Coastguard Worker /** 708*663afb9bSAndroid Build Coastguard Worker Allocate a new filtering bufferevent on top of an existing bufferevent. 709*663afb9bSAndroid Build Coastguard Worker 710*663afb9bSAndroid Build Coastguard Worker @param underlying the underlying bufferevent. 711*663afb9bSAndroid Build Coastguard Worker @param input_filter The filter to apply to data we read from the underlying 712*663afb9bSAndroid Build Coastguard Worker bufferevent 713*663afb9bSAndroid Build Coastguard Worker @param output_filter The filer to apply to data we write to the underlying 714*663afb9bSAndroid Build Coastguard Worker bufferevent 715*663afb9bSAndroid Build Coastguard Worker @param options A bitfield of bufferevent options. 716*663afb9bSAndroid Build Coastguard Worker @param free_context A function to use to free the filter context when 717*663afb9bSAndroid Build Coastguard Worker this bufferevent is freed. 718*663afb9bSAndroid Build Coastguard Worker @param ctx A context pointer to pass to the filter functions. 719*663afb9bSAndroid Build Coastguard Worker */ 720*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 721*663afb9bSAndroid Build Coastguard Worker struct bufferevent * 722*663afb9bSAndroid Build Coastguard Worker bufferevent_filter_new(struct bufferevent *underlying, 723*663afb9bSAndroid Build Coastguard Worker bufferevent_filter_cb input_filter, 724*663afb9bSAndroid Build Coastguard Worker bufferevent_filter_cb output_filter, 725*663afb9bSAndroid Build Coastguard Worker int options, 726*663afb9bSAndroid Build Coastguard Worker void (*free_context)(void *), 727*663afb9bSAndroid Build Coastguard Worker void *ctx); 728*663afb9bSAndroid Build Coastguard Worker /**@}*/ 729*663afb9bSAndroid Build Coastguard Worker 730*663afb9bSAndroid Build Coastguard Worker /** 731*663afb9bSAndroid Build Coastguard Worker Allocate a pair of linked bufferevents. The bufferevents behave as would 732*663afb9bSAndroid Build Coastguard Worker two bufferevent_sock instances connected to opposite ends of a 733*663afb9bSAndroid Build Coastguard Worker socketpair(), except that no internal socketpair is allocated. 734*663afb9bSAndroid Build Coastguard Worker 735*663afb9bSAndroid Build Coastguard Worker @param base The event base to associate with the socketpair. 736*663afb9bSAndroid Build Coastguard Worker @param options A set of options for this bufferevent 737*663afb9bSAndroid Build Coastguard Worker @param pair A pointer to an array to hold the two new bufferevent objects. 738*663afb9bSAndroid Build Coastguard Worker @return 0 on success, -1 on failure. 739*663afb9bSAndroid Build Coastguard Worker */ 740*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 741*663afb9bSAndroid Build Coastguard Worker int bufferevent_pair_new(struct event_base *base, int options, 742*663afb9bSAndroid Build Coastguard Worker struct bufferevent *pair[2]); 743*663afb9bSAndroid Build Coastguard Worker 744*663afb9bSAndroid Build Coastguard Worker /** 745*663afb9bSAndroid Build Coastguard Worker Given one bufferevent returned by bufferevent_pair_new(), returns the 746*663afb9bSAndroid Build Coastguard Worker other one if it still exists. Otherwise returns NULL. 747*663afb9bSAndroid Build Coastguard Worker */ 748*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 749*663afb9bSAndroid Build Coastguard Worker struct bufferevent *bufferevent_pair_get_partner(struct bufferevent *bev); 750*663afb9bSAndroid Build Coastguard Worker 751*663afb9bSAndroid Build Coastguard Worker /** 752*663afb9bSAndroid Build Coastguard Worker Abstract type used to configure rate-limiting on a bufferevent or a group 753*663afb9bSAndroid Build Coastguard Worker of bufferevents. 754*663afb9bSAndroid Build Coastguard Worker */ 755*663afb9bSAndroid Build Coastguard Worker struct ev_token_bucket_cfg; 756*663afb9bSAndroid Build Coastguard Worker 757*663afb9bSAndroid Build Coastguard Worker /** 758*663afb9bSAndroid Build Coastguard Worker A group of bufferevents which are configured to respect the same rate 759*663afb9bSAndroid Build Coastguard Worker limit. 760*663afb9bSAndroid Build Coastguard Worker */ 761*663afb9bSAndroid Build Coastguard Worker struct bufferevent_rate_limit_group; 762*663afb9bSAndroid Build Coastguard Worker 763*663afb9bSAndroid Build Coastguard Worker /** Maximum configurable rate- or burst-limit. */ 764*663afb9bSAndroid Build Coastguard Worker #define EV_RATE_LIMIT_MAX EV_SSIZE_MAX 765*663afb9bSAndroid Build Coastguard Worker 766*663afb9bSAndroid Build Coastguard Worker /** 767*663afb9bSAndroid Build Coastguard Worker Initialize and return a new object to configure the rate-limiting behavior 768*663afb9bSAndroid Build Coastguard Worker of bufferevents. 769*663afb9bSAndroid Build Coastguard Worker 770*663afb9bSAndroid Build Coastguard Worker @param read_rate The maximum number of bytes to read per tick on 771*663afb9bSAndroid Build Coastguard Worker average. 772*663afb9bSAndroid Build Coastguard Worker @param read_burst The maximum number of bytes to read in any single tick. 773*663afb9bSAndroid Build Coastguard Worker @param write_rate The maximum number of bytes to write per tick on 774*663afb9bSAndroid Build Coastguard Worker average. 775*663afb9bSAndroid Build Coastguard Worker @param write_burst The maximum number of bytes to write in any single tick. 776*663afb9bSAndroid Build Coastguard Worker @param tick_len The length of a single tick. Defaults to one second. 777*663afb9bSAndroid Build Coastguard Worker Any fractions of a millisecond are ignored. 778*663afb9bSAndroid Build Coastguard Worker 779*663afb9bSAndroid Build Coastguard Worker Note that all rate-limits hare are currently best-effort: future versions 780*663afb9bSAndroid Build Coastguard Worker of Libevent may implement them more tightly. 781*663afb9bSAndroid Build Coastguard Worker */ 782*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 783*663afb9bSAndroid Build Coastguard Worker struct ev_token_bucket_cfg *ev_token_bucket_cfg_new( 784*663afb9bSAndroid Build Coastguard Worker size_t read_rate, size_t read_burst, 785*663afb9bSAndroid Build Coastguard Worker size_t write_rate, size_t write_burst, 786*663afb9bSAndroid Build Coastguard Worker const struct timeval *tick_len); 787*663afb9bSAndroid Build Coastguard Worker 788*663afb9bSAndroid Build Coastguard Worker /** Free all storage held in 'cfg'. 789*663afb9bSAndroid Build Coastguard Worker 790*663afb9bSAndroid Build Coastguard Worker Note: 'cfg' is not currently reference-counted; it is not safe to free it 791*663afb9bSAndroid Build Coastguard Worker until no bufferevent is using it. 792*663afb9bSAndroid Build Coastguard Worker */ 793*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 794*663afb9bSAndroid Build Coastguard Worker void ev_token_bucket_cfg_free(struct ev_token_bucket_cfg *cfg); 795*663afb9bSAndroid Build Coastguard Worker 796*663afb9bSAndroid Build Coastguard Worker /** 797*663afb9bSAndroid Build Coastguard Worker Set the rate-limit of a the bufferevent 'bev' to the one specified in 798*663afb9bSAndroid Build Coastguard Worker 'cfg'. If 'cfg' is NULL, disable any per-bufferevent rate-limiting on 799*663afb9bSAndroid Build Coastguard Worker 'bev'. 800*663afb9bSAndroid Build Coastguard Worker 801*663afb9bSAndroid Build Coastguard Worker Note that only some bufferevent types currently respect rate-limiting. 802*663afb9bSAndroid Build Coastguard Worker They are: socket-based bufferevents (normal and IOCP-based), and SSL-based 803*663afb9bSAndroid Build Coastguard Worker bufferevents. 804*663afb9bSAndroid Build Coastguard Worker 805*663afb9bSAndroid Build Coastguard Worker Return 0 on success, -1 on failure. 806*663afb9bSAndroid Build Coastguard Worker */ 807*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 808*663afb9bSAndroid Build Coastguard Worker int bufferevent_set_rate_limit(struct bufferevent *bev, 809*663afb9bSAndroid Build Coastguard Worker struct ev_token_bucket_cfg *cfg); 810*663afb9bSAndroid Build Coastguard Worker 811*663afb9bSAndroid Build Coastguard Worker /** 812*663afb9bSAndroid Build Coastguard Worker Create a new rate-limit group for bufferevents. A rate-limit group 813*663afb9bSAndroid Build Coastguard Worker constrains the maximum number of bytes sent and received, in toto, 814*663afb9bSAndroid Build Coastguard Worker by all of its bufferevents. 815*663afb9bSAndroid Build Coastguard Worker 816*663afb9bSAndroid Build Coastguard Worker @param base An event_base to run any necessary timeouts for the group. 817*663afb9bSAndroid Build Coastguard Worker Note that all bufferevents in the group do not necessarily need to share 818*663afb9bSAndroid Build Coastguard Worker this event_base. 819*663afb9bSAndroid Build Coastguard Worker @param cfg The rate-limit for this group. 820*663afb9bSAndroid Build Coastguard Worker 821*663afb9bSAndroid Build Coastguard Worker Note that all rate-limits hare are currently best-effort: future versions 822*663afb9bSAndroid Build Coastguard Worker of Libevent may implement them more tightly. 823*663afb9bSAndroid Build Coastguard Worker 824*663afb9bSAndroid Build Coastguard Worker Note also that only some bufferevent types currently respect rate-limiting. 825*663afb9bSAndroid Build Coastguard Worker They are: socket-based bufferevents (normal and IOCP-based), and SSL-based 826*663afb9bSAndroid Build Coastguard Worker bufferevents. 827*663afb9bSAndroid Build Coastguard Worker */ 828*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 829*663afb9bSAndroid Build Coastguard Worker struct bufferevent_rate_limit_group *bufferevent_rate_limit_group_new( 830*663afb9bSAndroid Build Coastguard Worker struct event_base *base, 831*663afb9bSAndroid Build Coastguard Worker const struct ev_token_bucket_cfg *cfg); 832*663afb9bSAndroid Build Coastguard Worker /** 833*663afb9bSAndroid Build Coastguard Worker Change the rate-limiting settings for a given rate-limiting group. 834*663afb9bSAndroid Build Coastguard Worker 835*663afb9bSAndroid Build Coastguard Worker Return 0 on success, -1 on failure. 836*663afb9bSAndroid Build Coastguard Worker */ 837*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 838*663afb9bSAndroid Build Coastguard Worker int bufferevent_rate_limit_group_set_cfg( 839*663afb9bSAndroid Build Coastguard Worker struct bufferevent_rate_limit_group *, 840*663afb9bSAndroid Build Coastguard Worker const struct ev_token_bucket_cfg *); 841*663afb9bSAndroid Build Coastguard Worker 842*663afb9bSAndroid Build Coastguard Worker /** 843*663afb9bSAndroid Build Coastguard Worker Change the smallest quantum we're willing to allocate to any single 844*663afb9bSAndroid Build Coastguard Worker bufferevent in a group for reading or writing at a time. 845*663afb9bSAndroid Build Coastguard Worker 846*663afb9bSAndroid Build Coastguard Worker The rationale is that, because of TCP/IP protocol overheads and kernel 847*663afb9bSAndroid Build Coastguard Worker behavior, if a rate-limiting group is so tight on bandwidth that you're 848*663afb9bSAndroid Build Coastguard Worker only willing to send 1 byte per tick per bufferevent, you might instead 849*663afb9bSAndroid Build Coastguard Worker want to batch up the reads and writes so that you send N bytes per 850*663afb9bSAndroid Build Coastguard Worker 1/N of the bufferevents (chosen at random) each tick, so you still wind 851*663afb9bSAndroid Build Coastguard Worker up send 1 byte per tick per bufferevent on average, but you don't send 852*663afb9bSAndroid Build Coastguard Worker so many tiny packets. 853*663afb9bSAndroid Build Coastguard Worker 854*663afb9bSAndroid Build Coastguard Worker The default min-share is currently 64 bytes. 855*663afb9bSAndroid Build Coastguard Worker 856*663afb9bSAndroid Build Coastguard Worker Returns 0 on success, -1 on failure. 857*663afb9bSAndroid Build Coastguard Worker */ 858*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 859*663afb9bSAndroid Build Coastguard Worker int bufferevent_rate_limit_group_set_min_share( 860*663afb9bSAndroid Build Coastguard Worker struct bufferevent_rate_limit_group *, size_t); 861*663afb9bSAndroid Build Coastguard Worker 862*663afb9bSAndroid Build Coastguard Worker /** 863*663afb9bSAndroid Build Coastguard Worker Free a rate-limiting group. The group must have no members when 864*663afb9bSAndroid Build Coastguard Worker this function is called. 865*663afb9bSAndroid Build Coastguard Worker */ 866*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 867*663afb9bSAndroid Build Coastguard Worker void bufferevent_rate_limit_group_free(struct bufferevent_rate_limit_group *); 868*663afb9bSAndroid Build Coastguard Worker 869*663afb9bSAndroid Build Coastguard Worker /** 870*663afb9bSAndroid Build Coastguard Worker Add 'bev' to the list of bufferevents whose aggregate reading and writing 871*663afb9bSAndroid Build Coastguard Worker is restricted by 'g'. If 'g' is NULL, remove 'bev' from its current group. 872*663afb9bSAndroid Build Coastguard Worker 873*663afb9bSAndroid Build Coastguard Worker A bufferevent may belong to no more than one rate-limit group at a time. 874*663afb9bSAndroid Build Coastguard Worker If 'bev' is already a member of a group, it will be removed from its old 875*663afb9bSAndroid Build Coastguard Worker group before being added to 'g'. 876*663afb9bSAndroid Build Coastguard Worker 877*663afb9bSAndroid Build Coastguard Worker Return 0 on success and -1 on failure. 878*663afb9bSAndroid Build Coastguard Worker */ 879*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 880*663afb9bSAndroid Build Coastguard Worker int bufferevent_add_to_rate_limit_group(struct bufferevent *bev, 881*663afb9bSAndroid Build Coastguard Worker struct bufferevent_rate_limit_group *g); 882*663afb9bSAndroid Build Coastguard Worker 883*663afb9bSAndroid Build Coastguard Worker /** Remove 'bev' from its current rate-limit group (if any). */ 884*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 885*663afb9bSAndroid Build Coastguard Worker int bufferevent_remove_from_rate_limit_group(struct bufferevent *bev); 886*663afb9bSAndroid Build Coastguard Worker 887*663afb9bSAndroid Build Coastguard Worker /** 888*663afb9bSAndroid Build Coastguard Worker Set the size limit for single read operation. 889*663afb9bSAndroid Build Coastguard Worker 890*663afb9bSAndroid Build Coastguard Worker Set to 0 for a reasonable default. 891*663afb9bSAndroid Build Coastguard Worker 892*663afb9bSAndroid Build Coastguard Worker Return 0 on success and -1 on failure. 893*663afb9bSAndroid Build Coastguard Worker */ 894*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 895*663afb9bSAndroid Build Coastguard Worker int bufferevent_set_max_single_read(struct bufferevent *bev, size_t size); 896*663afb9bSAndroid Build Coastguard Worker 897*663afb9bSAndroid Build Coastguard Worker /** 898*663afb9bSAndroid Build Coastguard Worker Set the size limit for single write operation. 899*663afb9bSAndroid Build Coastguard Worker 900*663afb9bSAndroid Build Coastguard Worker Set to 0 for a reasonable default. 901*663afb9bSAndroid Build Coastguard Worker 902*663afb9bSAndroid Build Coastguard Worker Return 0 on success and -1 on failure. 903*663afb9bSAndroid Build Coastguard Worker */ 904*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 905*663afb9bSAndroid Build Coastguard Worker int bufferevent_set_max_single_write(struct bufferevent *bev, size_t size); 906*663afb9bSAndroid Build Coastguard Worker 907*663afb9bSAndroid Build Coastguard Worker /** Get the current size limit for single read operation. */ 908*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 909*663afb9bSAndroid Build Coastguard Worker ev_ssize_t bufferevent_get_max_single_read(struct bufferevent *bev); 910*663afb9bSAndroid Build Coastguard Worker 911*663afb9bSAndroid Build Coastguard Worker /** Get the current size limit for single write operation. */ 912*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 913*663afb9bSAndroid Build Coastguard Worker ev_ssize_t bufferevent_get_max_single_write(struct bufferevent *bev); 914*663afb9bSAndroid Build Coastguard Worker 915*663afb9bSAndroid Build Coastguard Worker /** 916*663afb9bSAndroid Build Coastguard Worker @name Rate limit inspection 917*663afb9bSAndroid Build Coastguard Worker 918*663afb9bSAndroid Build Coastguard Worker Return the current read or write bucket size for a bufferevent. 919*663afb9bSAndroid Build Coastguard Worker If it is not configured with a per-bufferevent ratelimit, return 920*663afb9bSAndroid Build Coastguard Worker EV_SSIZE_MAX. This function does not inspect the group limit, if any. 921*663afb9bSAndroid Build Coastguard Worker Note that it can return a negative value if the bufferevent has been 922*663afb9bSAndroid Build Coastguard Worker made to read or write more than its limit. 923*663afb9bSAndroid Build Coastguard Worker 924*663afb9bSAndroid Build Coastguard Worker @{ 925*663afb9bSAndroid Build Coastguard Worker */ 926*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 927*663afb9bSAndroid Build Coastguard Worker ev_ssize_t bufferevent_get_read_limit(struct bufferevent *bev); 928*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 929*663afb9bSAndroid Build Coastguard Worker ev_ssize_t bufferevent_get_write_limit(struct bufferevent *bev); 930*663afb9bSAndroid Build Coastguard Worker /*@}*/ 931*663afb9bSAndroid Build Coastguard Worker 932*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 933*663afb9bSAndroid Build Coastguard Worker ev_ssize_t bufferevent_get_max_to_read(struct bufferevent *bev); 934*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 935*663afb9bSAndroid Build Coastguard Worker ev_ssize_t bufferevent_get_max_to_write(struct bufferevent *bev); 936*663afb9bSAndroid Build Coastguard Worker 937*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 938*663afb9bSAndroid Build Coastguard Worker const struct ev_token_bucket_cfg *bufferevent_get_token_bucket_cfg(const struct bufferevent * bev); 939*663afb9bSAndroid Build Coastguard Worker 940*663afb9bSAndroid Build Coastguard Worker /** 941*663afb9bSAndroid Build Coastguard Worker @name Group Rate limit inspection 942*663afb9bSAndroid Build Coastguard Worker 943*663afb9bSAndroid Build Coastguard Worker Return the read or write bucket size for a bufferevent rate limit 944*663afb9bSAndroid Build Coastguard Worker group. Note that it can return a negative value if bufferevents in 945*663afb9bSAndroid Build Coastguard Worker the group have been made to read or write more than their limits. 946*663afb9bSAndroid Build Coastguard Worker 947*663afb9bSAndroid Build Coastguard Worker @{ 948*663afb9bSAndroid Build Coastguard Worker */ 949*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 950*663afb9bSAndroid Build Coastguard Worker ev_ssize_t bufferevent_rate_limit_group_get_read_limit( 951*663afb9bSAndroid Build Coastguard Worker struct bufferevent_rate_limit_group *); 952*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 953*663afb9bSAndroid Build Coastguard Worker ev_ssize_t bufferevent_rate_limit_group_get_write_limit( 954*663afb9bSAndroid Build Coastguard Worker struct bufferevent_rate_limit_group *); 955*663afb9bSAndroid Build Coastguard Worker /*@}*/ 956*663afb9bSAndroid Build Coastguard Worker 957*663afb9bSAndroid Build Coastguard Worker /** 958*663afb9bSAndroid Build Coastguard Worker @name Rate limit manipulation 959*663afb9bSAndroid Build Coastguard Worker 960*663afb9bSAndroid Build Coastguard Worker Subtract a number of bytes from a bufferevent's read or write bucket. 961*663afb9bSAndroid Build Coastguard Worker The decrement value can be negative, if you want to manually refill 962*663afb9bSAndroid Build Coastguard Worker the bucket. If the change puts the bucket above or below zero, the 963*663afb9bSAndroid Build Coastguard Worker bufferevent will resume or suspend reading writing as appropriate. 964*663afb9bSAndroid Build Coastguard Worker These functions make no change in the buckets for the bufferevent's 965*663afb9bSAndroid Build Coastguard Worker group, if any. 966*663afb9bSAndroid Build Coastguard Worker 967*663afb9bSAndroid Build Coastguard Worker Returns 0 on success, -1 on internal error. 968*663afb9bSAndroid Build Coastguard Worker 969*663afb9bSAndroid Build Coastguard Worker @{ 970*663afb9bSAndroid Build Coastguard Worker */ 971*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 972*663afb9bSAndroid Build Coastguard Worker int bufferevent_decrement_read_limit(struct bufferevent *bev, ev_ssize_t decr); 973*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 974*663afb9bSAndroid Build Coastguard Worker int bufferevent_decrement_write_limit(struct bufferevent *bev, ev_ssize_t decr); 975*663afb9bSAndroid Build Coastguard Worker /*@}*/ 976*663afb9bSAndroid Build Coastguard Worker 977*663afb9bSAndroid Build Coastguard Worker /** 978*663afb9bSAndroid Build Coastguard Worker @name Group rate limit manipulation 979*663afb9bSAndroid Build Coastguard Worker 980*663afb9bSAndroid Build Coastguard Worker Subtract a number of bytes from a bufferevent rate-limiting group's 981*663afb9bSAndroid Build Coastguard Worker read or write bucket. The decrement value can be negative, if you 982*663afb9bSAndroid Build Coastguard Worker want to manually refill the bucket. If the change puts the bucket 983*663afb9bSAndroid Build Coastguard Worker above or below zero, the bufferevents in the group will resume or 984*663afb9bSAndroid Build Coastguard Worker suspend reading writing as appropriate. 985*663afb9bSAndroid Build Coastguard Worker 986*663afb9bSAndroid Build Coastguard Worker Returns 0 on success, -1 on internal error. 987*663afb9bSAndroid Build Coastguard Worker 988*663afb9bSAndroid Build Coastguard Worker @{ 989*663afb9bSAndroid Build Coastguard Worker */ 990*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 991*663afb9bSAndroid Build Coastguard Worker int bufferevent_rate_limit_group_decrement_read( 992*663afb9bSAndroid Build Coastguard Worker struct bufferevent_rate_limit_group *, ev_ssize_t); 993*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 994*663afb9bSAndroid Build Coastguard Worker int bufferevent_rate_limit_group_decrement_write( 995*663afb9bSAndroid Build Coastguard Worker struct bufferevent_rate_limit_group *, ev_ssize_t); 996*663afb9bSAndroid Build Coastguard Worker /*@}*/ 997*663afb9bSAndroid Build Coastguard Worker 998*663afb9bSAndroid Build Coastguard Worker 999*663afb9bSAndroid Build Coastguard Worker /** 1000*663afb9bSAndroid Build Coastguard Worker * Inspect the total bytes read/written on a group. 1001*663afb9bSAndroid Build Coastguard Worker * 1002*663afb9bSAndroid Build Coastguard Worker * Set the variable pointed to by total_read_out to the total number of bytes 1003*663afb9bSAndroid Build Coastguard Worker * ever read on grp, and the variable pointed to by total_written_out to the 1004*663afb9bSAndroid Build Coastguard Worker * total number of bytes ever written on grp. */ 1005*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 1006*663afb9bSAndroid Build Coastguard Worker void bufferevent_rate_limit_group_get_totals( 1007*663afb9bSAndroid Build Coastguard Worker struct bufferevent_rate_limit_group *grp, 1008*663afb9bSAndroid Build Coastguard Worker ev_uint64_t *total_read_out, ev_uint64_t *total_written_out); 1009*663afb9bSAndroid Build Coastguard Worker 1010*663afb9bSAndroid Build Coastguard Worker /** 1011*663afb9bSAndroid Build Coastguard Worker * Reset the total bytes read/written on a group. 1012*663afb9bSAndroid Build Coastguard Worker * 1013*663afb9bSAndroid Build Coastguard Worker * Reset the number of bytes read or written on grp as given by 1014*663afb9bSAndroid Build Coastguard Worker * bufferevent_rate_limit_group_reset_totals(). */ 1015*663afb9bSAndroid Build Coastguard Worker EVENT2_EXPORT_SYMBOL 1016*663afb9bSAndroid Build Coastguard Worker void 1017*663afb9bSAndroid Build Coastguard Worker bufferevent_rate_limit_group_reset_totals( 1018*663afb9bSAndroid Build Coastguard Worker struct bufferevent_rate_limit_group *grp); 1019*663afb9bSAndroid Build Coastguard Worker 1020*663afb9bSAndroid Build Coastguard Worker #ifdef __cplusplus 1021*663afb9bSAndroid Build Coastguard Worker } 1022*663afb9bSAndroid Build Coastguard Worker #endif 1023*663afb9bSAndroid Build Coastguard Worker 1024*663afb9bSAndroid Build Coastguard Worker #endif /* EVENT2_BUFFEREVENT_H_INCLUDED_ */ 1025