41 #include <sys/types.h>
43 #include <sys/socket.h>
46 #include <sys/ioctl.h>
47 #include <sys/param.h>
48 #include <netinet/in.h>
49 #include <arpa/inet.h>
64 #include <qb/qbdefs.h>
65 #include <qb/qbloop.h>
66 #define LOGSYS_UTILS_ONLY 1
75 unsigned int msg_len);
112 void * (*initialize) (
118 unsigned int iface_no,
121 unsigned int msg_len);
126 unsigned int msg_len);
131 unsigned int msg_len);
135 unsigned int iface_no,
138 unsigned int msg_len,
139 unsigned int token_seqid);
144 unsigned int msg_len);
162 unsigned int iface_no);
166 unsigned int iface_no);
174 unsigned int iface_no);
179 unsigned int iface_no);
184 const struct srp_addr *member_list,
size_t member_list_entries,
185 const struct srp_addr *left_list,
size_t left_list_entries,
186 const struct srp_addr *joined_list,
size_t joined_list_entries,
190 #define STATUS_STR_LEN 512
205 unsigned int msg_len);
210 unsigned int iface_no);
215 unsigned int *token_is);
240 const char *
function,
265 unsigned int iface_no,
int is_faulty);
270 static void none_mcast_recv (
272 unsigned int iface_no,
275 unsigned int msg_len);
277 static void none_mcast_noflush_send (
280 unsigned int msg_len);
282 static void none_mcast_flush_send (
285 unsigned int msg_len);
287 static void none_token_recv (
289 unsigned int iface_no,
292 unsigned int msg_len,
293 unsigned int token_seqid);
295 static void none_token_send (
298 unsigned int msg_len);
300 static void none_recv_flush (
303 static void none_send_flush (
306 static void none_iface_check (
309 static void none_processor_count_set (
311 unsigned int processor_count_set);
313 static void none_token_target_set (
316 unsigned int iface_no);
318 static void none_ring_reenable (
320 unsigned int iface_no);
322 static int none_mcast_recv_empty (
325 static int none_member_add (
328 unsigned int iface_no);
330 static int none_member_remove (
333 unsigned int iface_no);
335 static void none_membership_changed (
338 const struct srp_addr *member_list,
size_t member_list_entries,
339 const struct srp_addr *left_list,
size_t left_list_entries,
340 const struct srp_addr *joined_list,
size_t joined_list_entries,
346 static void *passive_instance_initialize (
350 static void passive_mcast_recv (
352 unsigned int iface_no,
355 unsigned int msg_len);
357 static void passive_mcast_noflush_send (
360 unsigned int msg_len);
362 static void passive_mcast_flush_send (
365 unsigned int msg_len);
367 static void passive_monitor (
369 unsigned int iface_no,
370 int is_token_recv_count);
372 static void passive_token_recv (
374 unsigned int iface_no,
377 unsigned int msg_len,
378 unsigned int token_seqid);
380 static void passive_token_send (
383 unsigned int msg_len);
385 static void passive_recv_flush (
388 static void passive_send_flush (
391 static void passive_iface_check (
394 static void passive_processor_count_set (
396 unsigned int processor_count_set);
398 static void passive_token_target_set (
401 unsigned int iface_no);
403 static void passive_ring_reenable (
405 unsigned int iface_no);
407 static int passive_mcast_recv_empty (
410 static int passive_member_add (
413 unsigned int iface_no);
415 static int passive_member_remove (
418 unsigned int iface_no);
420 static void passive_membership_changed (
423 const struct srp_addr *member_list,
size_t member_list_entries,
424 const struct srp_addr *left_list,
size_t left_list_entries,
425 const struct srp_addr *joined_list,
size_t joined_list_entries,
431 static void *active_instance_initialize (
435 static void active_mcast_recv (
437 unsigned int iface_no,
440 unsigned int msg_len);
442 static void active_mcast_noflush_send (
445 unsigned int msg_len);
447 static void active_mcast_flush_send (
450 unsigned int msg_len);
452 static void active_token_recv (
454 unsigned int iface_no,
457 unsigned int msg_len,
458 unsigned int token_seqid);
460 static void active_token_send (
463 unsigned int msg_len);
465 static void active_recv_flush (
468 static void active_send_flush (
471 static void active_iface_check (
474 static void active_processor_count_set (
476 unsigned int processor_count_set);
478 static void active_token_target_set (
481 unsigned int iface_no);
483 static void active_ring_reenable (
485 unsigned int iface_no);
487 static int active_mcast_recv_empty (
490 static int active_member_add (
493 unsigned int iface_no);
495 static int active_member_remove (
498 unsigned int iface_no);
500 static void active_membership_changed (
503 const struct srp_addr *member_list,
size_t member_list_entries,
504 const struct srp_addr *left_list,
size_t left_list_entries,
505 const struct srp_addr *joined_list,
size_t joined_list_entries,
508 static void active_timer_expired_token_start (
511 static void active_timer_expired_token_cancel (
514 static void active_timer_problem_decrementer_start (
517 static void active_timer_problem_decrementer_cancel (
523 #define MESSAGE_TYPE_RING_TEST_ACTIVE 6
524 #define MESSAGE_TYPE_RING_TEST_ACTIVATE 7
526 #define ENDIAN_LOCAL 0xff22
537 #define ARR_SEQNO_START_TOKEN 0x0
550 #define PASSIVE_RECV_COUNT_THRESHOLD (INT_MAX / 2)
569 .mcast_recv = none_mcast_recv,
570 .mcast_noflush_send = none_mcast_noflush_send,
571 .mcast_flush_send = none_mcast_flush_send,
572 .token_recv = none_token_recv,
573 .token_send = none_token_send,
574 .recv_flush = none_recv_flush,
575 .send_flush = none_send_flush,
576 .iface_check = none_iface_check,
577 .processor_count_set = none_processor_count_set,
578 .token_target_set = none_token_target_set,
579 .ring_reenable = none_ring_reenable,
580 .mcast_recv_empty = none_mcast_recv_empty,
581 .member_add = none_member_add,
582 .member_remove = none_member_remove,
583 .membership_changed = none_membership_changed
588 .initialize = passive_instance_initialize,
589 .mcast_recv = passive_mcast_recv,
590 .mcast_noflush_send = passive_mcast_noflush_send,
591 .mcast_flush_send = passive_mcast_flush_send,
592 .token_recv = passive_token_recv,
593 .token_send = passive_token_send,
594 .recv_flush = passive_recv_flush,
595 .send_flush = passive_send_flush,
596 .iface_check = passive_iface_check,
597 .processor_count_set = passive_processor_count_set,
598 .token_target_set = passive_token_target_set,
599 .ring_reenable = passive_ring_reenable,
600 .mcast_recv_empty = passive_mcast_recv_empty,
601 .member_add = passive_member_add,
602 .member_remove = passive_member_remove,
603 .membership_changed = passive_membership_changed
608 .initialize = active_instance_initialize,
609 .mcast_recv = active_mcast_recv,
610 .mcast_noflush_send = active_mcast_noflush_send,
611 .mcast_flush_send = active_mcast_flush_send,
612 .token_recv = active_token_recv,
613 .token_send = active_token_send,
614 .recv_flush = active_recv_flush,
615 .send_flush = active_send_flush,
616 .iface_check = active_iface_check,
617 .processor_count_set = active_processor_count_set,
618 .token_target_set = active_token_target_set,
619 .ring_reenable = active_ring_reenable,
620 .mcast_recv_empty = active_mcast_recv_empty,
621 .member_add = active_member_add,
622 .member_remove = active_member_remove,
623 .membership_changed = active_membership_changed
632 #define RRP_ALGOS_COUNT 3
634 #define log_printf(level, format, args...) \
636 rrp_instance->totemrrp_log_printf ( \
637 level, rrp_instance->totemrrp_subsys_id, \
638 __FUNCTION__, __FILE__, __LINE__, \
643 unsigned int iface_no,
int is_faulty)
645 rrp_instance->
stats.
faulty[iface_no] = (is_faulty ? 1 : 0);
657 static void timer_function_test_ring_timeout (
void *context)
661 unsigned int *faulty = NULL;
662 int iface_no = deliver_fn_context->
iface_no;
673 assert (faulty != NULL);
675 if (faulty[iface_no] == 1) {
684 (
void *)deliver_fn_context,
685 timer_function_test_ring_timeout,
694 static void none_mcast_recv (
696 unsigned int iface_no,
699 unsigned int msg_len)
707 static void none_mcast_flush_send (
710 unsigned int msg_len)
715 static void none_mcast_noflush_send (
718 unsigned int msg_len)
723 static void none_token_recv (
725 unsigned int iface_no,
728 unsigned int msg_len,
737 static void none_token_send (
740 unsigned int msg_len)
762 static void none_processor_count_set (
764 unsigned int processor_count)
770 static void none_token_target_set (
773 unsigned int iface_no)
778 static void none_ring_reenable (
780 unsigned int iface_no)
787 static int none_mcast_recv_empty (
797 static int none_member_add (
800 unsigned int iface_no)
807 static int none_member_remove (
810 unsigned int iface_no)
817 static void none_membership_changed (
820 const struct srp_addr *member_list,
size_t member_list_entries,
821 const struct srp_addr *left_list,
size_t left_list_entries,
822 const struct srp_addr *joined_list,
size_t joined_list_entries,
827 for (i = 0; i < left_list_entries; i++) {
831 "Membership left list contains incorrect address. "
832 "This is sign of misconfiguration between nodes!");
835 &left_list[i].
addr[0], 0);
839 for (i = 0; i < joined_list_entries; i++) {
843 "Membership join list contains incorrect address. "
844 "This is sign of misconfiguration between nodes!");
847 &joined_list[i].
addr[0], 1);
855 void *passive_instance_initialize (
868 instance->
faulty = malloc (
sizeof (
int) * interface_count);
869 if (instance->
faulty == 0) {
874 memset (instance->
faulty, 0, sizeof (
int) * interface_count);
876 for (i = 0; i < interface_count; i++) {
877 stats_set_interface_faulty (rrp_instance, i, 0);
900 return ((
void *)instance);
903 static void timer_function_passive_token_expired (
void *context)
910 passive_instance->
token,
924 static void passive_timer_expired_token_start (
925 struct passive_instance *passive_instance)
931 (
void *)passive_instance,
932 timer_function_passive_token_expired,
936 static void passive_timer_expired_token_cancel (
937 struct passive_instance *passive_instance)
972 static void passive_monitor (
974 unsigned int iface_no,
975 int is_token_recv_count)
977 struct passive_instance *passive_instance = (
struct passive_instance *)rrp_instance->
rrp_algo_instance;
978 unsigned int *recv_count;
981 unsigned int min_all, min_active;
982 unsigned int threshold;
987 if (is_token_recv_count) {
995 recv_count[iface_no] += 1;
999 if (
max < recv_count[i]) {
1000 max = recv_count[i];
1008 min_all = min_active = recv_count[iface_no];
1011 if (recv_count[i] < min_all) {
1012 min_all = recv_count[i];
1015 if (passive_instance->
faulty[i] == 0 &&
1016 recv_count[i] < min_active) {
1017 min_active = recv_count[i];
1026 recv_count[i] -= min_all;
1034 if (passive_instance->
faulty[i] == 0) {
1035 recv_count[i] -= min_active;
1046 if (
max < recv_count[i]) {
1047 max = recv_count[i];
1053 if ((passive_instance->
faulty[i] == 0) &&
1054 (
max - recv_count[i] > threshold)) {
1055 passive_instance->
faulty[i] = 1;
1061 timer_function_test_ring_timeout,
1064 stats_set_interface_faulty (rrp_instance, i, passive_instance->
faulty[i]);
1067 "Marking ringid %u interface %s FAULTY",
1073 rrp_instance->
status[i]);
1078 static void passive_mcast_recv (
1080 unsigned int iface_no,
1083 unsigned int msg_len)
1085 struct passive_instance *passive_instance = (
struct passive_instance *)rrp_instance->
rrp_algo_instance;
1099 passive_instance->
token,
1101 passive_timer_expired_token_cancel (passive_instance);
1104 passive_monitor (rrp_instance, iface_no, 0);
1107 static void passive_mcast_flush_send (
1110 unsigned int msg_len)
1112 struct passive_instance *passive_instance = (
struct passive_instance *)instance->
rrp_algo_instance;
1118 }
while ((i <= instance->interface_count) && (passive_instance->
faulty[passive_instance->
msg_xmit_iface] == 1));
1120 if (i > instance->interface_count) {
1131 static void passive_mcast_noflush_send (
1134 unsigned int msg_len)
1136 struct passive_instance *passive_instance = (
struct passive_instance *)instance->
rrp_algo_instance;
1142 }
while ((i <= instance->interface_count) && (passive_instance->
faulty[passive_instance->
msg_xmit_iface] == 1));
1145 if (i > instance->interface_count) {
1156 static void passive_token_recv (
1158 unsigned int iface_no,
1161 unsigned int msg_len,
1162 unsigned int token_seq)
1164 struct passive_instance *passive_instance = (
struct passive_instance *)rrp_instance->
rrp_algo_instance;
1174 memcpy (passive_instance->
token, msg, msg_len);
1175 passive_timer_expired_token_start (passive_instance);
1179 passive_monitor (rrp_instance, iface_no, 1);
1182 static void passive_token_send (
1185 unsigned int msg_len)
1187 struct passive_instance *passive_instance = (
struct passive_instance *)instance->
rrp_algo_instance;
1193 }
while ((i <= instance->interface_count) && (passive_instance->
faulty[passive_instance->
token_xmit_iface] == 1));
1195 if (i > instance->interface_count) {
1210 struct passive_instance *rrp_algo_instance = (
struct passive_instance *)instance->
rrp_algo_instance;
1214 if (rrp_algo_instance->
faulty[i] == 0) {
1223 struct passive_instance *rrp_algo_instance = (
struct passive_instance *)instance->
rrp_algo_instance;
1227 if (rrp_algo_instance->
faulty[i] == 0) {
1236 struct passive_instance *rrp_algo_instance = (
struct passive_instance *)instance->
rrp_algo_instance;
1240 if (rrp_algo_instance->
faulty[i] == 0) {
1247 static void passive_processor_count_set (
1249 unsigned int processor_count)
1251 struct passive_instance *rrp_algo_instance = (
struct passive_instance *)instance->
rrp_algo_instance;
1255 if (rrp_algo_instance->
faulty[i] == 0) {
1263 static void passive_token_target_set (
1266 unsigned int iface_no)
1271 static int passive_mcast_recv_empty (
1275 int msgs_emptied = 0;
1288 return (msgs_emptied);
1291 static int passive_member_add (
1294 unsigned int iface_no)
1301 static int passive_member_remove (
1304 unsigned int iface_no)
1311 static void passive_membership_changed (
1314 const struct srp_addr *member_list,
size_t member_list_entries,
1315 const struct srp_addr *left_list,
size_t left_list_entries,
1316 const struct srp_addr *joined_list,
size_t joined_list_entries,
1322 for (interface = 0;
interface < rrp_instance->interface_count; interface++) {
1323 for (i = 0; i < left_list_entries; i++) {
1324 if (left_list->
no_addrs < interface + 1 ||
1325 (left_list[i].
addr[interface].
family != AF_INET &&
1326 left_list[i].
addr[interface].
family != AF_INET6)) {
1328 "Membership left list contains incorrect address. "
1329 "This is sign of misconfiguration between nodes!");
1332 &left_list[i].
addr[interface], 0);
1336 for (i = 0; i < joined_list_entries; i++) {
1337 if (joined_list->
no_addrs < interface + 1 ||
1338 (joined_list[i].
addr[interface].
family != AF_INET &&
1339 joined_list[i].
addr[interface].
family != AF_INET6)) {
1341 "Membership join list contains incorrect address. "
1342 "This is sign of misconfiguration between nodes!");
1345 &joined_list[i].
addr[interface], 1);
1351 static void passive_ring_reenable (
1353 unsigned int iface_no)
1355 struct passive_instance *rrp_algo_instance = (
struct passive_instance *)instance->
rrp_algo_instance;
1364 memset (rrp_algo_instance->
faulty, 0, sizeof (
unsigned int) *
1367 stats_set_interface_faulty (instance, i, 0);
1370 rrp_algo_instance->
faulty[iface_no] = 0;
1371 stats_set_interface_faulty (instance, iface_no, 0);
1378 void *active_instance_initialize (
1380 int interface_count)
1386 if (instance == 0) {
1391 instance->
faulty = malloc (
sizeof (
int) * interface_count);
1392 if (instance->
faulty == 0) {
1397 memset (instance->
faulty, 0, sizeof (
unsigned int) * interface_count);
1399 for (i = 0; i < interface_count; i++) {
1400 stats_set_interface_faulty (rrp_instance, i, 0);
1410 memset (instance->
last_token_recv, 0, sizeof (
unsigned int) * interface_count);
1420 memset (instance->
counter_problems, 0, sizeof (
unsigned int) * interface_count);
1431 return ((
void *)instance);
1433 static void timer_function_active_problem_decrementer (
void *context)
1437 unsigned int problem_found = 0;
1446 "ring %d active with no faults", i);
1449 "Decrementing problem counter for iface %s to [%d of %d]",
1457 rrp_instance->
status[i]);
1460 if (problem_found) {
1461 active_timer_problem_decrementer_start (active_instance);
1467 static void timer_function_active_token_expired (
void *context)
1469 struct active_instance *active_instance = (
struct active_instance *)context;
1478 active_timer_problem_decrementer_start (active_instance);
1481 "Incrementing problem counter for seqid %d iface %s to [%d of %d]",
1489 rrp_instance->
status[i]);
1494 active_instance->
faulty[i] == 0) {
1495 active_instance->
faulty[i] = 1;
1501 timer_function_test_ring_timeout,
1504 stats_set_interface_faulty (rrp_instance, i, active_instance->
faulty[i]);
1507 "Marking seqid %d ringid %u interface %s FAULTY",
1514 rrp_instance->
status[i]);
1515 active_timer_problem_decrementer_cancel (active_instance);
1521 active_instance->
token,
1525 static void active_timer_expired_token_start (
1526 struct active_instance *active_instance)
1532 (
void *)active_instance,
1533 timer_function_active_token_expired,
1537 static void active_timer_expired_token_cancel (
1538 struct active_instance *active_instance)
1545 static void active_timer_problem_decrementer_start (
1546 struct active_instance *active_instance)
1552 (
void *)active_instance,
1553 timer_function_active_problem_decrementer,
1557 static void active_timer_problem_decrementer_cancel (
1558 struct active_instance *active_instance)
1570 static void active_mcast_recv (
1572 unsigned int iface_no,
1575 unsigned int msg_len)
1583 static void active_mcast_flush_send (
1586 unsigned int msg_len)
1590 struct active_instance *rrp_algo_instance = (
struct active_instance *)instance->
rrp_algo_instance;
1595 if (rrp_algo_instance->
faulty[i] == 0) {
1610 static void active_mcast_noflush_send (
1613 unsigned int msg_len)
1617 struct active_instance *rrp_algo_instance = (
struct active_instance *)instance->
rrp_algo_instance;
1622 if (rrp_algo_instance->
faulty[i] == 0) {
1637 static void active_token_recv (
1639 unsigned int iface_no,
1642 unsigned int msg_len,
1643 unsigned int token_seq)
1646 struct active_instance *active_instance = (
struct active_instance *)rrp_instance->
rrp_algo_instance;
1649 if (sq_lt_compare (active_instance->
last_token_seq, token_seq)) {
1650 memcpy (active_instance->
token, msg, msg_len);
1657 active_timer_expired_token_start (active_instance);
1670 active_instance->
faulty[i] == 0) {
1674 active_timer_expired_token_cancel (active_instance);
1683 static void active_token_send (
1686 unsigned int msg_len)
1688 struct active_instance *rrp_algo_instance = (
struct active_instance *)instance->
rrp_algo_instance;
1695 if (rrp_algo_instance->
faulty[i] == 0) {
1718 struct active_instance *rrp_algo_instance = (
struct active_instance *)instance->
rrp_algo_instance;
1722 if (rrp_algo_instance->
faulty[i] == 0) {
1731 struct active_instance *rrp_algo_instance = (
struct active_instance *)instance->
rrp_algo_instance;
1735 if (rrp_algo_instance->
faulty[i] == 0) {
1742 static int active_member_add (
1745 unsigned int iface_no)
1752 static int active_member_remove (
1755 unsigned int iface_no)
1762 static void active_membership_changed (
1765 const struct srp_addr *member_list,
size_t member_list_entries,
1766 const struct srp_addr *left_list,
size_t left_list_entries,
1767 const struct srp_addr *joined_list,
size_t joined_list_entries,
1773 for (interface = 0;
interface < rrp_instance->interface_count; interface++) {
1774 for (i = 0; i < left_list_entries; i++) {
1775 if (left_list->
no_addrs < interface + 1 ||
1776 (left_list[i].
addr[interface].
family != AF_INET &&
1777 left_list[i].
addr[interface].
family != AF_INET6)) {
1779 "Membership left list contains incorrect address. "
1780 "This is sign of misconfiguration between nodes!");
1783 &left_list[i].
addr[interface], 0);
1787 for (i = 0; i < joined_list_entries; i++) {
1788 if (joined_list->
no_addrs < interface + 1 ||
1789 (joined_list[i].
addr[interface].
family != AF_INET &&
1790 joined_list[i].
addr[interface].
family != AF_INET6)) {
1792 "Membership join list contains incorrect address. "
1793 "This is sign of misconfiguration between nodes!");
1796 &joined_list[i].
addr[interface], 1);
1804 struct active_instance *rrp_algo_instance = (
struct active_instance *)instance->
rrp_algo_instance;
1808 if (rrp_algo_instance->
faulty[i] == 0) {
1815 static void active_processor_count_set (
1817 unsigned int processor_count)
1819 struct active_instance *rrp_algo_instance = (
struct active_instance *)instance->
rrp_algo_instance;
1823 if (rrp_algo_instance->
faulty[i] == 0) {
1831 static void active_token_target_set (
1834 unsigned int iface_no)
1839 static int active_mcast_recv_empty (
1843 int msgs_emptied = 0;
1856 return (msgs_emptied);
1859 static void active_ring_reenable (
1861 unsigned int iface_no)
1863 struct active_instance *rrp_algo_instance = (
struct active_instance *)instance->
rrp_algo_instance;
1867 memset (rrp_algo_instance->
last_token_recv, 0, sizeof (
unsigned int) *
1869 memset (rrp_algo_instance->
faulty, 0, sizeof (
unsigned int) *
1875 stats_set_interface_faulty (instance, i, 0);
1879 rrp_algo_instance->
faulty[iface_no] = 0;
1882 stats_set_interface_faulty (instance, iface_no, 0);
1891 static int totemrrp_algorithm_set (
1895 unsigned int res = -1;
1899 if (strcmp (totem_config->
rrp_mode, rrp_algos[i]->
name) == 0) {
1901 if (rrp_algos[i]->initialize) {
1913 "ring %d active with no faults", i);
1921 unsigned int msg_len)
1923 unsigned int token_seqid;
1924 unsigned int token_is;
1926 struct deliver_fn_context *deliver_fn_context = (
struct deliver_fn_context *)context;
1942 "received message requesting test of ring now active");
1945 test_active_msg_endian_convert(hdr, &tmp_msg);
1972 test_active_msg_endian_convert(hdr, &tmp_msg);
1978 "Received ring test activate message for ring %d sent by node %u",
1984 "Automatically recovered ring %d", hdr->
ring_number);
2022 struct deliver_fn_context *deliver_fn_context = (
struct deliver_fn_context *)context;
2045 static void rrp_target_set_completed (
void *context)
2047 struct deliver_fn_context *deliver_fn_context = (
struct deliver_fn_context *)context;
2061 qb_loop_t *poll_handle,
2063 struct totem_config *totem_config,
2067 void (*deliver_fn) (
2070 unsigned int msg_len),
2072 void (*iface_change_fn) (
2075 unsigned int iface_no),
2077 void (*token_seqid_get) (
2079 unsigned int *seqid,
2080 unsigned int *token_is),
2082 unsigned int (*msgs_missing) (
void),
2084 void (*target_set_completed) (
void *context))
2091 if (instance == 0) {
2095 totemrrp_instance_initialize (instance);
2102 res = totemrrp_algorithm_set (
2144 struct deliver_fn_context *deliver_fn_context;
2146 deliver_fn_context = malloc (
sizeof (
struct deliver_fn_context));
2147 assert (deliver_fn_context);
2159 (
void *)deliver_fn_context,
2162 rrp_target_set_completed);
2182 assert (instance != NULL);
2189 assert (instance != NULL);
2195 unsigned int processor_count)
2208 unsigned int iface_no)
2235 unsigned int msg_len)
2246 unsigned int msg_len)
2260 unsigned int msg_len)
2289 unsigned int *iface_count)
2292 *status = instance->
status;
2303 const char *cipher_type,
2304 const char *hash_type)
2322 unsigned int iface_no)
2333 "ring %d active with no faults", i);
2337 "ring %d active with no faults", iface_no);
2383 const struct srp_addr *member_list,
size_t member_list_entries,
2384 const struct srp_addr *left_list,
size_t left_list_entries,
2385 const struct srp_addr *joined_list,
size_t joined_list_entries,
2392 member_list, member_list_entries,
2393 left_list, left_list_entries,
2394 joined_list, joined_list_entries,