]> git.puffer.fish Git - matthieu/frr.git/commitdiff
vrrpd: protodown macvlan in backup state
authorQuentin Young <qlyoung@cumulusnetworks.com>
Tue, 5 Feb 2019 22:02:40 +0000 (22:02 +0000)
committerQuentin Young <qlyoung@cumulusnetworks.com>
Fri, 17 May 2019 00:27:08 +0000 (00:27 +0000)
Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
lib/zclient.c
lib/zclient.h
vrrpd/vrrp.c
vrrpd/vrrp_zebra.c
vrrpd/vrrp_zebra.h
zebra/if_netlink.c
zebra/if_netlink.h
zebra/interface.c
zebra/interface.h
zebra/zapi_msg.c

index 96a78efad6d5abe125493d77e3337dba8c610c5e..6647a1ab189b10b29bde840dfbf1469139e22839 100644 (file)
@@ -555,6 +555,25 @@ void zclient_send_interface_radv_req(struct zclient *zclient, vrf_id_t vrf_id,
        zclient_send_message(zclient);
 }
 
+int zclient_send_interface_protodown(struct zclient *zclient, vrf_id_t vrf_id,
+                                    struct interface *ifp, bool down)
+{
+       struct stream *s;
+
+       if (zclient->sock < 0)
+               return -1;
+
+       s = zclient->obuf;
+       stream_reset(s);
+       zclient_create_header(s, ZEBRA_INTERFACE_SET_PROTODOWN, vrf_id);
+       stream_putl(s, ifp->ifindex);
+       stream_putc(s, !!down);
+       stream_putw_at(s, 0, stream_get_endp(s));
+       zclient_send_message(zclient);
+
+       return 0;
+}
+
 /* Make connection to zebra daemon. */
 int zclient_start(struct zclient *zclient)
 {
index c46d63bfab4fe470219d391d267551a10873df03..09f0acad844cbdbb04f6754a654115440b0f1a17 100644 (file)
@@ -76,6 +76,7 @@ typedef enum {
        ZEBRA_INTERFACE_UP,
        ZEBRA_INTERFACE_DOWN,
        ZEBRA_INTERFACE_SET_MASTER,
+       ZEBRA_INTERFACE_SET_PROTODOWN,
        ZEBRA_ROUTE_ADD,
        ZEBRA_ROUTE_DELETE,
        ZEBRA_ROUTE_NOTIFY_OWNER,
@@ -466,6 +467,9 @@ extern void zclient_send_interface_radv_req(struct zclient *zclient,
                                            vrf_id_t vrf_id,
                                            struct interface *ifp, int enable,
                                            int ra_interval);
+extern int zclient_send_interface_protodown(struct zclient *zclient,
+                                           vrf_id_t vrf_id,
+                                           struct interface *ifp, bool down);
 
 /* Send redistribute command to zebra daemon. Do not update zclient state. */
 extern int zebra_redistribute_send(int command, struct zclient *, afi_t,
index e5018d58530b6d37a78331897b0dab4381bf5c04..76f8dfea5d4c0a5875309005581aacdfca7a538c 100644 (file)
@@ -1028,6 +1028,8 @@ static void vrrp_change_state_master(struct vrrp_router *r)
        /* Enable ND Router Advertisements */
        if (r->family == AF_INET6)
                vrrp_zebra_radv_set(r, true);
+
+       vrrp_zclient_send_interface_protodown(r->mvl_ifp, false);
 }
 
 /*
@@ -1041,6 +1043,8 @@ static void vrrp_change_state_backup(struct vrrp_router *r)
        /* Disable ND Router Advertisements */
        if (r->family == AF_INET6)
                vrrp_zebra_radv_set(r, false);
+
+       vrrp_zclient_send_interface_protodown(r->mvl_ifp, true);
 }
 
 /*
index 1bd5aa013f979f02b78fc83e164c495bc0b30bac..c41915cbd95eca9b1bfb2d08c93f183c40b12fc1 100644 (file)
@@ -226,6 +226,12 @@ void vrrp_zebra_radv_set(struct vrrp_router *r, bool enable)
                                        enable, VRRP_RADV_INT);
 }
 
+int vrrp_zclient_send_interface_protodown(struct interface *ifp, bool down)
+{
+       return zclient_send_interface_protodown(zclient, VRF_DEFAULT, ifp,
+                                               down);
+}
+
 void vrrp_zebra_init(void)
 {
        /* Socket for receiving updates from Zebra daemon */
index 5e8ff095437b6e46ab6a6178d0b09b28d1c43dad..84bcba23c19afcc482a6ba8d49eeaeb00a489321 100644 (file)
 #ifndef __VRRP_ZEBRA_H__
 #define __VRRP_ZEBRA_H__
 
+#include <zebra.h>
+
+#include "lib/if.h"
+
 extern void vrrp_zebra_init(void);
 extern void vrrp_zebra_radv_set(struct vrrp_router *r, bool enable);
+extern int vrrp_zclient_send_interface_protodown(struct interface *ifp,
+                                                bool down);
 
 #endif /* __VRRP_ZEBRA_H__ */
index ce0834f19003d3c862207a86b363e394e043b1b9..e7d988cd9f74bbf01da1b1e528b78874444fbe06 100644 (file)
@@ -1396,6 +1396,32 @@ int netlink_link_change(struct nlmsghdr *h, ns_id_t ns_id, int startup)
        return 0;
 }
 
+int netlink_protodown(struct interface *ifp, bool down)
+{
+       struct zebra_ns *zns = zebra_ns_lookup(NS_DEFAULT);
+
+       struct {
+               struct nlmsghdr n;
+               struct ifinfomsg ifa;
+               char buf[NL_PKT_BUF_SIZE];
+       } req;
+
+       memset(&req, 0, sizeof req);
+
+       req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg));
+       req.n.nlmsg_flags = NLM_F_REQUEST;
+       req.n.nlmsg_type = RTM_SETLINK;
+       req.n.nlmsg_pid = zns->netlink_cmd.snl.nl_pid;
+
+       req.ifa.ifi_index = ifp->ifindex;
+
+       addattr_l(&req.n, sizeof req, IFLA_PROTO_DOWN, &down, 4);
+       addattr_l(&req.n, sizeof req, IFLA_LINK, &ifp->ifindex, 4);
+
+       return netlink_talk(netlink_talk_filter, &req.n, &zns->netlink_cmd, zns,
+                           0);
+}
+
 /* Interface information read by netlink. */
 void interface_list(struct zebra_ns *zns)
 {
index 710fd525587549dcc5e866ea1017a587492803e0..29fd2aca354dd045c230b15fbd836f84feba8bca 100644 (file)
@@ -32,6 +32,20 @@ extern int netlink_interface_addr(struct nlmsghdr *h, ns_id_t ns_id,
 extern int netlink_link_change(struct nlmsghdr *h, ns_id_t ns_id, int startup);
 extern int interface_lookup_netlink(struct zebra_ns *zns);
 
+/*
+ * Set protodown status of interface.
+ *
+ * ifp
+ *    Interface to set protodown on.
+ *
+ * down
+ *    If true, set protodown on. If false, set protodown off.
+ *
+ * Returns:
+ *    0
+ */
+int netlink_protodown(struct interface *ifp, bool down);
+
 #ifdef __cplusplus
 }
 #endif
index b0ddcaf8bc4b59da4aa53cf7a029f728cfe9a005..2ed8a82000573eb778bdb9b2c688865a31dbefa0 100644 (file)
@@ -47,6 +47,7 @@
 #include "zebra/irdp.h"
 #include "zebra/zebra_ptm.h"
 #include "zebra/rt_netlink.h"
+#include "zebra/if_netlink.h"
 #include "zebra/interface.h"
 #include "zebra/zebra_vxlan.h"
 #include "zebra/zebra_errors.h"
@@ -1063,7 +1064,10 @@ void zebra_if_update_all_links(void)
        }
 }
 
-
+void zebra_if_set_protodown(struct interface *ifp, bool down)
+{
+       netlink_protodown(ifp, down);
+}
 
 /* Output prefix string to vty. */
 static int prefix_vty_out(struct vty *vty, struct prefix *p)
index bbb5445cc6dfd02a6e954be0fb6944a55933f7a8..6a3914451aa71d522a000be7a9eccb9986ffbb53 100644 (file)
@@ -422,6 +422,7 @@ extern void if_handle_vrf_change(struct interface *ifp, vrf_id_t vrf_id);
 extern void zebra_if_update_link(struct interface *ifp, ifindex_t link_ifindex,
                                 ns_id_t ns_id);
 extern void zebra_if_update_all_links(void);
+extern void zebra_if_set_protodown(struct interface *ifp, bool down);
 
 extern void vrf_add_update(struct vrf *vrfp);
 
index 03b9653ce6eda1a40acc1c872f093dbcd31a3275..a497331702981c5a1706cc8bf09f08ef2ad8b9b0 100644 (file)
@@ -1336,6 +1336,30 @@ static void zread_interface_delete(ZAPI_HANDLER_ARGS)
 {
 }
 
+/*
+ * Handle message requesting interface be set up or down.
+ */
+static void zread_interface_set_protodown(ZAPI_HANDLER_ARGS)
+{
+       ifindex_t ifindex;
+       struct interface *ifp;
+       char down;
+
+       STREAM_GETL(msg, ifindex);
+       STREAM_GETC(msg, down);
+
+       /* set ifdown */
+       ifp = if_lookup_by_index_per_ns(zebra_ns_lookup(NS_DEFAULT), ifindex);
+       zlog_info("Setting interface %s (%u): protodown %s", ifp->name, ifindex,
+                 down ? "on" : "off");
+
+       zebra_if_set_protodown(ifp, down);
+
+stream_failure:
+       return;
+}
+
+
 void zserv_nexthop_num_warn(const char *caller, const struct prefix *p,
                            const unsigned int nexthop_num)
 {
@@ -2412,6 +2436,7 @@ void (*zserv_handlers[])(ZAPI_HANDLER_ARGS) = {
        [ZEBRA_ROUTER_ID_DELETE] = zread_router_id_delete,
        [ZEBRA_INTERFACE_ADD] = zread_interface_add,
        [ZEBRA_INTERFACE_DELETE] = zread_interface_delete,
+       [ZEBRA_INTERFACE_SET_PROTODOWN] = zread_interface_set_protodown,
        [ZEBRA_ROUTE_ADD] = zread_route_add,
        [ZEBRA_ROUTE_DELETE] = zread_route_del,
        [ZEBRA_REDISTRIBUTE_ADD] = zebra_redistribute_add,