pimd: Lookup loopback based upon vrf correctly.

The vrf loopback ip address should be associated with the
vrf device for vrf's, else use the loopback.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
This commit is contained in:
Donald Sharp 2017-05-21 12:12:30 -04:00
parent 6f439a7058
commit 896b2044c7

View File

@ -903,6 +903,7 @@ struct in_addr pim_find_primary_addr(struct interface *ifp)
int v4_addrs = 0; int v4_addrs = 0;
int v6_addrs = 0; int v6_addrs = 0;
struct pim_interface *pim_ifp = ifp->info; struct pim_interface *pim_ifp = ifp->info;
struct vrf *vrf = vrf_lookup_by_id(ifp->vrf_id);
if (pim_ifp && PIM_INADDR_ISNOT_ANY(pim_ifp->update_source)) { if (pim_ifp && PIM_INADDR_ISNOT_ANY(pim_ifp->update_source)) {
return pim_ifp->update_source; return pim_ifp->update_source;
@ -940,7 +941,11 @@ struct in_addr pim_find_primary_addr(struct interface *ifp)
if (!v4_addrs && v6_addrs && !if_is_loopback(ifp)) { if (!v4_addrs && v6_addrs && !if_is_loopback(ifp)) {
struct interface *lo_ifp; struct interface *lo_ifp;
// DBS - Come back and check here // DBS - Come back and check here
lo_ifp = if_lookup_by_name("lo", pimg->vrf_id); if (ifp->vrf_id == VRF_DEFAULT)
lo_ifp = if_lookup_by_name("lo", vrf->vrf_id);
else
lo_ifp = if_lookup_by_name(vrf->name, vrf->vrf_id);
if (lo_ifp) if (lo_ifp)
return pim_find_primary_addr(lo_ifp); return pim_find_primary_addr(lo_ifp);
} }