]> git.proxmox.com Git - mirror_frr.git/blobdiff - pimd/pim_join.c
lib: enforce vrf_name_to_id by returning default_vrf when name is null
[mirror_frr.git] / pimd / pim_join.c
index 4f5e534010481500018d4f3bace81dca3a448580..ae5032be73f7d41088a7e19f54babc2f8351d8ef 100644 (file)
@@ -38,6 +38,7 @@
 #include "pim_rpf.h"
 #include "pim_rp.h"
 #include "pim_jp_agg.h"
+#include "pim_util.h"
 
 static void on_trace(const char *label, struct interface *ifp,
                     struct in_addr src)
@@ -153,6 +154,7 @@ int pim_joinprune_recv(struct interface *ifp, struct pim_neighbor *neigh,
                       int tlv_buf_size)
 {
        struct prefix msg_upstream_addr;
+       struct pim_interface *pim_ifp;
        uint8_t msg_num_groups;
        uint16_t msg_holdtime;
        int addr_offset;
@@ -163,6 +165,7 @@ int pim_joinprune_recv(struct interface *ifp, struct pim_neighbor *neigh,
 
        buf = tlv_buf;
        pastend = tlv_buf + tlv_buf_size;
+       pim_ifp = ifp->info;
 
        /*
          Parse ucast addr
@@ -231,6 +234,7 @@ int pim_joinprune_recv(struct interface *ifp, struct pim_neighbor *neigh,
                uint16_t msg_num_pruned_sources;
                int source;
                struct pim_ifchannel *starg_ch = NULL, *sg_ch = NULL;
+               bool filtered = false;
 
                memset(&sg, 0, sizeof(struct prefix_sg));
                addr_offset = pim_parse_addr_group(&sg, buf, pastend - buf);
@@ -273,6 +277,9 @@ int pim_joinprune_recv(struct interface *ifp, struct pim_neighbor *neigh,
                                src_str, ifp->name);
                }
 
+               /* boundary check */
+               filtered = pim_is_group_filtered(pim_ifp, &sg.grp);
+
                /* Scan joined sources */
                for (source = 0; source < msg_num_joined_sources; ++source) {
                        addr_offset = pim_parse_addr_source(
@@ -283,6 +290,10 @@ int pim_joinprune_recv(struct interface *ifp, struct pim_neighbor *neigh,
 
                        buf += addr_offset;
 
+                       /* if we are filtering this group, skip the join */
+                       if (filtered)
+                               continue;
+
                        recv_join(ifp, neigh, msg_holdtime,
                                  msg_upstream_addr.u.prefix4, &sg,
                                  msg_source_flags);
@@ -304,6 +315,11 @@ int pim_joinprune_recv(struct interface *ifp, struct pim_neighbor *neigh,
                        }
 
                        buf += addr_offset;
+
+                       /* if we are filtering this group, skip the prune */
+                       if (filtered)
+                               continue;
+
                        recv_prune(ifp, neigh, msg_holdtime,
                                   msg_upstream_addr.u.prefix4, &sg,
                                   msg_source_flags);
@@ -335,7 +351,7 @@ int pim_joinprune_recv(struct interface *ifp, struct pim_neighbor *neigh,
                                }
                        }
                }
-               if (starg_ch)
+               if (starg_ch && !filtered)
                        pim_ifchannel_set_star_g_join_state(starg_ch, 1, 0);
                starg_ch = NULL;
        } /* scan groups */