aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4
diff options
context:
space:
mode:
authorWei Zhang <asuka.com@163.com>2016-12-29 03:45:04 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-01-15 07:42:54 -0500
commite7422080e35d1faff66016f4163a34b09de78815 (patch)
tree5f9dfba3770b5be0031be8a18f4cf6caebf27376 /net/ipv4
parent2ffc694b572729d5f3e450a3b7d953eb88f4d550 (diff)
net: fix incorrect original ingress device index in PKTINFO
[ Upstream commit f0c16ba8933ed217c2688b277410b2a37ba81591 ] When we send a packet for our own local address on a non-loopback interface (e.g. eth0), due to the change had been introduced from commit 0b922b7a829c ("net: original ingress device index in PKTINFO"), the original ingress device index would be set as the loopback interface. However, the packet should be considered as if it is being arrived via the sending interface (eth0), otherwise it would break the expectation of the userspace application (e.g. the DHCPRELEASE message from dhcp_release binary would be ignored by the dnsmasq daemon, since it come from lo which is not the interface dnsmasq bind to) Fixes: 0b922b7a829c ("net: original ingress device index in PKTINFO") Acked-by: David Ahern <dsa@cumulusnetworks.com> Signed-off-by: Wei Zhang <asuka.com@163.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'net/ipv4')
-rw-r--r--net/ipv4/ip_sockglue.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c
index e869773e3979..f226f4086e05 100644
--- a/net/ipv4/ip_sockglue.c
+++ b/net/ipv4/ip_sockglue.c
@@ -1202,8 +1202,14 @@ void ipv4_pktinfo_prepare(const struct sock *sk, struct sk_buff *skb)
1202 * which has interface index (iif) as the first member of the 1202 * which has interface index (iif) as the first member of the
1203 * underlying inet{6}_skb_parm struct. This code then overlays 1203 * underlying inet{6}_skb_parm struct. This code then overlays
1204 * PKTINFO_SKB_CB and in_pktinfo also has iif as the first 1204 * PKTINFO_SKB_CB and in_pktinfo also has iif as the first
1205 * element so the iif is picked up from the prior IPCB 1205 * element so the iif is picked up from the prior IPCB. If iif
1206 * is the loopback interface, then return the sending interface
1207 * (e.g., process binds socket to eth0 for Tx which is
1208 * redirected to loopback in the rtable/dst).
1206 */ 1209 */
1210 if (pktinfo->ipi_ifindex == LOOPBACK_IFINDEX)
1211 pktinfo->ipi_ifindex = inet_iif(skb);
1212
1207 pktinfo->ipi_spec_dst.s_addr = fib_compute_spec_dst(skb); 1213 pktinfo->ipi_spec_dst.s_addr = fib_compute_spec_dst(skb);
1208 } else { 1214 } else {
1209 pktinfo->ipi_ifindex = 0; 1215 pktinfo->ipi_ifindex = 0;