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) {
779static int data_deliver_fn (
798#ifdef HAVE_MSGHDR_CONTROL
801#ifdef HAVE_MSGHDR_CONTROLLEN
804#ifdef HAVE_MSGHDR_FLAGS
807#ifdef HAVE_MSGHDR_ACCRIGHTS
810#ifdef HAVE_MSGHDR_ACCRIGHTSLEN
821#ifdef HAVE_MSGHDR_FLAGS
837 "Received too big message. This may be because something bad is happening"
838 "on the network (attack?), or you tried join more nodes than corosync is"
839 "compiled with (%u) or bug in the code (bad estimation of "
856static void timer_function_netif_check_timeout (
874#ifdef HAVE_KNET_ACCESS_LIST
920static void totemknet_refresh_config(
922 const char *key_name,
948 knet_set_access_list_config(instance);
1013 totemknet_refresh_config,
1019 totemknet_refresh_config,
1046#ifdef HAVE_KNET_CRYPTO_RECONF
1056 if (!totemknet_is_crypto_enabled(instance)) {
1101 void **knet_context,
1106 void (*deliver_fn) (
1109 unsigned int msg_len,
1121 void (*target_set_completed) (
1132 if (instance ==
NULL) {
1136 totemknet_instance_initialize (instance);
1199#if defined(KNET_API_VER) && (KNET_API_VER == 2)
1207#if defined(KNET_API_VER) && (KNET_API_VER == 2)
1219 knet_set_access_list_config(instance);
1259#ifdef HAVE_KNET_CRYPTO_RECONF
1260 if (totemknet_is_crypto_enabled(instance)) {
1261 res = totemknet_set_knet_crypto(instance);
1286 if (totemknet_is_crypto_enabled(instance)) {
1287 res = totemknet_set_knet_crypto(instance);
1321 POLLIN, instance, log_deliver_fn);
1326 POLLIN, instance, data_deliver_fn);
1336 timer_function_netif_check_timeout,
1339 totemknet_start_merge_detect_timeout(instance);
1342 totemknet_add_config_notifications(instance);
1353 log_flush_messages(instance);
1389 unsigned int msg_len)
1394 ucast_sendmsg (instance, &instance->
token_target, msg, msg_len);
1401 unsigned int msg_len)
1406 mcast_sendmsg (instance, msg, msg_len, 0);
1414 unsigned int msg_len)
1419 mcast_sendmsg (instance, msg, msg_len, 1);
1475#ifdef HAVE_MSGHDR_CONTROL
1478#ifdef HAVE_MSGHDR_CONTROLLEN
1481#ifdef HAVE_MSGHDR_FLAGS
1484#ifdef HAVE_MSGHDR_ACCRIGHTS
1487#ifdef HAVE_MSGHDR_ACCRIGHTSLEN
1503 }
while (
nfds == 1);
1510 unsigned short ip_port,
1700static int totemknet_configure_compression (
1729#ifdef HAVE_LIBNOZZLE
1739 res = totemknet_set_knet_crypto(instance);
1755#ifdef HAVE_KNET_CRYPTO_RECONF
1767 if (!totemknet_is_crypto_enabled(instance)) {
1798 if (totemknet_is_crypto_enabled(instance)) {
1873static void timer_function_merge_detect_timeout (
1884 totemknet_start_merge_detect_timeout(instance);
1887static void totemknet_start_merge_detect_timeout(
1896 timer_function_merge_detect_timeout,
1897 &instance->timer_merge_detect_timeout);
1901static void totemknet_stop_merge_detect_timeout(
1925 (log_deliver_fn(instance->
logpipes[0],
POLLIN, instance) == 0)) {
1934#ifdef HAVE_LIBNOZZLE
1935#define NOZZLE_NAME "nozzle.name"
1936#define NOZZLE_IPADDR "nozzle.ipaddr"
1937#define NOZZLE_PREFIX "nozzle.ipprefix"
1938#define NOZZLE_MACADDR "nozzle.macaddr"
1940#define NOZZLE_CHANNEL 1
1984 }
else if (
res == -2) {
2000 const char *prefix,
int nodeid,
2050 const char *
ipaddr,
const char *prefix,
2155 free(instance->nozzle_name);
2156 free(instance->nozzle_ipaddr);
2157 free(instance->nozzle_prefix);
2158 free(instance->nozzle_macaddr);
2160 instance->nozzle_name = instance->nozzle_ipaddr = instance->nozzle_prefix =
2161 instance->nozzle_macaddr =
NULL;
2215 if (instance->nozzle_name &&
2219 (instance->nozzle_macaddr ==
NULL ||
2235 if (instance->nozzle_name) {
2247 if (!instance->nozzle_name || !instance->nozzle_ipaddr ||
2248 !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.
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
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_log_level_debug
void(* totemknet_deliver_fn)(void *context, const void *msg, unsigned int msg_len, const struct sockaddr_storage *system_from)
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]
char iov_buffer[KNET_MAX_PACKET_SIZE]
unsigned int merge_detect_messages_sent_before_timeout
int send_merge_detect_message
void(* totemknet_iface_change_fn)(void *context, const struct totem_ip_address *iface_address, unsigned int link_no)
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_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_initialize(qb_loop_t *poll_handle, void **knet_context, struct totem_config *totem_config, totemsrp_stats_t *stats, void *context, void(*deliver_fn)(void *context, const void *msg, unsigned int msg_len, const struct sockaddr_storage *system_from), void(*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_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)