Blob Blame History Raw
/*
 * Soft:        Keepalived is a failover program for the LVS project
 *              <www.linuxvirtualserver.org>. It monitor & manipulate
 *              a loadbalanced server pool using multi-layer checks.
 *
 * Part:        vrrp_track.c include file.
 *
 * Author:      Alexandre Cassen, <acassen@linux-vs.org>
 *
 *              This program is distributed in the hope that it will be useful,
 *              but WITHOUT ANY WARRANTY; without even the implied warranty of
 *              MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 *              See the GNU General Public License for more details.
 *
 *              This program is free software; you can redistribute it and/or
 *              modify it under the terms of the GNU General Public License
 *              as published by the Free Software Foundation; either version
 *              2 of the License, or (at your option) any later version.
 *
 * Copyright (C) 2001-2017 Alexandre Cassen, <acassen@gmail.com>
 */

#ifndef _VRRP_TRACK_H
#define _VRRP_TRACK_H

/* global includes */
#include <stdbool.h>
#include <stdio.h>
#include <sys/types.h>

/* local includes */
#include "vector.h"
#include "list.h"
#include "vrrp_if.h"
#include "vrrp.h"
#include "notify.h"
#ifdef _WITH_BFD_
#include "bfd.h"
#endif

/* VRRP script tracking defaults */
#define VRRP_SCRIPT_DI 1	/* external script track interval (in sec) */
#define VRRP_SCRIPT_DT 0	/* external script track timeout (in sec) */
#define VRRP_SCRIPT_DW 0	/* external script default weight */

/* VRRP script tracking results.
 * The result is an integer between 0 and rise-1 to indicate a DOWN state,
 * or between rise-1 and rise+fall-1 to indicate an UP state. Upon failure,
 * we decrease result and set it to zero when we pass below rise. Upon
 * success, we increase result and set it to rise+fall-1 when we pass above
 * rise-1.
 */

/* If a VRRP instance doesn't track it's own interface, we still
 * want the interface to have a reference to the VRRP instance,
 * but it needs to know the instance isn't tracking it. */
#define	VRRP_NOT_TRACK_IF	255

/* external script we call to track local processes */
typedef struct _vrrp_script {
	char			*sname;		/* instance name */
	notify_script_t		script;		/* The script details */
	unsigned long		interval;	/* interval between script calls */
	unsigned long		timeout;	/* microseconds before script timeout */
	int			weight;		/* weight associated to this script */
	int			result;		/* result of last call to this script: 0..R-1 = KO, R..R+F-1 = OK */
	int			rise;		/* R: how many successes before OK */
	int			fall;		/* F: how many failures before KO */
	list			tracking_vrrp;	/* List of tracking_vrrp_t for vrrp instances tracking this script */
	int			last_status;	/* Last status returned by script. Used to report changes */
	script_state_t		state;		/* current state of script */
	script_init_state_t	init_state;	/* current initialisation state of script */
	bool			insecure;	/* Set if script is run by root, but is non-root modifiable */
} vrrp_script_t;

/* Tracked script structure definition */
typedef struct _tracked_sc {
	vrrp_script_t		*scr;		/* script pointer, cannot be NULL */
	int			weight;		/* tracking weight when non-zero */
} tracked_sc_t;

/* external file we read to track local processes */
typedef struct _vrrp_file {
	char			*fname;		/* File name */
	char			*file_path;	/* Path to file */
	char			*file_part;	/* Pointer to start of filename without directories */
	int			weight;		/* Default weight */
	int			wd;		/* Watch descriptor */
	list			tracking_vrrp;	/* List of tracking_vrrp_t for vrrp instances tracking this file */
	int			last_status;	/* Last status returned by file. Used to report changes */
} vrrp_tracked_file_t;

/* Tracked file structure definition */
typedef struct _tracked_file {
	vrrp_tracked_file_t	*file;		/* track file pointer, cannot be NULL */
	int			weight;		/* Multiplier for file value */
} tracked_file_t;

#ifdef _WITH_BFD_
/* external bfd we read to track forwarding to remote systems */
typedef struct _vrrp_bfd {
	char			bname[BFD_INAME_MAX];	/* bfd name */
	int			weight;		/* Default weight */
	list			tracking_vrrp;	/* List of tracking_vrrp_t for vrrp instances tracking this bfd */
	bool			bfd_up;		/* Last status returned by bfd. Used to report changes */
} vrrp_tracked_bfd_t;

/* Tracked bfd structure definition */
typedef struct _tracked_bfd {
	vrrp_tracked_bfd_t	*bfd;		/* track bfd pointer, cannot be NULL */
	int			weight;		/* Weight for bfd */
} tracked_bfd_t;
#endif

/* Forward references */
struct _vrrp_t;
struct _vrrp_sgroup;

typedef enum {
	TRACK_VRRP = 0x01,
	TRACK_IF = 0x02,
	TRACK_SG = 0x04,
	TRACK_ADDR = 0x08,
	TRACK_ROUTE = 0x10,
	TRACK_RULE = 0x20,
	TRACK_SADDR = 0x40,
	TRACK_SROUTE = 0x80,
	TRACK_SRULE = 0x100,
	TRACK_VRRP_DYNAMIC = 0x200,
} track_t;

/* List structure from scripts, files and interfaces to tracking vrrp */
typedef struct _tracking_vrrp {
	int			weight;		/* Tracking weight, or zero for down instance */
	struct _vrrp_t		*vrrp;		/* The vrrp instance */
	track_t			type;		/* Type of object being tracked */
} tracking_vrrp_t;

/* prototypes */
extern void dump_track_if(FILE *, void *);
extern void free_track_if(void *);
extern void alloc_track_if(struct _vrrp_t *, vector_t *);
extern void alloc_group_track_if(struct _vrrp_sgroup *, vector_t *);
extern void dump_track_script(FILE *, void *);
extern void free_track_script(void *);
extern void alloc_track_script(struct _vrrp_t *, vector_t *);
extern void alloc_group_track_script(struct _vrrp_sgroup *, vector_t *);
extern void dump_track_file(FILE *, void *);
extern void free_track_file(void *);
extern void alloc_track_file(struct _vrrp_t *, vector_t *);
extern void alloc_group_track_file(struct _vrrp_sgroup *, vector_t *);
#ifdef _WITH_BFD_
extern vrrp_tracked_bfd_t *find_vrrp_tracked_bfd_by_name(const char *);
extern void dump_vrrp_tracked_bfd(FILE *, void *);
extern void free_vrrp_tracked_bfd(void *);
extern void alloc_track_bfd(struct _vrrp_t *, vector_t *);
extern void alloc_group_track_bfd(struct _vrrp_sgroup *, vector_t *);
#endif
extern vrrp_script_t *find_script_by_name(char *);
extern void update_script_priorities(vrrp_script_t *, bool);
extern void down_instance(struct _vrrp_t *);
extern void vrrp_set_effective_priority(struct _vrrp_t *);
extern void initialise_tracking_priorities(void);
extern void init_track_files(list);
extern void stop_track_files(void);
#ifdef THREAD_DUMP
extern void register_vrrp_inotify_addresses(void);
#endif

#endif