diff options
Diffstat (limited to 'pimd/pim_igmpv2.c')
| -rw-r--r-- | pimd/pim_igmpv2.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/pimd/pim_igmpv2.c b/pimd/pim_igmpv2.c index a7c7c99ebf..81a895ee7c 100644 --- a/pimd/pim_igmpv2.c +++ b/pimd/pim_igmpv2.c @@ -24,6 +24,7 @@ #include "pim_igmp.h" #include "pim_igmpv2.h" #include "pim_igmpv3.h" +#include "pim_ssm.h" #include "pim_str.h" #include "pim_time.h" #include "pim_util.h" @@ -107,10 +108,13 @@ int igmp_v2_recv_report(struct gm_sock *igmp, struct in_addr from, { struct interface *ifp = igmp->interface; struct in_addr group_addr; + struct pim_interface *pim_ifp; char group_str[INET_ADDRSTRLEN]; on_trace(__func__, igmp->interface, from); + pim_ifp = ifp->info; + if (igmp->mtrace_only) return 0; @@ -142,6 +146,23 @@ int igmp_v2_recv_report(struct gm_sock *igmp, struct in_addr from, } /* + * RFC 4604 + * section 2.2.1 + * EXCLUDE mode does not apply to SSM addresses, and an SSM-aware router + * will ignore MODE_IS_EXCLUDE and CHANGE_TO_EXCLUDE_MODE requests in + * the SSM range. + */ + if (pim_is_grp_ssm(pim_ifp->pim, group_addr)) { + if (PIM_DEBUG_IGMP_PACKETS) { + zlog_debug( + "Ignoring IGMPv2 group record %pI4 from %s on %s exclude mode in SSM range", + &group_addr.s_addr, from_str, ifp->name); + } + return -1; + } + + + /* * RFC 3376 * 7.3.2. In the Presence of Older Version Group Members * |
