Merge branch 'topic-udpu'

Conflicts:
	Makefile.am

Signed-off-by: Steven Dake <sdake@redhat.com>
This commit is contained in:
Steven Dake 2010-11-18 15:03:19 -07:00
commit aa03dca478
19 changed files with 2275 additions and 29 deletions

View File

@ -39,6 +39,7 @@ EXTRA_DIST = autogen.sh conf/corosync.conf.example $(SPEC).in \
build-aux/release.mk \
conf/lenses/tests/test_corosync.aug \
conf/lenses/corosync.aug \
conf/corosync.conf.example.udpu \
.version
AUTOMAKE_OPTIONS = foreign

View File

@ -0,0 +1,75 @@
# Please read the corosync.conf.5 manual page
compatibility: whitetank
totem {
version: 2
secauth: off
interface {
member {
memberaddr: 10.16.35.101
}
member {
memberaddr: 10.16.35.102
}
member {
memberaddr: 10.16.35.103
}
member {
memberaddr: 10.16.35.104
}
member {
memberaddr: 10.16.35.105
}
member {
memberaddr: 10.16.35.106
}
member {
memberaddr: 10.16.35.107
}
member {
memberaddr: 10.16.35.108
}
member {
memberaddr: 10.16.35.109
}
member {
memberaddr: 10.16.35.110
}
member {
memberaddr: 10.16.35.111
}
member {
memberaddr: 10.16.35.112
}
member {
memberaddr: 10.16.35.113
}
member {
memberaddr: 10.16.35.114
}
member {
memberaddr: 10.16.35.115
}
member {
memberaddr: 10.16.35.116
}
ringnumber: 0
bindnetaddr: 10.16.35.0
mcastport: 5405
}
transport: udpu
}
logging {
fileline: off
to_logfile: yes
to_syslog: yes
debug: on
logfile: /var/log/cluster/corosync.log
debug: off
timestamp: on
logger_subsys {
subsys: AMF
debug: off
}
}

View File

@ -111,6 +111,7 @@ fi
%dir %{_sysconfdir}/corosync/service.d
%dir %{_sysconfdir}/corosync/uidgid.d
%config(noreplace) %{_sysconfdir}/corosync/corosync.conf.example
%config(noreplace) %{_sysconfdir}/corosync/corosync.conf.example.udpu
%{_initrddir}/corosync
%dir %{_libexecdir}/lcrso
%{_libexecdir}/lcrso/coroparse.lcrso

View File

@ -36,8 +36,8 @@ AM_CFLAGS = -fPIC
INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include $(nss_CFLAGS) $(rdmacm_CFLAGS) $(ibverbs_CFLAGS)
TOTEM_SRC = coropoll.c totemip.c totemnet.c totemudp.c \
totemrrp.c totemsrp.c totemmrp.c totempg.c \
crypto.c wthread.c tsafe.c
totemudpu.c totemrrp.c totemsrp.c totemmrp.c \
totempg.c crypto.c wthread.c tsafe.c
if BUILD_RDMA
TOTEM_SRC += totemiba.c
endif
@ -72,10 +72,10 @@ SHARED_LIBS_SO = $(SHARED_LIBS:%.so.$(SONAME)=%.so)
SHARED_LIBS_SO_TWO = $(SHARED_LIBS:%.so.$(SONAME)=%.so.$(SOMAJOR))
noinst_HEADERS = apidef.h crypto.h mainconfig.h main.h tsafe.h \
quorum.h service.h sync.h timer.h tlist.h totemconfig.h \
totemmrp.h totemnet.h totemudp.h totemiba.h totemrrp.h \
totemsrp.h util.h vsf.h wthread.h schedwrk.h \
evil.h syncv2.h fsm.h
quorum.h service.h sync.h timer.h tlist.h \
totemconfig.h totemmrp.h totemnet.h totemudp.h \
totemudpu.h totemiba.h totemrrp.h totemsrp.h util.h \
vsf.h wthread.h schedwrk.h evil.h syncv2.h fsm.h
EXTRA_DIST = $(LCRSO_SRC)

View File

@ -270,10 +270,13 @@ extern int totem_config_read (
int res = 0;
hdb_handle_t object_totem_handle;
hdb_handle_t object_interface_handle;
hdb_handle_t object_member_handle;
const char *str;
unsigned int ringnumber = 0;
hdb_handle_t object_find_interface_handle;
hdb_handle_t object_find_member_handle;
const char *transport_type;
int member_count = 0;
res = totem_handle_find (objdb, &object_totem_handle);
if (res == -1) {
@ -349,6 +352,8 @@ printf ("couldn't find totem handle\n");
object_find_interface_handle,
&object_interface_handle) == 0) {
member_count = 0;
objdb_get_int (objdb, object_interface_handle, "ringnumber", &ringnumber);
/*
@ -384,6 +389,22 @@ printf ("couldn't find totem handle\n");
res = totemip_parse (&totem_config->interfaces[ringnumber].bindnet, str,
totem_config->interfaces[ringnumber].mcast_addr.family);
}
objdb->object_find_create (
object_interface_handle,
"member",
strlen ("member"),
&object_find_member_handle);
while (objdb->object_find_next (
object_find_member_handle,
&object_member_handle) == 0) {
if (!objdb_get_string (objdb, object_member_handle, "memberaddr", &str)) {
res = totemip_parse (&totem_config->interfaces[ringnumber].member_list[member_count++], str, 0);
}
}
totem_config->interfaces[ringnumber].member_count = member_count;
totem_config->interface_count++;
}
@ -391,11 +412,16 @@ printf ("couldn't find totem handle\n");
add_totem_config_notification(objdb, totem_config, object_totem_handle);
totem_config->transport_number = 0;
totem_config->transport_number = TOTEM_TRANSPORT_UDP;
objdb_get_string (objdb, object_totem_handle, "transport", &transport_type);
if (transport_type) {
if (strcmp (transport_type, "udpu") == 0) {
totem_config->transport_number = TOTEM_TRANSPORT_UDPU;
}
}
if (transport_type) {
if (strcmp (transport_type, "iba") == 0) {
totem_config->transport_number = 1;
totem_config->transport_number = TOTEM_TRANSPORT_RDMA;
}
}
@ -425,7 +451,8 @@ int totem_config_validate (
struct totem_ip_address null_addr;
memset (&null_addr, 0, sizeof (struct totem_ip_address));
if (memcmp (&totem_config->interfaces[i].mcast_addr, &null_addr,
if ((totem_config->transport_number == 0) &&
memcmp (&totem_config->interfaces[i].mcast_addr, &null_addr,
sizeof (struct totem_ip_address)) == 0) {
error_reason = "No multicast address specified";
goto parse_error;
@ -443,7 +470,7 @@ int totem_config_validate (
goto parse_error;
}
if (totem_config->broadcast_use == 0) {
if (totem_config->broadcast_use == 0 && totem_config->transport_number == 0) {
if (totem_config->interfaces[i].mcast_addr.family != totem_config->interfaces[i].bindnet.family) {
error_reason = "Multicast address family does not match bind address family";
goto parse_error;

View File

@ -245,3 +245,25 @@ extern void totemmrp_service_ready_register (
totemsrp_context,
totem_service_ready);
}
int totemmrp_member_add (
const struct totem_ip_address *member,
int ring_no)
{
int res;
res = totemsrp_member_add (totemsrp_context, member, ring_no);
return (res);
}
int totemmrp_member_remove (
const struct totem_ip_address *member,
int ring_no)
{
int res;
res = totemsrp_member_remove (totemsrp_context, member, ring_no);
return (res);
}

View File

@ -116,4 +116,12 @@ extern int totemmrp_ring_reenable (void);
extern void totemmrp_service_ready_register (
void (*totem_service_ready) (void));
extern int totemmrp_member_add (
const struct totem_ip_address *member,
int ring_no);
extern int totemmrp_member_remove (
const struct totem_ip_address *member,
int ring_no);
#endif /* TOTEMMRP_H_DEFINED */

View File

@ -39,6 +39,7 @@
#include <totemiba.h>
#endif
#include <totemudp.h>
#include <totemudpu.h>
#include <totemnet.h>
#define LOGSYS_UTILS_ONLY 1
@ -112,11 +113,19 @@ struct transport {
int (*recv_mcast_empty) (
void *transport_context);
int (*member_add) (
void *transport_context,
const struct totem_ip_address *member);
int (*member_remove) (
void *transport_context,
const struct totem_ip_address *member);
};
struct transport transport_entries[] = {
{
.name = "UDP/IP",
.name = "UDP/IP Multicast",
.initialize = totemudp_initialize,
.processor_count_set = totemudp_processor_count_set,
.token_send = totemudp_token_send,
@ -133,6 +142,26 @@ struct transport transport_entries[] = {
.crypto_set = totemudp_crypto_set,
.recv_mcast_empty = totemudp_recv_mcast_empty
},
{
.name = "UDP/IP Unicast",
.initialize = totemudpu_initialize,
.processor_count_set = totemudpu_processor_count_set,
.token_send = totemudpu_token_send,
.mcast_flush_send = totemudpu_mcast_flush_send,
.mcast_noflush_send = totemudpu_mcast_noflush_send,
.recv_flush = totemudpu_recv_flush,
.send_flush = totemudpu_send_flush,
.iface_check = totemudpu_iface_check,
.finalize = totemudpu_finalize,
.net_mtu_adjust = totemudpu_net_mtu_adjust,
.iface_print = totemudpu_iface_print,
.iface_get = totemudpu_iface_get,
.token_target_set = totemudpu_token_target_set,
.crypto_set = totemudpu_crypto_set,
.recv_mcast_empty = totemudpu_recv_mcast_empty,
.member_add = totemudpu_member_add,
.member_remove = totemudpu_member_remove
},
#ifdef HAVE_RDMA
{
.name = "Infiniband/IP",
@ -192,13 +221,7 @@ static void totemnet_instance_initialize (
instance->totemnet_subsys_id = config->totem_logging_configuration.log_subsys_id;
transport = 0;
#ifdef HAVE_RDMA
if (config->transport_number == 1) {
transport = 1;
}
#endif
transport = config->transport_number;
log_printf (LOGSYS_LEVEL_NOTICE,
"Initializing transport (%s).\n", transport_entries[transport].name);
@ -403,3 +426,35 @@ extern int totemnet_recv_mcast_empty (
return (res);
}
extern int totemnet_member_add (
void *net_context,
const struct totem_ip_address *member)
{
struct totemnet_instance *instance = (struct totemnet_instance *)net_context;
unsigned int res = 0;
if (instance->transport->member_add) {
res = instance->transport->member_add (
instance->transport_context,
member);
}
return (res);
}
extern int totemnet_member_remove (
void *net_context,
const struct totem_ip_address *member)
{
struct totemnet_instance *instance = (struct totemnet_instance *)net_context;
unsigned int res = 0;
if (instance->transport->member_remove) {
res = instance->transport->member_remove (
instance->transport_context,
member);
}
return (res);
}

View File

@ -115,4 +115,12 @@ extern int totemnet_crypto_set (
extern int totemnet_recv_mcast_empty (
void *net_context);
extern int totemnet_member_add (
void *net_context,
const struct totem_ip_address *member);
extern int totemnet_member_remove (
void *net_context,
const struct totem_ip_address *member);
#endif /* TOTEMNET_H_DEFINED */

View File

@ -1377,3 +1377,10 @@ extern void totempg_service_ready_register (
totemmrp_service_ready_register (totem_service_ready);
}
extern int totempg_member_add (
const struct totem_ip_address *member,
int ring_no);
extern int totempg_member_remove (
const struct totem_ip_address *member,
int ring_no);

View File

@ -166,6 +166,17 @@ struct rrp_algo {
int (*mcast_recv_empty) (
struct totemrrp_instance *instance);
int (*member_add) (
struct totemrrp_instance *instance,
const struct totem_ip_address *member,
unsigned int iface_no);
int (*member_remove) (
struct totemrrp_instance *instance,
const struct totem_ip_address *member,
unsigned int iface_no);
};
struct totemrrp_instance {
@ -289,6 +300,15 @@ static void none_ring_reenable (
static int none_mcast_recv_empty (
struct totemrrp_instance *instance);
static int none_member_add (
struct totemrrp_instance *instance,
const struct totem_ip_address *member,
unsigned int iface_no);
static int none_member_remove (
struct totemrrp_instance *instance,
const struct totem_ip_address *member,
unsigned int iface_no);
/*
* Passive Replication Forward Declerations
*/
@ -350,6 +370,15 @@ static void passive_ring_reenable (
static int passive_mcast_recv_empty (
struct totemrrp_instance *instance);
static int passive_member_add (
struct totemrrp_instance *instance,
const struct totem_ip_address *member,
unsigned int iface_no);
static int passive_member_remove (
struct totemrrp_instance *instance,
const struct totem_ip_address *member,
unsigned int iface_no);
/*
* Active Replication Forward Definitions
*/
@ -411,6 +440,16 @@ static void active_ring_reenable (
static int active_mcast_recv_empty (
struct totemrrp_instance *instance);
static int active_member_add (
struct totemrrp_instance *instance,
const struct totem_ip_address *member,
unsigned int iface_no);
static int active_member_remove (
struct totemrrp_instance *instance,
const struct totem_ip_address *member,
unsigned int iface_no);
static void active_timer_expired_token_start (
struct active_instance *active_instance);
@ -437,7 +476,9 @@ struct rrp_algo none_algo = {
.processor_count_set = none_processor_count_set,
.token_target_set = none_token_target_set,
.ring_reenable = none_ring_reenable,
.mcast_recv_empty = none_mcast_recv_empty
.mcast_recv_empty = none_mcast_recv_empty,
.member_add = none_member_add,
.member_remove = none_member_remove
};
struct rrp_algo passive_algo = {
@ -454,7 +495,9 @@ struct rrp_algo passive_algo = {
.processor_count_set = passive_processor_count_set,
.token_target_set = passive_token_target_set,
.ring_reenable = passive_ring_reenable,
.mcast_recv_empty = passive_mcast_recv_empty
.mcast_recv_empty = passive_mcast_recv_empty,
.member_add = passive_member_add,
.member_remove = passive_member_remove
};
struct rrp_algo active_algo = {
@ -471,7 +514,9 @@ struct rrp_algo active_algo = {
.processor_count_set = active_processor_count_set,
.token_target_set = active_token_target_set,
.ring_reenable = active_ring_reenable,
.mcast_recv_empty = active_mcast_recv_empty
.mcast_recv_empty = active_mcast_recv_empty,
.member_add = active_member_add,
.member_remove = active_member_remove
};
struct rrp_algo *rrp_algos[] = {
@ -598,6 +643,27 @@ static int none_mcast_recv_empty (
return (res);
}
static int none_member_add (
struct totemrrp_instance *instance,
const struct totem_ip_address *member,
unsigned int iface_no)
{
int res;
res = totemnet_member_add (instance->net_handles[0], member);
return (res);
}
static int none_member_remove (
struct totemrrp_instance *instance,
const struct totem_ip_address *member,
unsigned int iface_no)
{
int res;
res = totemnet_member_remove (instance->net_handles[0], member);
return (res);
}
/*
* Passive Replication Implementation
*/
@ -947,6 +1013,27 @@ static int passive_mcast_recv_empty (
return (msgs_emptied);
}
static int passive_member_add (
struct totemrrp_instance *instance,
const struct totem_ip_address *member,
unsigned int iface_no)
{
int res;
res = totemnet_member_add (instance->net_handles[iface_no], member);
return (res);
}
static int passive_member_remove (
struct totemrrp_instance *instance,
const struct totem_ip_address *member,
unsigned int iface_no)
{
int res;
res = totemnet_member_remove (instance->net_handles[iface_no], member);
return (res);
}
static void passive_ring_reenable (
struct totemrrp_instance *instance)
{
@ -1264,6 +1351,26 @@ static void active_send_flush (struct totemrrp_instance *instance)
}
}
static int active_member_add (
struct totemrrp_instance *instance,
const struct totem_ip_address *member,
unsigned int iface_no)
{
int res;
res = totemnet_member_add (instance->net_handles[iface_no], member);
return (res);
}
static int active_member_remove (
struct totemrrp_instance *instance,
const struct totem_ip_address *member,
unsigned int iface_no)
{
int res;
res = totemnet_member_remove (instance->net_handles[iface_no], member);
return (res);
}
static void active_iface_check (struct totemrrp_instance *instance)
{
struct active_instance *rrp_algo_instance = (struct active_instance *)instance->rrp_algo_instance;
@ -1550,7 +1657,6 @@ int totemrrp_initialize (
totemnet_net_mtu_adjust (instance->net_handles[i], totem_config);
}
*rrp_context = instance;
return (0);
@ -1707,3 +1813,28 @@ extern int totemrrp_mcast_recv_empty (
return (res);
}
int totemrrp_member_add (
void *rrp_context,
const struct totem_ip_address *member,
int iface_no)
{
struct totemrrp_instance *instance = (struct totemrrp_instance *)rrp_context;
int res;
res = instance->rrp_algo->member_add (instance, member, iface_no);
return (res);
}
int totemrrp_member_remove (
void *rrp_context,
const struct totem_ip_address *member,
int iface_no)
{
struct totemrrp_instance *instance = (struct totemrrp_instance *)rrp_context;
int res;
res = instance->rrp_algo->member_remove (instance, member, iface_no);
return (res);
}

View File

@ -128,4 +128,14 @@ extern int totemrrp_ring_reenable (
extern int totemrrp_mcast_recv_empty (
void *rrp_context);
extern int totemrrp_member_add (
void *net_context,
const struct totem_ip_address *member,
int iface_no);
extern int totemrrp_member_remove (
void *net_context,
const struct totem_ip_address *member,
int iface_no);
#endif /* TOTEMRRP_H_DEFINED */

View File

@ -4352,6 +4352,7 @@ void main_iface_change_fn (
unsigned int iface_no)
{
struct totemsrp_instance *instance = context;
int i;
totemip_copy (&instance->my_id.addr[iface_no], iface_addr);
assert (instance->my_id.addr[iface_no].nodeid);
@ -4365,6 +4366,12 @@ void main_iface_change_fn (
"Created or loaded sequence id %lld.%s for this ring.\n",
instance->my_ring_id.seq,
totemip_print (&instance->my_ring_id.rep));
for (i = 0; i < instance->totem_config->interfaces[iface_no].member_count; i++) {
totemsrp_member_add (instance,
&instance->totem_config->interfaces[iface_no].member_list[i],
iface_no);
}
if (instance->totemsrp_service_ready_fn) {
instance->totemsrp_service_ready_fn ();
}
@ -4387,3 +4394,29 @@ void totemsrp_service_ready_register (
instance->totemsrp_service_ready_fn = totem_service_ready;
}
int totemsrp_member_add (
void *context,
const struct totem_ip_address *member,
int ring_no)
{
struct totemsrp_instance *instance = (struct totemsrp_instance *)context;
int res;
res = totemrrp_member_add (instance->totemrrp_context, member, ring_no);
return (res);
}
int totemsrp_member_remove (
void *context,
const struct totem_ip_address *member,
int ring_no)
{
struct totemsrp_instance *instance = (struct totemsrp_instance *)context;
int res;
res = totemrrp_member_remove (instance->totemrrp_context, member, ring_no);
return (res);
}

View File

@ -120,4 +120,14 @@ void totemsrp_service_ready_register (
void *srp_context,
void (*totem_service_ready) (void));
extern int totemsrp_member_add (
void *srp_context,
const struct totem_ip_address *member,
int ring_no);
extern int totemsrp_member_remove (
void *srp_context,
const struct totem_ip_address *member,
int ring_no);
#endif /* TOTEMSRP_H_DEFINED */

1711
exec/totemudpu.c Normal file

File diff suppressed because it is too large Load Diff

120
exec/totemudpu.h Normal file
View File

@ -0,0 +1,120 @@
/*
* Copyright (c) 2005 MontaVista Software, Inc.
* Copyright (c) 2006-2010 Red Hat, Inc.
*
* All rights reserved.
*
* Author: Steven Dake (sdake@redhat.com)
*
* 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 TOTEMUDPU_H_DEFINED
#define TOTEMUDPU_H_DEFINED
#include <sys/types.h>
#include <sys/socket.h>
#include <corosync/hdb.h>
#include <corosync/totem/totem.h>
/*
* Create an instance
*/
extern int totemudpu_initialize (
hdb_handle_t poll_handle,
void **udpu_context,
struct totem_config *totem_config,
int interface_no,
void *context,
void (*deliver_fn) (
void *context,
const void *msg,
unsigned int msg_len),
void (*iface_change_fn) (
void *context,
const struct totem_ip_address *iface_address),
void (*target_set_completed) (
void *context));
extern int totemudpu_processor_count_set (
void *udpu_context,
int processor_count);
extern int totemudpu_token_send (
void *udpu_context,
const void *msg,
unsigned int msg_len);
extern int totemudpu_mcast_flush_send (
void *udpu_context,
const void *msg,
unsigned int msg_len);
extern int totemudpu_mcast_noflush_send (
void *udpu_context,
const void *msg,
unsigned int msg_len);
extern int totemudpu_recv_flush (void *udpu_context);
extern int totemudpu_send_flush (void *udpu_context);
extern int totemudpu_iface_check (void *udpu_context);
extern int totemudpu_finalize (void *udpu_context);
extern void totemudpu_net_mtu_adjust (void *udpu_context, struct totem_config *totem_config);
extern const char *totemudpu_iface_print (void *udpu_context);
extern int totemudpu_iface_get (
void *udpu_context,
struct totem_ip_address *addr);
extern int totemudpu_token_target_set (
void *udpu_context,
const struct totem_ip_address *token_target);
extern int totemudpu_crypto_set (
void *udpu_context,
unsigned int type);
extern int totemudpu_recv_mcast_empty (
void *udpu_context);
extern int totemudpu_member_add (
void *udpu_context,
const struct totem_ip_address *member);
extern int totemudpu_member_remove (
void *udpu_context,
const struct totem_ip_address *member);
#endif /* TOTEMUDPU_H_DEFINED */

View File

@ -57,6 +57,9 @@ struct totem_interface {
struct totem_ip_address boundto;
struct totem_ip_address mcast_addr;
uint16_t ip_port;
int member_count;
struct totem_ip_address member_list[PROCESSOR_COUNT_MAX];
};
struct totem_logging_configuration {
@ -79,6 +82,12 @@ struct totem_logging_configuration {
enum { TOTEM_PRIVATE_KEY_LEN = 128 };
enum { TOTEM_RRP_MODE_BYTES = 64 };
typedef enum {
TOTEM_TRANSPORT_UDP = 0,
TOTEM_TRANSPORT_UDPU = 1,
TOTEM_TRANSPORT_RDMA = 2
} totem_transport_t;
struct totem_config {
int version;
@ -164,7 +173,7 @@ struct totem_config {
int crypto_crypt_type;
int crypto_sign_type;
int transport_number;
totem_transport_t transport_number;
};
#define TOTEM_CONFIGURATION_TYPE

View File

@ -160,6 +160,14 @@ extern int totempg_ring_reenable (void);
extern void totempg_service_ready_register (
void (*totem_service_ready) (void));
extern int totempg_member_add (
const struct totem_ip_address *member,
int ring_no);
extern int totempg_member_remove (
const struct totem_ip_address *member,
int ring_no);
#ifdef __cplusplus
}
#endif

View File

@ -1,6 +1,6 @@
.\"/*
.\" * Copyright (c) 2005 MontaVista Software, Inc.
.\" * Copyright (c) 2006-2009 Red Hat, Inc.
.\" * Copyright (c) 2006-2010 Red Hat, Inc.
.\" *
.\" * All rights reserved.
.\" *
@ -77,7 +77,8 @@ option which is required:
.PP
Within the
.B interface
sub-directive of totem there are four parameters which are required:
sub-directive of totem there are four parameters which are required. There is
one parameter which is optional.
.TP
ringnumber
@ -126,6 +127,13 @@ mcastport - 1 (for mcast sends).
If you have multiple clusters on the same network using the same mcastaddr
please configure the mcastports with a gap.
.TP
member
This specifies a member on the interface and used with the udpu transport only.
Every node that should be a member of the membership should be specified as
a separate member directive. Within the member directive there is a parameter
memberaddr which specifies the ip address of one of the nodes.
.PP
.PP
Within the
@ -258,11 +266,13 @@ The default is ykd. The vsftype can also be set to none.
.TP
transport
This directive controls the transport mechanism used. If the interface to
which corosync is binding is Infiniband, you can specify the "iba" option. Any
other option is ignored. Note Infiniband interfaces will use RDMA transport
techniques and perform at higher bandwidths and lower latency than gige networks.
which corosync is binding is an RDMA interface such as RoCEE or Infiniband, the
"iba" parameter may be specified. To avoid the use of multicast entirely, a
unicast transport parameter "udpu" can be specified. This requires specifying
the list of members that could potentially make up the membership before
deployment.
The default is udp. The transport type can also be set to iba.
The default is udp. The transport type can also be set to udpu or iba.
Within the
.B totem