summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--vrrpd/vrrp.c14
-rw-r--r--vrrpd/vrrp.h1
-rw-r--r--vrrpd/vrrp_zebra.c6
-rw-r--r--vrrpd/vrrp_zebra.h1
4 files changed, 19 insertions, 3 deletions
diff --git a/vrrpd/vrrp.c b/vrrpd/vrrp.c
index 1e7117eaff..0c0ef9709a 100644
--- a/vrrpd/vrrp.c
+++ b/vrrpd/vrrp.c
@@ -34,6 +34,7 @@
#include "vrrp_arp.h"
#include "vrrp_ndisc.h"
#include "vrrp_packet.h"
+#include "vrrp_zebra.h"
#define VRRP_LOGPFX "[CORE] "
@@ -900,7 +901,9 @@ DEFINE_HOOK(vrrp_change_state_hook, (struct vrrp_router * r, int to), (r, to));
*/
static void vrrp_change_state_master(struct vrrp_router *r)
{
- /* NOTHING */
+ /* Enable ND Router Advertisements */
+ if (r->family == AF_INET6)
+ vrrp_zebra_radv_set(r, true);
}
/*
@@ -911,8 +914,9 @@ static void vrrp_change_state_master(struct vrrp_router *r)
*/
static void vrrp_change_state_backup(struct vrrp_router *r)
{
- /* Uninstall ARP entry for router MAC */
- /* ... */
+ /* Disable ND Router Advertisements */
+ if (r->family == AF_INET6)
+ vrrp_zebra_radv_set(r, false);
}
/*
@@ -929,6 +933,10 @@ static void vrrp_change_state_initialize(struct vrrp_router *r)
r->vr->advertisement_interval = r->vr->advertisement_interval;
r->master_adver_interval = 0;
vrrp_recalculate_timers(r);
+
+ /* Disable ND Router Advertisements */
+ if (r->family == AF_INET6)
+ vrrp_zebra_radv_set(r, false);
}
void (*vrrp_change_state_handlers[])(struct vrrp_router *vr) = {
diff --git a/vrrpd/vrrp.h b/vrrpd/vrrp.h
index 417b23a030..0249b3e9af 100644
--- a/vrrpd/vrrp.h
+++ b/vrrpd/vrrp.h
@@ -34,6 +34,7 @@
/* Global definitions */
#define VRRP_DEFAULT_ADVINT 100
#define VRRP_DEFAULT_PRIORITY 100
+#define VRRP_RADV_INT 16
#define VRRP_PRIO_MASTER 255
#define VRRP_MCASTV4_GROUP_STR "224.0.0.18"
#define VRRP_MCASTV6_GROUP_STR "ff02:0:0:0:0:0:0:12"
diff --git a/vrrpd/vrrp_zebra.c b/vrrpd/vrrp_zebra.c
index 26d0a5020a..1c4b0a3828 100644
--- a/vrrpd/vrrp_zebra.c
+++ b/vrrpd/vrrp_zebra.c
@@ -220,6 +220,12 @@ static int vrrp_zebra_if_address_del(int command, struct zclient *client,
return 0;
}
+void vrrp_zebra_radv_set(struct vrrp_router *r, bool enable)
+{
+ zclient_send_interface_radv_req(zclient, VRF_DEFAULT, r->mvl_ifp,
+ enable, VRRP_RADV_INT);
+}
+
void vrrp_zebra_init(void)
{
/* Socket for receiving updates from Zebra daemon */
diff --git a/vrrpd/vrrp_zebra.h b/vrrpd/vrrp_zebra.h
index 03910db407..70871cd89b 100644
--- a/vrrpd/vrrp_zebra.h
+++ b/vrrpd/vrrp_zebra.h
@@ -21,4 +21,5 @@
#define __VRRP_ZEBRA_H__
extern void vrrp_zebra_init(void);
+extern void vrrp_zebra_radv_set(struct vrrp_router *r, bool enable);
#endif