From: Mobashshera Rasool Date: Mon, 21 Nov 2022 11:15:28 +0000 (-0800) Subject: pim6d, pimd: Discard (*,G) prune if WC bit is set but RPT bit is unset. X-Git-Tag: base_8.5~221^2 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=a23a485cbff96fc3cfca50a309977fd5dea06639;p=matthieu%2Ffrr.git pim6d, pimd: Discard (*,G) prune if WC bit is set but RPT bit is unset. As per RFC 7761, Section 4.9.1 The RPT (or Rendezvous Point Tree) bit is a 1-bit value for use with PIM Join/Prune messages (see Section 4.9.5.1). If the WC bit is 1, the RPT bit MUST be 1. ANVL conformance test case is trying to verify this and is failing. Issue: #12354 Signed-off-by: Mobashshera Rasool --- diff --git a/pimd/pim_join.c b/pimd/pim_join.c index 7b252ad572..e028b6aa77 100644 --- a/pimd/pim_join.c +++ b/pimd/pim_join.c @@ -140,8 +140,21 @@ static void recv_prune(struct interface *ifp, struct pim_neighbor *neigh, ++pim_ifp->pim_ifstat_prune_recv; - if ((source_flags & PIM_RPT_BIT_MASK) - && (source_flags & PIM_WILDCARD_BIT_MASK)) { + if (CHECK_FLAG(source_flags, PIM_WILDCARD_BIT_MASK)) { + /* As per RFC 7761 Section 4.9.1: + * The RPT (or Rendezvous Point Tree) bit is a 1-bit value for + * use with PIM Join/Prune messages (see Section 4.9.5.1). If + * the WC bit is 1, the RPT bit MUST be 1. + */ + if (!CHECK_FLAG(source_flags, PIM_RPT_BIT_MASK)) { + if (PIM_DEBUG_PIM_J_P) + zlog_debug( + "Discarding (*,G)=%pSG prune since WC bit is set but RPT bit is unset", + sg); + + return; + } + /* * RFC 4601 Section 4.5.2: * Received Prune(*,G) messages are processed even if the