aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
Diffstat (limited to 'net')
-rw-r--r--net/ipv4/tcp_output.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
index 7d076f0db100..3ed6fc15815b 100644
--- a/net/ipv4/tcp_output.c
+++ b/net/ipv4/tcp_output.c
@@ -1370,15 +1370,21 @@ int tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb)
1370 1370
1371 if (skb->len > cur_mss) { 1371 if (skb->len > cur_mss) {
1372 int old_factor = tcp_skb_pcount(skb); 1372 int old_factor = tcp_skb_pcount(skb);
1373 int new_factor; 1373 int diff;
1374 1374
1375 if (tcp_fragment(sk, skb, cur_mss, cur_mss)) 1375 if (tcp_fragment(sk, skb, cur_mss, cur_mss))
1376 return -ENOMEM; /* We'll try again later. */ 1376 return -ENOMEM; /* We'll try again later. */
1377 1377
1378 /* New SKB created, account for it. */ 1378 /* New SKB created, account for it. */
1379 new_factor = tcp_skb_pcount(skb); 1379 diff = old_factor - tcp_skb_pcount(skb) -
1380 tp->packets_out -= old_factor - new_factor; 1380 tcp_skb_pcount(skb->next);
1381 tp->packets_out += tcp_skb_pcount(skb->next); 1381 tp->packets_out -= diff;
1382
1383 if (diff > 0) {
1384 tp->fackets_out -= diff;
1385 if ((int)tp->fackets_out < 0)
1386 tp->fackets_out = 0;
1387 }
1382 } 1388 }
1383 1389
1384 /* Collapse two adjacent packets if worthwhile and we can. */ 1390 /* Collapse two adjacent packets if worthwhile and we can. */