All of lore.kernel.org
 help / color / mirror / Atom feed
From: Lorenzo Colitti <lorenzo@google.com>
To: netdev@vger.kernel.org
Cc: davem@davemloft.net, hannes@stressinduktion.org,
	eric.dumazet@gmail.com, ek@google.com, tom@herbertland.com,
	zenczykowski@gmail.com
Subject: Re: Add a SOCK_DESTROY operation to close sockets from userspace
Date: Tue,  1 Dec 2015 11:32:23 +0900	[thread overview]
Message-ID: <1448937147-38043-1-git-send-email-lorenzo@google.com> (raw)
In-Reply-To: <CAHo-OoyN7OgvHSuXxjk7C4FitXhoWffOxY1wkQBWwi+nc013_w@mail.gmail.com>

Here is an updated version of the SOCK_DESTROY patch
incorporating some of the feedback received.

There were two substantial concerns expressed on the approach
taken in this patch. The first was that it allows applications
to cause the Linux TCP stack to behave improperly. I believe
this is addressed as follows:

1. This new patchset sends a RST in addition to clearing state.
   This is compliant behaviour: it is the ABORT operation
   specified in RFC 793 [1]. Any app today can do this by
   enabling SO_LINGER with a timeout of 0 and calling close.
2. Multiple other operating systems implement this behaviour:
   - FreeBSD has had this since 5.4 in 2005 [2]. It is available
     to privileged userspace and there is a tool to use it [3].
   - The FreeBSD commit description states that the idea came
     from OpenBSD.
   - iOS has been administratively closing app sockets since
     iOS 4 [see 4, which states that a socket "might get
     reclaimed by the kernel" and after that will return EBADF].

The second concern was that userspace should not be in the
business of making reachability determinations for TCP sockets;
that job belongs to the kernel. But userspace makes reachability
determinations all the time. Most relevant to this patchset:
"-j REJECT --reject-with tcp-reset" has exactly the same
effect as SOCK_DESTROY, except it only does so when the app does
write or the kernel sends a keepalive, not when blocked on read.

Also, there are real use cases where the kernel does not have
enough information to know that a connection is now inoperable.
The kernel can know if a packet can't be routed, but in general
it won't if a TCP connection is dead in the water because it is
now routed to a network where its source address is no longer
valid [5][6]. 

Other concerns have been addressed in this version, as follows:

1. tcp_diag_destroy now does a proper RFC 793 ABORT, i.e., sends
   a RST to the peer. This is consistent with BSD's tcpdrop, and
   is more correct in general, even though in most use cases
   SOCK_DESTROY will only be called when sending a RST is no
   longer possible (e.g., the network has disconnected).
2. Blocking socket operations are interrupted with ECONNABORTED
   instead of ETIMEDOUT. This addresses Tom's point that
   ETIMEDOUT is vague and an explicit notification is needed.
   ECONNABORTED was chosen because it is consistent with BSD.
3. SOCK_DESTROY is placed behind an INET_DIAG_DESTROY
   configuration option, which is off by default.

[1] http://tools.ietf.org/html/rfc793#page-50
[2] http://svnweb.freebsd.org/base?view=revision&revision=141381
[3] https://www.freebsd.org/cgi/man.cgi?query=tcpdrop&sektion=8&manpath=FreeBSD+5.4-RELEASE
[4] https://developer.apple.com/library/ios/technotes/tn2277/_index.html#//apple_ref/doc/uid/DTS40010841-CH1-SUBSECTION3
[5] http://www.spinics.net/lists/netdev/msg352775.html
[6] http://www.spinics.net/lists/netdev/msg352952.html

  reply	other threads:[~2015-12-01  2:32 UTC|newest]

Thread overview: 110+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-11-18  1:43 Add a SOCK_DESTROY operation to close sockets from userspace Lorenzo Colitti
2015-11-18  1:43 ` [PATCH 1/4] net: diag: split inet_diag_dump_one_icsk into two Lorenzo Colitti
2015-11-18  1:43 ` [PATCH 2/4] net: diag: Add the ability to destroy a socket from userspace Lorenzo Colitti
2015-11-18  1:43 ` [PATCH 3/4] net: diag: Support SOCK_DESTROY for inet sockets Lorenzo Colitti
2015-11-18  1:43 ` [PATCH 4/4] net: diag: Support destroying TCP sockets Lorenzo Colitti
2015-11-18  3:43   ` kbuild test robot
2015-11-18  4:46     ` Lorenzo Colitti
2015-11-18  4:25   ` kbuild test robot
2015-11-18  3:27 ` Add a SOCK_DESTROY operation to close sockets from userspace Stephen Hemminger
     [not found]   ` <CAAedzxqiXnKzCyevNipNnXEc_+TEjnVphLfseTo4ykZ8SAVt_w@mail.gmail.com>
2015-11-18  3:36     ` Erik Kline
2015-11-18  3:57   ` Maciej Żenczykowski
2015-11-18 11:56     ` David Laight
2015-11-18  4:04   ` Eric Dumazet
2015-11-18 10:19     ` Hannes Frederic Sowa
2015-11-18 10:47       ` Lorenzo Colitti
2015-11-18 11:19         ` Hannes Frederic Sowa
2015-11-18 12:54           ` Eric Dumazet
2015-11-18 13:04           ` Lorenzo Colitti
2015-11-18 13:31             ` Hannes Frederic Sowa
2015-11-18 14:45               ` Lorenzo Colitti
2015-11-18 14:56                 ` Hannes Frederic Sowa
2015-11-18 15:16                   ` Eric Dumazet
2015-11-18 15:32                     ` Hannes Frederic Sowa
2015-11-18 15:33                       ` Hannes Frederic Sowa
2015-11-18 20:35         ` David Miller
2015-11-18 20:43           ` Hannes Frederic Sowa
2015-11-19  3:49             ` David Miller
2015-11-19  5:12               ` Tom Herbert
2015-11-19 15:54                 ` Hannes Frederic Sowa
2015-11-19 23:54                   ` Maciej Żenczykowski
2015-11-19  5:13               ` Lorenzo Colitti
2015-11-19  5:53                 ` David Miller
2015-11-19  7:19                   ` Maciej Żenczykowski
2015-11-19 15:48                     ` David Miller
2015-11-19 16:19                       ` Eric Dumazet
2015-11-19 16:33                         ` David Miller
2015-11-19 16:43                           ` Eric Dumazet
2015-11-19 16:50                             ` David Miller
2015-11-19 16:47                           ` Eric Dumazet
2015-11-19 17:02                             ` David Miller
2015-11-19 17:44                               ` Eric Dumazet
2015-11-19 22:55                           ` Lorenzo Colitti
2015-11-19 17:08                         ` Hannes Frederic Sowa
2015-11-19 17:38                           ` Tom Herbert
2015-11-19 18:09                             ` David Miller
2015-11-19 18:27                               ` Hannes Frederic Sowa
2015-11-19 23:02                                 ` Hannes Frederic Sowa
2015-11-19 23:47                                   ` Lorenzo Colitti
2015-11-19 22:33                             ` Lorenzo Colitti
2015-11-19 22:38                               ` Hannes Frederic Sowa
2015-11-19 23:24                                 ` Tom Herbert
2015-11-19 21:29                         ` Tom Herbert
2015-11-19 21:41                           ` Eric Dumazet
2015-11-19 21:53                             ` Hannes Frederic Sowa
2015-11-19 22:04                               ` Eric Dumazet
2015-11-19 22:09                                 ` Hannes Frederic Sowa
2015-11-19 22:15                                   ` Eric Dumazet
2015-11-19 22:31                                     ` Hannes Frederic Sowa
2015-11-19 22:36                                       ` Eric Dumazet
2015-11-19 21:53                             ` Tom Herbert
2015-11-19 22:07                               ` Eric Dumazet
2015-11-19 22:14                                 ` Tom Herbert
2015-11-19 22:33                                   ` Eric Dumazet
2015-11-20  0:04                                     ` Tom Herbert
2015-11-20  0:09                                       ` Lorenzo Colitti
2015-11-20  0:15                                         ` Tom Herbert
2015-11-20  2:25                                           ` Maciej Żenczykowski
2015-12-01  2:32                                             ` Lorenzo Colitti [this message]
2015-12-01  2:32                                               ` [PATCH v3 1/4] net: diag: split inet_diag_dump_one_icsk into two Lorenzo Colitti
2015-12-01  2:32                                               ` [PATCH v3 2/4] net: diag: Add the ability to destroy a socket from userspace Lorenzo Colitti
2015-12-01  2:32                                               ` [PATCH v3 3/4] net: diag: Support SOCK_DESTROY for inet sockets Lorenzo Colitti
2015-12-01  2:32                                               ` [PATCH v3 4/4] net: diag: Support destroying TCP sockets Lorenzo Colitti
2015-12-01  6:23                                                 ` kbuild test robot
2015-12-01  7:12                                                   ` Lorenzo Colitti
2015-12-01  2:53                                               ` Add a SOCK_DESTROY operation to close sockets from userspace Tom Herbert
2015-12-02 15:18                                                 ` Lorenzo Colitti
2015-12-02 16:12                                                   ` Tom Herbert
2015-12-02 16:30                                                     ` Lorenzo Colitti
2015-12-02 17:09                                                       ` Tom Herbert
2015-12-14 17:29                                                     ` Lorenzo Colitti
2015-12-14 17:29                                                       ` [PATCH v5 1/4] net: diag: Add the ability to destroy a socket Lorenzo Colitti
2015-12-14 17:29                                                       ` [PATCH v5 2/4] net: diag: split inet_diag_dump_one_icsk into two Lorenzo Colitti
2015-12-14 17:29                                                       ` [PATCH v5 3/4] net: diag: Support SOCK_DESTROY for inet sockets Lorenzo Colitti
2015-12-14 17:29                                                       ` [PATCH v5 4/4] net: diag: Support destroying TCP sockets Lorenzo Colitti
2015-12-14 17:51                                                         ` kbuild test robot
2015-12-14 17:52                                                         ` Tom Herbert
2015-12-14 18:03                                                         ` Eric Dumazet
2015-12-14 19:37                                                         ` David Miller
2015-12-15 17:17                                                           ` [PATCH v5 4/4] net: diag: Support destroying TCP socketsr Lorenzo Colitti
2015-12-15 17:17                                                             ` [PATCH v6 1/4] net: diag: split inet_diag_dump_one_icsk into two Lorenzo Colitti
2015-12-15 17:44                                                               ` Eric Dumazet
2015-12-15 17:17                                                             ` [PATCH v6 2/4] net: diag: Add the ability to destroy a socket Lorenzo Colitti
2015-12-15 17:44                                                               ` Eric Dumazet
2015-12-15 17:17                                                             ` [PATCH v6 3/4] net: diag: Support SOCK_DESTROY for inet sockets Lorenzo Colitti
2015-12-15 17:45                                                               ` Eric Dumazet
2015-12-15 17:17                                                             ` [PATCH v6 4/4] net: diag: Support destroying TCP sockets Lorenzo Colitti
2015-12-15 17:46                                                               ` Eric Dumazet
2015-12-15 18:36                                                             ` [PATCH v5 4/4] net: diag: Support destroying TCP socketsr Maciej Żenczykowski
2015-12-15 18:46                                                               ` Rustad, Mark D
2015-12-15 18:38                                                             ` David Miller
2015-11-20  0:12                         ` Add a SOCK_DESTROY operation to close sockets from userspace Maciej Żenczykowski
2015-11-20  0:19                   ` Lorenzo Colitti
2015-11-20  0:55                     ` David Miller
2015-11-20  1:00                       ` Maciej Żenczykowski
2015-11-20  1:55                       ` Lorenzo Colitti
2015-11-20 16:51                         ` David Ahern
2015-11-18  3:56 ` Tom Herbert
2015-11-18  4:23   ` Lorenzo Colitti
2015-11-18  4:31     ` Tom Herbert
2015-11-18 10:12 ` Hannes Frederic Sowa

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1448937147-38043-1-git-send-email-lorenzo@google.com \
    --to=lorenzo@google.com \
    --cc=davem@davemloft.net \
    --cc=ek@google.com \
    --cc=eric.dumazet@gmail.com \
    --cc=hannes@stressinduktion.org \
    --cc=netdev@vger.kernel.org \
    --cc=tom@herbertland.com \
    --cc=zenczykowski@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.