From: Ilpo Järvinen Date: Sat, 28 Feb 2009 04:44:31 +0000 (+0000) Subject: tcp: fix corner case issue in segmentation during rexmitting X-Git-Url: http://git.lede-project.org./?a=commitdiff_plain;h=02276f3c962fd408fa9d441251067845f948bfcf;p=openwrt%2Fstaging%2Fblogic.git tcp: fix corner case issue in segmentation during rexmitting If cur_mss grew very recently so that the previously G/TSOed skb now fits well into a single segment it would get send up in parts unless we calculate # of segments again. This corner-case could happen eg. after mtu probe completes or less than previously sack blocks are required for the opposite direction. Signed-off-by: Ilpo Järvinen Signed-off-by: David S. Miller --- diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index 3feab4d6929d..77af7faf38a9 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c @@ -1921,6 +1921,8 @@ int tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb) if (skb->len > cur_mss) { if (tcp_fragment(sk, skb, cur_mss, cur_mss)) return -ENOMEM; /* We'll try again later. */ + } else { + tcp_init_tso_segs(sk, skb, cur_mss); } tcp_retrans_try_collapse(sk, skb, cur_mss);