From: Peter Wu <peter@lekensteyn.nl>
To: Eric Dumazet <eric.dumazet@gmail.com>
Cc: "David S . Miller" <davem@davemloft.net>,
netdev@vger.kernel.org, Eric Dumazet <edumazet@google.com>,
Kui Zhang <kuizhang@gmail.com>
Subject: Re: [PATCH] tcp: ensure non-empty connection request queue
Date: Wed, 4 May 2016 11:40:15 +0200 [thread overview]
Message-ID: <20160504094015.GA1346@al> (raw)
In-Reply-To: <1462321544.5535.337.camel@edumazet-glaptop3.roam.corp.google.com>
On Tue, May 03, 2016 at 05:25:44PM -0700, Eric Dumazet wrote:
> On Tue, 2016-05-03 at 23:54 +0200, Peter Wu wrote:
> > When applications use listen() with a backlog of 0, the kernel would
> > set the maximum connection request queue to zero. This causes false
> > reports of SYN flooding (if tcp_syncookies is enabled) or packet drops
> > otherwise.
> >
> > Prior kernels enforce a minimum size of 8, so do that now as well.
> >
> > Fixes: ef547f2ac16b ("tcp: remove max_qlen_log")
> > Signed-off-by: Peter Wu <peter@lekensteyn.nl>
> > ---
> > Hi,
> >
> > This patch fixes a regression from Linux 4.4. Use of "qemu-arm -g 1234"
> > would trigger the following warning in dmesg:
> >
> > TCP: request_sock_TCP: Possible SYN flooding on port 1234. Sending cookies. Check SNMP counters.
> >
> > For some users the "tcp: remove max_qlen_log" change already broke
> > applications[1]. While listen(3p) says that a backlog argument of 0 sets
> > the length to an "implementation-defined minimum value", I doubt that
> > "0" should be considered a valid value (as demonstrated in the above two
> > real-world applications that worked fine before). It is a hint anyway.
> >
> > This patch was tested on top of Linux v4.5 and removes the warning which
> > would otherwise be present (due to the inet_csk_reqsk_queue_is_full()
> > check in tcp_conn_request).
> >
> > I also looked at modifying the backlog value in inet_listen, but that
> > might have other unintended effects:
> >
> > - If TFO is enabled and tcp_fastopen==0x400, listen(fd, 0) currently
> > disables TFO (also possible via setsockopt). Forcing a minimum breaks
> > this path (unlikely to be a problem though since TFO users likely set
> > a much higher backlog).
> > - sk->sk_max_ack_backlog is also reported via tcp statistics and seems
> > really to be the hint rather than the actual interpreted value.
> >
> > Kind regards,
> > Peter
> >
> > [1]: https://lkml.kernel.org/r/CANn89i+OKfw896-N5KsNDEikzUidR8yX1JC089hJnGGfDQ0mzw@mail.gmail.com
> > ---
> > include/net/inet_connection_sock.h | 2 +-
> > 1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/include/net/inet_connection_sock.h b/include/net/inet_connection_sock.h
> > index 49dcad4..ca0fdbc 100644
> > --- a/include/net/inet_connection_sock.h
> > +++ b/include/net/inet_connection_sock.h
> > @@ -296,7 +296,7 @@ static inline int inet_csk_reqsk_queue_young(const struct sock *sk)
> >
> > static inline int inet_csk_reqsk_queue_is_full(const struct sock *sk)
> > {
> > - return inet_csk_reqsk_queue_len(sk) >= sk->sk_max_ack_backlog;
> > + return inet_csk_reqsk_queue_len(sk) >= max(8U, sk->sk_max_ack_backlog);
> > }
> >
> > void inet_csk_reqsk_queue_drop(struct sock *sk, struct request_sock *req);
>
> Well, I believe I already gave my opinion on this.
>
> listen backlog is not a hint. This is a limit.
>
> It is the limit of outstanding children in accept queue.
>
> If backlog is 0, no child can be put in the accept queue.
>
> It is therefore Working As Intented.
Alright, this is actually described in the Linux manual (listen(2)):
Now it specifies the queue length for completely established sockets
waiting to be accepted, instead of the number of incomplete
connection requests.
The POSIX manual (listen(3p)) says:
A backlog argument of 0 may allow the socket to accept connections,
in which case the length of the listen queue may be set to an
implementation-defined minimum value.
Not accepting a connection is apparently valid due to the wording ("may
allow"). Fair enough, please drop this patch. Applications will have to
be fixed then.
Kind regards,
Peter
next prev parent reply other threads:[~2016-05-04 9:41 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-05-03 21:54 [PATCH] tcp: ensure non-empty connection request queue Peter Wu
2016-05-04 0:25 ` Eric Dumazet
2016-05-04 9:40 ` Peter Wu [this message]
2016-05-04 17:24 ` Rick Jones
2016-05-04 17:34 ` Eric Dumazet
2016-05-04 18:05 ` Rick Jones
2016-05-04 18:18 ` Eric Dumazet
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=20160504094015.GA1346@al \
--to=peter@lekensteyn.nl \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=eric.dumazet@gmail.com \
--cc=kuizhang@gmail.com \
--cc=netdev@vger.kernel.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox