diff options
| author | Donald Sharp <donaldsharp72@gmail.com> | 2025-03-06 20:32:23 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-03-06 20:32:23 -0500 |
| commit | 2cc4416f134aa23a59ccfc999ca3365dee50d0ac (patch) | |
| tree | 76edea3eecbdf0f375a3447e5c22d4a4f1aa7db3 | |
| parent | 2889b3dac46a64561c22d2544839aeeb7426716d (diff) | |
| parent | cb6242bd8d22c0b4d05d675d649b0e860926612b (diff) | |
Merge pull request #18334 from FRRouting/mergify/bp/stable/10.1/pr-18315
pimd: Fix PIM6 MLD VRF support (use recvmsg() pktinfo) (backport #18315)
| -rw-r--r-- | pimd/pim6_mld.c | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/pimd/pim6_mld.c b/pimd/pim6_mld.c index a39d182990..e258a52dc5 100644 --- a/pimd/pim6_mld.c +++ b/pimd/pim6_mld.c @@ -1665,18 +1665,6 @@ static void gm_t_recv(struct event *t) goto out_free; } - struct interface *ifp; - - ifp = if_lookup_by_index(pkt_src->sin6_scope_id, pim->vrf->vrf_id); - if (!ifp || !ifp->info) - goto out_free; - - struct pim_interface *pim_ifp = ifp->info; - struct gm_if *gm_ifp = pim_ifp->mld; - - if (!gm_ifp) - goto out_free; - for (cmsg = CMSG_FIRSTHDR(mh); cmsg; cmsg = CMSG_NXTHDR(mh, cmsg)) { if (cmsg->cmsg_level != SOL_IPV6) continue; @@ -1695,6 +1683,21 @@ static void gm_t_recv(struct event *t) } } + /* Prefer pktinfo as that also works in case of VRF */ + ifindex_t ifindex = pktinfo ? pktinfo->ipi6_ifindex + : pkt_src->sin6_scope_id; + struct interface *ifp; + + ifp = if_lookup_by_index(ifindex, pim->vrf->vrf_id); + if (!ifp || !ifp->info) + goto out_free; + + struct pim_interface *pim_ifp = ifp->info; + struct gm_if *gm_ifp = pim_ifp->mld; + + if (!gm_ifp) + goto out_free; + if (!pktinfo || !hoplimit) { zlog_err(log_ifp( "BUG: packet without IPV6_PKTINFO or IPV6_HOPLIMIT")); |
