corosync  2.3.5
coroapi.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2008-2012 Red Hat, Inc.
3  *
4  * All rights reserved.
5  *
6  * Author: Steven Dake (sdake@redhat.com)
7  *
8  * This software licensed under BSD license, the text of which follows:
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions are met:
12  *
13  * - Redistributions of source code must retain the above copyright notice,
14  * this list of conditions and the following disclaimer.
15  * - Redistributions in binary form must reproduce the above copyright notice,
16  * this list of conditions and the following disclaimer in the documentation
17  * and/or other materials provided with the distribution.
18  * - Neither the name of the MontaVista Software, Inc. nor the names of its
19  * contributors may be used to endorse or promote products derived from this
20  * software without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
26  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
32  * THE POSSIBILITY OF SUCH DAMAGE.
33  */
34 #ifndef COROAPI_H_DEFINED
35 #define COROAPI_H_DEFINED
36 
37 #include <config.h>
38 
39 #include <stdio.h>
40 #ifdef HAVE_SYS_UIO_H
41 #include <sys/uio.h>
42 #endif
43 #include <corosync/hdb.h>
44 #include <qb/qbloop.h>
45 #include <corosync/swab.h>
46 
47 typedef struct {
48  uint32_t nodeid __attribute__((aligned(8)));
49  void *conn __attribute__((aligned(8)));
50 } mar_message_source_t __attribute__((aligned(8)));
51 
52 static inline void swab_mar_message_source_t (mar_message_source_t *to_swab)
53 {
54  swab32 (to_swab->nodeid);
55  /*
56  * if it is from a byteswapped machine, then we can safely
57  * ignore its conn info data structure since this is only
58  * local to the machine
59  */
60  to_swab->conn = NULL;
61 }
62 
63 #ifndef TIMER_HANDLE_T
64 typedef qb_loop_timer_handle corosync_timer_handle_t;
65 #define TIMER_HANDLE_T 1
66 #endif
67 
69  const void *group;
70  size_t group_len;
71 };
72 
73 #define TOTEMIP_ADDRLEN (sizeof(struct in6_addr))
74 
75 #define INTERFACE_MAX 2
76 
77 #ifndef MESSAGE_QUEUE_MAX
78 #ifdef HAVE_SMALL_MEMORY_FOOTPRINT
79 #define PROCESSOR_COUNT_MAX 16
80 #define MESSAGE_SIZE_MAX 1024*64
81 #define MESSAGE_QUEUE_MAX 512
82 #else
83 #define PROCESSOR_COUNT_MAX 384
84 #define MESSAGE_SIZE_MAX 1024*1024
85 #define MESSAGE_QUEUE_MAX ((4 * MESSAGE_SIZE_MAX) / totem_config->net_mtu)
86 #endif /* HAVE_SMALL_MEMORY_FOOTPRINT */
87 #endif /* MESSAGE_QUEUE_MAX */
88 
89 #define TOTEM_AGREED 0
90 #define TOTEM_SAFE 1
91 
92 #define MILLI_2_NANO_SECONDS 1000000ULL
93 
94 #if !defined(TOTEM_IP_ADDRESS)
96  unsigned int nodeid;
97  unsigned short family;
98  unsigned char addr[TOTEMIP_ADDRLEN];
99 } __attribute__((packed));
100 #endif
101 
102 #if !defined(MEMB_RING_ID)
103 struct memb_ring_id {
105  unsigned long long seq;
106 } __attribute__((packed));
107 #endif
108 
109 #if !defined(TOTEM_CONFIGURATION_TYPE)
113 };
114 #endif
115 
116 #if !defined(TOTEM_CALLBACK_TOKEN_TYPE)
120 };
121 #endif
122 
126 };
127 #define corosync_lib_flow_control cs_lib_flow_control
128 #define COROSYNC_LIB_FLOW_CONTROL_REQUIRED CS_LIB_FLOW_CONTROL_REQUIRED
129 #define COROSYNC_LIB_FLOW_CONTROL_NOT_REQUIRED CS_LIB_FLOW_CONTROL_NOT_REQUIRED
130 
132  CS_LIB_DISALLOW_INQUORATE = 0, /* default */
134 };
135 
136 #if !defined (COROSYNC_FLOW_CONTROL_STATE)
140 };
141 #define corosync_flow_control_state cs_flow_control_state
142 #define CS_FLOW_CONTROL_STATE_DISABLED CS_FLOW_CONTROL_STATE_DISABLED
143 #define CS_FLOW_CONTROL_STATE_ENABLED CS_FLOW_CONTROL_STATE_ENABLED
144 
145 #endif /* COROSYNC_FLOW_CONTROL_STATE */
146 
147 typedef enum {
157 #define corosync_fatal_error_t cs_fatal_error_t;
158 
159 #ifndef QUORUM_H_DEFINED
160 typedef void (*quorum_callback_fn_t) (int quorate, void *context);
161 
163  int (*quorate) (void);
164  int (*register_callback) (quorum_callback_fn_t callback_fn, void *contexxt);
165  int (*unregister_callback) (quorum_callback_fn_t callback_fn, void *context);
166 };
167 
168 typedef void (*sync_callback_fn_t) (
169  const unsigned int *view_list,
170  size_t view_list_entries,
171  int primary_designated,
172  struct memb_ring_id *ring_id);
173 
174 #endif /* QUORUM_H_DEFINED */
175 
176 
178  /*
179  * Time and timer APIs
180  */
182  unsigned long long nanoseconds_in_future,
183  void *data,
184  void (*timer_nf) (void *data),
185  corosync_timer_handle_t *handle);
186 
188  unsigned long long nanoseconds_from_epoch,
189  void *data,
190  void (*timer_fn) (void *data),
191  corosync_timer_handle_t *handle);
192 
193  void (*timer_delete) (
194  corosync_timer_handle_t timer_handle);
195 
196  unsigned long long (*timer_time_get) (void);
197 
198  unsigned long long (*timer_expire_time_get) (
199  corosync_timer_handle_t timer_handle);
200 
201  /*
202  * IPC APIs
203  */
204  void (*ipc_source_set) (mar_message_source_t *source, void *conn);
205 
207 
208  void *(*ipc_private_data_get) (void *conn);
209 
210  int (*ipc_response_send) (void *conn, const void *msg, size_t mlen);
211 
212  int (*ipc_response_iov_send) (void *conn,
213  const struct iovec *iov, unsigned int iov_len);
214 
215  int (*ipc_dispatch_send) (void *conn, const void *msg, size_t mlen);
216 
217  int (*ipc_dispatch_iov_send) (void *conn,
218  const struct iovec *iov, unsigned int iov_len);
219 
220  void (*ipc_refcnt_inc) (void *conn);
221 
222  void (*ipc_refcnt_dec) (void *conn);
223 
224  /*
225  * Totem APIs
226  */
227  unsigned int (*totem_nodeid_get) (void);
228 
229  int (*totem_family_get) (void);
230 
231  int (*totem_ring_reenable) (void);
232 
233  int (*totem_mcast) (const struct iovec *iovec,
234  unsigned int iov_len, unsigned int guarantee);
235 
237  unsigned int nodeid,
238  struct totem_ip_address *interfaces,
239  unsigned int interfaces_size,
240  char ***status,
241  unsigned int *iface_count);
242 
243  const char *(*totem_ifaces_print) (unsigned int nodeid);
244 
245  const char *(*totem_ip_print) (const struct totem_ip_address *addr);
246 
247  int (*totem_crypto_set) (const char *cipher_type, const char *hash_type);
248 
250  void **handle_out,
252  int delete,
253  int (*callback_fn) (enum totem_callback_token_type type,
254  const void *),
255  const void *data);
256 
257  /*
258  * Totem open process groups API for those service engines
259  * wanting their own groups
260  */
261  int (*tpg_init) (
262  void **instance,
263 
264  void (*deliver_fn) (
265  unsigned int nodeid,
266  const void *msg,
267  unsigned int msg_len,
268  int endian_conversion_required),
269 
270  void (*confchg_fn) (
271  enum totem_configuration_type configuration_type,
272  const unsigned int *member_list,
273  size_t member_list_entries,
274  const unsigned int *left_list,
275  size_t left_list_entries,
276  const unsigned int *joined_list,
277  size_t joined_list_entries,
278  const struct memb_ring_id *ring_id));
279 
280  int (*tpg_exit) (
281  void *instance);
282 
283  int (*tpg_join) (
284  void *instance,
285  const struct corosync_tpg_group *groups,
286  size_t group_cnt);
287 
288  int (*tpg_leave) (
289  void *instance,
290  const struct corosync_tpg_group *groups,
291  size_t group_cnt);
292 
294  void *totempg_groups_instance,
295  const struct iovec *iovec,
296  unsigned int iov_len,
297  int guarantee);
298 
300  void *totempg_groups_instance,
301  const struct iovec *iovec,
302  unsigned int iov_len);
303 
305  int reserved_msgs);
306 
308  void *instance,
309  int guarantee,
310  const struct corosync_tpg_group *groups,
311  size_t groups_cnt,
312  const struct iovec *iovec,
313  unsigned int iov_len);
314 
316  void *instance,
317  const struct corosync_tpg_group *groups,
318  size_t groups_cnt,
319  const struct iovec *iovec,
320  unsigned int iov_len);
321 
323  int reserved_msgs);
324 
326  hdb_handle_t *handle,
327  int (schedwrk_fn) (const void *),
328  const void *context);
329 
330  void (*schedwrk_destroy) (hdb_handle_t handle);
331 
332  int (*sync_request) (
333  const char *service_name);
334 
335  /*
336  * User plugin-callable functions for quorum
337  */
338  int (*quorum_is_quorate) (void);
339  int (*quorum_register_callback) (quorum_callback_fn_t callback_fn, void *context);
340  int (*quorum_unregister_callback) (quorum_callback_fn_t callback_fn, void *context);
341 
342  /*
343  * This one is for the quorum management plugin's use
344  */
346 
347  /*
348  * Plugin loading and unloading
349  */
351  hdb_handle_t *handle,
352  const char *iface_name,
353  int version,
354  void **interface,
355  void *context);
356 
358 
359  /*
360  * Service loading and unloading APIs
361  */
362  unsigned int (*service_link_and_init) (
364  const char *service_name,
365  unsigned int service_ver);
366 
367  unsigned int (*service_unlink_and_exit) (
368  struct corosync_api_v1 *corosync_api_v1,
369  const char *service_name,
370  unsigned int service_ver);
371 
372  /*
373  * Error handling APIs
374  */
375  void (*error_memory_failure) (void) __attribute__ ((noreturn));
376 
377 #define corosync_fatal_error(err) api->fatal_error ((err), __FILE__, __LINE__)
379  const char *file,
380  unsigned int line) __attribute__ ((noreturn));
381 
382  void (*shutdown_request) (void);
383 
384  void (*state_dump) (void);
385 
386  qb_loop_t *(*poll_handle_get) (void);
387 
388  void *(*totem_get_stats)(void);
389 
391  hdb_handle_t *handle,
392  int (schedwrk_fn) (const void *),
393  const void *context);
394 
395  int (*poll_dispatch_add) (qb_loop_t * handle,
396  int fd,
397  int events,
398  void *data,
399 
400  int (*dispatch_fn) (int fd,
401  int revents,
402  void *data));
403 
404 
406  qb_loop_t * handle,
407  int fd);
408 
409 };
410 
411 #define SERVICE_ID_MAKE(a,b) ( ((a)<<16) | (b) )
412 
413 #define SERVICE_HANDLER_MAXIMUM_COUNT 64
414 
415 #define SERVICES_COUNT_MAX 64
416 
418  void (*lib_handler_fn) (void *conn, const void *msg);
420 };
421 
423  void (*exec_handler_fn) (const void *msg, unsigned int nodeid);
424  void (*exec_endian_convert_fn) (void *msg);
425 };
426 
428  struct corosync_service_engine *(*corosync_get_service_engine_ver0) (void);
429 };
430 
432  const char *name;
433  unsigned short id;
434  unsigned short priority; /* Lower priority are loaded first, unloaded last.
435  * 0 is a special case which always loaded _and_ unloaded last
436  */
437  unsigned int private_data_size;
440  char *(*exec_init_fn) (struct corosync_api_v1 *);
441  int (*exec_exit_fn) (void);
442  void (*exec_dump_fn) (void);
443  int (*lib_init_fn) (void *conn);
444  int (*lib_exit_fn) (void *conn);
449  int (*config_init_fn) (struct corosync_api_v1 *);
450  void (*confchg_fn) (
451  enum totem_configuration_type configuration_type,
452  const unsigned int *member_list, size_t member_list_entries,
453  const unsigned int *left_list, size_t left_list_entries,
454  const unsigned int *joined_list, size_t joined_list_entries,
455  const struct memb_ring_id *ring_id);
456  void (*sync_init) (
457  const unsigned int *trans_list,
458  size_t trans_list_entries,
459  const unsigned int *member_list,
460  size_t member_list_entries,
461  const struct memb_ring_id *ring_id);
462  int (*sync_process) (void);
463  void (*sync_activate) (void);
464  void (*sync_abort) (void);
465 };
466 
467 #endif /* COROAPI_H_DEFINED */
int(* quorum_unregister_callback)(quorum_callback_fn_t callback_fn, void *context)
Definition: coroapi.h:340
const char * name
Definition: coroapi.h:432
int(* totem_family_get)(void)
Definition: coroapi.h:229
unsigned short family
Definition: coroapi.h:97
int(* quorum_is_quorate)(void)
Definition: coroapi.h:338
int(* ipc_response_iov_send)(void *conn, const struct iovec *iov, unsigned int iov_len)
Definition: coroapi.h:212
unsigned long long(* timer_time_get)(void)
Definition: coroapi.h:196
enum totem_configuration_type __attribute__
void(* lib_handler_fn)(void *conn, const void *msg)
Definition: coroapi.h:418
#define CS_FLOW_CONTROL_STATE_DISABLED
Definition: coroapi.h:142
void(* state_dump)(void)
Definition: coroapi.h:384
unsigned int(* service_link_and_init)(struct corosync_api_v1 *corosync_api_v1, const char *service_name, unsigned int service_ver)
Definition: coroapi.h:362
int(* ipc_source_is_local)(const mar_message_source_t *source)
Definition: coroapi.h:206
void(* timer_delete)(corosync_timer_handle_t timer_handle)
Definition: coroapi.h:193
unsigned char addr[TOTEMIP_ADDRLEN]
Definition: coroapi.h:98
int(* sync_process)(void)
Definition: coroapi.h:462
void(* exec_dump_fn)(void)
Definition: coroapi.h:442
int(* timer_add_duration)(unsigned long long nanoseconds_in_future, void *data, void(*timer_nf)(void *data), corosync_timer_handle_t *handle)
Definition: coroapi.h:181
int(* totem_ring_reenable)(void)
Definition: coroapi.h:231
void(* exec_endian_convert_fn)(void *msg)
Definition: coroapi.h:424
int(* lib_exit_fn)(void *conn)
Definition: coroapi.h:444
int(* totem_callback_token_create)(void **handle_out, enum totem_callback_token_type type, int delete, int(*callback_fn)(enum totem_callback_token_type type, const void *), const void *data)
Definition: coroapi.h:249
totem_configuration_type
Definition: coroapi.h:110
cs_fatal_error_t
Definition: coroapi.h:147
enum cs_lib_flow_control flow_control
Definition: coroapi.h:438
void(* shutdown_request)(void)
Definition: coroapi.h:382
int(* totem_ifaces_get)(unsigned int nodeid, struct totem_ip_address *interfaces, unsigned int interfaces_size, char ***status, unsigned int *iface_count)
Definition: coroapi.h:236
int guarantee
Definition: totemsrp.c:66
unsigned char addr[TOTEMIP_ADDRLEN]
Definition: coroapi.h:67
int(* plugin_interface_release)(hdb_handle_t handle)
Definition: coroapi.h:357
void(* sync_abort)(void)
Definition: coroapi.h:464
unsigned long long(* timer_expire_time_get)(corosync_timer_handle_t timer_handle)
Definition: coroapi.h:198
int(* tpg_leave)(void *instance, const struct corosync_tpg_group *groups, size_t group_cnt)
Definition: coroapi.h:288
void(* sync_callback_fn_t)(const unsigned int *view_list, size_t view_list_entries, int primary_designated, struct memb_ring_id *ring_id)
Definition: coroapi.h:168
int(* tpg_groups_mcast)(void *instance, int guarantee, const struct corosync_tpg_group *groups, size_t groups_cnt, const struct iovec *iovec, unsigned int iov_len)
Definition: coroapi.h:307
const void * group
Definition: coroapi.h:69
void(* exec_handler_fn)(const void *msg, unsigned int nodeid)
Definition: coroapi.h:423
unsigned short priority
Definition: coroapi.h:434
int(* tpg_joined_release)(int reserved_msgs)
Definition: coroapi.h:304
int(* totem_crypto_set)(const char *cipher_type, const char *hash_type)
Definition: coroapi.h:247
#define CS_FLOW_CONTROL_STATE_ENABLED
Definition: coroapi.h:143
int(* timer_add_absolute)(unsigned long long nanoseconds_from_epoch, void *data, void(*timer_fn)(void *data), corosync_timer_handle_t *handle)
Definition: coroapi.h:187
int(* schedwrk_create)(hdb_handle_t *handle, int(schedwrk_fn)(const void *), const void *context)
Definition: coroapi.h:325
size_t group_len
Definition: coroapi.h:70
int(* quorum_initialize)(struct quorum_callin_functions *fns)
Definition: coroapi.h:345
struct corosync_exec_handler * exec_engine
Definition: coroapi.h:447
struct corosync_lib_handler * lib_engine
Definition: coroapi.h:445
cs_flow_control_state
Definition: coroapi.h:137
unsigned int nodeid
Definition: coroapi.h:96
int(* tpg_joined_mcast)(void *totempg_groups_instance, const struct iovec *iovec, unsigned int iov_len, int guarantee)
Definition: coroapi.h:293
void(* ipc_source_set)(mar_message_source_t *source, void *conn)
Definition: coroapi.h:204
int(* poll_dispatch_add)(qb_loop_t *handle, int fd, int events, void *data, int(*dispatch_fn)(int fd, int revents, void *data))
Definition: coroapi.h:395
void(* ipc_refcnt_inc)(void *conn)
Definition: coroapi.h:220
void(* ipc_refcnt_dec)(void *conn)
Definition: coroapi.h:222
struct totem_ip_address rep
Definition: coroapi.h:104
int(* sync_request)(const char *service_name)
Definition: coroapi.h:332
int(* ipc_dispatch_iov_send)(void *conn, const struct iovec *iov, unsigned int iov_len)
Definition: coroapi.h:217
void(* sync_activate)(void)
Definition: coroapi.h:463
void(* confchg_fn)(enum totem_configuration_type configuration_type, const unsigned int *member_list, size_t member_list_entries, const unsigned int *left_list, size_t left_list_entries, const unsigned int *joined_list, size_t joined_list_entries, const struct memb_ring_id *ring_id)
Definition: coroapi.h:450
int(* ipc_dispatch_send)(void *conn, const void *msg, size_t mlen)
Definition: coroapi.h:215
int(* tpg_joined_reserve)(void *totempg_groups_instance, const struct iovec *iovec, unsigned int iov_len)
Definition: coroapi.h:299
unsigned int(* service_unlink_and_exit)(struct corosync_api_v1 *corosync_api_v1, const char *service_name, unsigned int service_ver)
Definition: coroapi.h:367
uint32_t quorate
Definition: sam.c:133
#define swab32(x)
Definition: swab.h:43
int(* totem_mcast)(const struct iovec *iovec, unsigned int iov_len, unsigned int guarantee)
Definition: coroapi.h:233
#define TOTEMIP_ADDRLEN
Definition: coroapi.h:73
void(* fatal_error)(cs_fatal_error_t err, const char *file, unsigned int line) __attribute__((noreturn))
Definition: coroapi.h:378
int(* lib_init_fn)(void *conn)
Definition: coroapi.h:443
int(* schedwrk_create_nolock)(hdb_handle_t *handle, int(schedwrk_fn)(const void *), const void *context)
Definition: coroapi.h:390
int(* tpg_groups_release)(int reserved_msgs)
Definition: coroapi.h:322
int(* ipc_response_send)(void *conn, const void *msg, size_t mlen)
Definition: coroapi.h:210
void(* error_memory_failure)(void) __attribute__((noreturn))
Definition: coroapi.h:375
qb_handle_t hdb_handle_t
Definition: hdb.h:52
int(* unregister_callback)(quorum_callback_fn_t callback_fn, void *context)
Definition: coroapi.h:165
enum cs_lib_allow_inquorate allow_inquorate
Definition: coroapi.h:439
int(* quorum_register_callback)(quorum_callback_fn_t callback_fn, void *context)
Definition: coroapi.h:339
unsigned short id
Definition: coroapi.h:433
int(* tpg_groups_reserve)(void *instance, const struct corosync_tpg_group *groups, size_t groups_cnt, const struct iovec *iovec, unsigned int iov_len)
Definition: coroapi.h:315
int(* tpg_init)(void **instance, void(*deliver_fn)(unsigned int nodeid, const void *msg, unsigned int msg_len, int endian_conversion_required), void(*confchg_fn)(enum totem_configuration_type configuration_type, const unsigned int *member_list, size_t member_list_entries, const unsigned int *left_list, size_t left_list_entries, const unsigned int *joined_list, size_t joined_list_entries, const struct memb_ring_id *ring_id))
Definition: coroapi.h:261
cs_lib_allow_inquorate
Definition: coroapi.h:131
int(* register_callback)(quorum_callback_fn_t callback_fn, void *contexxt)
Definition: coroapi.h:164
qb_loop_timer_handle corosync_timer_handle_t
Definition: coroapi.h:64
cs_lib_flow_control
Definition: coroapi.h:123
void(* sync_init)(const unsigned int *trans_list, size_t trans_list_entries, const unsigned int *member_list, size_t member_list_entries, const struct memb_ring_id *ring_id)
Definition: coroapi.h:456
enum cs_lib_flow_control flow_control
Definition: coroapi.h:419
int(* plugin_interface_reference)(hdb_handle_t *handle, const char *iface_name, int version, void **interface, void *context)
Definition: coroapi.h:350
unsigned long long seq
Definition: coroapi.h:105
int(* config_init_fn)(struct corosync_api_v1 *)
Definition: coroapi.h:449
int(* poll_dispatch_delete)(qb_loop_t *handle, int fd)
Definition: coroapi.h:405
void(* schedwrk_destroy)(hdb_handle_t handle)
Definition: coroapi.h:330
char type
Definition: totemrrp.c:518
void(* quorum_callback_fn_t)(int quorate, void *context)
Definition: coroapi.h:160
int(* tpg_exit)(void *instance)
Definition: coroapi.h:280
unsigned int nodeid
Definition: coroapi.h:65
unsigned int private_data_size
Definition: coroapi.h:437
struct memb_ring_id ring_id
Definition: totemsrp.c:64
unsigned int(* totem_nodeid_get)(void)
Definition: coroapi.h:227
int(* exec_exit_fn)(void)
Definition: coroapi.h:441
int(* tpg_join)(void *instance, const struct corosync_tpg_group *groups, size_t group_cnt)
Definition: coroapi.h:283
totem_callback_token_type
Definition: coroapi.h:117