1 /* $OpenLDAP$ */
2 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
3  *
4  * Copyright 1998-2021 The OpenLDAP Foundation.
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted only as authorized by the OpenLDAP
9  * Public License.
10  *
11  * A copy of this license is available in the file LICENSE in the
12  * top-level directory of the distribution or, alternatively, at
13  * <http://www.OpenLDAP.org/license.html>.
14  */
15 /* Portions Copyright (c) 1995 Regents of the University of Michigan.
16  * All rights reserved.
17  *
18  * Redistribution and use in source and binary forms are permitted
19  * provided that this notice is preserved and that due credit is given
20  * to the University of Michigan at Ann Arbor. The name of the University
21  * may not be used to endorse or promote products derived from this
22  * software without specific prior written permission. This software
23  * is provided ``as is'' without express or implied warranty.
24  */
25 
26 #ifndef PROTO_LLOAD_H
27 #define PROTO_LLOAD_H
28 
29 #include <ldap_cdefs.h>
30 #include "ldap_pvt.h"
31 
32 #include <event2/event.h>
33 
34 LDAP_BEGIN_DECL
35 
36 /*
37  * backend.c
38  */
39 
40 LDAP_SLAPD_F (void) backend_connect( evutil_socket_t s, short what, void *arg );
41 LDAP_SLAPD_F (void *) backend_connect_task( void *ctx, void *arg );
42 LDAP_SLAPD_F (void) backend_retry( LloadBackend *b );
43 LDAP_SLAPD_F (int) upstream_select( LloadOperation *op, LloadConnection **c, int *res, char **message );
44 LDAP_SLAPD_F (int) backend_select( LloadBackend *b, LloadOperation *op, LloadConnection **c, int *res, char **message );
45 LDAP_SLAPD_F (int) try_upstream( LloadBackend *b, lload_c_head *head, LloadOperation *op, LloadConnection *c, int *res, char **message );
46 LDAP_SLAPD_F (void) backend_reset( LloadBackend *b, int gentle );
47 LDAP_SLAPD_F (LloadBackend *) lload_backend_new( void );
48 LDAP_SLAPD_F (void) lload_backend_destroy( LloadBackend *b );
49 
50 /*
51  * bind.c
52  */
53 LDAP_SLAPD_F (int) request_bind( LloadConnection *c, LloadOperation *op );
54 LDAP_SLAPD_F (int) handle_bind_response( LloadConnection *client, LloadOperation *op, BerElement *ber );
55 LDAP_SLAPD_F (int) handle_whoami_response( LloadConnection *client, LloadOperation *op, BerElement *ber );
56 LDAP_SLAPD_F (int) handle_vc_bind_response( LloadConnection *client, LloadOperation *op, BerElement *ber );
57 
58 /*
59  * client.c
60  */
61 LDAP_SLAPD_F (int) request_abandon( LloadConnection *c, LloadOperation *op );
62 LDAP_SLAPD_F (int) request_process( LloadConnection *c, LloadOperation *op );
63 LDAP_SLAPD_F (int) handle_one_request( LloadConnection *c );
64 LDAP_SLAPD_F (void) client_tls_handshake_cb( evutil_socket_t s, short what, void *arg );
65 LDAP_SLAPD_F (LloadConnection *) client_init( ber_socket_t s, const char *peername, struct event_base *base, int use_tls );
66 LDAP_SLAPD_F (void) client_reset( LloadConnection *c );
67 LDAP_SLAPD_F (void) client_destroy( LloadConnection *c );
68 LDAP_SLAPD_F (void) clients_destroy( int gentle );
69 LDAP_SLAPD_V (long) lload_client_max_pending;
70 
71 /*
72  * config.c
73  */
74 LDAP_SLAPD_F (int) lload_read_config( const char *fname, const char *dir );
75 LDAP_SLAPD_F (void) lload_config_destroy( void );
76 LDAP_SLAPD_F (int) verb_to_mask( const char *word, slap_verbmasks *v );
77 LDAP_SLAPD_F (int) lload_tls_get_config( LDAP *ld, int opt, char **val );
78 LDAP_SLAPD_F (void) lload_bindconf_tls_defaults( slap_bindconf *bc );
79 LDAP_SLAPD_F (int) lload_backend_parse( const char *word, LloadBackend *b );
80 LDAP_SLAPD_F (int) lload_bindconf_parse( const char *word, slap_bindconf *bc );
81 LDAP_SLAPD_F (int) lload_bindconf_unparse( slap_bindconf *bc, struct berval *bv );
82 LDAP_SLAPD_F (int) lload_bindconf_tls_set( slap_bindconf *bc, LDAP *ld );
83 LDAP_SLAPD_F (void) lload_bindconf_free( slap_bindconf *bc );
84 #ifdef BALANCER_MODULE
85 LDAP_SLAPD_F (int) lload_back_init_cf( BackendInfo *bi );
86 #endif
87 
88 /*
89  * connection.c
90  */
91 LDAP_SLAPD_V (ldap_pvt_thread_mutex_t) clients_mutex;
92 LDAP_SLAPD_F (void *) handle_pdus( void *ctx, void *arg );
93 LDAP_SLAPD_F (void) connection_write_cb( evutil_socket_t s, short what, void *arg );
94 LDAP_SLAPD_F (void) connection_read_cb( evutil_socket_t s, short what, void *arg );
95 LDAP_SLAPD_F (int) lload_connection_close( LloadConnection *c, void *arg );
96 LDAP_SLAPD_F (LloadConnection *) lload_connection_init( ber_socket_t s, const char *peername, int use_tls );
97 LDAP_SLAPD_F (void) connection_destroy( LloadConnection *c );
98 LDAP_SLAPD_F (void) connections_walk_last( ldap_pvt_thread_mutex_t *cq_mutex,
99         lload_c_head *cq,
100         LloadConnection *cq_last,
101         CONNCB cb,
102         void *arg );
103 LDAP_SLAPD_F (void) connections_walk( ldap_pvt_thread_mutex_t *cq_mutex, lload_c_head *cq, CONNCB cb, void *arg );
104 
105 /*
106  * daemon.c
107  */
108 LDAP_SLAPD_F (int) lload_open_new_listener( const char *urls, LDAPURLDesc *lud );
109 LDAP_SLAPD_F (int) lloadd_listeners_init( const char *urls );
110 LDAP_SLAPD_F (int) lloadd_daemon_destroy( void );
111 LDAP_SLAPD_F (int) lloadd_daemon( struct event_base *daemon_base );
112 LDAP_SLAPD_F (LloadListener **) lloadd_get_listeners( void );
113 LDAP_SLAPD_F (void) listeners_reactivate( void );
114 LDAP_SLAPD_F (struct event_base *) lload_get_base( ber_socket_t s );
115 LDAP_SLAPD_V (int) lload_daemon_threads;
116 LDAP_SLAPD_V (int) lload_daemon_mask;
117 
118 LDAP_SLAPD_F (void) lload_sig_shutdown( evutil_socket_t sig, short what, void *arg );
119 
120 LDAP_SLAPD_F (void) lload_pause_server( void );
121 LDAP_SLAPD_F (void) lload_unpause_server( void );
122 
123 LDAP_SLAPD_V (struct event_base *) daemon_base;
124 LDAP_SLAPD_V (struct evdns_base *) dnsbase;
125 LDAP_SLAPD_V (volatile sig_atomic_t) slapd_shutdown;
126 LDAP_SLAPD_V (volatile sig_atomic_t) slapd_gentle_shutdown;
127 LDAP_SLAPD_V (int) lloadd_inited;
128 LDAP_SLAPD_V (struct LloadChange) lload_change;
129 
130 LDAP_SLAPD_V (struct event *) lload_timeout_event;
131 
132 LDAP_SLAPD_V (LDAP *) lload_tls_backend_ld;
133 LDAP_SLAPD_V (LDAP *) lload_tls_ld;
134 LDAP_SLAPD_V (void *) lload_tls_ctx;
135 #ifdef BALANCER_MODULE
136 LDAP_SLAPD_V (int) lload_use_slap_tls_ctx;
137 #endif /* BALANCER_MODULE */
138 
139 /*
140  * extended.c
141  */
142 LDAP_SLAPD_V (Avlnode *) lload_exop_handlers;
143 LDAP_SLAPD_F (int) exop_handler_cmp( const void *l, const void *r );
144 LDAP_SLAPD_F (int) request_extended( LloadConnection *c, LloadOperation *op );
145 LDAP_SLAPD_F (int) lload_exop_init( void );
146 
147 /*
148  * init.c
149  */
150 LDAP_SLAPD_F (int) lload_global_init( void );
151 LDAP_SLAPD_F (int) lload_tls_init( void );
152 LDAP_SLAPD_F (int) lload_init( int mode, const char *name );
153 LDAP_SLAPD_F (int) lload_destroy( void );
154 LDAP_SLAPD_F (void) lload_counters_init( void );
155 
156 /*
157  * libevent_support.c
158  */
159 LDAP_SLAPD_F (int) lload_libevent_init( void );
160 LDAP_SLAPD_F (void) lload_libevent_destroy( void );
161 
162 #ifdef BALANCER_MODULE
163 /*
164  * monitor.c
165  */
166 LDAP_SLAPD_V (monitor_subsys_t *) lload_monitor_client_subsys;
167 LDAP_SLAPD_F (int) lload_monitor_open( void );
168 LDAP_SLAPD_F (int) lload_monitor_conn_entry_create( LloadConnection *c, monitor_subsys_t *ms );
169 LDAP_SLAPD_F (int) lload_monitor_conn_unlink( LloadConnection *c );
170 LDAP_SLAPD_F (int) lload_monitor_backend_init( BackendInfo *bi, monitor_subsys_t *ms, LloadBackend *b );
171 LDAP_SLAPD_F (int) lload_monitor_tier_init( BackendInfo *bi, LloadTier *tier );
172 #endif /* BALANCER_MODULE */
173 
174 /*
175  * operation.c
176  */
177 LDAP_SLAPD_V (ldap_pvt_thread_mutex_t) lload_pin_mutex;
178 LDAP_SLAPD_V (unsigned long) lload_next_pin;
179 LDAP_SLAPD_V (TAvlnode *) lload_control_actions;
180 LDAP_SLAPD_V (TAvlnode *) lload_exop_actions;
181 LDAP_SLAPD_V (enum op_restriction) lload_default_exop_action;
182 LDAP_SLAPD_F (int) lload_restriction_cmp( const void *left, const void *right );
183 LDAP_SLAPD_F (const char *) lload_msgtype2str( ber_tag_t tag );
184 LDAP_SLAPD_F (int) operation_upstream_cmp( const void *l, const void *r );
185 LDAP_SLAPD_F (int) operation_client_cmp( const void *l, const void *r );
186 LDAP_SLAPD_F (LloadOperation *) operation_init( LloadConnection *c, BerElement *ber );
187 LDAP_SLAPD_F (int) operation_send_abandon( LloadOperation *op, LloadConnection *c );
188 LDAP_SLAPD_F (void) operation_abandon( LloadOperation *op );
189 LDAP_SLAPD_F (void) operation_send_reject( LloadOperation *op, int result, const char *msg, int send_anyway );
190 LDAP_SLAPD_F (int) operation_send_reject_locked( LloadOperation *op, int result, const char *msg, int send_anyway );
191 LDAP_SLAPD_F (void) operation_lost_upstream( LloadOperation *op );
192 LDAP_SLAPD_F (void) operation_destroy( LloadOperation *op );
193 LDAP_SLAPD_F (int) operation_unlink( LloadOperation *op );
194 LDAP_SLAPD_F (int) operation_unlink_client( LloadOperation *op, LloadConnection *client );
195 LDAP_SLAPD_F (int) operation_unlink_upstream( LloadOperation *op, LloadConnection *upstream );
196 LDAP_SLAPD_F (void) operations_timeout( evutil_socket_t s, short what, void *arg );
197 LDAP_SLAPD_F (void) operation_update_conn_counters( LloadOperation *op, LloadConnection *upstream );
198 LDAP_SLAPD_F (void) operation_update_backend_counters( LloadOperation *op, LloadBackend *b );
199 LDAP_SLAPD_F (void) operation_update_global_rejected( LloadOperation *op );
200 
201 /*
202  * tier.c
203  */
204 LDAP_SLAPD_F (int) tier_startup( LloadTier *tier );
205 LDAP_SLAPD_F (int) tier_reset( LloadTier *tier, int shutdown );
206 LDAP_SLAPD_F (int) tier_destroy( LloadTier *tier );
207 LDAP_SLAPD_F (void) lload_tiers_shutdown( void );
208 LDAP_SLAPD_F (void) lload_tiers_reset( int shutdown );
209 LDAP_SLAPD_F (void) lload_tiers_update( evutil_socket_t s, short what, void *arg );
210 LDAP_SLAPD_F (void) lload_tiers_destroy( void );
211 LDAP_SLAPD_F (struct lload_tier_type *) lload_tier_find( char *type );
212 
213 /*
214  * upstream.c
215  */
216 LDAP_SLAPD_F (int) lload_upstream_entry_cmp( const void *l, const void *r );
217 LDAP_SLAPD_F (int) forward_final_response( LloadConnection *client, LloadOperation *op, BerElement *ber );
218 LDAP_SLAPD_F (int) forward_response( LloadConnection *client, LloadOperation *op, BerElement *ber );
219 LDAP_SLAPD_F (void *) upstream_bind( void *ctx, void *arg );
220 LDAP_SLAPD_F (LloadConnection *) upstream_init( ber_socket_t s, LloadBackend *b );
221 LDAP_SLAPD_F (void) upstream_destroy( LloadConnection *c );
222 
223 LDAP_SLAPD_V (ber_len_t) sockbuf_max_incoming_client;
224 LDAP_SLAPD_V (ber_len_t) sockbuf_max_incoming_upstream;
225 LDAP_SLAPD_V (int) lload_conn_max_pdus_per_cycle;
226 
227 LDAP_SLAPD_V (int) lload_write_coherence;
228 
229 LDAP_SLAPD_V (lload_features_t) lload_features;
230 
231 LDAP_SLAPD_V (slap_mask_t) global_allows;
232 LDAP_SLAPD_V (slap_mask_t) global_disallows;
233 
234 LDAP_SLAPD_V (const char) Versionstr[];
235 
236 LDAP_SLAPD_V (int) global_gentlehup;
237 LDAP_SLAPD_V (int) global_idletimeout;
238 
239 LDAP_SLAPD_V (struct timeval *) lload_timeout_api;
240 LDAP_SLAPD_V (struct timeval *) lload_timeout_net;
241 LDAP_SLAPD_V (struct timeval *) lload_write_timeout;
242 
243 LDAP_SLAPD_V (char *) global_host;
244 LDAP_SLAPD_V (int) lber_debug;
245 LDAP_SLAPD_V (int) ldap_syslog;
246 
247 LDAP_SLAPD_V (lload_global_stats_t) lload_stats;
248 LDAP_SLAPD_V (char *) listeners_list;
249 LDAP_END_DECL
250 
251 #endif /* PROTO_LLOAD_H */
252