From: Quentin Young Date: Fri, 8 Feb 2019 19:47:55 +0000 (+0000) Subject: vrrpd: properly find iface in manual cfg mode X-Git-Tag: base_7.2~330^2~98 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=1b1f3c43cfbac93eba5edb89b5d4d840718d9e09;p=matthieu%2Ffrr.git vrrpd: properly find iface in manual cfg mode 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 --- diff --git a/vrrpd/vrrp.c b/vrrpd/vrrp.c index bf804abb3d..01044b580f 100644 --- a/vrrpd/vrrp.c +++ b/vrrpd/vrrp.c @@ -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];