From: Donald Sharp Date: Wed, 14 Jun 2017 17:11:35 +0000 (-0400) Subject: pimd: Allow pim to work in vrf's without explicitly configuring the vrf device X-Git-Tag: frr-4.0-dev~468^2~50 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=90133de64ca73c7dfcd2ed499be5544421c0ca96;p=mirror%2Ffrr.git pimd: Allow pim to work in vrf's without explicitly configuring the vrf device Under vrf's pim needs to have a socket listening for pim packets on the vrf device so that we can actually get the packets. As such when we configure up a vrf interface, configure just enough to allow it to listen on the device and to do the right thing. Signed-off-by: Donald Sharp --- diff --git a/pimd/pim_iface.c b/pimd/pim_iface.c index 19747ebcb3..8628da2c8d 100644 --- a/pimd/pim_iface.c +++ b/pimd/pim_iface.c @@ -1593,3 +1593,16 @@ int pim_if_is_loopback(struct pim_instance *pim, struct interface *ifp) return 0; } + +int pim_if_is_vrf_device(struct interface *ifp) +{ + struct vrf *vrf; + + RB_FOREACH(vrf, vrf_name_head, &vrfs_by_name) + { + if (strncmp(ifp->name, vrf->name, strlen(ifp->name)) == 0) + return 1; + } + + return 0; +} diff --git a/pimd/pim_iface.h b/pimd/pim_iface.h index 7eff299023..963d41fc3e 100644 --- a/pimd/pim_iface.h +++ b/pimd/pim_iface.h @@ -206,4 +206,6 @@ int pim_if_connected_to_source(struct interface *ifp, struct in_addr src); int pim_update_source_set(struct interface *ifp, struct in_addr source); int pim_if_is_loopback(struct pim_instance *pim, struct interface *ifp); + +int pim_if_is_vrf_device(struct interface *ifp); #endif /* PIM_IFACE_H */ diff --git a/pimd/pim_zebra.c b/pimd/pim_zebra.c index 8c0715101b..7fc7e42534 100644 --- a/pimd/pim_zebra.c +++ b/pimd/pim_zebra.c @@ -89,6 +89,23 @@ static int pim_zebra_if_add(int command, struct zclient *zclient, if (if_is_operative(ifp)) pim_if_addr_add_all(ifp); + /* + * If we are a vrf device that is up, open up the pim_socket for + * listening + * to incoming pim messages irrelevant if the user has configured us + * for pim or not. + */ + if (pim_if_is_vrf_device(ifp)) { + struct pim_interface *pim_ifp; + + if (!ifp->info) { + pim_ifp = pim_if_new(ifp, 0, 0); + ifp->info = pim_ifp; + } + + pim_sock_add(ifp); + } + return 0; }