From f3fe00478044cc6a3b6f980500f8c70f5ec128b8 Mon Sep 17 00:00:00 2001 From: Quentin Young Date: Mon, 28 Jan 2019 20:15:00 +0000 Subject: [PATCH] vrrpd: send ND Router Advertisements Send ND Router Advertisements when IPv6 VR is in Master state. Signed-off-by: Quentin Young --- vrrpd/vrrp.c | 14 +++++++++++--- vrrpd/vrrp.h | 1 + vrrpd/vrrp_zebra.c | 6 ++++++ vrrpd/vrrp_zebra.h | 1 + 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/vrrpd/vrrp.c b/vrrpd/vrrp.c index 1e7117eaffed..0c0ef9709a3b 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 417b23a0307a..0249b3e9af8b 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 26d0a5020a6f..1c4b0a3828ec 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 03910db40766..70871cd89bab 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