pimd: static joins no longer worked

Static joins were killed by a previous commit, which
has been backed out.  I've recoded the igmp join
code to ignore 224.0.0.0/24 from ourselves a bit
differently now.

Ticket: CM-11751
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
This commit is contained in:
Donald Sharp 2016-07-11 12:57:28 -04:00
parent e20883e6bf
commit 74fb6c66da

View File

@ -23,6 +23,7 @@
#include <zebra.h> #include <zebra.h>
#include "memory.h" #include "memory.h"
#include "prefix.h"
#include "if.h" #include "if.h"
#include "pimd.h" #include "pimd.h"
@ -471,6 +472,7 @@ static int igmp_v3_report(struct igmp_sock *igmp,
uint8_t *report_pastend = (uint8_t *) igmp_msg + igmp_msg_len; uint8_t *report_pastend = (uint8_t *) igmp_msg + igmp_msg_len;
struct interface *ifp = igmp->interface; struct interface *ifp = igmp->interface;
int i; int i;
int local_ncb = 0;
if (igmp_msg_len < IGMP_V3_MSG_MIN_SIZE) { if (igmp_msg_len < IGMP_V3_MSG_MIN_SIZE) {
zlog_warn("Recv IGMP report v3 from %s on %s: size=%d shorter than minimum=%d", zlog_warn("Recv IGMP report v3 from %s on %s: size=%d shorter than minimum=%d",
@ -513,6 +515,8 @@ static int igmp_v3_report(struct igmp_sock *igmp,
int rec_auxdatalen; int rec_auxdatalen;
int rec_num_sources; int rec_num_sources;
int j; int j;
struct prefix lncb;
struct prefix g;
if ((group_record + IGMP_V3_GROUP_RECORD_MIN_SIZE) > report_pastend) { if ((group_record + IGMP_V3_GROUP_RECORD_MIN_SIZE) > report_pastend) {
zlog_warn("Recv IGMP report v3 from %s on %s: group record beyond report end", zlog_warn("Recv IGMP report v3 from %s on %s: group record beyond report end",
@ -555,31 +559,48 @@ static int igmp_v3_report(struct igmp_sock *igmp,
} }
} /* for (sources) */ } /* for (sources) */
switch (rec_type) {
case IGMP_GRP_REC_TYPE_MODE_IS_INCLUDE: lncb.family = AF_INET;
igmpv3_report_isin(igmp, from, rec_group, rec_num_sources, (struct in_addr *) sources); lncb.u.prefix4.s_addr = 0x000000E0;
break; lncb.prefixlen = 24;
case IGMP_GRP_REC_TYPE_MODE_IS_EXCLUDE:
igmpv3_report_isex(igmp, from, rec_group, rec_num_sources, (struct in_addr *) sources); g.family = AF_INET;
break; g.u.prefix4 = rec_group;
case IGMP_GRP_REC_TYPE_CHANGE_TO_INCLUDE_MODE: g.prefixlen = 32;
igmpv3_report_toin(igmp, from, rec_group, rec_num_sources, (struct in_addr *) sources); /*
break; * If we receive a igmp report with the group in 224.0.0.0/24
case IGMP_GRP_REC_TYPE_CHANGE_TO_EXCLUDE_MODE: * then we should ignore it
igmpv3_report_toex(igmp, from, rec_group, rec_num_sources, (struct in_addr *) sources); */
break; if (prefix_match(&lncb, &g))
case IGMP_GRP_REC_TYPE_ALLOW_NEW_SOURCES: local_ncb = 1;
igmpv3_report_allow(igmp, from, rec_group, rec_num_sources, (struct in_addr *) sources);
break; if (!local_ncb)
case IGMP_GRP_REC_TYPE_BLOCK_OLD_SOURCES: switch (rec_type) {
igmpv3_report_block(igmp, from, rec_group, rec_num_sources, (struct in_addr *) sources); case IGMP_GRP_REC_TYPE_MODE_IS_INCLUDE:
break; igmpv3_report_isin(igmp, from, rec_group, rec_num_sources, (struct in_addr *) sources);
default: break;
zlog_warn("Recv IGMP report v3 from %s on %s: unknown record type: type=%d", case IGMP_GRP_REC_TYPE_MODE_IS_EXCLUDE:
from_str, ifp->name, rec_type); igmpv3_report_isex(igmp, from, rec_group, rec_num_sources, (struct in_addr *) sources);
} break;
case IGMP_GRP_REC_TYPE_CHANGE_TO_INCLUDE_MODE:
igmpv3_report_toin(igmp, from, rec_group, rec_num_sources, (struct in_addr *) sources);
break;
case IGMP_GRP_REC_TYPE_CHANGE_TO_EXCLUDE_MODE:
igmpv3_report_toex(igmp, from, rec_group, rec_num_sources, (struct in_addr *) sources);
break;
case IGMP_GRP_REC_TYPE_ALLOW_NEW_SOURCES:
igmpv3_report_allow(igmp, from, rec_group, rec_num_sources, (struct in_addr *) sources);
break;
case IGMP_GRP_REC_TYPE_BLOCK_OLD_SOURCES:
igmpv3_report_block(igmp, from, rec_group, rec_num_sources, (struct in_addr *) sources);
break;
default:
zlog_warn("Recv IGMP report v3 from %s on %s: unknown record type: type=%d",
from_str, ifp->name, rec_type);
}
group_record += 8 + (rec_num_sources << 2) + (rec_auxdatalen << 2); group_record += 8 + (rec_num_sources << 2) + (rec_auxdatalen << 2);
local_ncb = 0;
} /* for (group records) */ } /* for (group records) */