forked from Mirror/frr
pimd: Fix PIM6 MLD VRF support (use recvmsg() pktinfo)
When receiving MLD messages, prefer pktinfo over msghdr.msg_name for determining the source interface. The latter is just the VRF master interface in case of VRF and we need the true interface the packet was received on instead. Signed-off-by: Martin Buck <mb-tmp-tvguho.pbz@gromit.dyndns.org>
This commit is contained in:
parent
5cf533ba74
commit
374c8dc4db
|
@ -1770,18 +1770,6 @@ static void gm_t_recv(struct event *t)
|
||||||
goto out_free;
|
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)) {
|
for (cmsg = CMSG_FIRSTHDR(mh); cmsg; cmsg = CMSG_NXTHDR(mh, cmsg)) {
|
||||||
if (cmsg->cmsg_level != SOL_IPV6)
|
if (cmsg->cmsg_level != SOL_IPV6)
|
||||||
continue;
|
continue;
|
||||||
|
@ -1800,6 +1788,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) {
|
if (!pktinfo || !hoplimit) {
|
||||||
zlog_err(log_ifp(
|
zlog_err(log_ifp(
|
||||||
"BUG: packet without IPV6_PKTINFO or IPV6_HOPLIMIT"));
|
"BUG: packet without IPV6_PKTINFO or IPV6_HOPLIMIT"));
|
||||||
|
|
Loading…
Reference in a new issue