Signed-off-by: Steven Dake <sdake@xxxxxxxxxx>
---
TODO | 5 +-
corosync.spec.in | 1 -
exec/apidef.c | 1 -
exec/apidef.h | 2 +-
exec/evil.c | 2 +-
exec/main.h | 2 +-
exec/mainconfig.h | 2 +-
exec/service.c | 1 -
exec/vsf_quorum.c | 2 +-
exec/vsf_ykd.c | 2 +-
include/Makefile.am | 5 +-
include/corosync/coroapi.h | 469 +++++++++++++++++++++++++++++++++++++
include/corosync/engine/coroapi.h | 469 -------------------------------------
services/cfg.c | 2 +-
services/cmap.c | 2 +-
services/cpg.c | 2 +-
services/evs.c | 2 +-
services/mon.c | 2 +-
services/pload.c | 2 +-
services/testquorum.c | 2 +-
services/votequorum.c | 2 +-
services/wd.c | 2 +-
22 files changed, 489 insertions(+), 492 deletions(-)
create mode 100644 include/corosync/coroapi.h
delete mode 100644 include/corosync/engine/coroapi.h
diff --git a/TODO b/TODO
index 6fdc5ec..e1e8a4d 100644
--- a/TODO
+++ b/TODO
@@ -10,9 +10,8 @@
Current priority list for Needle 2.0
--------------------------------------
1. quorum debugging and rework
-2. remove external plug-in api
-3. allow a cluster name to autogenerate a mcastaddr
-4. ring status change via corosync-notifyd
+2. allow a cluster name to autogenerate a mcastaddr
+3. ring status change via corosync-notifyd
--------------------------------------
Current priority list for Needle 2.1
diff --git a/corosync.spec.in b/corosync.spec.in
index 36956fd..7e314ec 100644
--- a/corosync.spec.in
+++ b/corosync.spec.in
@@ -294,7 +294,6 @@ The Corosync Cluster Engine APIs.
%{_includedir}/corosync/lcr/lcr_ifact.h
%dir %{_includedir}/corosync/engine
%{_includedir}/corosync/engine/config.h
-%{_includedir}/corosync/engine/coroapi.h
%{_includedir}/corosync/engine/icmap.h
%{_includedir}/corosync/engine/quorum.h
%{_libdir}/libcfg.so
diff --git a/exec/apidef.c b/exec/apidef.c
index 795b594..6e14e55 100644
--- a/exec/apidef.c
+++ b/exec/apidef.c
@@ -54,7 +54,6 @@
#include "schedwrk.h"
#include "main.h"
#include "apidef.h"
-#include <corosync/engine/coroapi.h>
#include "service.h"
LOGSYS_DECLARE_SUBSYS ("APIDEF");
diff --git a/exec/apidef.h b/exec/apidef.h
index efb72ca..299270c 100644
--- a/exec/apidef.h
+++ b/exec/apidef.h
@@ -35,7 +35,7 @@
#ifndef APIDEF_H_DEFINED
#define APIDEF_H_DEFINED
-#include <corosync/engine/coroapi.h>
+#include <corosync/coroapi.h>
extern struct corosync_api_v1 *apidef_get (void);
diff --git a/exec/evil.c b/exec/evil.c
index ba4bde9..092f55d 100644
--- a/exec/evil.c
+++ b/exec/evil.c
@@ -71,7 +71,7 @@
#include <corosync/list.h>
#include <corosync/lcr/lcr_ifact.h>
#include <corosync/config.h>
-#include <corosync/engine/coroapi.h>
+#include <corosync/coroapi.h>
#include <corosync/logsys.h>
#include <qb/qbipcs.h>
#include "sync.h"
diff --git a/exec/main.h b/exec/main.h
index 91a2706..ad73d87 100644
--- a/exec/main.h
+++ b/exec/main.h
@@ -49,7 +49,7 @@
#include <qb/qbloop.h>
#include <corosync/totem/totempg.h>
#include <corosync/engine/config.h>
-#include <corosync/engine/coroapi.h>
+#include <corosync/coroapi.h>
extern unsigned long long *(*main_clm_get_by_nodeid) (unsigned int node_id);
diff --git a/exec/mainconfig.h b/exec/mainconfig.h
index 3de7a7e..2d5c552 100644
--- a/exec/mainconfig.h
+++ b/exec/mainconfig.h
@@ -37,7 +37,7 @@
#include <corosync/logsys.h>
#include <corosync/list.h>
-#include <corosync/engine/coroapi.h>
+#include <corosync/coroapi.h>
/**
* All service handlers in the AIS
diff --git a/exec/service.c b/exec/service.c
index a7be311..1425bac 100644
--- a/exec/service.c
+++ b/exec/service.c
@@ -52,7 +52,6 @@
#include <corosync/totem/totempg.h>
#include <corosync/totem/totemip.h>
#include "main.h"
-#include <corosync/engine/coroapi.h>
#include "service.h"
#include <qb/qbipcs.h>
diff --git a/exec/vsf_quorum.c b/exec/vsf_quorum.c
index 79bea03..99ccda4 100644
--- a/exec/vsf_quorum.c
+++ b/exec/vsf_quorum.c
@@ -64,7 +64,7 @@
#include <corosync/lcr/lcr_comp.h>
#include <corosync/lcr/lcr_ifact.h>
#include <corosync/mar_gen.h>
-#include <corosync/engine/coroapi.h>
+#include <corosync/coroapi.h>
#include <corosync/logsys.h>
#include <corosync/engine/quorum.h>
#include <corosync/engine/icmap.h>
diff --git a/exec/vsf_ykd.c b/exec/vsf_ykd.c
index f8cdd04..f9012be 100644
--- a/exec/vsf_ykd.c
+++ b/exec/vsf_ykd.c
@@ -60,7 +60,7 @@
#include <corosync/corotypes.h>
#include <qb/qbipc_common.h>
#include <corosync/mar_gen.h>
-#include <corosync/engine/coroapi.h>
+#include <corosync/coroapi.h>
#include <corosync/engine/quorum.h>
#include <corosync/swab.h>
#include <corosync/lcr/lcr_comp.h>
diff --git a/include/Makefile.am b/include/Makefile.am
index a36cfc0..a8fbaca 100644
--- a/include/Makefile.am
+++ b/include/Makefile.am
@@ -36,11 +36,12 @@ CS_H = hdb.h cs_config.h cpg.h cfg.h evs.h mar_gen.h swab.h \
list.h corotypes.h quorum.h votequorum.h sam.h cmap.h
CS_INTERNAL_H = ipc_cfg.h ipc_cpg.h ipc_evs.h ipc_pload.h ipc_quorum.h \
- jhash.h pload.h quorum.h sq.h ipc_votequorum.h ipc_cmap.h logsys.h
+ jhash.h pload.h quorum.h sq.h ipc_votequorum.h ipc_cmap.h \
+ logsys.h coroapi.h
LCR_H = lcr_ckpt.h lcr_comp.h lcr_ifact.h
-ENGINE_H = config.h coroapi.h quorum.h icmap.h
+ENGINE_H = config.h quorum.h icmap.h
TOTEM_H = totem.h totemip.h totempg.h
diff --git a/include/corosync/coroapi.h b/include/corosync/coroapi.h
new file mode 100644
index 0000000..fa6a510
--- /dev/null
+++ b/include/corosync/coroapi.h
@@ -0,0 +1,469 @@
+/*
+ * Copyright (c) 2008, 2009 Red Hat, Inc.
+ *
+ * All rights reserved.
+ *
+ * Author: Steven Dake (sdake@xxxxxxxxxx)
+ *
+ * This software licensed under BSD license, the text of which follows:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * - Neither the name of the MontaVista Software, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef COROAPI_H_DEFINED
+#define COROAPI_H_DEFINED
+
+#include <stdio.h>
+#ifdef COROSYNC_BSD
+#include <sys/uio.h>
+#endif
+#include <corosync/hdb.h>
+#include <qb/qbloop.h>
+#include <corosync/swab.h>
+
+typedef struct {
+ uint32_t nodeid __attribute__((aligned(8)));
+ void *conn __attribute__((aligned(8)));
+} mar_message_source_t __attribute__((aligned(8)));
+
+static inline void swab_mar_message_source_t (mar_message_source_t *to_swab)
+{
+ swab32 (to_swab->nodeid);
+ /*
+ * if it is from a byteswapped machine, then we can safely
+ * ignore its conn info data structure since this is only
+ * local to the machine
+ */
+ to_swab->conn = NULL;
+}
+
+#ifndef TIMER_HANDLE_T
+typedef qb_loop_timer_handle corosync_timer_handle_t;
+#define TIMER_HANDLE_T 1
+#endif
+
+struct corosync_tpg_group {
+ const void *group;
+ size_t group_len;
+};
+
+#define TOTEMIP_ADDRLEN (sizeof(struct in6_addr))
+
+#define INTERFACE_MAX 2
+
+#ifndef MESSAGE_QUEUE_MAX
+#ifdef HAVE_SMALL_MEMORY_FOOTPRINT
+#define PROCESSOR_COUNT_MAX 16
+#define MESSAGE_SIZE_MAX 1024*64
+#define MESSAGE_QUEUE_MAX 512
+#else
+#define PROCESSOR_COUNT_MAX 384
+#define MESSAGE_SIZE_MAX 1024*1024
+#define MESSAGE_QUEUE_MAX ((4 * MESSAGE_SIZE_MAX) / totem_config->net_mtu)
+#endif /* HAVE_SMALL_MEMORY_FOOTPRINT */
+#endif /* MESSAGE_QUEUE_MAX */
+
+#define TOTEM_AGREED 0
+#define TOTEM_SAFE 1
+
+#define MILLI_2_NANO_SECONDS 1000000ULL
+
+#if !defined(TOTEM_IP_ADDRESS)
+struct totem_ip_address {
+ unsigned int nodeid;
+ unsigned short family;
+ unsigned char addr[TOTEMIP_ADDRLEN];
+} __attribute__((packed));
+#endif
+
+#if !defined(MEMB_RING_ID)
+struct memb_ring_id {
+ struct totem_ip_address rep;
+ unsigned long long seq;
+} __attribute__((packed));
+#endif
+
+#if !defined(TOTEM_CONFIGURATION_TYPE)
+enum totem_configuration_type {
+ TOTEM_CONFIGURATION_REGULAR,
+ TOTEM_CONFIGURATION_TRANSITIONAL
+};
+#endif
+
+#if !defined(TOTEM_CALLBACK_TOKEN_TYPE)
+enum totem_callback_token_type {
+ TOTEM_CALLBACK_TOKEN_RECEIVED = 1,
+ TOTEM_CALLBACK_TOKEN_SENT = 2
+};
+#endif
+
+enum cs_lib_flow_control {
+ CS_LIB_FLOW_CONTROL_REQUIRED = 1,
+ CS_LIB_FLOW_CONTROL_NOT_REQUIRED = 2
+};
+#define corosync_lib_flow_control cs_lib_flow_control
+#define COROSYNC_LIB_FLOW_CONTROL_REQUIRED CS_LIB_FLOW_CONTROL_REQUIRED
+#define COROSYNC_LIB_FLOW_CONTROL_NOT_REQUIRED CS_LIB_FLOW_CONTROL_NOT_REQUIRED
+
+enum cs_lib_allow_inquorate {
+ CS_LIB_DISALLOW_INQUORATE = 0, /* default */
+ CS_LIB_ALLOW_INQUORATE = 1
+};
+
+#if !defined (COROSYNC_FLOW_CONTROL_STATE)
+enum cs_flow_control_state {
+ CS_FLOW_CONTROL_STATE_DISABLED,
+ CS_FLOW_CONTROL_STATE_ENABLED
+};
+#define corosync_flow_control_state cs_flow_control_state
+#define CS_FLOW_CONTROL_STATE_DISABLED CS_FLOW_CONTROL_STATE_DISABLED
+#define CS_FLOW_CONTROL_STATE_ENABLED CS_FLOW_CONTROL_STATE_ENABLED
+
+#endif /* COROSYNC_FLOW_CONTROL_STATE */
+
+enum cs_sync_mode {
+ CS_SYNC_V1 = 0,
+ CS_SYNC_V2 = 1,
+ CS_SYNC_V1_APIV2 = 2
+};
+
+typedef enum {
+ COROSYNC_FATAL_ERROR_EXIT = -1,
+ COROSYNC_LIBAIS_SOCKET = -6,
+ COROSYNC_LIBAIS_BIND = -7,
+ COROSYNC_READKEY = -8,
+ COROSYNC_INVALID_CONFIG = -9,
+ COROSYNC_DYNAMICLOAD = -12,
+ COROSYNC_OUT_OF_MEMORY = -15,
+ COROSYNC_FATAL_ERR = -16
+} cs_fatal_error_t;
+#define corosync_fatal_error_t cs_fatal_error_t;
+
+#ifndef QUORUM_H_DEFINED
+typedef void (*quorum_callback_fn_t) (int quorate, void *context);
+
+struct quorum_callin_functions
+{
+ int (*quorate) (void);
+ int (*register_callback) (quorum_callback_fn_t callback_fn, void *context);
+ int (*unregister_callback) (quorum_callback_fn_t callback_fn, void *context);
+};
+
+typedef void (*sync_callback_fn_t) (
+ const unsigned int *view_list,
+ size_t view_list_entries,
+ int primary_designated,
+ struct memb_ring_id *ring_id);
+
+#endif /* QUORUM_H_DEFINED */
+
+struct corosync_api_v1 {
+ /*
+ * Time and timer APIs
+ */
+ int (*timer_add_duration) (
+ unsigned long long nanoseconds_in_future,
+ void *data,
+ void (*timer_nf) (void *data),
+ corosync_timer_handle_t *handle);
+
+ int (*timer_add_absolute) (
+ unsigned long long nanoseconds_from_epoch,
+ void *data,
+ void (*timer_fn) (void *data),
+ corosync_timer_handle_t *handle);
+
+ void (*timer_delete) (
+ corosync_timer_handle_t timer_handle);
+
+ unsigned long long (*timer_time_get) (void);
+
+ unsigned long long (*timer_expire_time_get) (
+ corosync_timer_handle_t timer_handle);
+
+ /*
+ * IPC APIs
+ */
+ void (*ipc_source_set) (mar_message_source_t *source, void *conn);
+
+ int (*ipc_source_is_local) (const mar_message_source_t *source);
+
+ void *(*ipc_private_data_get) (void *conn);
+
+ int (*ipc_response_send) (void *conn, const void *msg, size_t mlen);
+
+ int (*ipc_response_iov_send) (void *conn,
+ const struct iovec *iov, unsigned int iov_len);
+
+ int (*ipc_dispatch_send) (void *conn, const void *msg, size_t mlen);
+
+ int (*ipc_dispatch_iov_send) (void *conn,
+ const struct iovec *iov, unsigned int iov_len);
+
+ void (*ipc_refcnt_inc) (void *conn);
+
+ void (*ipc_refcnt_dec) (void *conn);
+
+ /*
+ * Totem APIs
+ */
+ unsigned int (*totem_nodeid_get) (void);
+
+ int (*totem_family_get) (void);
+
+ int (*totem_ring_reenable) (void);
+
+ int (*totem_mcast) (const struct iovec *iovec,
+ unsigned int iov_len, unsigned int guarantee);
+
+ int (*totem_ifaces_get) (
+ unsigned int nodeid,
+ struct totem_ip_address *interfaces,
+ char ***status,
+ unsigned int *iface_count);
+
+ const char *(*totem_ifaces_print) (unsigned int nodeid);
+
+ const char *(*totem_ip_print) (const struct totem_ip_address *addr);
+
+ int (*totem_crypto_set) (unsigned int type);
+
+ 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);
+
+ /*
+ * Totem open process groups API for those service engines
+ * wanting their own groups
+ */
+ 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));
+
+ int (*tpg_exit) (
+ void *instance);
+
+ int (*tpg_join) (
+ void *instance,
+ const struct corosync_tpg_group *groups,
+ size_t group_cnt);
+
+ int (*tpg_leave) (
+ void *instance,
+ const struct corosync_tpg_group *groups,
+ size_t group_cnt);
+
+ int (*tpg_joined_mcast) (
+ void *totempg_groups_instance,
+ const struct iovec *iovec,
+ unsigned int iov_len,
+ int guarantee);
+
+ int (*tpg_joined_reserve) (
+ void *totempg_groups_instance,
+ const struct iovec *iovec,
+ unsigned int iov_len);
+
+ int (*tpg_joined_release) (
+ int reserved_msgs);
+
+ 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);
+
+ int (*tpg_groups_reserve) (
+ void *instance,
+ const struct corosync_tpg_group *groups,
+ size_t groups_cnt,
+ const struct iovec *iovec,
+ unsigned int iov_len);
+
+ int (*tpg_groups_release) (
+ int reserved_msgs);
+
+ int (*schedwrk_create) (
+ hdb_handle_t *handle,
+ int (schedwrk_fn) (const void *),
+ const void *context);
+
+ void (*schedwrk_destroy) (hdb_handle_t handle);
+
+ int (*sync_request) (
+ const char *service_name);
+
+ /*
+ * User plugin-callable functions for quorum
+ */
+ int (*quorum_is_quorate) (void);
+ int (*quorum_register_callback) (quorum_callback_fn_t callback_fn, void *context);
+ int (*quorum_unregister_callback) (quorum_callback_fn_t callback_fn, void *context);
+
+ /*
+ * This one is for the quorum management plugin's use
+ */
+ int (*quorum_initialize)(struct quorum_callin_functions *fns);
+
+ /*
+ * Plugin loading and unloading
+ */
+ int (*plugin_interface_reference) (
+ hdb_handle_t *handle,
+ const char *iface_name,
+ int version,
+ void **interface,
+ void *context);
+
+ int (*plugin_interface_release) (hdb_handle_t handle);
+
+ /*
+ * Service loading and unloading APIs
+ */
+ unsigned int (*service_link_and_init) (
+ struct corosync_api_v1 *corosync_api_v1,
+ const char *service_name,
+ unsigned int service_ver);
+
+ unsigned int (*service_unlink_and_exit) (
+ struct corosync_api_v1 *corosync_api_v1,
+ const char *service_name,
+ unsigned int service_ver);
+
+ /*
+ * Error handling APIs
+ */
+ void (*error_memory_failure) (void) __attribute__ ((noreturn));
+
+#define corosync_fatal_error(err) api->fatal_error ((err), __FILE__, __LINE__)
+ void (*fatal_error) (cs_fatal_error_t err,
+ const char *file,
+ unsigned int line) __attribute__ ((noreturn));
+
+ void (*shutdown_request) (void);
+
+ void (*state_dump) (void);
+
+ qb_loop_t *(*poll_handle_get) (void);
+
+ void *(*totem_get_stats)(void);
+
+ int (*schedwrk_create_nolock) (
+ hdb_handle_t *handle,
+ int (schedwrk_fn) (const void *),
+ const void *context);
+
+ int (*poll_dispatch_add) (qb_loop_t * handle,
+ int fd,
+ int events,
+ void *data,
+
+ int (*dispatch_fn) (int fd,
+ int revents,
+ void *data));
+
+
+ int (*poll_dispatch_delete) (
+ qb_loop_t * handle,
+ int fd);
+
+};
+
+#define SERVICE_ID_MAKE(a,b) ( ((a)<<16) | (b) )
+
+#define SERVICE_HANDLER_MAXIMUM_COUNT 64
+
+struct corosync_lib_handler {
+ void (*lib_handler_fn) (void *conn, const void *msg);
+ enum cs_lib_flow_control flow_control;
+};
+
+struct corosync_exec_handler {
+ void (*exec_handler_fn) (const void *msg, unsigned int nodeid);
+ void (*exec_endian_convert_fn) (void *msg);
+};
+
+struct corosync_service_engine_iface_ver0 {
+ struct corosync_service_engine *(*corosync_get_service_engine_ver0) (void);
+};
+
+typedef void (*sync_init_v1_fn_t) (
+ const unsigned int *member_list,
+ size_t member_list_entries,
+ const struct memb_ring_id *ring_id) ;
+
+struct corosync_service_engine {
+ const char *name;
+ unsigned short id;
+ unsigned short priority; /* Lower priority are loaded first, unloaded last.
+ * 0 is a special case which always loaded _and_ unloaded last
+ */
+ unsigned int private_data_size;
+ enum cs_lib_flow_control flow_control;
+ enum cs_lib_allow_inquorate allow_inquorate;
+ int (*exec_init_fn) (struct corosync_api_v1 *);
+ int (*exec_exit_fn) (void);
+ void (*exec_dump_fn) (void);
+ int (*lib_init_fn) (void *conn);
+ int (*lib_exit_fn) (void *conn);
+ struct corosync_lib_handler *lib_engine;
+ int lib_engine_count;
+ struct corosync_exec_handler *exec_engine;
+ int exec_engine_count;
+ int (*config_init_fn) (struct corosync_api_v1 *);
+ 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);
+ enum cs_sync_mode sync_mode;
+ sync_init_v1_fn_t sync_init;
+ int (*sync_process) (void);
+ void (*sync_activate) (void);
+ void (*sync_abort) (void);
+};
+
+#endif /* COROAPI_H_DEFINED */
diff --git a/include/corosync/engine/coroapi.h b/include/corosync/engine/coroapi.h
deleted file mode 100644
index fa6a510..0000000
--- a/include/corosync/engine/coroapi.h
+++ /dev/null
@@ -1,469 +0,0 @@
-/*
- * Copyright (c) 2008, 2009 Red Hat, Inc.
- *
- * All rights reserved.
- *
- * Author: Steven Dake (sdake@xxxxxxxxxx)
- *
- * This software licensed under BSD license, the text of which follows:
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * - Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * - Neither the name of the MontaVista Software, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from this
- * software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-#ifndef COROAPI_H_DEFINED
-#define COROAPI_H_DEFINED
-
-#include <stdio.h>
-#ifdef COROSYNC_BSD
-#include <sys/uio.h>
-#endif
-#include <corosync/hdb.h>
-#include <qb/qbloop.h>
-#include <corosync/swab.h>
-
-typedef struct {
- uint32_t nodeid __attribute__((aligned(8)));
- void *conn __attribute__((aligned(8)));
-} mar_message_source_t __attribute__((aligned(8)));
-
-static inline void swab_mar_message_source_t (mar_message_source_t *to_swab)
-{
- swab32 (to_swab->nodeid);
- /*
- * if it is from a byteswapped machine, then we can safely
- * ignore its conn info data structure since this is only
- * local to the machine
- */
- to_swab->conn = NULL;
-}
-
-#ifndef TIMER_HANDLE_T
-typedef qb_loop_timer_handle corosync_timer_handle_t;
-#define TIMER_HANDLE_T 1
-#endif
-
-struct corosync_tpg_group {
- const void *group;
- size_t group_len;
-};
-
-#define TOTEMIP_ADDRLEN (sizeof(struct in6_addr))
-
-#define INTERFACE_MAX 2
-
-#ifndef MESSAGE_QUEUE_MAX
-#ifdef HAVE_SMALL_MEMORY_FOOTPRINT
-#define PROCESSOR_COUNT_MAX 16
-#define MESSAGE_SIZE_MAX 1024*64
-#define MESSAGE_QUEUE_MAX 512
-#else
-#define PROCESSOR_COUNT_MAX 384
-#define MESSAGE_SIZE_MAX 1024*1024
-#define MESSAGE_QUEUE_MAX ((4 * MESSAGE_SIZE_MAX) / totem_config->net_mtu)
-#endif /* HAVE_SMALL_MEMORY_FOOTPRINT */
-#endif /* MESSAGE_QUEUE_MAX */
-
-#define TOTEM_AGREED 0
-#define TOTEM_SAFE 1
-
-#define MILLI_2_NANO_SECONDS 1000000ULL
-
-#if !defined(TOTEM_IP_ADDRESS)
-struct totem_ip_address {
- unsigned int nodeid;
- unsigned short family;
- unsigned char addr[TOTEMIP_ADDRLEN];
-} __attribute__((packed));
-#endif
-
-#if !defined(MEMB_RING_ID)
-struct memb_ring_id {
- struct totem_ip_address rep;
- unsigned long long seq;
-} __attribute__((packed));
-#endif
-
-#if !defined(TOTEM_CONFIGURATION_TYPE)
-enum totem_configuration_type {
- TOTEM_CONFIGURATION_REGULAR,
- TOTEM_CONFIGURATION_TRANSITIONAL
-};
-#endif
-
-#if !defined(TOTEM_CALLBACK_TOKEN_TYPE)
-enum totem_callback_token_type {
- TOTEM_CALLBACK_TOKEN_RECEIVED = 1,
- TOTEM_CALLBACK_TOKEN_SENT = 2
-};
-#endif
-
-enum cs_lib_flow_control {
- CS_LIB_FLOW_CONTROL_REQUIRED = 1,
- CS_LIB_FLOW_CONTROL_NOT_REQUIRED = 2
-};
-#define corosync_lib_flow_control cs_lib_flow_control
-#define COROSYNC_LIB_FLOW_CONTROL_REQUIRED CS_LIB_FLOW_CONTROL_REQUIRED
-#define COROSYNC_LIB_FLOW_CONTROL_NOT_REQUIRED CS_LIB_FLOW_CONTROL_NOT_REQUIRED
-
-enum cs_lib_allow_inquorate {
- CS_LIB_DISALLOW_INQUORATE = 0, /* default */
- CS_LIB_ALLOW_INQUORATE = 1
-};
-
-#if !defined (COROSYNC_FLOW_CONTROL_STATE)
-enum cs_flow_control_state {
- CS_FLOW_CONTROL_STATE_DISABLED,
- CS_FLOW_CONTROL_STATE_ENABLED
-};
-#define corosync_flow_control_state cs_flow_control_state
-#define CS_FLOW_CONTROL_STATE_DISABLED CS_FLOW_CONTROL_STATE_DISABLED
-#define CS_FLOW_CONTROL_STATE_ENABLED CS_FLOW_CONTROL_STATE_ENABLED
-
-#endif /* COROSYNC_FLOW_CONTROL_STATE */
-
-enum cs_sync_mode {
- CS_SYNC_V1 = 0,
- CS_SYNC_V2 = 1,
- CS_SYNC_V1_APIV2 = 2
-};
-
-typedef enum {
- COROSYNC_FATAL_ERROR_EXIT = -1,
- COROSYNC_LIBAIS_SOCKET = -6,
- COROSYNC_LIBAIS_BIND = -7,
- COROSYNC_READKEY = -8,
- COROSYNC_INVALID_CONFIG = -9,
- COROSYNC_DYNAMICLOAD = -12,
- COROSYNC_OUT_OF_MEMORY = -15,
- COROSYNC_FATAL_ERR = -16
-} cs_fatal_error_t;
-#define corosync_fatal_error_t cs_fatal_error_t;
-
-#ifndef QUORUM_H_DEFINED
-typedef void (*quorum_callback_fn_t) (int quorate, void *context);
-
-struct quorum_callin_functions
-{
- int (*quorate) (void);
- int (*register_callback) (quorum_callback_fn_t callback_fn, void *context);
- int (*unregister_callback) (quorum_callback_fn_t callback_fn, void *context);
-};
-
-typedef void (*sync_callback_fn_t) (
- const unsigned int *view_list,
- size_t view_list_entries,
- int primary_designated,
- struct memb_ring_id *ring_id);
-
-#endif /* QUORUM_H_DEFINED */
-
-struct corosync_api_v1 {
- /*
- * Time and timer APIs
- */
- int (*timer_add_duration) (
- unsigned long long nanoseconds_in_future,
- void *data,
- void (*timer_nf) (void *data),
- corosync_timer_handle_t *handle);
-
- int (*timer_add_absolute) (
- unsigned long long nanoseconds_from_epoch,
- void *data,
- void (*timer_fn) (void *data),
- corosync_timer_handle_t *handle);
-
- void (*timer_delete) (
- corosync_timer_handle_t timer_handle);
-
- unsigned long long (*timer_time_get) (void);
-
- unsigned long long (*timer_expire_time_get) (
- corosync_timer_handle_t timer_handle);
-
- /*
- * IPC APIs
- */
- void (*ipc_source_set) (mar_message_source_t *source, void *conn);
-
- int (*ipc_source_is_local) (const mar_message_source_t *source);
-
- void *(*ipc_private_data_get) (void *conn);
-
- int (*ipc_response_send) (void *conn, const void *msg, size_t mlen);
-
- int (*ipc_response_iov_send) (void *conn,
- const struct iovec *iov, unsigned int iov_len);
-
- int (*ipc_dispatch_send) (void *conn, const void *msg, size_t mlen);
-
- int (*ipc_dispatch_iov_send) (void *conn,
- const struct iovec *iov, unsigned int iov_len);
-
- void (*ipc_refcnt_inc) (void *conn);
-
- void (*ipc_refcnt_dec) (void *conn);
-
- /*
- * Totem APIs
- */
- unsigned int (*totem_nodeid_get) (void);
-
- int (*totem_family_get) (void);
-
- int (*totem_ring_reenable) (void);
-
- int (*totem_mcast) (const struct iovec *iovec,
- unsigned int iov_len, unsigned int guarantee);
-
- int (*totem_ifaces_get) (
- unsigned int nodeid,
- struct totem_ip_address *interfaces,
- char ***status,
- unsigned int *iface_count);
-
- const char *(*totem_ifaces_print) (unsigned int nodeid);
-
- const char *(*totem_ip_print) (const struct totem_ip_address *addr);
-
- int (*totem_crypto_set) (unsigned int type);
-
- 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);
-
- /*
- * Totem open process groups API for those service engines
- * wanting their own groups
- */
- 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));
-
- int (*tpg_exit) (
- void *instance);
-
- int (*tpg_join) (
- void *instance,
- const struct corosync_tpg_group *groups,
- size_t group_cnt);
-
- int (*tpg_leave) (
- void *instance,
- const struct corosync_tpg_group *groups,
- size_t group_cnt);
-
- int (*tpg_joined_mcast) (
- void *totempg_groups_instance,
- const struct iovec *iovec,
- unsigned int iov_len,
- int guarantee);
-
- int (*tpg_joined_reserve) (
- void *totempg_groups_instance,
- const struct iovec *iovec,
- unsigned int iov_len);
-
- int (*tpg_joined_release) (
- int reserved_msgs);
-
- 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);
-
- int (*tpg_groups_reserve) (
- void *instance,
- const struct corosync_tpg_group *groups,
- size_t groups_cnt,
- const struct iovec *iovec,
- unsigned int iov_len);
-
- int (*tpg_groups_release) (
- int reserved_msgs);
-
- int (*schedwrk_create) (
- hdb_handle_t *handle,
- int (schedwrk_fn) (const void *),
- const void *context);
-
- void (*schedwrk_destroy) (hdb_handle_t handle);
-
- int (*sync_request) (
- const char *service_name);
-
- /*
- * User plugin-callable functions for quorum
- */
- int (*quorum_is_quorate) (void);
- int (*quorum_register_callback) (quorum_callback_fn_t callback_fn, void *context);
- int (*quorum_unregister_callback) (quorum_callback_fn_t callback_fn, void *context);
-
- /*
- * This one is for the quorum management plugin's use
- */
- int (*quorum_initialize)(struct quorum_callin_functions *fns);
-
- /*
- * Plugin loading and unloading
- */
- int (*plugin_interface_reference) (
- hdb_handle_t *handle,
- const char *iface_name,
- int version,
- void **interface,
- void *context);
-
- int (*plugin_interface_release) (hdb_handle_t handle);
-
- /*
- * Service loading and unloading APIs
- */
- unsigned int (*service_link_and_init) (
- struct corosync_api_v1 *corosync_api_v1,
- const char *service_name,
- unsigned int service_ver);
-
- unsigned int (*service_unlink_and_exit) (
- struct corosync_api_v1 *corosync_api_v1,
- const char *service_name,
- unsigned int service_ver);
-
- /*
- * Error handling APIs
- */
- void (*error_memory_failure) (void) __attribute__ ((noreturn));
-
-#define corosync_fatal_error(err) api->fatal_error ((err), __FILE__, __LINE__)
- void (*fatal_error) (cs_fatal_error_t err,
- const char *file,
- unsigned int line) __attribute__ ((noreturn));
-
- void (*shutdown_request) (void);
-
- void (*state_dump) (void);
-
- qb_loop_t *(*poll_handle_get) (void);
-
- void *(*totem_get_stats)(void);
-
- int (*schedwrk_create_nolock) (
- hdb_handle_t *handle,
- int (schedwrk_fn) (const void *),
- const void *context);
-
- int (*poll_dispatch_add) (qb_loop_t * handle,
- int fd,
- int events,
- void *data,
-
- int (*dispatch_fn) (int fd,
- int revents,
- void *data));
-
-
- int (*poll_dispatch_delete) (
- qb_loop_t * handle,
- int fd);
-
-};
-
-#define SERVICE_ID_MAKE(a,b) ( ((a)<<16) | (b) )
-
-#define SERVICE_HANDLER_MAXIMUM_COUNT 64
-
-struct corosync_lib_handler {
- void (*lib_handler_fn) (void *conn, const void *msg);
- enum cs_lib_flow_control flow_control;
-};
-
-struct corosync_exec_handler {
- void (*exec_handler_fn) (const void *msg, unsigned int nodeid);
- void (*exec_endian_convert_fn) (void *msg);
-};
-
-struct corosync_service_engine_iface_ver0 {
- struct corosync_service_engine *(*corosync_get_service_engine_ver0) (void);
-};
-
-typedef void (*sync_init_v1_fn_t) (
- const unsigned int *member_list,
- size_t member_list_entries,
- const struct memb_ring_id *ring_id) ;
-
-struct corosync_service_engine {
- const char *name;
- unsigned short id;
- unsigned short priority; /* Lower priority are loaded first, unloaded last.
- * 0 is a special case which always loaded _and_ unloaded last
- */
- unsigned int private_data_size;
- enum cs_lib_flow_control flow_control;
- enum cs_lib_allow_inquorate allow_inquorate;
- int (*exec_init_fn) (struct corosync_api_v1 *);
- int (*exec_exit_fn) (void);
- void (*exec_dump_fn) (void);
- int (*lib_init_fn) (void *conn);
- int (*lib_exit_fn) (void *conn);
- struct corosync_lib_handler *lib_engine;
- int lib_engine_count;
- struct corosync_exec_handler *exec_engine;
- int exec_engine_count;
- int (*config_init_fn) (struct corosync_api_v1 *);
- 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);
- enum cs_sync_mode sync_mode;
- sync_init_v1_fn_t sync_init;
- int (*sync_process) (void);
- void (*sync_activate) (void);
- void (*sync_abort) (void);
-};
-
-#endif /* COROAPI_H_DEFINED */
diff --git a/services/cfg.c b/services/cfg.c
index b00ae93..a4d43f4 100644
--- a/services/cfg.c
+++ b/services/cfg.c
@@ -60,7 +60,7 @@
#include <corosync/ipc_cfg.h>
#include <corosync/lcr/lcr_comp.h>
#include <corosync/logsys.h>
-#include <corosync/engine/coroapi.h>
+#include <corosync/coroapi.h>
#include <corosync/engine/icmap.h>
#include <corosync/corodefs.h>
diff --git a/services/cmap.c b/services/cmap.c
index 076d8db..62e73e7 100644
--- a/services/cmap.c
+++ b/services/cmap.c
@@ -53,7 +53,7 @@
#include <corosync/ipc_cmap.h>
#include <corosync/lcr/lcr_comp.h>
#include <corosync/logsys.h>
-#include <corosync/engine/coroapi.h>
+#include <corosync/coroapi.h>
#include <corosync/engine/icmap.h>
#define hdb_error_to_cs(_result_) qb_to_cs_error(_result_)
diff --git a/services/cpg.c b/services/cpg.c
index 008a3ea..c7c4ead 100644
--- a/services/cpg.c
+++ b/services/cpg.c
@@ -64,7 +64,7 @@
#include <corosync/jhash.h>
#include <corosync/lcr/lcr_comp.h>
#include <corosync/logsys.h>
-#include <corosync/engine/coroapi.h>
+#include <corosync/coroapi.h>
#include <corosync/cpg.h>
#include <corosync/ipc_cpg.h>
diff --git a/services/evs.c b/services/evs.c
index e8d5879..bad8154 100644
--- a/services/evs.c
+++ b/services/evs.c
@@ -57,7 +57,7 @@
#include <corosync/corodefs.h>
#include <corosync/mar_gen.h>
#include <corosync/lcr/lcr_comp.h>
-#include <corosync/engine/coroapi.h>
+#include <corosync/coroapi.h>
#include <corosync/logsys.h>
#include <corosync/list.h>
diff --git a/services/mon.c b/services/mon.c
index a0bc705..665e768 100644
--- a/services/mon.c
+++ b/services/mon.c
@@ -42,7 +42,7 @@
#include <corosync/corotypes.h>
#include <corosync/corodefs.h>
#include <corosync/lcr/lcr_comp.h>
-#include <corosync/engine/coroapi.h>
+#include <corosync/coroapi.h>
#include <corosync/list.h>
#include <corosync/logsys.h>
#include <corosync/engine/icmap.h>
diff --git a/services/pload.c b/services/pload.c
index 85a485f..c8f64ce 100644
--- a/services/pload.c
+++ b/services/pload.c
@@ -61,7 +61,7 @@
#include <corosync/corodefs.h>
#include <corosync/lcr/lcr_comp.h>
#include <corosync/mar_gen.h>
-#include <corosync/engine/coroapi.h>
+#include <corosync/coroapi.h>
#include <corosync/ipc_pload.h>
#include <corosync/list.h>
#include <corosync/logsys.h>
diff --git a/services/testquorum.c b/services/testquorum.c
index 3cdf9cd..5122054 100644
--- a/services/testquorum.c
+++ b/services/testquorum.c
@@ -62,7 +62,7 @@
#include <corosync/mar_gen.h>
#include <corosync/lcr/lcr_comp.h>
-#include <corosync/engine/coroapi.h>
+#include <corosync/coroapi.h>
#include <corosync/engine/quorum.h>
diff --git a/services/votequorum.c b/services/votequorum.c
index d9930fb..126354f 100644
--- a/services/votequorum.c
+++ b/services/votequorum.c
@@ -66,7 +66,7 @@
#include <corosync/lcr/lcr_comp.h>
#include <corosync/logsys.h>
#include <corosync/mar_gen.h>
-#include <corosync/engine/coroapi.h>
+#include <corosync/coroapi.h>
#include <corosync/engine/quorum.h>
#include <corosync/engine/icmap.h>
#include <corosync/ipc_votequorum.h>
diff --git a/services/wd.c b/services/wd.c
index 72544ae..055cc8a 100644
--- a/services/wd.c
+++ b/services/wd.c
@@ -44,7 +44,7 @@
#include <corosync/corotypes.h>
#include <corosync/corodefs.h>
#include <corosync/lcr/lcr_comp.h>
-#include <corosync/engine/coroapi.h>
+#include <corosync/coroapi.h>
#include <corosync/list.h>
#include <corosync/logsys.h>
#include <corosync/engine/icmap.h>