41#include <sys/socket.h>
46#include <netinet/in.h>
47#include <net/ethernet.h>
91#define CFG_INTERFACE_STATUS_MAX_LEN 512
107 unsigned int msg_len,
199static int totemknet_configure_compression (
203static void totemknet_start_merge_detect_timeout(
206static void totemknet_stop_merge_detect_timeout(
209static void log_flush_messages (
224#define knet_log_printf_lock(level, subsys, function, file, line, format, args...) \
226 (void)pthread_mutex_lock(&instance->log_mutex); \
227 instance->totemknet_log_printf ( \
228 level, subsys, function, file, line, \
229 (const char *)format, ##args); \
230 (void)pthread_mutex_unlock(&instance->log_mutex); \
233#define knet_log_printf(level, format, args...) \
235 knet_log_printf_lock ( \
236 level, instance->totemknet_subsys_id, \
237 __FUNCTION__, __FILE__, __LINE__, \
238 (const char *)format, ##args); \
241#define libknet_log_printf(level, format, args...) \
243 knet_log_printf_lock ( \
244 level, instance->knet_subsys_id, \
245 __FUNCTION__, "libknet.h", __LINE__, \
246 (const char *)format, ##args); \
249#define KNET_LOGSYS_PERROR(err_num, level, fmt, args...) \
251 char _error_str[LOGSYS_MAX_PERROR_MSG_LEN]; \
252 const char *_error_ptr = qb_strerror_r(err_num, _error_str, sizeof(_error_str)); \
253 instance->totemknet_log_printf ( \
254 level, instance->totemknet_subsys_id, \
255 __FUNCTION__, __FILE__, __LINE__, \
256 fmt ": %s (%d)", ##args, _error_ptr, err_num); \
263 return (
addr[0] & 0x01);
300static int dst_host_filter_callback_fn(
void *
private_data,
372static inline void ucast_sendmsg (
376 unsigned int msg_len)
385 iovec.iov_base = (
void *)msg;
386 iovec.iov_len = msg_len;
394#ifdef HAVE_MSGHDR_CONTROL
397#ifdef HAVE_MSGHDR_CONTROLLEN
400#ifdef HAVE_MSGHDR_FLAGS
403#ifdef HAVE_MSGHDR_ACCRIGHTS
406#ifdef HAVE_MSGHDR_ACCRIGHTSLEN
418 "sendmsg(ucast) failed (non-critical)");
422static inline void mcast_sendmsg (
425 unsigned int msg_len,
433 iovec.iov_base = (
void *)msg;
434 iovec.iov_len = msg_len;
444#ifdef HAVE_MSGHDR_CONTROL
447#ifdef HAVE_MSGHDR_CONTROLLEN
450#ifdef HAVE_MSGHDR_FLAGS
453#ifdef HAVE_MSGHDR_ACCRIGHTS
456#ifdef HAVE_MSGHDR_ACCRIGHTSLEN
477static int node_compare(
const void *
aptr,
const void *
bptr)
487#ifndef OWN_INDEX_NONE
488#define OWN_INDEX_NONE -1
524#ifdef HAVE_KNET_ONWIRE_VER
552 sizeof(link_status));
643 sizeof(link_status));
645 ptr[
j] =
'0' + (link_status.enabled |
646 link_status.connected<<1 |
647 link_status.dynconnected<<2);
651 "totemknet_ifaces_get: Cannot get link status: %s",
strerror(
errno));
725 totemknet_stop_merge_detect_timeout(instance);
727 log_flush_messages(instance);
737static int log_deliver_fn (
748 len =
read(fd, buffer,
sizeof(buffer));
751 switch (msg->msglevel) {
786static int data_deliver_fn (
805#ifdef HAVE_MSGHDR_CONTROL
808#ifdef HAVE_MSGHDR_CONTROLLEN
811#ifdef HAVE_MSGHDR_FLAGS
814#ifdef HAVE_MSGHDR_ACCRIGHTS
817#ifdef HAVE_MSGHDR_ACCRIGHTSLEN
828#ifdef HAVE_MSGHDR_FLAGS
844 "Received too big message. This may be because something bad is happening"
845 "on the network (attack?), or you tried join more nodes than corosync is"
846 "compiled with (%u) or bug in the code (bad estimation of "
863static void timer_function_netif_check_timeout (
887#ifdef HAVE_KNET_ACCESS_LIST
944static void totemknet_refresh_config(
946 const char *key_name,
972 knet_set_access_list_config(instance);
1037 totemknet_refresh_config,
1043 totemknet_refresh_config,
1070#ifdef HAVE_KNET_CRYPTO_RECONF
1080 if (!totemknet_is_crypto_enabled(instance)) {
1125 void **knet_context,
1133 unsigned int msg_len,
1145 void (*target_set_completed) (
1156 if (instance ==
NULL) {
1160 totemknet_instance_initialize (instance);
1223#if defined(KNET_API_VER) && (KNET_API_VER == 2)
1231#if defined(KNET_API_VER) && (KNET_API_VER == 2)
1243 knet_set_access_list_config(instance);
1283#ifdef HAVE_KNET_CRYPTO_RECONF
1284 if (totemknet_is_crypto_enabled(instance)) {
1285 res = totemknet_set_knet_crypto(instance);
1310 if (totemknet_is_crypto_enabled(instance)) {
1311 res = totemknet_set_knet_crypto(instance);
1345 POLLIN, instance, log_deliver_fn);
1350 POLLIN, instance, data_deliver_fn);
1360 timer_function_netif_check_timeout,
1363 totemknet_start_merge_detect_timeout(instance);
1366 totemknet_add_config_notifications(instance);
1377 log_flush_messages(instance);
1413 unsigned int msg_len)
1418 ucast_sendmsg (instance, &instance->
token_target, msg, msg_len);
1425 unsigned int msg_len)
1430 mcast_sendmsg (instance, msg, msg_len, 0);
1438 unsigned int msg_len)
1443 mcast_sendmsg (instance, msg, msg_len, 1);
1499#ifdef HAVE_MSGHDR_CONTROL
1502#ifdef HAVE_MSGHDR_CONTROLLEN
1505#ifdef HAVE_MSGHDR_FLAGS
1508#ifdef HAVE_MSGHDR_ACCRIGHTS
1511#ifdef HAVE_MSGHDR_ACCRIGHTSLEN
1527 }
while (
nfds == 1);
1534 unsigned short ip_port,
1656 log_flush_messages(instance);
1666 log_flush_messages(instance);
1737static int totemknet_configure_compression (
1766#ifdef HAVE_LIBNOZZLE
1776 res = totemknet_set_knet_crypto(instance);
1792#ifdef HAVE_KNET_CRYPTO_RECONF
1804 if (!totemknet_is_crypto_enabled(instance)) {
1835 if (totemknet_is_crypto_enabled(instance)) {
1910static void timer_function_merge_detect_timeout (
1921 totemknet_start_merge_detect_timeout(instance);
1924static void totemknet_start_merge_detect_timeout(
1933 timer_function_merge_detect_timeout,
1934 &instance->timer_merge_detect_timeout);
1938static void totemknet_stop_merge_detect_timeout(
1962 (log_deliver_fn(instance->
logpipes[0],
POLLIN, instance) == 0)) {
1971#ifdef HAVE_LIBNOZZLE
1972#define NOZZLE_NAME "nozzle.name"
1973#define NOZZLE_IPADDR "nozzle.ipaddr"
1974#define NOZZLE_PREFIX "nozzle.ipprefix"
1975#define NOZZLE_MACADDR "nozzle.macaddr"
1977#define NOZZLE_CHANNEL 1
2021 }
else if (
res == -2) {
2037 const char *prefix,
int nodeid,
2087 const char *
ipaddr,
const char *prefix,
2192 free(instance->nozzle_name);
2193 free(instance->nozzle_ipaddr);
2194 free(instance->nozzle_prefix);
2195 free(instance->nozzle_macaddr);
2197 instance->nozzle_name = instance->nozzle_ipaddr = instance->nozzle_prefix =
2198 instance->nozzle_macaddr =
NULL;
2252 if (instance->nozzle_name &&
2256 (instance->nozzle_macaddr ==
NULL ||
2272 if (instance->nozzle_name) {
2284 if (!instance->nozzle_name || !instance->nozzle_ipaddr ||
2285 !instance->nozzle_prefix) {
unsigned char addr[TOTEMIP_ADDRLEN]
#define PROCESSOR_COUNT_MAX
cs_error_t qb_to_cs_error(int result)
qb_to_cs_error
cs_error_t
The cs_error_t enum.
#define corosync_exit_error(err)
@ COROSYNC_DONE_MAINCONFIGREAD
cs_error_t icmap_get_uint8(const char *key_name, uint8_t *u8)
#define ICMAP_TRACK_MODIFY
#define ICMAP_TRACK_DELETE
cs_error_t icmap_track_add(const char *key_name, int32_t track_type, icmap_notify_fn_t notify_fn, void *user_data, icmap_track_t *icmap_track)
Add tracking function for given key_name.
#define ICMAP_TRACK_PREFIX
Whole prefix is tracked, instead of key only (so "totem." tracking means that "totem....
cs_error_t icmap_get_string(const char *key_name, char **str)
Shortcut for icmap_get for string type.
#define LOGSYS_LEVEL_ERROR
#define log_printf(level, format, args...)
#define LOGSYS_LEVEL_INFO
#define LOGSYS_LEVEL_CRIT
int logsys_config_debug_get(const char *subsys)
Return the debug flag for this subsys.
#define LOGSYS_DEBUG_TRACE
#define LOGSYS_LEVEL_WARNING
int _logsys_subsys_create(const char *subsys, const char *filename)
_logsys_subsys_create
#define LOGSYS_LEVEL_DEBUG
#define LOGSYS_LEVEL_TRACE
const char * corosync_get_config_file(void)
Structure passed as new_value and old_value in change callback.
char crypto_model[CONFIG_STRING_LEN_MAX]
unsigned int private_key_len
uint32_t knet_compression_threshold
struct totem_logging_configuration totem_logging_configuration
struct totem_interface * interfaces
unsigned int merge_timeout
int knet_compression_level
char knet_compression_model[CONFIG_STRING_LEN_MAX]
unsigned int block_unlisted_ips
unsigned char private_key[TOTEM_PRIVATE_KEY_LEN_MAX]
unsigned int knet_pmtud_interval
char crypto_cipher_type[CONFIG_STRING_LEN_MAX]
char link_mode[TOTEM_LINK_MODE_BYTES]
char crypto_hash_type[CONFIG_STRING_LEN_MAX]
struct totem_ip_address boundto
struct totem_ip_address bindnet
The totem_ip_address struct.
void(* log_printf)(int level, int subsys, const char *function_name, const char *file_name, int file_line, const char *format,...) __attribute__((format(printf
void(* totemknet_target_set_completed)(void *context)
pthread_mutex_t log_mutex
void(* totemknet_mtu_changed)(void *context, int net_mtu)
struct crypto_instance * crypto_inst
struct totem_config * totem_config
qb_loop_timer_handle timer_netif_check_timeout
char * link_status[INTERFACE_MAX]
void(* totemknet_log_printf)(int level, int subsys, const char *function, const char *file, int line, const char *format,...) __attribute__((format(printf
knet_handle_t knet_handle
uint16_t ip_port[INTERFACE_MAX]
int(* totemknet_iface_change_fn)(void *context, const struct totem_ip_address *iface_address, unsigned int link_no)
int totemknet_log_level_debug
struct totem_ip_address token_target
qb_loop_timer_handle timer_merge_detect_timeout
void(*) void knet_context)
int totemknet_log_level_warning
struct totem_ip_address my_ids[INTERFACE_MAX]
int(* totemknet_deliver_fn)(void *context, const void *msg, unsigned int msg_len, const struct sockaddr_storage *system_from)
char iov_buffer[KNET_MAX_PACKET_SIZE]
unsigned int merge_detect_messages_sent_before_timeout
int send_merge_detect_message
int totemknet_log_level_error
int totemknet_log_level_security
int totemknet_log_level_notice
struct totemknet_instance * instance
cfg_message_crypto_reconfig_phase_t
@ CRYPTO_RECONFIG_PHASE_CLEANUP
@ CRYPTO_RECONFIG_PHASE_ACTIVATE
int totemip_parse(struct totem_ip_address *totemip, const char *addr, enum totem_ip_version_enum ip_version)
void totemip_copy(struct totem_ip_address *addr1, const struct totem_ip_address *addr2)
int totemip_totemip_to_sockaddr_convert(struct totem_ip_address *ip_addr, uint16_t port, struct sockaddr_storage *saddr, int *addrlen)
const char * totemip_print(const struct totem_ip_address *addr)
int totemknet_mcast_flush_send(void *knet_context, const void *msg, unsigned int msg_len)
int totemknet_iface_set(void *knet_context, const struct totem_ip_address *local_addr, unsigned short ip_port, unsigned int iface_no)
int totemknet_finalize(void *knet_context)
int totemknet_recv_flush(void *knet_context)
int totemknet_member_list_rebind_ip(void *knet_context)
void * totemknet_buffer_alloc(void)
int totemknet_processor_count_set(void *knet_context, int processor_count)
int totemknet_mcast_noflush_send(void *knet_context, const void *msg, unsigned int msg_len)
struct totemknet_instance * global_instance
void totemknet_buffer_release(void *ptr)
int totemknet_initialize(qb_loop_t *poll_handle, void **knet_context, struct totem_config *totem_config, totemsrp_stats_t *stats, void *context, int(*deliver_fn)(void *context, const void *msg, unsigned int msg_len, const struct sockaddr_storage *system_from), int(*iface_change_fn)(void *context, const struct totem_ip_address *iface_address, unsigned int link_no), void(*mtu_changed)(void *context, int net_mtu), void(*target_set_completed)(void *context))
int totemknet_ifaces_get(void *knet_context, char ***status, unsigned int *iface_count)
int totemknet_member_add(void *knet_context, const struct totem_ip_address *local, const struct totem_ip_address *member, int link_no)
int totemknet_crypto_set(void *knet_context, const char *cipher_type, const char *hash_type)
int totemknet_member_remove(void *knet_context, const struct totem_ip_address *token_target, int link_no)
int totemknet_token_send(void *knet_context, const void *msg, unsigned int msg_len)
#define CFG_INTERFACE_STATUS_MAX_LEN
int totemknet_link_get_status(knet_node_id_t node, uint8_t link_no, struct knet_link_status *status)
void totemknet_configure_log_level()
int totemknet_nodestatus_get(void *knet_context, unsigned int nodeid, struct totem_node_status *node_status)
int totemknet_handle_get_stats(struct knet_handle_stats *stats)
void totemknet_stats_clear(void *knet_context)
int totemknet_send_flush(void *knet_context)
void totemknet_net_mtu_adjust(void *knet_context, struct totem_config *totem_config)
#define knet_log_printf(level, format, args...)
int totemknet_token_target_set(void *knet_context, unsigned int nodeid)
#define KNET_LOGSYS_PERROR(err_num, level, fmt, args...)
int totemknet_reconfigure(void *knet_context, struct totem_config *totem_config)
int totemknet_crypto_reconfigure_phase(void *knet_context, struct totem_config *totem_config, cfg_message_crypto_reconfig_phase_t phase)
#define libknet_log_printf(level, format, args...)
int totemknet_recv_mcast_empty(void *knet_context)
int totemknet_iface_check(void *knet_context)
struct totem_message_header header
struct srp_addr system_from
void stats_knet_add_handle(void)
void stats_knet_del_member(knet_node_id_t nodeid, uint8_t link)
void stats_knet_add_member(knet_node_id_t nodeid, uint8_t link)