summaryrefslogtreecommitdiffstats
path: root/vrrpd
diff options
context:
space:
mode:
authorQuentin Young <qlyoung@cumulusnetworks.com>2018-12-03 23:29:02 +0100
committerQuentin Young <qlyoung@cumulusnetworks.com>2019-05-17 02:27:08 +0200
commita8144d7fc8521c1f01f73e28b68df20110ad7e81 (patch)
tree703cbf994f448b9ca0fd7b0cd97a3a7bfe63e162 /vrrpd
parentvrrpd: add .gitignore (diff)
downloadfrr-a8144d7fc8521c1f01f73e28b68df20110ad7e81.tar.xz
frr-a8144d7fc8521c1f01f73e28b68df20110ad7e81.zip
vrrpd: interface support
Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
Diffstat (limited to 'vrrpd')
-rw-r--r--vrrpd/vrrp.c25
-rw-r--r--vrrpd/vrrp.h3
-rw-r--r--vrrpd/vrrp_main.c2
-rw-r--r--vrrpd/vrrp_vty.c7
4 files changed, 27 insertions, 10 deletions
diff --git a/vrrpd/vrrp.c b/vrrpd/vrrp.c
index f0a106ba0..bf7da51fd 100644
--- a/vrrpd/vrrp.c
+++ b/vrrpd/vrrp.c
@@ -149,6 +149,7 @@ static int vrrp_socket(struct vrrp_vrouter *vr)
{
struct ip_mreqn req;
int ret;
+ struct connected *c;
vr->sock = socket(AF_INET, SOCK_RAW, IPPROTO_VRRP);
@@ -159,7 +160,10 @@ static int vrrp_socket(struct vrrp_vrouter *vr)
/* Join the multicast group.*/
/* FIXME: Use first address on the interface and for imr_interface */
- struct connected *c = listhead(vr->ifp->connected)->data;
+ if (!listcount(vr->ifp->connected))
+ return -1;
+
+ c = listhead(vr->ifp->connected)->data;
struct in_addr v4 = c->address->u.prefix4;
memset(&req, 0, sizeof(req));
@@ -277,10 +281,14 @@ static int vrrp_master_down_timer_expire(struct thread *thread)
* vr
* Virtual Router on which to apply Startup event
*/
-static void vrrp_startup(struct vrrp_vrouter *vr)
+static int vrrp_startup(struct vrrp_vrouter *vr)
{
/* Create socket */
- vrrp_socket(vr);
+ int ret = vrrp_socket(vr);
+ if (ret < 0) {
+ zlog_warn("Cannot create VRRP socket\n");
+ return ret;
+ }
/* Schedule listener */
/* ... */
@@ -301,14 +309,17 @@ static void vrrp_startup(struct vrrp_vrouter *vr)
&vr->t_master_down_timer);
vrrp_change_state(vr, VRRP_STATE_BACKUP);
}
+
+ return 0;
}
-static void vrrp_shutdown(struct vrrp_vrouter *vr)
+static int vrrp_shutdown(struct vrrp_vrouter *vr)
{
/* NOTHING */
+ return 0;
}
-static void (*vrrp_event_handlers[])(struct vrrp_vrouter *vr) = {
+static int (*vrrp_event_handlers[])(struct vrrp_vrouter *vr) = {
[VRRP_EVENT_STARTUP] = vrrp_startup,
[VRRP_EVENT_SHUTDOWN] = vrrp_shutdown,
};
@@ -322,9 +333,9 @@ static void (*vrrp_event_handlers[])(struct vrrp_vrouter *vr) = {
* event
* The event to spawn
*/
-void vrrp_event(struct vrrp_vrouter *vr, int event)
+int vrrp_event(struct vrrp_vrouter *vr, int event)
{
- vrrp_event_handlers[event](vr);
+ return vrrp_event_handlers[event](vr);
}
diff --git a/vrrpd/vrrp.h b/vrrpd/vrrp.h
index 95feeb4df..91c728401 100644
--- a/vrrpd/vrrp.h
+++ b/vrrpd/vrrp.h
@@ -135,7 +135,6 @@ struct vrrp_vrouter {
#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 */
@@ -157,6 +156,6 @@ struct vrrp_vrouter *vrrp_lookup(uint8_t vrid);
/*
* Trigger VRRP event
*/
-void vrrp_event(struct vrrp_vrouter *vr, int event);
+int vrrp_event(struct vrrp_vrouter *vr, int event);
#endif /* _VRRP_H */
diff --git a/vrrpd/vrrp_main.c b/vrrpd/vrrp_main.c
index 8c73375c9..c470ec365 100644
--- a/vrrpd/vrrp_main.c
+++ b/vrrpd/vrrp_main.c
@@ -31,6 +31,7 @@
#include "vrf.h"
#include "nexthop.h"
#include "filter.h"
+#include "if.h"
#include "vrrp.h"
#include "vrrp_zebra.h"
@@ -98,6 +99,7 @@ struct quagga_signal_t vrrp_signals[] = {
};
static const struct frr_yang_module_info *vrrp_yang_modules[] = {
+ &frr_interface_info,
};
#define VRRP_VTY_PORT 2617
diff --git a/vrrpd/vrrp_vty.c b/vrrpd/vrrp_vty.c
index f438c2489..4c5ce7f85 100644
--- a/vrrpd/vrrp_vty.c
+++ b/vrrpd/vrrp_vty.c
@@ -61,7 +61,11 @@ DEFUN(vrrp_vrid,
vrid = strtoul(argv[idx]->arg, NULL, 10);
struct vrrp_vrouter *vr = vrrp_vrouter_create(ifp, vrid);
- vrrp_event(vr, VRRP_EVENT_STARTUP);
+ int ret = vrrp_event(vr, VRRP_EVENT_STARTUP);
+ if (ret < 0) {
+ vty_out(vty, "%% Failed to start VRRP instance\n");
+ return CMD_WARNING_CONFIG_FAILED;
+ }
return CMD_SUCCESS;
}
@@ -76,5 +80,6 @@ void vrrp_vty_init(void)
install_node(&interface_node, NULL);
if_cmd_init();
install_element(VIEW_NODE, &show_debugging_vrrpd_cmd);
+ install_element(ENABLE_NODE, &show_debugging_vrrpd_cmd);
install_element(INTERFACE_NODE, &vrrp_vrid_cmd);
}