From patchwork Thu Dec 6 02:56:28 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: yupeng X-Patchwork-Id: 1008587 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="Vp4kdcO3"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 439KxY3k1Bz9s0t for ; Thu, 6 Dec 2018 13:56:33 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728294AbeLFC4c (ORCPT ); Wed, 5 Dec 2018 21:56:32 -0500 Received: from mail-pg1-f177.google.com ([209.85.215.177]:38924 "EHLO mail-pg1-f177.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727940AbeLFC4b (ORCPT ); Wed, 5 Dec 2018 21:56:31 -0500 Received: by mail-pg1-f177.google.com with SMTP id w6so9935568pgl.6 for ; Wed, 05 Dec 2018 18:56:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id; bh=P7DW+1Tjpkm99bRgA4dqSrnibTzh4feIx425nqhVybc=; b=Vp4kdcO3wIdqocHZs2YGmGqk4U+IMutAVPw0CETX26TCODxdv+eEb1ScNrjxpVx1M9 C/LQ0UjQ6BVohQug7g6ZIMV5G80oInDHQRW65ycN2aSPtt/spw+y4GZYrBxtF21djzMn qf9BcucV2v6yCBCxdlwVP5T7repY972MySGx9KW2+ObUgPCdWkiuIUndceBlTvqvk1yY khGz2AoLw9b0nY2Xt8E+b7sCodMk3rNTk+14ukM5+A/f8ouvyKnzswHAMipZUctFUVMf mtIuVeNLId/VTidjpkhaSl9XRan0Z7rGDiV4z1uwXbmNxYz6pSoSIkWQ6V+x66hqaJfe 2JeQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id; bh=P7DW+1Tjpkm99bRgA4dqSrnibTzh4feIx425nqhVybc=; b=SHLDtMderuo5ozaHmHYtE1/DKyNqeTmKQ+4vlkFACwzNrBIifBHuytRsZBKI+XN3Bq 5VR0wf5DNXIHCxfVCf6YDnbl/Je/oiAP4D/2PDnZBVfKx/gndOOOdGJ7D0D38jmW8jdc 7Eg+hE4/T6fy3cUjQ+bPzSg4+VwWC5rt2cKP5OM0VUeZqT+mo4Xn3cejaEGbU9DSInva 5NnEX9mf3iiCw8ql+uxQ7MXcCAwuhWdGahWTihbjtZvq+UYBEkAnFotDxVkvANcvrqFb 8KNjCzUmGDvFJAr+LgwDHW2/eOs8LM731hRdnUnxDKKsjFrBNXH6QXdOSWMTw12eEmp9 UbYw== X-Gm-Message-State: AA+aEWa/UoRatoR8SE7uWYaxil7UKiAnnudoIxOoWY3JnvFiwgonpd/N IUBzvcSYX6PEF+EtljQiUJ4laCTXZz8= X-Google-Smtp-Source: AFSGD/VtUFymEetoPe3lJlnH4aaB1K9vwdtXkW3/PGexTDJDki/k0S7YBjTpQGzBtfj3cV0JM/gI/g== X-Received: by 2002:aa7:8608:: with SMTP id p8mr27309911pfn.125.1544064990546; Wed, 05 Dec 2018 18:56:30 -0800 (PST) Received: from localhost.localdomain ([2601:602:9602:6598:a040:42ba:78c2:f669]) by smtp.gmail.com with ESMTPSA id x12sm22933431pgr.55.2018.12.05.18.56.29 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 05 Dec 2018 18:56:30 -0800 (PST) From: yupeng To: netdev@vger.kernel.org, davem@davemloft.net, edumazet@google.com Subject: [Patch v2 net-next] call sk_dst_reset when set SO_DONTROUTE Date: Wed, 5 Dec 2018 18:56:28 -0800 Message-Id: <20181206025628.3130-1-yupeng0921@gmail.com> X-Mailer: git-send-email 2.17.1 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org after set SO_DONTROUTE to 1, the IP layer should not route packets if the dest IP address is not in link scope. But if the socket has cached the dst_entry, such packets would be routed until the sk_dst_cache expires. So we should clean the sk_dst_cache when a user set SO_DONTROUTE option. Below are server/client python scripts which could reprodue this issue: server side code: ========================================================================== import socket import struct import time s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(('0.0.0.0', 9000)) s.listen(1) sock, addr = s.accept() sock.setsockopt(socket.SOL_SOCKET, socket.SO_DONTROUTE, struct.pack('i', 1)) while True: sock.send(b'foo') time.sleep(1) ========================================================================== client side code: ========================================================================== import socket import time s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('server_address', 9000)) while True: data = s.recv(1024) print(data) ========================================================================== Signed-off-by: yupeng --- net/core/sock.c | 1 + 1 file changed, 1 insertion(+) diff --git a/net/core/sock.c b/net/core/sock.c index f5bb89785e47..f00902c532cc 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -700,6 +700,7 @@ int sock_setsockopt(struct socket *sock, int level, int optname, break; case SO_DONTROUTE: sock_valbool_flag(sk, SOCK_LOCALROUTE, valbool); + sk_dst_reset(sk); break; case SO_BROADCAST: sock_valbool_flag(sk, SOCK_BROADCAST, valbool);