pimd: (*, G) Prune should be processed even if the RP in packet is not RP(G)

RCA: We are ignoring (*,G) prune when the RP in packet is not RP(G)

Fix:
According to RFC 4601 Section 4.5.2:
Received Prune(*,G) messages are processed even if the RP in the message does not match RP(G).

We have allowed starg prune to be processed in the scenario.

Signed-off-by: Saravanan K <saravanank@vmware.com>
This commit is contained in:
saravanank 2020-03-17 02:28:18 -07:00
parent 7f2ccbe562
commit 5c777da81f

View File

@ -140,18 +140,19 @@ static void recv_prune(struct interface *ifp, struct pim_neighbor *neigh,
if ((source_flags & PIM_RPT_BIT_MASK) if ((source_flags & PIM_RPT_BIT_MASK)
&& (source_flags & PIM_WILDCARD_BIT_MASK)) { && (source_flags & PIM_WILDCARD_BIT_MASK)) {
struct pim_rpf *rp = RP(pim_ifp->pim, sg->grp); /*
* RFC 4601 Section 4.5.2:
* Received Prune(*,G) messages are processed even if the
* RP in the message does not match RP(G).
*/
if (PIM_DEBUG_PIM_TRACE) {
char received_rp[INET_ADDRSTRLEN];
if (!rp) { pim_inet4_dump("<received?>", sg->src, received_rp,
if (PIM_DEBUG_PIM_TRACE) sizeof(received_rp));
zlog_debug( zlog_debug("%s: Prune received with RP(%s) for %pSG4",
"%s: RP for %pSG4 completely failed lookup", __func__, received_rp, sg);
__func__, sg);
return;
} }
// Ignoring Prune *,G's at the moment.
if (sg->src.s_addr != rp->rpf_addr.u.prefix4.s_addr)
return;
sg->src.s_addr = INADDR_ANY; sg->src.s_addr = INADDR_ANY;
} }