]> git.puffer.fish Git - mirror/frr.git/commitdiff
vrrpd: send ND Router Advertisements
authorQuentin Young <qlyoung@cumulusnetworks.com>
Mon, 28 Jan 2019 20:15:00 +0000 (20:15 +0000)
committerQuentin Young <qlyoung@cumulusnetworks.com>
Fri, 17 May 2019 00:27:08 +0000 (00:27 +0000)
Send ND Router Advertisements when IPv6 VR is in Master state.

Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
vrrpd/vrrp.c
vrrpd/vrrp.h
vrrpd/vrrp_zebra.c
vrrpd/vrrp_zebra.h

index 1e7117eaffed58d0d2e5d5f01c251fb5dc36bfdb..0c0ef9709a3b54716fcdd2bc4945e469c992e438 100644 (file)
@@ -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) = {
index 417b23a0307a9667a56ba9261b34b1c621c799d0..0249b3e9af8bf487fe6e3a0e8e7f3d43ed3b39b7 100644 (file)
@@ -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"
index 26d0a5020a6f4f0b3aedd0e88fc96e32ead0eb2f..1c4b0a3828ec0fc4e99ecf8ea03adba451fb3813 100644 (file)
@@ -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 */
index 03910db40766a8bc881052c98ae2effb27d510ea..70871cd89bab1f3efea7e8edd62be4a1fb1911cf 100644 (file)
@@ -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