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);
123 void (*mcast_noflush_send) (
126 unsigned int msg_len);
128 void (*mcast_flush_send) (
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);
152 void (*iface_check) (
155 void (*processor_count_set) (
159 void (*token_target_set) (
162 unsigned int iface_no);
164 void (*ring_reenable) (
166 unsigned int iface_no);
168 int (*mcast_recv_empty) (
174 unsigned int iface_no);
176 int (*member_remove) (
179 unsigned int iface_no);
181 void (*membership_changed) (
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 202 void (*totemrrp_deliver_fn) (
205 unsigned int msg_len);
207 void (*totemrrp_iface_change_fn) (
210 unsigned int iface_no);
212 void (*totemrrp_token_seqid_get) (
215 unsigned int *token_is);
217 void (*totemrrp_target_set_completed) (
220 unsigned int (*totemrrp_msgs_missing) (void);
237 void (*totemrrp_log_printf) (
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 (
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) {
1125 static void passive_mcast_noflush_send (
1128 unsigned int msg_len)
1138 if (i <= instance->interface_count) {
1143 static void passive_token_recv (
1145 unsigned int iface_no,
1148 unsigned int msg_len,
1161 memcpy (passive_instance->
token, msg, msg_len);
1162 passive_timer_expired_token_start (passive_instance);
1166 passive_monitor (rrp_instance, iface_no, 1);
1169 static void passive_token_send (
1172 unsigned int msg_len)
1182 if (i <= instance->interface_count) {
1196 if (rrp_algo_instance->
faulty[i] == 0) {
1209 if (rrp_algo_instance->
faulty[i] == 0) {
1222 if (rrp_algo_instance->
faulty[i] == 0) {
1229 static void passive_processor_count_set (
1231 unsigned int processor_count)
1237 if (rrp_algo_instance->
faulty[i] == 0) {
1245 static void passive_token_target_set (
1248 unsigned int iface_no)
1253 static int passive_mcast_recv_empty (
1257 int msgs_emptied = 0;
1270 return (msgs_emptied);
1273 static int passive_member_add (
1276 unsigned int iface_no)
1283 static int passive_member_remove (
1286 unsigned int iface_no)
1293 static void passive_membership_changed (
1296 const struct srp_addr *member_list,
size_t member_list_entries,
1297 const struct srp_addr *left_list,
size_t left_list_entries,
1298 const struct srp_addr *joined_list,
size_t joined_list_entries,
1304 for (interface = 0;
interface < rrp_instance->interface_count; interface++) {
1305 for (i = 0; i < left_list_entries; i++) {
1306 if (left_list->
no_addrs < interface + 1 ||
1307 (left_list[i].
addr[interface].
family != AF_INET &&
1308 left_list[i].
addr[interface].
family != AF_INET6)) {
1310 "Membership left list contains incorrect address. " 1311 "This is sign of misconfiguration between nodes!");
1314 &left_list[i].
addr[interface], 0);
1318 for (i = 0; i < joined_list_entries; i++) {
1319 if (joined_list->
no_addrs < interface + 1 ||
1320 (joined_list[i].
addr[interface].
family != AF_INET &&
1321 joined_list[i].
addr[interface].
family != AF_INET6)) {
1323 "Membership join list contains incorrect address. " 1324 "This is sign of misconfiguration between nodes!");
1327 &joined_list[i].
addr[interface], 1);
1333 static void passive_ring_reenable (
1335 unsigned int iface_no)
1346 memset (rrp_algo_instance->
faulty, 0, sizeof (
unsigned int) *
1349 stats_set_interface_faulty (instance, i, 0);
1352 rrp_algo_instance->
faulty[iface_no] = 0;
1353 stats_set_interface_faulty (instance, iface_no, 0);
1360 void *active_instance_initialize (
1362 int interface_count)
1368 if (instance == 0) {
1373 instance->
faulty = malloc (
sizeof (
int) * interface_count);
1374 if (instance->
faulty == 0) {
1379 memset (instance->
faulty, 0, sizeof (
unsigned int) * interface_count);
1381 for (i = 0; i < interface_count; i++) {
1382 stats_set_interface_faulty (rrp_instance, i, 0);
1392 memset (instance->
last_token_recv, 0, sizeof (
unsigned int) * interface_count);
1402 memset (instance->
counter_problems, 0, sizeof (
unsigned int) * interface_count);
1413 return ((
void *)instance);
1415 static void timer_function_active_problem_decrementer (
void *context)
1419 unsigned int problem_found = 0;
1428 "ring %d active with no faults", i);
1431 "Decrementing problem counter for iface %s to [%d of %d]",
1439 rrp_instance->
status[i]);
1442 if (problem_found) {
1443 active_timer_problem_decrementer_start (active_instance);
1449 static void timer_function_active_token_expired (
void *
context)
1460 active_timer_problem_decrementer_start (active_instance);
1463 "Incrementing problem counter for seqid %d iface %s to [%d of %d]",
1471 rrp_instance->
status[i]);
1476 active_instance->
faulty[i] == 0) {
1477 active_instance->
faulty[i] = 1;
1483 timer_function_test_ring_timeout,
1486 stats_set_interface_faulty (rrp_instance, i, active_instance->
faulty[i]);
1489 "Marking seqid %d ringid %u interface %s FAULTY",
1496 rrp_instance->
status[i]);
1497 active_timer_problem_decrementer_cancel (active_instance);
1503 active_instance->
token,
1507 static void active_timer_expired_token_start (
1514 (
void *)active_instance,
1515 timer_function_active_token_expired,
1519 static void active_timer_expired_token_cancel (
1520 struct active_instance *active_instance)
1527 static void active_timer_problem_decrementer_start (
1528 struct active_instance *active_instance)
1534 (
void *)active_instance,
1535 timer_function_active_problem_decrementer,
1539 static void active_timer_problem_decrementer_cancel (
1540 struct active_instance *active_instance)
1552 static void active_mcast_recv (
1554 unsigned int iface_no,
1557 unsigned int msg_len)
1565 static void active_mcast_flush_send (
1568 unsigned int msg_len)
1571 struct active_instance *rrp_algo_instance = (
struct active_instance *)instance->
rrp_algo_instance;
1574 if (rrp_algo_instance->
faulty[i] == 0) {
1580 static void active_mcast_noflush_send (
1583 unsigned int msg_len)
1586 struct active_instance *rrp_algo_instance = (
struct active_instance *)instance->
rrp_algo_instance;
1589 if (rrp_algo_instance->
faulty[i] == 0) {
1595 static void active_token_recv (
1597 unsigned int iface_no,
1600 unsigned int msg_len,
1604 struct active_instance *active_instance = (
struct active_instance *)rrp_instance->
rrp_algo_instance;
1607 if (sq_lt_compare (active_instance->
last_token_seq, token_seq)) {
1608 memcpy (active_instance->
token, msg, msg_len);
1615 active_timer_expired_token_start (active_instance);
1628 active_instance->
faulty[i] == 0) {
1632 active_timer_expired_token_cancel (active_instance);
1641 static void active_token_send (
1644 unsigned int msg_len)
1646 struct active_instance *rrp_algo_instance = (
struct active_instance *)instance->
rrp_algo_instance;
1650 if (rrp_algo_instance->
faulty[i] == 0) {
1661 struct active_instance *rrp_algo_instance = (
struct active_instance *)instance->
rrp_algo_instance;
1665 if (rrp_algo_instance->
faulty[i] == 0) {
1674 struct active_instance *rrp_algo_instance = (
struct active_instance *)instance->
rrp_algo_instance;
1678 if (rrp_algo_instance->
faulty[i] == 0) {
1685 static int active_member_add (
1688 unsigned int iface_no)
1695 static int active_member_remove (
1698 unsigned int iface_no)
1705 static void active_membership_changed (
1708 const struct srp_addr *member_list,
size_t member_list_entries,
1709 const struct srp_addr *left_list,
size_t left_list_entries,
1710 const struct srp_addr *joined_list,
size_t joined_list_entries,
1716 for (interface = 0;
interface < rrp_instance->interface_count; interface++) {
1717 for (i = 0; i < left_list_entries; i++) {
1718 if (left_list->
no_addrs < interface + 1 ||
1719 (left_list[i].
addr[interface].
family != AF_INET &&
1720 left_list[i].
addr[interface].
family != AF_INET6)) {
1722 "Membership left list contains incorrect address. " 1723 "This is sign of misconfiguration between nodes!");
1726 &left_list[i].
addr[interface], 0);
1730 for (i = 0; i < joined_list_entries; i++) {
1731 if (joined_list->
no_addrs < interface + 1 ||
1732 (joined_list[i].
addr[interface].
family != AF_INET &&
1733 joined_list[i].
addr[interface].
family != AF_INET6)) {
1735 "Membership join list contains incorrect address. " 1736 "This is sign of misconfiguration between nodes!");
1739 &joined_list[i].
addr[interface], 1);
1747 struct active_instance *rrp_algo_instance = (
struct active_instance *)instance->
rrp_algo_instance;
1751 if (rrp_algo_instance->
faulty[i] == 0) {
1758 static void active_processor_count_set (
1760 unsigned int processor_count)
1762 struct active_instance *rrp_algo_instance = (
struct active_instance *)instance->
rrp_algo_instance;
1766 if (rrp_algo_instance->
faulty[i] == 0) {
1774 static void active_token_target_set (
1777 unsigned int iface_no)
1782 static int active_mcast_recv_empty (
1786 int msgs_emptied = 0;
1799 return (msgs_emptied);
1802 static void active_ring_reenable (
1804 unsigned int iface_no)
1806 struct active_instance *rrp_algo_instance = (
struct active_instance *)instance->
rrp_algo_instance;
1810 memset (rrp_algo_instance->
last_token_recv, 0, sizeof (
unsigned int) *
1812 memset (rrp_algo_instance->
faulty, 0, sizeof (
unsigned int) *
1818 stats_set_interface_faulty (instance, i, 0);
1822 rrp_algo_instance->
faulty[iface_no] = 0;
1825 stats_set_interface_faulty (instance, iface_no, 0);
1834 static int totemrrp_algorithm_set (
1838 unsigned int res = -1;
1856 "ring %d active with no faults", i);
1864 unsigned int msg_len)
1866 unsigned int token_seqid;
1867 unsigned int token_is;
1885 "received message requesting test of ring now active");
1888 test_active_msg_endian_convert(hdr, &tmp_msg);
1915 test_active_msg_endian_convert(hdr, &tmp_msg);
1921 "Received ring test activate message for ring %d sent by node %u",
1927 "Automatically recovered ring %d", hdr->
ring_number);
1988 static void rrp_target_set_completed (
void *
context)
2004 qb_loop_t *poll_handle,
2006 struct totem_config *totem_config,
2010 void (*deliver_fn) (
2013 unsigned int msg_len),
2015 void (*iface_change_fn) (
2020 void (*token_seqid_get) (
2022 unsigned int *seqid,
2023 unsigned int *token_is),
2025 unsigned int (*msgs_missing) (
void),
2027 void (*target_set_completed) (
void *context))
2034 if (instance == 0) {
2038 totemrrp_instance_initialize (instance);
2045 res = totemrrp_algorithm_set (
2089 deliver_fn_context = malloc (
sizeof (
struct deliver_fn_context));
2090 assert (deliver_fn_context);
2102 (
void *)deliver_fn_context,
2105 rrp_target_set_completed);
2121 assert (instance != NULL);
2128 assert (instance != NULL);
2147 unsigned int iface_no)
2174 unsigned int msg_len)
2185 unsigned int msg_len)
2199 unsigned int msg_len)
2228 unsigned int *iface_count)
2231 *status = instance->
status;
2242 const char *cipher_type,
2243 const char *hash_type)
2261 unsigned int iface_no)
2272 "ring %d active with no faults", i);
2276 "ring %d active with no faults", iface_no);
2322 const struct srp_addr *member_list,
size_t member_list_entries,
2323 const struct srp_addr *left_list,
size_t left_list_entries,
2324 const struct srp_addr *joined_list,
size_t joined_list_entries,
2331 member_list, member_list_entries,
2332 left_list, left_list_entries,
2333 joined_list, joined_list_entries,
void(* mcast_recv)(struct totemrrp_instance *instance, unsigned int iface_no, void *context, const void *msg, unsigned int msg_len)
int totemrrp_iface_check(void *rrp_context)
void rrp_iface_change_fn(void *context, const struct totem_ip_address *iface_addr)
int totemnet_mcast_flush_send(void *net_context, const void *msg, unsigned int msg_len)
qb_loop_timer_handle timer_expired_token
struct totem_interface * interfaces
unsigned int interface_count
int totemrrp_log_level_error
qb_loop_timer_handle timer_problem_decrementer
The totem_ip_address struct.
void(* totemrrp_token_seqid_get)(const void *msg, unsigned int *seqid, unsigned int *token_is)
int(* member_add)(struct totemrrp_instance *instance, const struct totem_ip_address *member, unsigned int iface_no)
int totemnet_member_remove(void *net_context, const struct totem_ip_address *member)
unsigned int(* totemrrp_msgs_missing)(void)
struct totemrrp_instance * instance
unsigned int last_token_seq
totem_configuration_type
The totem_configuration_type enum.
void(*) void * net_handles)
char rrp_mode[TOTEM_RRP_MODE_BYTES]
void totemrrp_membership_changed(void *rrp_context, enum totem_configuration_type configuration_type, const struct srp_addr *member_list, size_t member_list_entries, const struct srp_addr *left_list, size_t left_list_entries, const struct srp_addr *joined_list, size_t joined_list_entries, const struct memb_ring_id *ring_id)
const char * totemnet_iface_print(void *net_context)
#define PASSIVE_RECV_COUNT_THRESHOLD
unsigned char addr[TOTEMIP_ADDRLEN]
unsigned int rrp_problem_count_timeout
struct rrp_algo active_algo
unsigned int * token_recv_count
struct rrp_algo passive_algo
int(* mcast_recv_empty)(struct totemrrp_instance *instance)
int totemnet_member_add(void *net_context, const struct totem_ip_address *member)
int totemrrp_ifaces_get(void *rrp_context, char ***status, unsigned int *iface_count)
void * totemrrp_buffer_alloc(void *rrp_context)
void(* processor_count_set)(struct totemrrp_instance *instance, unsigned int processor_count)
void(* totemrrp_target_set_completed)(void *context)
unsigned int * counter_problems
qb_loop_timer_handle timer_expired_token
unsigned int * mcast_recv_count
unsigned int token_xmit_iface
unsigned int rrp_problem_count_threshold
struct totemrrp_instance * rrp_instance
void(* send_flush)(struct totemrrp_instance *instance)
void(*) in log_level_security)
Totem Network interface - also does encryption/decryption.
int totemnet_recv_flush(void *net_context)
#define MESSAGE_TYPE_RING_TEST_ACTIVATE
void(* token_recv)(struct totemrrp_instance *instance, unsigned int iface_no, void *context, const void *msg, unsigned int msg_len, unsigned int token_seqid)
unsigned char token[15000]
#define ARR_SEQNO_START_TOKEN
int totemrrp_finalize(void *rrp_context)
int totemnet_net_mtu_adjust(void *net_context, struct totem_config *totem_config)
int totemrrp_member_remove(void *rrp_context, const struct totem_ip_address *member, int iface_no)
int totemrrp_crypto_set(void *rrp_context, const char *cipher_type, const char *hash_type)
void(* mcast_flush_send)(struct totemrrp_instance *instance, const void *msg, unsigned int msg_len)
int totemnet_crypto_set(void *net_context, const char *cipher_type, const char *hash_type)
void * totemnet_buffer_alloc(void *net_context)
void * deliver_fn_context[INTERFACE_MAX]
int totemrrp_log_level_debug
int totemnet_member_set_active(void *net_context, const struct totem_ip_address *member, int active)
int totemrrp_send_flush(void *rrp_context)
unsigned int msg_xmit_iface
int totemnet_recv_mcast_empty(void *net_context)
int totemrrp_member_add(void *rrp_context, const struct totem_ip_address *member, int iface_no)
unsigned int rrp_autorecovery_check_timeout
void(* totemrrp_deliver_fn)(void *context, const void *msg, unsigned int msg_len)
int totemnet_send_flush(void *net_context)
void(* token_send)(struct totemrrp_instance *instance, const void *msg, unsigned int msg_len)
int totemnet_mcast_noflush_send(void *net_context, const void *msg, unsigned int msg_len)
struct totem_interface * interfaces
int totemrrp_initialize(qb_loop_t *poll_handle, void **rrp_context, struct totem_config *totem_config, totemsrp_stats_t *stats, 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_addr, unsigned int iface_no), void(*token_seqid_get)(const void *msg, unsigned int *seqid, unsigned int *token_is), unsigned int(*msgs_missing)(void), void(*target_set_completed)(void *context))
Create an instance.
int totemnet_finalize(void *net_context)
unsigned int * last_token_recv
void(* log_printf)(int level, int subsys, const char *function_name, const char *file_name, int file_line, const char *format,...) __attribute__((format(printf
int totemrrp_log_level_warning
#define swab32(x)
The swab32 macro.
int totemnet_token_send(void *net_context, const void *msg, unsigned int msg_len)
void(* totemrrp_iface_change_fn)(void *context, const struct totem_ip_address *iface_addr, unsigned int iface_no)
int totemrrp_recv_flush(void *rrp_context)
struct deliver_fn_context __attribute__
void(* token_target_set)(struct totemrrp_instance *instance, struct totem_ip_address *token_target, unsigned int iface_no)
unsigned char token[15000]
void(* iface_check)(struct totemrrp_instance *instance)
int(* member_remove)(struct totemrrp_instance *instance, const struct totem_ip_address *member, unsigned int iface_no)
void(* membership_changed)(struct totemrrp_instance *instance, enum totem_configuration_type configuration_type, const struct srp_addr *member_list, size_t member_list_entries, const struct srp_addr *left_list, size_t left_list_entries, const struct srp_addr *joined_list, size_t joined_list_entries, const struct memb_ring_id *ring_id)
void totemrrp_buffer_release(void *rrp_context, void *ptr)
Totem Network interface - also does encryption/decryption.
struct totem_config * totem_config
void(* ring_reenable)(struct totemrrp_instance *instance, unsigned int iface_no)
int totemnet_initialize(qb_loop_t *loop_pt, void **net_context, struct totem_config *totem_config, totemsrp_stats_t *stats, 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))
Create an instance.
char * status[INTERFACE_MAX]
void(* recv_flush)(struct totemrrp_instance *instance)
unsigned int rrp_problem_count_mcast_threshold
int totemrrp_processor_count_set(void *rrp_context, unsigned int processor_count)
int totemrrp_log_level_security
int totemrrp_mcast_noflush_send(void *rrp_context, const void *msg, unsigned int msg_len)
int totemrrp_mcast_recv_empty(void *rrp_context)
struct rrp_algo * rrp_algo
struct rrp_algo * rrp_algos[]
struct totem_logging_configuration totem_logging_configuration
int totemrrp_mcast_flush_send(void *rrp_context, const void *msg, unsigned int msg_len)
qb_loop_timer_handle timer_problem_decrementer
void totemnet_buffer_release(void *net_context, void *ptr)
int totemrrp_log_level_notice
void rrp_deliver_fn(void *context, const void *msg, unsigned int msg_len)
#define MESSAGE_TYPE_RING_TEST_ACTIVE
int totemnet_iface_check(void *net_context)
#define log_printf(level, format, args...)
struct memb_ring_id ring_id
int totemrrp_ring_reenable(void *rrp_context, unsigned int iface_no)
void *(* initialize)(struct totemrrp_instance *rrp_instance, int interface_count)
struct totemrrp_instance * rrp_instance
qb_loop_timer_handle timer_active_test_ring_timeout[INTERFACE_MAX]
int totemnet_token_target_set(void *net_context, const struct totem_ip_address *token_target)
struct rrp_algo none_algo
struct totem_ip_address addr[INTERFACE_MAX]
unsigned int rrp_token_expired_timeout
int totemrrp_token_send(void *rrp_context, const void *msg, unsigned int msg_len)
int totemrrp_token_target_set(void *rrp_context, struct totem_ip_address *addr, unsigned int iface_no)
void(* totemrrp_log_printf)(int level, int subsys, const char *function, const char *file, int line, const char *format,...) __attribute__((format(printf
int totemnet_processor_count_set(void *net_context, int processor_count)
void(* mcast_noflush_send)(struct totemrrp_instance *instance, const void *msg, unsigned int msg_len)