]> git.puffer.fish Git - mirror/frr.git/commitdiff
pimd: Convert boundary_oil_plist to struct prefix_list 17461/head
authorCorey Siltala <csiltala@atcorp.com>
Tue, 26 Nov 2024 14:35:42 +0000 (08:35 -0600)
committerCorey Siltala <csiltala@atcorp.com>
Fri, 6 Dec 2024 20:44:52 +0000 (14:44 -0600)
Rather than storing the prefix-list name and looking it up every time we use it, store a pointer to the prefix-list itself.

Signed-off-by: Corey Siltala <csiltala@atcorp.com>
pimd/pim_iface.c
pimd/pim_iface.h
pimd/pim_igmpv3.c
pimd/pim_nb_config.c
pimd/pim_util.c
pimd/pim_vty.c

index f92a42dd8a547fca47803d24b749122aada2b328..bd7164c9b9727a152105bc895649835f7d56c271 100644 (file)
@@ -216,7 +216,6 @@ void pim_if_delete(struct interface *ifp)
        if (pim_ifp->bfd_config.profile)
                XFREE(MTYPE_TMP, pim_ifp->bfd_config.profile);
 
-       XFREE(MTYPE_PIM_INTERFACE, pim_ifp->boundary_oil_plist);
        XFREE(MTYPE_PIM_INTERFACE, pim_ifp);
 
        ifp->info = NULL;
index 18e88ffbd5dce9544062632693bac15dd2c8aa2b..90a81a21d0263567e3caf6f16efff5c4acfb11fb 100644 (file)
@@ -134,7 +134,7 @@ struct pim_interface {
        int pim_dr_num_nondrpri_neighbors; /* neighbors without dr_pri */
 
        /* boundary prefix-list (group) */
-       char *boundary_oil_plist;
+       struct prefix_list *boundary_oil_plist;
        /* boundary access-list (source and group) */
        struct access_list *boundary_acl;
 
index d0ba79378b3195ec77d8f163b4fa9aac29c43b6d..7348d8130f2c9e933253de8c160b686f0e3a84fa 100644 (file)
@@ -9,6 +9,8 @@
 #include "memory.h"
 #include "if.h"
 #include "lib_errors.h"
+#include "plist.h"
+#include "plist_int.h"
 
 #include "pimd.h"
 #include "pim_instance.h"
@@ -1815,9 +1817,10 @@ static bool igmp_pkt_grp_addr_ok(struct interface *ifp, const char *from_str,
                if (PIM_DEBUG_GM_PACKETS) {
                        zlog_debug("Filtering IGMPv3 group record %pI4 from %s on %s per prefix-list %s or access-list %s",
                                   &grp.s_addr, from_str, ifp->name,
-                                  (pim_ifp->boundary_oil_plist ? pim_ifp->boundary_oil_plist
+                                  (pim_ifp->boundary_oil_plist ? pim_ifp->boundary_oil_plist->name
                                                                : "(not found)"),
-                                  (pim_ifp->boundary_acl ? pim_ifp->boundary_acl->name : "(not found)"));
+                                  (pim_ifp->boundary_acl ? pim_ifp->boundary_acl->name
+                                                         : "(not found)"));
                }
                return false;
        }
index 2533f8c4d49102c388cbf220424af90dffb85763..41457ffba2d231b76c3071a208be6ffc1c0e2788 100644 (file)
@@ -2390,7 +2390,6 @@ int lib_interface_pim_address_family_multicast_boundary_oil_modify(
 {
        struct interface *ifp;
        struct pim_interface *pim_ifp;
-       const char *plist;
        const struct lyd_node *if_dnode;
 
        switch (args->event) {
@@ -2398,7 +2397,12 @@ int lib_interface_pim_address_family_multicast_boundary_oil_modify(
                if_dnode = yang_dnode_get_parent(args->dnode, "interface");
                if (!is_pim_interface(if_dnode)) {
                        snprintf(args->errmsg, args->errmsg_len,
-                                       "Pim not enabled on this interface");
+                                "%% Enable PIM and/or IGMP on this interface first");
+                       return NB_ERR_VALIDATION;
+               }
+               if (!prefix_list_lookup(AFI_IP, yang_dnode_get_string(args->dnode, NULL))) {
+                       snprintf(args->errmsg, args->errmsg_len,
+                                "%% Specified prefix-list not found");
                        return NB_ERR_VALIDATION;
                }
                break;
@@ -2408,13 +2412,8 @@ int lib_interface_pim_address_family_multicast_boundary_oil_modify(
        case NB_EV_APPLY:
                ifp = nb_running_get_entry(args->dnode, NULL, true);
                pim_ifp = ifp->info;
-               plist = yang_dnode_get_string(args->dnode, NULL);
-
-               if (pim_ifp->boundary_oil_plist)
-                       XFREE(MTYPE_PIM_INTERFACE, pim_ifp->boundary_oil_plist);
-
                pim_ifp->boundary_oil_plist =
-                       XSTRDUP(MTYPE_PIM_INTERFACE, plist);
+                       prefix_list_lookup(AFI_IP, yang_dnode_get_string(args->dnode, NULL));
 
                break;
        }
@@ -2444,8 +2443,7 @@ int lib_interface_pim_address_family_multicast_boundary_oil_destroy(
        case NB_EV_APPLY:
                ifp = nb_running_get_entry(args->dnode, NULL, true);
                pim_ifp = ifp->info;
-               if (pim_ifp->boundary_oil_plist)
-                       XFREE(MTYPE_PIM_INTERFACE, pim_ifp->boundary_oil_plist);
+               pim_ifp->boundary_oil_plist = NULL;
                break;
        }
 
index b6f3be52fc74d78bd00fcf5dcf3e2a1021b66e51..40404714e7fbdaea85abfe7317f4022fb6e0aff5 100644 (file)
@@ -9,6 +9,7 @@
 #include "log.h"
 #include "prefix.h"
 #include "plist.h"
+#include "plist_int.h"
 
 #include "pimd.h"
 #include "pim_instance.h"
@@ -174,7 +175,6 @@ bool pim_is_group_filtered(struct pim_interface *pim_ifp, pim_addr *grp, pim_add
        bool is_filtered = false;
 #if PIM_IPV == 4
        struct prefix grp_pfx = {};
-       struct prefix_list *pl = NULL;
        pim_addr any_src = PIMADDR_ANY;
 
        if (!pim_ifp->boundary_oil_plist && !pim_ifp->boundary_acl)
@@ -182,14 +182,13 @@ bool pim_is_group_filtered(struct pim_interface *pim_ifp, pim_addr *grp, pim_add
 
        pim_addr_to_prefix(&grp_pfx, *grp);
 
-       pl = prefix_list_lookup(PIM_AFI, pim_ifp->boundary_oil_plist);
-
        /* Filter if either group or (S,G) are denied */
-       if (pl) {
-               is_filtered = prefix_list_apply_ext(pl, NULL, &grp_pfx, true) == PREFIX_DENY;
+       if (pim_ifp->boundary_oil_plist) {
+               is_filtered = prefix_list_apply_ext(pim_ifp->boundary_oil_plist, NULL, &grp_pfx,
+                                                   true) == PREFIX_DENY;
                if (is_filtered && PIM_DEBUG_EVENTS) {
                        zlog_debug("Filtering group %pI4 per prefix-list %s", grp,
-                                  pim_ifp->boundary_oil_plist);
+                                  pim_ifp->boundary_oil_plist->name);
                }
        }
        if (!is_filtered && pim_ifp->boundary_acl) {
index ec87093325f0bae7d6e249512addfd90748d6c1c..4c3762b2edfa363dbc7a947e9059385385609ad9 100644 (file)
@@ -12,6 +12,7 @@
 #include "vty.h"
 #include "vrf.h"
 #include "plist.h"
+#include "plist_int.h"
 #include "filter.h"
 
 #include "pimd.h"
@@ -493,7 +494,7 @@ int pim_config_write(struct vty *vty, int writes, struct interface *ifp,
        /* boundary */
        if (pim_ifp->boundary_oil_plist) {
                vty_out(vty, " " PIM_AF_NAME " multicast boundary oil %s\n",
-                       pim_ifp->boundary_oil_plist);
+                       pim_ifp->boundary_oil_plist->name);
                ++writes;
        }