From: Benjamin LaHaise <bcrl@kvack.org>
To: David Miller <davem@davemloft.net>
Cc: netdev@vger.kernel.org
Subject: [PATCH] TCP FIN gets dropped prematurely, results in ack storm
Date: Tue, 1 May 2007 11:13:54 -0400 [thread overview]
Message-ID: <20070501151354.GB1751@kvack.org> (raw)
Hello,
While testing a failover scenario, I managed to trigger an ack storm
between a Linux box and another system. Although the cause of this particular
ACK storm was due to the other box forgetting that it sent out a FIN (the
second node was unaware of the FIN the first sent in its dying gasp, which
is what I'm trying to fix, but it's a tricky race), the resulting Linux
behaviour wasn't very robust. Is there any particularly good reason that
FIN flag gets cleared on a connection which is being shut down? The trace
that motivates this can be seen at
http://www.kvack.org/~bcrl/ack-storm.log . As near as I can tell, a
similar effect can occur between two Linux boxes if the right packets get
reordered/dropped during connection teardown.
-ben
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
index 0faacf9..1e54291 100644
--- a/net/ipv4/tcp_output.c
+++ b/net/ipv4/tcp_output.c
@@ -635,9 +635,9 @@ int tcp_fragment(struct sock *sk, struct sk_buff *skb, u32 len, unsigned int mss
TCP_SKB_CB(buff)->end_seq = TCP_SKB_CB(skb)->end_seq;
TCP_SKB_CB(skb)->end_seq = TCP_SKB_CB(buff)->seq;
- /* PSH and FIN should only be set in the second packet. */
+ /* PSH should only be set in the second packet. */
flags = TCP_SKB_CB(skb)->flags;
- TCP_SKB_CB(skb)->flags = flags & ~(TCPCB_FLAG_FIN|TCPCB_FLAG_PSH);
+ TCP_SKB_CB(skb)->flags = flags & ~(TCPCB_FLAG_PSH);
TCP_SKB_CB(buff)->flags = flags;
TCP_SKB_CB(buff)->sacked = TCP_SKB_CB(skb)->sacked;
TCP_SKB_CB(skb)->sacked &= ~TCPCB_AT_TAIL;
@@ -1124,9 +1124,9 @@ static int tso_fragment(struct sock *sk, struct sk_buff *skb, unsigned int len,
TCP_SKB_CB(buff)->end_seq = TCP_SKB_CB(skb)->end_seq;
TCP_SKB_CB(skb)->end_seq = TCP_SKB_CB(buff)->seq;
- /* PSH and FIN should only be set in the second packet. */
+ /* PSH should only be set in the second packet. */
flags = TCP_SKB_CB(skb)->flags;
- TCP_SKB_CB(skb)->flags = flags & ~(TCPCB_FLAG_FIN|TCPCB_FLAG_PSH);
+ TCP_SKB_CB(skb)->flags = flags & ~(TCPCB_FLAG_PSH);
TCP_SKB_CB(buff)->flags = flags;
/* This packet was never sent out yet, so no SACK bits. */
@@ -1308,7 +1308,7 @@ static int tcp_mtu_probe(struct sock *sk)
sk_stream_free_skb(sk, skb);
} else {
TCP_SKB_CB(nskb)->flags |= TCP_SKB_CB(skb)->flags &
- ~(TCPCB_FLAG_FIN|TCPCB_FLAG_PSH);
+ ~(TCPCB_FLAG_PSH);
if (!skb_shinfo(skb)->nr_frags) {
skb_pull(skb, copy);
if (skb->ip_summed != CHECKSUM_PARTIAL)
next reply other threads:[~2007-05-01 15:14 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-05-01 15:13 Benjamin LaHaise [this message]
2007-05-01 16:20 ` [PATCH] TCP FIN gets dropped prematurely, results in ack storm Evgeniy Polyakov
2007-05-01 16:49 ` Benjamin LaHaise
2007-05-01 17:41 ` Evgeniy Polyakov
2007-05-01 17:53 ` Benjamin LaHaise
2007-05-01 18:03 ` John Heffner
2007-05-01 19:19 ` Benjamin LaHaise
2007-05-01 20:24 ` David Miller
2007-05-01 17:57 ` Evgeniy Polyakov
2007-05-01 18:02 ` Evgeniy Polyakov
2007-05-01 17:54 ` John Heffner
2007-05-01 18:04 ` Benjamin LaHaise
2007-05-01 18:07 ` Evgeniy Polyakov
2007-05-01 18:20 ` Evgeniy Polyakov
2007-05-01 18:25 ` Evgeniy Polyakov
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=20070501151354.GB1751@kvack.org \
--to=bcrl@kvack.org \
--cc=davem@davemloft.net \
--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;
as well as URLs for NNTP newsgroup(s).