net: ipv4: fix l3slave check for index returned in IP_PKTINFO
Subsystems (3)
PATCH 1/1 net: ipv4: fix l3slave check for index returned in IP_PKTINFO
rt_iif is only set to the actual egress device for the output path. The recent change to consider the l3slave flag when returning IP_PKTINFO works for local traffic (the correct device index is returned), but it broke the more typical use case of packets received from a remote host always returning the VRF index rather than the original ingress device. Update the fixup to consider l3slave and rt_iif actually getting set.
--- net/ipv4/ip_sockglue.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
net/ipv4/ip_sockglue.c +6 -2
@@ -1207,7 +1207,6 @@ static int do_ip_setsockopt(struct sock *sk, int level,void ipv4_pktinfo_prepare (const struct sock *sk,struct sk_buff *skb) {struct in_pktinfo *pktinfo =PKTINFO_SKB_CB (skb); -bool l3slave =ipv4_l3mdev_skb (IPCB (skb)->flags);bool prepare = (inet_sk (sk)->cmsg_flags &IP_CMSG_PKTINFO ) ||ipv6_sk_rxinfo (sk);
@@ -1221,8 +1220,13 @@ void ipv4_pktinfo_prepare(const struct sock *sk, struct sk_buff *skb)* (e.g., process binds socket to eth0 for Tx which is * redirected to loopback in the rtable/dst). */ -if (pktinfo->ipi_ifindex ==LOOPBACK_IFINDEX || l3slave) +struct rtable *rt =skb_rtable (skb); +bool l3slave =ipv4_l3mdev_skb (IPCB (skb)->flags); + +if (pktinfo->ipi_ifindex ==LOOPBACK_IFINDEX ) pktinfo->ipi_ifindex =inet_iif (skb); +else if (l3slave && rt && rt->rt_iif) + pktinfo->ipi_ifindex = rt->rt_iif; pktinfo->ipi_spec_dst.s_addr =fib_compute_spec_dst (skb); }else {
Signature · 1 line
2.1.4
From: David Ahern <[email protected]>
Date: Wed, 13 Sep 2017 17:11:37 -0700
Quoted 9 lines
rt_iifis only set to the actual egress device for the output path. The recent change to consider the l3slave flag when returningIP_PKTINFOworks for local traffic (the correct device index is returned), but it broke the more typical use case of packets received from a remote host always returning the VRF index rather than the original ingress device. Update the fixup to consider l3slave andrt_iifactually getting set.Fixes 1dfa76390bf05 ("net: ipv4: add check for l3slave for index returned in IP_PKTINFO")Signed-off-by David Ahern <[email protected]>
Applied, thanks David.