diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/ipv4/tcp_output.c | 14 |
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. */ |