summaryrefslogtreecommitdiff
path: root/vrrpd/vrrp.h
diff options
context:
space:
mode:
authorQuentin Young <qlyoung@cumulusnetworks.com>2018-11-19 20:51:52 +0000
committerQuentin Young <qlyoung@cumulusnetworks.com>2019-05-17 00:27:08 +0000
commit5435a2bf61c4179e8b69af5d3a808b42f5387177 (patch)
treef4f0f9f8b0d7304d84360928f31f640740c8fcde /vrrpd/vrrp.h
parentdb95656d48ecc46555fc9e8524849aa73a357dcb (diff)
vrrpd: initial commit
Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
Diffstat (limited to 'vrrpd/vrrp.h')
-rw-r--r--vrrpd/vrrp.h162
1 files changed, 162 insertions, 0 deletions
diff --git a/vrrpd/vrrp.h b/vrrpd/vrrp.h
new file mode 100644
index 0000000000..308e3a8e10
--- /dev/null
+++ b/vrrpd/vrrp.h
@@ -0,0 +1,162 @@
+/*
+ * VRRPD global definitions
+ * 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
+ */
+#ifndef __VRRP_H__
+#define __VRRP_H_
+
+#include <zebra.h>
+#include "linklist.h"
+#include "hash.h"
+#include "if.h"
+#include "thread.h"
+#include "hook.h"
+
+/* 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
+
+/* threadmaster */
+extern struct thread_master *master;
+
+/* 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;
+
+ /* Time between ADVERTISEMENTS (centiseconds) */
+ int advint;
+
+ /* 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;
+};
+
+/* State machine */
+#define VRRP_STATE_INITIALIZE 1
+#define VRRP_STATE_MASTER 2
+#define VRRP_STATE_BACKUP 3
+#define VRRP_EVENT_STARTUP 1
+#define VRRP_EVENT_SHUTDOWN 2
+
+DECLARE_HOOK(vrrp_change_state_hook, (struct vrrp_vrouter *vr, int to), (vr, to));
+void vrrp_event(struct vrrp_vrouter *vr, int event);
+/* End state machine */
+
+
+/*
+ * Initialize VRRP global datastructures.
+ */
+void vrrp_init(void);
+
+/*
+ * Create and register a new VRRP Virtual Router.
+ */
+struct vrrp_vrouter *vrrp_vrouter_create(struct interface *ifp, uint8_t vrid);
+
+/*
+ * Find VRRP Virtual Router by Virtual Router ID
+ */
+struct vrrp_vrouter *vrrp_lookup(uint8_t vrid);
+
+/*
+ * Trigger VRRP event
+ */
+void vrrp_event(struct vrrp_vrouter *vr, int event);
+
+#endif