]> git.puffer.fish Git - matthieu/frr.git/commitdiff
vrrpd: properly find iface in manual cfg mode
authorQuentin Young <qlyoung@cumulusnetworks.com>
Fri, 8 Feb 2019 19:47:55 +0000 (19:47 +0000)
committerQuentin Young <qlyoung@cumulusnetworks.com>
Fri, 17 May 2019 00:27:08 +0000 (00:27 +0000)
As a crutch, interface search when manually configuring VRRP on an
interface did a prefix match on the name of macvlan interfaces,
comparing its name to the name of the interface VRRP was configured on
in order to determine if the interface under question was a subinterface
of the configured interface. This is obviously fragile and prone to
failure. We now pass up parent interface info from Zebra so use that
instead to correctly deduce parent-child relationships.

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

index bf804abb3d0d1f7339d2bde0ed0f92663c9114a4..01044b580f2e09668498311593ea07e2ac09f017 100644 (file)
@@ -281,9 +281,8 @@ static bool vrrp_attach_interface(struct vrrp_router *r)
                r->vmac.octet, sizeof(r->vmac.octet), &ifps, VRF_DEFAULT);
 
        /*
-        * Filter to only those interfaces whose names begin with VRRP
-        * interface name. E.g. if this VRRP instance was configured on eth0,
-        * then we filter the list to only keep interfaces matching ^eth0.*
+        * Filter to only those macvlan interfaces whose parent is the base
+        * interface this VRRP router is configured on.
         *
         * If there are still multiple interfaces we just select the first one,
         * as it should be functionally identical to the others.
@@ -291,8 +290,8 @@ static bool vrrp_attach_interface(struct vrrp_router *r)
        unsigned int candidates = 0;
        struct interface *selection = NULL;
        for (unsigned int i = 0; i < ifps_cnt; i++) {
-               if (strncmp(ifps[i]->name, r->vr->ifp->name,
-                           strlen(r->vr->ifp->name)))
+               if (ifps[i]->link_ifindex != r->vr->ifp->ifindex
+                   || !CHECK_FLAG(ifps[i]->flags, IFF_UP))
                        ifps[i] = NULL;
                else {
                        selection = selection ? selection : ifps[i];