From patchwork Thu Sep 14 00:11:37 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Ahern X-Patchwork-Id: 813672 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="P9BPLtK4"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3xszVF0Qvnz9s83 for ; Thu, 14 Sep 2017 10:11:49 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751424AbdINALr (ORCPT ); Wed, 13 Sep 2017 20:11:47 -0400 Received: from mail-pg0-f66.google.com ([74.125.83.66]:37010 "EHLO mail-pg0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751173AbdINALq (ORCPT ); Wed, 13 Sep 2017 20:11:46 -0400 Received: by mail-pg0-f66.google.com with SMTP id v5so807230pgn.4 for ; Wed, 13 Sep 2017 17:11:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=PTg5rsrZwNFZbkCrNpbx7G1Yp9xKMTqWZol6w+x/h3o=; b=P9BPLtK4pzShJ42plJB8quxxu70ybTzXVo6yZzj+56Y6Ub9s5cx+soXJC1pb1IPCf6 IkFPQXVtrJqTvKS1nfY/NXOL5j/bRvhiV5FEiGdhqNiq8hRUY17xReN/aacDt2My0dEa 2II0tXxy6ziex8fjjynvoC2n4Q+y+PgonlGi1Uq42yT3HBHM4c9Sb6l3Ry13j7LtXuuc CQgytfXe0BjpYOk/k8XV6oTNQvKqr4EdR5GsmOBwgm9mtaBEaxGKVQS35PQUyR9XZJe7 r1FvNSTCc/Dgh3Y7K6NPdlfc2yg1RiMzznyZ/INo39kZprIen6x32FaIt0mPM7M6pCEi JCIg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=PTg5rsrZwNFZbkCrNpbx7G1Yp9xKMTqWZol6w+x/h3o=; b=ISvpyZ+Yh8BDfX1YFWZgN1Nju67DafVtekbjpu6sfGSW4y4SCpzLxwy/kNKEK+2f8K KG2UXeWvTe/7AhG8U7Karn1X+aZ35er5ZZlxjNNcZzzPm1O1/3sXJVUT0SB+OVFNMDR/ 2vQtsrPbJEwwt6vv5vnMo0KljM+r4KQJo49KsaYBq82oTZ9bWlCpZ7/tOs3ZnhPA/ouD JJiXM1XeJSllQLC29OCaJ/sowd2OdqkvnLOwHWUGq5FNtzNfqJF7hHvD2JXkV91hcoTY 4FtAhvg/GpC40bMBzS3UxrKHu39g3agjc3e5ygNYGijQM1ZvHpdxeM0Sy1qX50qpaBPc bneQ== X-Gm-Message-State: AHPjjUjuoPRnGmPfamB2g/nheN2nZbyxkn8J5Js9N40q5/URi1sStkXV ya+7ELCuiurcBwDU X-Google-Smtp-Source: ADKCNb6vJXEid3FH74p8HPcEsIP3Ei2lDiv/cuBxkMYjI86VspEHbYdIaLooxhi12v+4JtJOIMFipw== X-Received: by 10.84.128.69 with SMTP id 63mr22800108pla.446.1505347905209; Wed, 13 Sep 2017 17:11:45 -0700 (PDT) Received: from kenny.it.cumulusnetworks.com. (fw.cumulusnetworks.com. [216.129.126.126]) by smtp.googlemail.com with ESMTPSA id k14sm23199874pgt.3.2017.09.13.17.11.43 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 13 Sep 2017 17:11:44 -0700 (PDT) From: David Ahern To: netdev@vger.kernel.org Cc: David Ahern Subject: [PATCH] net: ipv4: fix l3slave check for index returned in IP_PKTINFO Date: Wed, 13 Sep 2017 17:11:37 -0700 Message-Id: <1505347897-27422-1-git-send-email-dsahern@gmail.com> X-Mailer: git-send-email 2.1.4 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org 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. Fixes: 1dfa76390bf05 ("net: ipv4: add check for l3slave for index returned in IP_PKTINFO") Signed-off-by: David Ahern --- net/ipv4/ip_sockglue.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c index e558e4f9597b..a599aa83fdad 100644 --- a/net/ipv4/ip_sockglue.c +++ b/net/ipv4/ip_sockglue.c @@ -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 {