aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/tcp_output.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv4/tcp_output.c')
-rw-r--r--net/ipv4/tcp_output.c32
1 files changed, 12 insertions, 20 deletions
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
index 7a4834a2ae84..1ca638b83168 100644
--- a/net/ipv4/tcp_output.c
+++ b/net/ipv4/tcp_output.c
@@ -61,29 +61,22 @@ int sysctl_tcp_base_mss __read_mostly = 512;
61/* By default, RFC2861 behavior. */ 61/* By default, RFC2861 behavior. */
62int sysctl_tcp_slow_start_after_idle __read_mostly = 1; 62int sysctl_tcp_slow_start_after_idle __read_mostly = 1;
63 63
64static inline void tcp_packets_out_inc(struct sock *sk, 64static void tcp_event_new_data_sent(struct sock *sk, struct sk_buff *skb)
65 const struct sk_buff *skb)
66{
67 struct tcp_sock *tp = tcp_sk(sk);
68 int orig = tp->packets_out;
69
70 tp->packets_out += tcp_skb_pcount(skb);
71 if (!orig)
72 inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS,
73 inet_csk(sk)->icsk_rto, TCP_RTO_MAX);
74}
75
76static void update_send_head(struct sock *sk, struct sk_buff *skb)
77{ 65{
78 struct tcp_sock *tp = tcp_sk(sk); 66 struct tcp_sock *tp = tcp_sk(sk);
67 unsigned int prior_packets = tp->packets_out;
79 68
80 tcp_advance_send_head(sk, skb); 69 tcp_advance_send_head(sk, skb);
81 tp->snd_nxt = TCP_SKB_CB(skb)->end_seq; 70 tp->snd_nxt = TCP_SKB_CB(skb)->end_seq;
82 tcp_packets_out_inc(sk, skb);
83 71
84 /* Don't override Nagle indefinately with F-RTO */ 72 /* Don't override Nagle indefinately with F-RTO */
85 if (tp->frto_counter == 2) 73 if (tp->frto_counter == 2)
86 tp->frto_counter = 3; 74 tp->frto_counter = 3;
75
76 tp->packets_out += tcp_skb_pcount(skb);
77 if (!prior_packets)
78 inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS,
79 inet_csk(sk)->icsk_rto, TCP_RTO_MAX);
87} 80}
88 81
89/* SND.NXT, if window was not shrunk. 82/* SND.NXT, if window was not shrunk.
@@ -1410,7 +1403,7 @@ static int tcp_mtu_probe(struct sock *sk)
1410 /* Decrement cwnd here because we are sending 1403 /* Decrement cwnd here because we are sending
1411 * effectively two packets. */ 1404 * effectively two packets. */
1412 tp->snd_cwnd--; 1405 tp->snd_cwnd--;
1413 update_send_head(sk, nskb); 1406 tcp_event_new_data_sent(sk, nskb);
1414 1407
1415 icsk->icsk_mtup.probe_size = tcp_mss_to_mtu(sk, nskb->len); 1408 icsk->icsk_mtup.probe_size = tcp_mss_to_mtu(sk, nskb->len);
1416 tp->mtu_probe.probe_seq_start = TCP_SKB_CB(nskb)->seq; 1409 tp->mtu_probe.probe_seq_start = TCP_SKB_CB(nskb)->seq;
@@ -1494,7 +1487,7 @@ static int tcp_write_xmit(struct sock *sk, unsigned int mss_now, int nonagle)
1494 /* Advance the send_head. This one is sent out. 1487 /* Advance the send_head. This one is sent out.
1495 * This call will increment packets_out. 1488 * This call will increment packets_out.
1496 */ 1489 */
1497 update_send_head(sk, skb); 1490 tcp_event_new_data_sent(sk, skb);
1498 1491
1499 tcp_minshall_update(tp, mss_now, skb); 1492 tcp_minshall_update(tp, mss_now, skb);
1500 sent_pkts++; 1493 sent_pkts++;
@@ -1553,7 +1546,7 @@ void tcp_push_one(struct sock *sk, unsigned int mss_now)
1553 TCP_SKB_CB(skb)->when = tcp_time_stamp; 1546 TCP_SKB_CB(skb)->when = tcp_time_stamp;
1554 1547
1555 if (likely(!tcp_transmit_skb(sk, skb, 1, sk->sk_allocation))) { 1548 if (likely(!tcp_transmit_skb(sk, skb, 1, sk->sk_allocation))) {
1556 update_send_head(sk, skb); 1549 tcp_event_new_data_sent(sk, skb);
1557 tcp_cwnd_validate(sk); 1550 tcp_cwnd_validate(sk);
1558 return; 1551 return;
1559 } 1552 }
@@ -2528,9 +2521,8 @@ int tcp_write_wakeup(struct sock *sk)
2528 TCP_SKB_CB(skb)->flags |= TCPCB_FLAG_PSH; 2521 TCP_SKB_CB(skb)->flags |= TCPCB_FLAG_PSH;
2529 TCP_SKB_CB(skb)->when = tcp_time_stamp; 2522 TCP_SKB_CB(skb)->when = tcp_time_stamp;
2530 err = tcp_transmit_skb(sk, skb, 1, GFP_ATOMIC); 2523 err = tcp_transmit_skb(sk, skb, 1, GFP_ATOMIC);
2531 if (!err) { 2524 if (!err)
2532 update_send_head(sk, skb); 2525 tcp_event_new_data_sent(sk, skb);
2533 }
2534 return err; 2526 return err;
2535 } else { 2527 } else {
2536 if (tp->urg_mode && 2528 if (tp->urg_mode &&