]> git.puffer.fish Git - mirror/frr.git/commitdiff
pimd: Allow pim to work in vrf's without explicitly configuring the vrf device
authorDonald Sharp <sharpd@cumulusnetworks.com>
Wed, 14 Jun 2017 17:11:35 +0000 (13:11 -0400)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Mon, 24 Jul 2017 17:51:39 +0000 (13:51 -0400)
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 <sharpd@cumulusnetworks.com>
pimd/pim_iface.c
pimd/pim_iface.h
pimd/pim_zebra.c

index 19747ebcb3969d05e1dfb0505b90b5d48c860749..8628da2c8de2c0afeb990b5f8d7120d488d22216 100644 (file)
@@ -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;
+}
index 7eff2990235e3f07d2735d6e32cd7da56268d6f9..963d41fc3e001935e7e3cf0ebd313cdfe9953f29 100644 (file)
@@ -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 */
index 8c0715101b75da17b9a5084e8942ca4bb16f3da9..7fc7e425342341239b7caccec4da024159125ba9 100644 (file)
@@ -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;
 }