]> git.puffer.fish Git - matthieu/frr.git/commitdiff
pimd: modifications in PIM joins
authorSai Gomathi <nsaigomathi@vmware.com>
Tue, 26 Oct 2021 12:55:23 +0000 (05:55 -0700)
committerSai Gomathi <nsaigomathi@vmware.com>
Tue, 26 Oct 2021 14:35:55 +0000 (07:35 -0700)
Problem :
=======
(*,G) created on transit node where same groups are defined as SSM
At present FRR has SSM checks for IGMP report, but SSM check is missing for PIM join.

Fix :
===
When an interface receives the PIM (*,G)join with G as SSM group, then PIMd supposed to discard that join.
There is no need to maintain PIM state for this group.

Signed-off-by: Sai Gomathi <nsaigomathi@vmware.com>
pimd/pim_join.c
pimd/pim_register.c

index c7a80ca8e05f7a7868eb5c083a0b6586d5be3259..652b27476df70099771252ff41d6b9c19bb7c6ac 100644 (file)
@@ -39,6 +39,7 @@
 #include "pim_rp.h"
 #include "pim_jp_agg.h"
 #include "pim_util.h"
+#include "pim_ssm.h"
 
 static void on_trace(const char *label, struct interface *ifp,
                     struct in_addr src)
@@ -55,6 +56,7 @@ static void recv_join(struct interface *ifp, struct pim_neighbor *neigh,
                      struct prefix_sg *sg, uint8_t source_flags)
 {
        struct pim_interface *pim_ifp = NULL;
+       char buf[PREFIX_STRLEN];
 
        if (PIM_DEBUG_PIM_TRACE) {
                char up_str[INET_ADDRSTRLEN];
@@ -105,6 +107,14 @@ static void recv_join(struct interface *ifp, struct pim_neighbor *neigh,
                        return;
                }
 
+               if (pim_is_grp_ssm(pim_ifp->pim, sg->grp)) {
+                       zlog_warn(
+                               "%s: Specified Group(%s) in join is now in SSM, not allowed to create PIM state",
+                               __func__,
+                               inet_ntop(AF_INET, &sg->grp, buf, sizeof(buf)));
+                       return;
+               }
+
                sg->src.s_addr = INADDR_ANY;
        }
 
index 9d5b864ab0e1415c003b0cac48f08acb9cc97cf2..fc464753e0b09b4be88d49f20a4bce26af353369 100644 (file)
@@ -323,6 +323,7 @@ int pim_register_recv(struct interface *ifp, struct in_addr dest_addr,
        int i_am_rp = 0;
        struct pim_interface *pim_ifp = ifp->info;
        struct pim_instance *pim = pim_ifp->pim;
+       char buf[PREFIX_STRLEN];
 
 #define PIM_MSG_REGISTER_BIT_RESERVED_LEN 4
        ip_hdr = (struct ip *)(tlv_buf + PIM_MSG_REGISTER_BIT_RESERVED_LEN);
@@ -381,6 +382,17 @@ int pim_register_recv(struct interface *ifp, struct in_addr dest_addr,
                           pim_str_sg_dump(&sg), src_str, ifp->name, i_am_rp);
        }
 
+       if (pim_is_grp_ssm(pim_ifp->pim, sg.grp)) {
+               if (sg.src.s_addr == INADDR_ANY) {
+                       zlog_warn(
+                               "%s: Received Register message for Group(%s) is now in SSM, dropping the packet",
+                               __func__,
+                               inet_ntop(AF_INET, &sg.grp, buf, sizeof(buf)));
+                       /* Drop Packet Silently */
+                       return 0;
+               }
+       }
+
        if (i_am_rp
            && (dest_addr.s_addr
                == ((RP(pim, sg.grp))->rpf_addr.u.prefix4.s_addr))) {