2018-11-19 21:51:52 +01:00
|
|
|
/*
|
2018-12-06 22:31:05 +01:00
|
|
|
* VRRPD global definitions and state machine
|
2018-11-19 21:51:52 +01:00
|
|
|
* Copyright (C) 2018 Cumulus Networks, Inc.
|
|
|
|
* Quentin Young
|
|
|
|
*
|
|
|
|
* 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.
|
|
|
|
*
|
|
|
|
* 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.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License along
|
|
|
|
* with this program; see the file COPYING; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
|
*/
|
2018-11-30 09:45:36 +01:00
|
|
|
#ifndef _VRRP_H
|
|
|
|
#define _VRRP_H
|
2018-11-19 21:51:52 +01:00
|
|
|
|
|
|
|
#include <zebra.h>
|
2018-12-06 22:31:05 +01:00
|
|
|
|
|
|
|
#include "lib/hash.h"
|
|
|
|
#include "lib/hook.h"
|
|
|
|
#include "lib/if.h"
|
|
|
|
#include "lib/linklist.h"
|
|
|
|
#include "lib/privs.h"
|
|
|
|
#include "lib/thread.h"
|
2018-11-19 21:51:52 +01:00
|
|
|
|
|
|
|
/* Global definitions */
|
|
|
|
#define VRRP_DEFAULT_ADVINT 100
|
|
|
|
#define VRRP_DEFAULT_PRIORITY 100
|
|
|
|
#define VRRP_PRIO_MASTER 255
|
|
|
|
#define VRRP_MCAST_GROUP "224.0.0.18"
|
|
|
|
#define VRRP_MCAST_GROUP_HEX 0xe0000012
|
|
|
|
#define IPPROTO_VRRP 112
|
|
|
|
|
2018-12-08 01:16:27 +01:00
|
|
|
#define VRRP_LOGPFX_VRID "[VRID: %u] "
|
|
|
|
|
2018-11-19 21:51:52 +01:00
|
|
|
/* threadmaster */
|
|
|
|
extern struct thread_master *master;
|
|
|
|
|
2018-12-04 21:41:37 +01:00
|
|
|
/* privileges */
|
|
|
|
extern struct zebra_privs_t vrrp_privs;
|
|
|
|
|
2018-11-19 21:51:52 +01:00
|
|
|
/* Global hash of all Virtual Routers */
|
|
|
|
struct hash *vrrp_vrouters_hash;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* VRRP Virtual Router
|
|
|
|
*/
|
|
|
|
struct vrrp_vrouter {
|
|
|
|
/* Socket */
|
|
|
|
int sock;
|
|
|
|
|
|
|
|
/* Interface */
|
|
|
|
struct interface *ifp;
|
|
|
|
|
|
|
|
/* Virtual Router Identifier */
|
|
|
|
uint32_t vrid;
|
|
|
|
|
|
|
|
/* One or more IPv4 addresses associated with this Virtual Router. */
|
|
|
|
struct list *v4;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* One ore more IPv6 addresses associated with this Virtual Router. The
|
|
|
|
* first address must be the Link-Local address associated with the
|
|
|
|
* virtual router.
|
|
|
|
*/
|
|
|
|
struct list *v6;
|
|
|
|
|
|
|
|
/* Whether this VRRP Router is currently the master */
|
|
|
|
bool is_master;
|
|
|
|
|
|
|
|
/* Priority */
|
|
|
|
uint8_t priority;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Time interval between ADVERTISEMENTS (centiseconds). Default is 100
|
|
|
|
* centiseconds (1 second).
|
|
|
|
*/
|
|
|
|
uint16_t advertisement_interval;
|
|
|
|
/*
|
|
|
|
* Advertisement interval contained in ADVERTISEMENTS received from the
|
|
|
|
* Master (centiseconds)
|
|
|
|
*/
|
|
|
|
uint16_t master_adver_interval;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Time to skew Master_Down_Interval in centiseconds. Calculated as:
|
|
|
|
* (((256 - priority) * Master_Adver_Interval) / 256)
|
|
|
|
*/
|
|
|
|
uint16_t skew_time;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Time interval for Backup to declare Master down (centiseconds).
|
|
|
|
* Calculated as:
|
|
|
|
* (3 * Master_Adver_Interval) + Skew_time
|
|
|
|
*/
|
|
|
|
uint16_t master_down_interval;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Controls whether a (starting or restarting) higher-priority Backup
|
|
|
|
* router preempts a lower-priority Master router. Values are True to
|
|
|
|
* allow preemption and False to prohibit preemption. Default is True.
|
|
|
|
*/
|
|
|
|
bool preempt_mode;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Controls whether a virtual router in Master state will accept
|
|
|
|
* packets addressed to the address owner's IPvX address as its own if
|
|
|
|
* it is not the IPvX address owner. The default is False.
|
|
|
|
*/
|
|
|
|
bool accept_mode;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* The MAC address used for the source MAC address in VRRP
|
|
|
|
* advertisements and advertised in ARP responses as the MAC address to
|
|
|
|
* use for IP_Addresses.
|
|
|
|
*/
|
|
|
|
struct ethaddr vr_mac_v4;
|
|
|
|
struct ethaddr vr_mac_v6;
|
|
|
|
|
|
|
|
struct thread *t_master_down_timer;
|
|
|
|
struct thread *t_adver_timer;
|
|
|
|
|
|
|
|
struct {
|
|
|
|
int state;
|
|
|
|
} fsm;
|
|
|
|
};
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Initialize VRRP global datastructures.
|
|
|
|
*/
|
|
|
|
void vrrp_init(void);
|
|
|
|
|
2018-12-06 22:31:05 +01:00
|
|
|
|
|
|
|
/* Creation and destruction ------------------------------------------------ */
|
|
|
|
|
2018-11-19 21:51:52 +01:00
|
|
|
/*
|
|
|
|
* Create and register a new VRRP Virtual Router.
|
2018-12-06 22:31:05 +01:00
|
|
|
*
|
|
|
|
* ifp
|
|
|
|
* Base interface to configure VRRP on
|
|
|
|
*
|
|
|
|
* vrid
|
|
|
|
* Virtual Router Identifier
|
2018-11-19 21:51:52 +01:00
|
|
|
*/
|
|
|
|
struct vrrp_vrouter *vrrp_vrouter_create(struct interface *ifp, uint8_t vrid);
|
|
|
|
|
2018-12-04 22:28:25 +01:00
|
|
|
/*
|
|
|
|
* Destroy a VRRP Virtual Router.
|
|
|
|
*/
|
|
|
|
void vrrp_vrouter_destroy(struct vrrp_vrouter *vr);
|
|
|
|
|
2018-12-06 22:31:05 +01:00
|
|
|
|
|
|
|
/* Configuration controllers ----------------------------------------------- */
|
|
|
|
|
2018-12-04 22:28:25 +01:00
|
|
|
/*
|
2018-12-06 22:31:05 +01:00
|
|
|
* Change the priority of a VRRP Virtual Router.
|
2018-12-04 22:28:25 +01:00
|
|
|
*
|
2018-12-06 22:31:05 +01:00
|
|
|
* Also recalculates timers using new priority.
|
2018-12-04 22:28:25 +01:00
|
|
|
*
|
2018-12-06 22:31:05 +01:00
|
|
|
* vr
|
|
|
|
* Virtual Router to change priority of
|
2018-12-04 22:28:25 +01:00
|
|
|
*
|
2018-12-06 22:31:05 +01:00
|
|
|
* priority
|
|
|
|
* New priority
|
2018-12-04 22:28:25 +01:00
|
|
|
*/
|
2018-12-06 22:31:05 +01:00
|
|
|
void vrrp_set_priority(struct vrrp_vrouter *vr, uint8_t priority);
|
2018-12-04 22:28:25 +01:00
|
|
|
|
|
|
|
/*
|
2018-12-06 22:31:05 +01:00
|
|
|
* Set Advertisement Interval on this Virtual Router.
|
2018-12-04 22:28:25 +01:00
|
|
|
*
|
|
|
|
* vr
|
|
|
|
* Virtual Router to change priority of
|
|
|
|
*
|
2018-12-06 22:31:05 +01:00
|
|
|
* advertisement_interval
|
|
|
|
* New advertisement interval
|
2018-12-04 22:28:25 +01:00
|
|
|
*/
|
2018-12-06 22:31:05 +01:00
|
|
|
void vrrp_set_advertisement_interval(struct vrrp_vrouter *vr,
|
|
|
|
uint16_t advertisement_interval);
|
2018-12-04 22:28:25 +01:00
|
|
|
|
|
|
|
/*
|
2018-12-06 22:31:05 +01:00
|
|
|
* Add IPv4 address to a VRRP Virtual Router.
|
2018-12-04 22:28:25 +01:00
|
|
|
*
|
|
|
|
* vr
|
|
|
|
* Virtual Router to add IPv4 address to
|
|
|
|
*
|
|
|
|
* v4
|
|
|
|
* Address to add
|
|
|
|
*/
|
|
|
|
void vrrp_add_ip(struct vrrp_vrouter *vr, struct in_addr v4);
|
|
|
|
|
2018-12-06 22:31:05 +01:00
|
|
|
|
|
|
|
/* State machine ----------------------------------------------------------- */
|
|
|
|
|
2018-12-08 01:16:27 +01:00
|
|
|
#define VRRP_STATE_INITIALIZE 0
|
|
|
|
#define VRRP_STATE_MASTER 1
|
|
|
|
#define VRRP_STATE_BACKUP 2
|
|
|
|
#define VRRP_EVENT_STARTUP 0
|
|
|
|
#define VRRP_EVENT_SHUTDOWN 1
|
|
|
|
|
|
|
|
extern const char *vrrp_state_names[3];
|
|
|
|
extern const char *vrrp_event_names[2];
|
2018-12-06 22:31:05 +01:00
|
|
|
|
2018-11-19 21:51:52 +01:00
|
|
|
/*
|
2018-12-06 22:31:05 +01:00
|
|
|
* This hook called whenever the state of a Virtual Router changes, after the
|
|
|
|
* specific internal state handlers have run.
|
|
|
|
*
|
|
|
|
* Use this if you need to react to state changes to perform non-critical
|
|
|
|
* tasks. Critical tasks should go in the internal state change handlers.
|
2018-11-19 21:51:52 +01:00
|
|
|
*/
|
2018-12-06 22:31:05 +01:00
|
|
|
DECLARE_HOOK(vrrp_change_state_hook, (struct vrrp_vrouter *vr, int to), (vr, to));
|
2018-11-19 21:51:52 +01:00
|
|
|
|
|
|
|
/*
|
2018-12-06 22:31:05 +01:00
|
|
|
* Trigger a VRRP event on a given Virtual Router..
|
|
|
|
*
|
|
|
|
* vr
|
|
|
|
* Virtual Router to operate on
|
|
|
|
*
|
|
|
|
* event
|
|
|
|
* Event to kick off. All event related processing will have completed upon
|
|
|
|
* return of this function.
|
|
|
|
*
|
|
|
|
* Returns:
|
|
|
|
* < 0 if the event created an error
|
|
|
|
* 0 otherwise
|
2018-11-19 21:51:52 +01:00
|
|
|
*/
|
2018-12-03 23:29:02 +01:00
|
|
|
int vrrp_event(struct vrrp_vrouter *vr, int event);
|
2018-11-19 21:51:52 +01:00
|
|
|
|
2018-12-06 22:31:05 +01:00
|
|
|
|
|
|
|
/* Other ------------------------------------------------------------------- */
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Find VRRP Virtual Router by Virtual Router ID
|
|
|
|
*/
|
|
|
|
struct vrrp_vrouter *vrrp_lookup(uint8_t vrid);
|
|
|
|
|
2018-11-30 09:45:36 +01:00
|
|
|
#endif /* _VRRP_H */
|