|
|
|
@ -550,7 +550,7 @@ static unsigned int tcp_syn_options(struct sock *sk, struct sk_buff *skb,
|
|
|
|
|
|
|
|
|
|
if (likely(sysctl_tcp_timestamps && *md5 == NULL)) {
|
|
|
|
|
opts->options |= OPTION_TS;
|
|
|
|
|
opts->tsval = TCP_SKB_CB(skb)->when + tp->tsoffset;
|
|
|
|
|
opts->tsval = tcp_skb_timestamp(skb) + tp->tsoffset;
|
|
|
|
|
opts->tsecr = tp->rx_opt.ts_recent;
|
|
|
|
|
remaining -= TCPOLEN_TSTAMP_ALIGNED;
|
|
|
|
|
}
|
|
|
|
@ -618,7 +618,7 @@ static unsigned int tcp_synack_options(struct sock *sk,
|
|
|
|
|
}
|
|
|
|
|
if (likely(ireq->tstamp_ok)) {
|
|
|
|
|
opts->options |= OPTION_TS;
|
|
|
|
|
opts->tsval = TCP_SKB_CB(skb)->when;
|
|
|
|
|
opts->tsval = tcp_skb_timestamp(skb);
|
|
|
|
|
opts->tsecr = req->ts_recent;
|
|
|
|
|
remaining -= TCPOLEN_TSTAMP_ALIGNED;
|
|
|
|
|
}
|
|
|
|
@ -647,7 +647,6 @@ static unsigned int tcp_established_options(struct sock *sk, struct sk_buff *skb
|
|
|
|
|
struct tcp_out_options *opts,
|
|
|
|
|
struct tcp_md5sig_key **md5)
|
|
|
|
|
{
|
|
|
|
|
struct tcp_skb_cb *tcb = skb ? TCP_SKB_CB(skb) : NULL;
|
|
|
|
|
struct tcp_sock *tp = tcp_sk(sk);
|
|
|
|
|
unsigned int size = 0;
|
|
|
|
|
unsigned int eff_sacks;
|
|
|
|
@ -666,7 +665,7 @@ static unsigned int tcp_established_options(struct sock *sk, struct sk_buff *skb
|
|
|
|
|
|
|
|
|
|
if (likely(tp->rx_opt.tstamp_ok)) {
|
|
|
|
|
opts->options |= OPTION_TS;
|
|
|
|
|
opts->tsval = tcb ? tcb->when + tp->tsoffset : 0;
|
|
|
|
|
opts->tsval = skb ? tcp_skb_timestamp(skb) + tp->tsoffset : 0;
|
|
|
|
|
opts->tsecr = tp->rx_opt.ts_recent;
|
|
|
|
|
size += TCPOLEN_TSTAMP_ALIGNED;
|
|
|
|
|
}
|
|
|
|
@ -886,8 +885,6 @@ static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it,
|
|
|
|
|
skb = skb_clone(skb, gfp_mask);
|
|
|
|
|
if (unlikely(!skb))
|
|
|
|
|
return -ENOBUFS;
|
|
|
|
|
/* Our usage of tstamp should remain private */
|
|
|
|
|
skb->tstamp.tv64 = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
inet = inet_sk(sk);
|
|
|
|
@ -975,7 +972,10 @@ static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it,
|
|
|
|
|
TCP_ADD_STATS(sock_net(sk), TCP_MIB_OUTSEGS,
|
|
|
|
|
tcp_skb_pcount(skb));
|
|
|
|
|
|
|
|
|
|
/* Our usage of tstamp should remain private */
|
|
|
|
|
skb->tstamp.tv64 = 0;
|
|
|
|
|
err = icsk->icsk_af_ops->queue_xmit(sk, skb, &inet->cork.fl);
|
|
|
|
|
|
|
|
|
|
if (likely(err <= 0))
|
|
|
|
|
return err;
|
|
|
|
|
|
|
|
|
@ -1149,7 +1149,6 @@ int tcp_fragment(struct sock *sk, struct sk_buff *skb, u32 len,
|
|
|
|
|
/* Looks stupid, but our code really uses when of
|
|
|
|
|
* skbs, which it never sent before. --ANK
|
|
|
|
|
*/
|
|
|
|
|
TCP_SKB_CB(buff)->when = TCP_SKB_CB(skb)->when;
|
|
|
|
|
buff->tstamp = skb->tstamp;
|
|
|
|
|
tcp_fragment_tstamp(skb, buff);
|
|
|
|
|
|
|
|
|
@ -1874,8 +1873,8 @@ static int tcp_mtu_probe(struct sock *sk)
|
|
|
|
|
tcp_init_tso_segs(sk, nskb, nskb->len);
|
|
|
|
|
|
|
|
|
|
/* We're ready to send. If this fails, the probe will
|
|
|
|
|
* be resegmented into mss-sized pieces by tcp_write_xmit(). */
|
|
|
|
|
TCP_SKB_CB(nskb)->when = tcp_time_stamp;
|
|
|
|
|
* be resegmented into mss-sized pieces by tcp_write_xmit().
|
|
|
|
|
*/
|
|
|
|
|
if (!tcp_transmit_skb(sk, nskb, 1, GFP_ATOMIC)) {
|
|
|
|
|
/* Decrement cwnd here because we are sending
|
|
|
|
|
* effectively two packets. */
|
|
|
|
@ -1935,8 +1934,8 @@ static bool tcp_write_xmit(struct sock *sk, unsigned int mss_now, int nonagle,
|
|
|
|
|
BUG_ON(!tso_segs);
|
|
|
|
|
|
|
|
|
|
if (unlikely(tp->repair) && tp->repair_queue == TCP_SEND_QUEUE) {
|
|
|
|
|
/* "when" is used as a start point for the retransmit timer */
|
|
|
|
|
TCP_SKB_CB(skb)->when = tcp_time_stamp;
|
|
|
|
|
/* "skb_mstamp" is used as a start point for the retransmit timer */
|
|
|
|
|
skb_mstamp_get(&skb->skb_mstamp);
|
|
|
|
|
goto repair; /* Skip network transmission */
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -2000,8 +1999,6 @@ static bool tcp_write_xmit(struct sock *sk, unsigned int mss_now, int nonagle,
|
|
|
|
|
unlikely(tso_fragment(sk, skb, limit, mss_now, gfp)))
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
TCP_SKB_CB(skb)->when = tcp_time_stamp;
|
|
|
|
|
|
|
|
|
|
if (unlikely(tcp_transmit_skb(sk, skb, 1, gfp)))
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
@ -2499,7 +2496,6 @@ int __tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb)
|
|
|
|
|
/* Make a copy, if the first transmission SKB clone we made
|
|
|
|
|
* is still in somebody's hands, else make a clone.
|
|
|
|
|
*/
|
|
|
|
|
TCP_SKB_CB(skb)->when = tcp_time_stamp;
|
|
|
|
|
|
|
|
|
|
/* make sure skb->data is aligned on arches that require it
|
|
|
|
|
* and check if ack-trimming & collapsing extended the headroom
|
|
|
|
@ -2544,7 +2540,7 @@ int tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb)
|
|
|
|
|
|
|
|
|
|
/* Save stamp of the first retransmit. */
|
|
|
|
|
if (!tp->retrans_stamp)
|
|
|
|
|
tp->retrans_stamp = TCP_SKB_CB(skb)->when;
|
|
|
|
|
tp->retrans_stamp = tcp_skb_timestamp(skb);
|
|
|
|
|
|
|
|
|
|
/* snd_nxt is stored to detect loss of retransmitted segment,
|
|
|
|
|
* see tcp_input.c tcp_sacktag_write_queue().
|
|
|
|
@ -2752,7 +2748,6 @@ void tcp_send_active_reset(struct sock *sk, gfp_t priority)
|
|
|
|
|
tcp_init_nondata_skb(skb, tcp_acceptable_seq(sk),
|
|
|
|
|
TCPHDR_ACK | TCPHDR_RST);
|
|
|
|
|
/* Send it off. */
|
|
|
|
|
TCP_SKB_CB(skb)->when = tcp_time_stamp;
|
|
|
|
|
if (tcp_transmit_skb(sk, skb, 0, priority))
|
|
|
|
|
NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPABORTFAILED);
|
|
|
|
|
|
|
|
|
@ -2791,7 +2786,6 @@ int tcp_send_synack(struct sock *sk)
|
|
|
|
|
TCP_SKB_CB(skb)->tcp_flags |= TCPHDR_ACK;
|
|
|
|
|
TCP_ECN_send_synack(tcp_sk(sk), skb);
|
|
|
|
|
}
|
|
|
|
|
TCP_SKB_CB(skb)->when = tcp_time_stamp;
|
|
|
|
|
return tcp_transmit_skb(sk, skb, 1, GFP_ATOMIC);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -2835,10 +2829,10 @@ struct sk_buff *tcp_make_synack(struct sock *sk, struct dst_entry *dst,
|
|
|
|
|
memset(&opts, 0, sizeof(opts));
|
|
|
|
|
#ifdef CONFIG_SYN_COOKIES
|
|
|
|
|
if (unlikely(req->cookie_ts))
|
|
|
|
|
TCP_SKB_CB(skb)->when = cookie_init_timestamp(req);
|
|
|
|
|
skb->skb_mstamp.stamp_jiffies = cookie_init_timestamp(req);
|
|
|
|
|
else
|
|
|
|
|
#endif
|
|
|
|
|
TCP_SKB_CB(skb)->when = tcp_time_stamp;
|
|
|
|
|
skb_mstamp_get(&skb->skb_mstamp);
|
|
|
|
|
tcp_header_size = tcp_synack_options(sk, req, mss, skb, &opts, &md5,
|
|
|
|
|
foc) + sizeof(*th);
|
|
|
|
|
|
|
|
|
@ -3086,7 +3080,7 @@ int tcp_connect(struct sock *sk)
|
|
|
|
|
skb_reserve(buff, MAX_TCP_HEADER);
|
|
|
|
|
|
|
|
|
|
tcp_init_nondata_skb(buff, tp->write_seq++, TCPHDR_SYN);
|
|
|
|
|
tp->retrans_stamp = TCP_SKB_CB(buff)->when = tcp_time_stamp;
|
|
|
|
|
tp->retrans_stamp = tcp_time_stamp;
|
|
|
|
|
tcp_connect_queue_skb(sk, buff);
|
|
|
|
|
TCP_ECN_send_syn(sk, buff);
|
|
|
|
|
|
|
|
|
@ -3194,7 +3188,7 @@ void tcp_send_ack(struct sock *sk)
|
|
|
|
|
tcp_init_nondata_skb(buff, tcp_acceptable_seq(sk), TCPHDR_ACK);
|
|
|
|
|
|
|
|
|
|
/* Send it off, this clears delayed acks for us. */
|
|
|
|
|
TCP_SKB_CB(buff)->when = tcp_time_stamp;
|
|
|
|
|
skb_mstamp_get(&buff->skb_mstamp);
|
|
|
|
|
tcp_transmit_skb(sk, buff, 0, sk_gfp_atomic(sk, GFP_ATOMIC));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -3226,7 +3220,7 @@ static int tcp_xmit_probe_skb(struct sock *sk, int urgent)
|
|
|
|
|
* send it.
|
|
|
|
|
*/
|
|
|
|
|
tcp_init_nondata_skb(skb, tp->snd_una - !urgent, TCPHDR_ACK);
|
|
|
|
|
TCP_SKB_CB(skb)->when = tcp_time_stamp;
|
|
|
|
|
skb_mstamp_get(&skb->skb_mstamp);
|
|
|
|
|
return tcp_transmit_skb(sk, skb, 0, GFP_ATOMIC);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -3270,7 +3264,6 @@ int tcp_write_wakeup(struct sock *sk)
|
|
|
|
|
tcp_set_skb_tso_segs(sk, skb, mss);
|
|
|
|
|
|
|
|
|
|
TCP_SKB_CB(skb)->tcp_flags |= TCPHDR_PSH;
|
|
|
|
|
TCP_SKB_CB(skb)->when = tcp_time_stamp;
|
|
|
|
|
err = tcp_transmit_skb(sk, skb, 1, GFP_ATOMIC);
|
|
|
|
|
if (!err)
|
|
|
|
|
tcp_event_new_data_sent(sk, skb);
|
|
|
|
|