Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756073AbcL0TEH (ORCPT ); Tue, 27 Dec 2016 14:04:07 -0500 Received: from shards.monkeyblade.net ([184.105.139.130]:44968 "EHLO shards.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754578AbcL0TD6 (ORCPT ); Tue, 27 Dec 2016 14:03:58 -0500 Date: Tue, 27 Dec 2016 14:03:13 -0500 (EST) Message-Id: <20161227.140313.1837464529059496066.davem@davemloft.net> To: asuka.com@163.com Cc: kuznet@ms2.inr.ac.ru, jmorris@namei.org, yoshfuji@linux-ipv6.org, kaber@trash.net, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, dsa@cumulusnetworks.com Subject: Re: [PATCH] net: fix incorrect original ingress device index in PKTINFO From: David Miller In-Reply-To: <1482832344-24760-1-git-send-email-asuka.com@163.com> References: <1482832344-24760-1-git-send-email-asuka.com@163.com> X-Mailer: Mew version 6.7 on Emacs 24.5 / Mule 6.0 (HANACHIRUSATO) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Greylist: Sender succeeded SMTP AUTH, not delayed by milter-greylist-4.5.12 (shards.monkeyblade.net [149.20.54.216]); Tue, 27 Dec 2016 10:04:00 -0800 (PST) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1972 Lines: 48 From: Wei Zhang Date: Tue, 27 Dec 2016 17:52:24 +0800 > 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) > > Signed-off-by: Wei Zhang When you are fixing a problem introduced by another change, always CC: the author of that change as I have done so here. David, please take a look at this, thanks. > --- > net/ipv4/ip_sockglue.c | 8 +++++++- > 1 file changed, 7 insertions(+), 1 deletion(-) > > diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c > index b8a2d63..76d78a7 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) > * which has interface index (iif) as the first member of the > * underlying inet{6}_skb_parm struct. This code then overlays > * PKTINFO_SKB_CB and in_pktinfo also has iif as the first > - * element so the iif is picked up from the prior IPCB > + * element so the iif is picked up from the prior IPCB except > + * iif is loopback interface which the packet should be > + * considered as if it is being arrived via the sending > + * interface > */ > + if (pktinfo->ipi_ifindex == LOOPBACK_IFINDEX) > + pktinfo->ipi_ifindex = inet_iif(skb); > + > pktinfo->ipi_spec_dst.s_addr = fib_compute_spec_dst(skb); > } else { > pktinfo->ipi_ifindex = 0; > -- > 1.8.3.1 > >