xref: /aosp_15_r20/external/libevent/include/event2/bufferevent.h (revision 663afb9b963571284e0f0a60f257164ab54f64bf)
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