6
6
* Part: Sheduling framework for vrrp code.
8
* Version: $Id: vrrp_scheduler.c,v 1.1.7 2004/04/04 23:28:05 acassen Exp $
8
* Version: $Id: vrrp_scheduler.c,v 1.1.11 2005/03/01 01:22:13 acassen Exp $
10
10
* Author: Alexandre Cassen, <acassen@linux-vs.org>
19
19
* as published by the Free Software Foundation; either version
20
20
* 2 of the License, or (at your option) any later version.
22
* Copyright (C) 2001-2004 Alexandre Cassen, <acassen@linux-vs.org>
22
* Copyright (C) 2001-2005 Alexandre Cassen, <acassen@linux-vs.org>
25
25
#include "vrrp_scheduler.h"
142
138
if (vrrp->smtp_alert) {
143
139
if (vrrp->state == VRRP_STATE_MAST)
144
smtp_alert(master, NULL, vrrp, NULL,
140
smtp_alert(NULL, vrrp, NULL,
145
141
"Entering MASTER state",
146
142
"=> VRRP Instance is now owning VRRP VIPs <=");
147
143
if (vrrp->state == VRRP_STATE_BACK)
148
smtp_alert(master, NULL, vrrp, NULL,
144
smtp_alert(NULL, vrrp, NULL,
149
145
"Entering BACKUP state",
150
146
"=> VRRP Instance is nolonger owning VRRP VIPs <=");
311
308
/* Register VRRP workers threads */
312
309
for (e = LIST_HEAD(l); e; ELEMENT_NEXT(e)) {
313
sock = ELEMENT_DATA(e);
310
sock_obj = ELEMENT_DATA(e);
314
311
/* jump to asynchronous handling */
315
vrrp_timer = vrrp_timer_fd(sock->fd_in);
312
vrrp_timer = vrrp_timer_fd(sock_obj->fd_in);
317
314
/* Register a timer thread if interface is shut */
318
if (sock->fd_in == -1)
315
if (sock_obj->fd_in == -1)
319
316
thread_add_timer(master, vrrp_read_dispatcher_thread,
320
317
(int *)THREAD_TIMER, vrrp_timer);
322
319
thread_add_read(master, vrrp_read_dispatcher_thread,
323
NULL, sock->fd_in, vrrp_timer);
320
NULL, sock_obj->fd_in, vrrp_timer);
329
326
already_exist_sock(list l, int ifindex, int proto)
334
331
for (e = LIST_HEAD(l); e; ELEMENT_NEXT(e)) {
335
sock = ELEMENT_DATA(e);
336
if ((sock->ifindex == ifindex) && (sock->proto == proto))
332
sock_obj = ELEMENT_DATA(e);
333
if ((sock_obj->ifindex == ifindex) && (sock_obj->proto == proto))
342
/* sockpool list primitives */
344
free_sock(void *data)
350
dump_sock(void *data)
353
syslog(LOG_INFO, "VRRP sockpool: [ifindex(%d), proto(%d), fd(%d,%d)]",
361
340
alloc_sock(list l, int ifindex, int proto)
396
375
vrrp_open_sockpool(list l)
401
380
for (e = LIST_HEAD(l); e; ELEMENT_NEXT(e)) {
402
sock = ELEMENT_DATA(e);
403
sock->fd_in = open_vrrp_socket(sock->proto, sock->ifindex);
404
if (sock->fd_in == -1)
381
sock_obj = ELEMENT_DATA(e);
382
sock_obj->fd_in = open_vrrp_socket(sock_obj->proto, sock_obj->ifindex);
383
if (sock_obj->fd_in == -1)
384
sock_obj->fd_out = -1;
407
sock->fd_out = open_vrrp_send_socket(sock->proto,
386
sock_obj->fd_out = open_vrrp_send_socket(sock_obj->proto,
413
392
vrrp_set_fds(list l)
417
396
list p = vrrp_data->vrrp;
422
401
for (e_sock = LIST_HEAD(l); e_sock; ELEMENT_NEXT(e_sock)) {
423
sock = ELEMENT_DATA(e_sock);
402
sock_obj = ELEMENT_DATA(e_sock);
424
403
for (e_vrrp = LIST_HEAD(p); e_vrrp; ELEMENT_NEXT(e_vrrp)) {
425
404
vrrp = ELEMENT_DATA(e_vrrp);
426
405
if (vrrp->auth_type == VRRP_AUTH_AH)
429
408
proto = IPPROTO_VRRP;
431
if ((sock->ifindex == IF_INDEX(vrrp->ifp)) &&
432
(sock->proto == proto)) {
433
vrrp->fd_in = sock->fd_in;
434
vrrp->fd_out = sock->fd_out;
410
if ((sock_obj->ifindex == IF_INDEX(vrrp->ifp)) &&
411
(sock_obj->proto == proto)) {
412
vrrp->fd_in = sock_obj->fd_in;
413
vrrp->fd_out = sock_obj->fd_out;
436
415
/* append to hash index */
437
416
alloc_vrrp_fd_bucket(vrrp);
455
434
* multiplexing points.
458
vrrp_dispatcher_init(thread * thread)
437
vrrp_dispatcher_init(thread * thread_obj)
462
/* allocate the sockpool */
463
pool = alloc_list(free_sock, dump_sock);
465
439
/* create the VRRP socket pool list */
466
vrrp_create_sockpool(pool);
440
vrrp_create_sockpool(vrrp_data->vrrp_socket_pool);
468
442
/* open the VRRP socket pool */
469
vrrp_open_sockpool(pool);
443
vrrp_open_sockpool(vrrp_data->vrrp_socket_pool);
471
445
/* set VRRP instance fds to sockpool */
446
vrrp_set_fds(vrrp_data->vrrp_socket_pool);
474
448
/* register read dispatcher worker thread */
475
vrrp_register_workers(pool);
449
vrrp_register_workers(vrrp_data->vrrp_socket_pool);
477
/* cleanup the temp socket pool */
451
/* Dump socket pool */
453
dump_list(vrrp_data->vrrp_socket_pool);
458
vrrp_dispatcher_release(vrrp_conf_data *conf_data_obj)
460
free_list(conf_data_obj->vrrp_socket_pool);
486
vrrp_backup(vrrp_rt * vrrp, char *vrrp_buffer, int len)
464
vrrp_backup(vrrp_rt * vrrp, char *buffer, int len)
488
struct iphdr *iph = (struct iphdr *) vrrp_buffer;
466
struct iphdr *iph = (struct iphdr *) buffer;
491
469
if (iph->protocol == IPPROTO_IPSEC_AH) {
492
ah = (ipsec_ah *) (vrrp_buffer + sizeof (struct iphdr));
493
if (ah->seq_number >= vrrp->ipsecah_counter->seq_number) {
494
// vrrp->ipsecah_counter->seq_number = ah->seq_number + 10;
470
ah = (ipsec_ah *) (buffer + sizeof (struct iphdr));
471
if (ntohl(ah->seq_number) >= vrrp->ipsecah_counter->seq_number)
495
472
vrrp->ipsecah_counter->cycle = 0;
499
vrrp_state_backup(vrrp, vrrp_buffer, len);
475
vrrp_state_backup(vrrp, buffer, len);
503
vrrp_become_master(vrrp_rt * vrrp, char *vrrp_buffer, int len)
479
vrrp_become_master(vrrp_rt * vrrp, char *buffer, int len)
505
struct iphdr *iph = (struct iphdr *) vrrp_buffer;
481
struct iphdr *iph = (struct iphdr *) buffer;
512
488
if (iph->protocol == IPPROTO_IPSEC_AH) {
513
489
syslog(LOG_INFO, "VRRP_Instance(%s) IPSEC-AH : seq_num sync",
515
ah = (ipsec_ah *) (vrrp_buffer + sizeof (struct iphdr));
516
vrrp->ipsecah_counter->seq_number = ah->seq_number + 1;
491
ah = (ipsec_ah *) (buffer + sizeof (struct iphdr));
492
vrrp->ipsecah_counter->seq_number = ntohl(ah->seq_number) + 1;
517
493
vrrp->ipsecah_counter->cycle = 0;
526
vrrp_leave_master(vrrp_rt * vrrp, char *vrrp_buffer, int len)
502
vrrp_leave_master(vrrp_rt * vrrp, char *buffer, int len)
528
504
if (!VRRP_ISUP(vrrp)) {
529
505
vrrp_log_int_down(vrrp);
530
506
vrrp->wantstate = VRRP_STATE_GOTO_FAULT;
531
507
vrrp_state_leave_master(vrrp);
532
} else if (vrrp_state_master_rx(vrrp, vrrp_buffer, len)) {
508
} else if (vrrp_state_master_rx(vrrp, buffer, len)) {
533
509
vrrp_state_leave_master(vrrp);
534
510
vrrp_smtp_notifier(vrrp);
552
vrrp_leave_fault(vrrp_rt * vrrp, char *vrrp_buffer, int len)
528
vrrp_leave_fault(vrrp_rt * vrrp, char *buffer, int len)
554
530
if (!VRRP_ISUP(vrrp))
557
if (vrrp_state_fault_rx(vrrp, vrrp_buffer, len)) {
533
if (vrrp_state_fault_rx(vrrp, buffer, len)) {
558
534
if (vrrp->sync) {
559
535
if (vrrp_sync_leave_fault(vrrp)) {
561
537
"VRRP_Instance(%s) prio is higher than received advert",
563
vrrp_become_master(vrrp, vrrp_buffer, len);
539
vrrp_become_master(vrrp, buffer, len);
567
543
"VRRP_Instance(%s) prio is higher than received advert",
569
vrrp_become_master(vrrp, vrrp_buffer, len);
545
vrrp_become_master(vrrp, buffer, len);
572
548
if (vrrp->sync) {
611
587
/* Delayed gratuitous ARP thread */
613
vrrp_gratuitous_arp_thread(thread * thread)
589
vrrp_gratuitous_arp_thread(thread * thread_obj)
615
vrrp_rt *vrrp = THREAD_ARG(thread);
591
vrrp_rt *vrrp = THREAD_ARG(thread_obj);
617
593
/* Simply broadcast the gratuitous ARP */
618
594
vrrp_send_gratuitous_arp(vrrp);
671
647
vrrp_sgroup *vgroup = vrrp->sync;
674
if (vrrp_sync_leave_fault(vrrp)) {
675
if (vgroup->state == VRRP_STATE_FAULT)
676
vgroup->state = vrrp->init_state;
650
if (!vrrp_sync_leave_fault(vrrp))
679
652
} else if (VRRP_ISUP(vrrp))
680
653
vrrp_log_int_up(vrrp);
789
762
/* Our read packet dispatcher */
791
vrrp_read_dispatcher_thread(thread * thread)
764
vrrp_read_dispatcher_thread(thread * thread_obj)
793
766
long vrrp_timer = 0;
796
769
/* Dispatcher state handler */
797
if (thread->type == THREAD_READ_TIMEOUT)
798
fd = vrrp_dispatcher_read_to(thread->u.fd);
799
else if (thread->arg) {
770
if (thread_obj->type == THREAD_READ_TIMEOUT)
771
fd = vrrp_dispatcher_read_to(thread_obj->u.fd);
772
else if (thread_obj->arg) {
800
773
fd = vrrp_dispatcher_read_to(-1);
802
fd = vrrp_dispatcher_read(thread->u.fd);
775
fd = vrrp_dispatcher_read(thread_obj->u.fd);
804
777
/* register next dispatcher thread */
805
778
vrrp_timer = vrrp_timer_fd(fd);
807
thread_add_timer(thread->master, vrrp_read_dispatcher_thread,
780
thread_add_timer(thread_obj->master, vrrp_read_dispatcher_thread,
808
781
(int *)THREAD_TIMER, vrrp_timer);
810
thread_add_read(thread->master, vrrp_read_dispatcher_thread,
783
thread_add_read(thread_obj->master, vrrp_read_dispatcher_thread,
811
784
NULL, fd, vrrp_timer);