diff options
Diffstat (limited to 'net/ipv4/tcp_output.c')
-rw-r--r-- | net/ipv4/tcp_output.c | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index 5d451593ef16..e2b4461074da 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c | |||
@@ -314,7 +314,7 @@ static inline void TCP_ECN_send_syn(struct sock *sk, struct sk_buff *skb) | |||
314 | struct tcp_sock *tp = tcp_sk(sk); | 314 | struct tcp_sock *tp = tcp_sk(sk); |
315 | 315 | ||
316 | tp->ecn_flags = 0; | 316 | tp->ecn_flags = 0; |
317 | if (sysctl_tcp_ecn == 1) { | 317 | if (sock_net(sk)->ipv4.sysctl_tcp_ecn == 1) { |
318 | TCP_SKB_CB(skb)->tcp_flags |= TCPHDR_ECE | TCPHDR_CWR; | 318 | TCP_SKB_CB(skb)->tcp_flags |= TCPHDR_ECE | TCPHDR_CWR; |
319 | tp->ecn_flags = TCP_ECN_OK; | 319 | tp->ecn_flags = TCP_ECN_OK; |
320 | } | 320 | } |
@@ -622,7 +622,7 @@ static unsigned int tcp_syn_options(struct sock *sk, struct sk_buff *skb, | |||
622 | 622 | ||
623 | if (likely(sysctl_tcp_timestamps && *md5 == NULL)) { | 623 | if (likely(sysctl_tcp_timestamps && *md5 == NULL)) { |
624 | opts->options |= OPTION_TS; | 624 | opts->options |= OPTION_TS; |
625 | opts->tsval = TCP_SKB_CB(skb)->when; | 625 | opts->tsval = TCP_SKB_CB(skb)->when + tp->tsoffset; |
626 | opts->tsecr = tp->rx_opt.ts_recent; | 626 | opts->tsecr = tp->rx_opt.ts_recent; |
627 | remaining -= TCPOLEN_TSTAMP_ALIGNED; | 627 | remaining -= TCPOLEN_TSTAMP_ALIGNED; |
628 | } | 628 | } |
@@ -806,7 +806,7 @@ static unsigned int tcp_established_options(struct sock *sk, struct sk_buff *skb | |||
806 | 806 | ||
807 | if (likely(tp->rx_opt.tstamp_ok)) { | 807 | if (likely(tp->rx_opt.tstamp_ok)) { |
808 | opts->options |= OPTION_TS; | 808 | opts->options |= OPTION_TS; |
809 | opts->tsval = tcb ? tcb->when : 0; | 809 | opts->tsval = tcb ? tcb->when + tp->tsoffset : 0; |
810 | opts->tsecr = tp->rx_opt.ts_recent; | 810 | opts->tsecr = tp->rx_opt.ts_recent; |
811 | size += TCPOLEN_TSTAMP_ALIGNED; | 811 | size += TCPOLEN_TSTAMP_ALIGNED; |
812 | } | 812 | } |
@@ -1331,7 +1331,7 @@ static void __pskb_trim_head(struct sk_buff *skb, int len) | |||
1331 | /* Remove acked data from a packet in the transmit queue. */ | 1331 | /* Remove acked data from a packet in the transmit queue. */ |
1332 | int tcp_trim_head(struct sock *sk, struct sk_buff *skb, u32 len) | 1332 | int tcp_trim_head(struct sock *sk, struct sk_buff *skb, u32 len) |
1333 | { | 1333 | { |
1334 | if (skb_cloned(skb) && pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) | 1334 | if (skb_unclone(skb, GFP_ATOMIC)) |
1335 | return -ENOMEM; | 1335 | return -ENOMEM; |
1336 | 1336 | ||
1337 | __pskb_trim_head(skb, len); | 1337 | __pskb_trim_head(skb, len); |
@@ -1351,8 +1351,8 @@ int tcp_trim_head(struct sock *sk, struct sk_buff *skb, u32 len) | |||
1351 | return 0; | 1351 | return 0; |
1352 | } | 1352 | } |
1353 | 1353 | ||
1354 | /* Calculate MSS. Not accounting for SACKs here. */ | 1354 | /* Calculate MSS not accounting any TCP options. */ |
1355 | int tcp_mtu_to_mss(struct sock *sk, int pmtu) | 1355 | static inline int __tcp_mtu_to_mss(struct sock *sk, int pmtu) |
1356 | { | 1356 | { |
1357 | const struct tcp_sock *tp = tcp_sk(sk); | 1357 | const struct tcp_sock *tp = tcp_sk(sk); |
1358 | const struct inet_connection_sock *icsk = inet_csk(sk); | 1358 | const struct inet_connection_sock *icsk = inet_csk(sk); |
@@ -1381,13 +1381,17 @@ int tcp_mtu_to_mss(struct sock *sk, int pmtu) | |||
1381 | /* Then reserve room for full set of TCP options and 8 bytes of data */ | 1381 | /* Then reserve room for full set of TCP options and 8 bytes of data */ |
1382 | if (mss_now < 48) | 1382 | if (mss_now < 48) |
1383 | mss_now = 48; | 1383 | mss_now = 48; |
1384 | |||
1385 | /* Now subtract TCP options size, not including SACKs */ | ||
1386 | mss_now -= tp->tcp_header_len - sizeof(struct tcphdr); | ||
1387 | |||
1388 | return mss_now; | 1384 | return mss_now; |
1389 | } | 1385 | } |
1390 | 1386 | ||
1387 | /* Calculate MSS. Not accounting for SACKs here. */ | ||
1388 | int tcp_mtu_to_mss(struct sock *sk, int pmtu) | ||
1389 | { | ||
1390 | /* Subtract TCP options size, not including SACKs */ | ||
1391 | return __tcp_mtu_to_mss(sk, pmtu) - | ||
1392 | (tcp_sk(sk)->tcp_header_len - sizeof(struct tcphdr)); | ||
1393 | } | ||
1394 | |||
1391 | /* Inverse of above */ | 1395 | /* Inverse of above */ |
1392 | int tcp_mss_to_mtu(struct sock *sk, int mss) | 1396 | int tcp_mss_to_mtu(struct sock *sk, int mss) |
1393 | { | 1397 | { |
@@ -2930,7 +2934,7 @@ static int tcp_send_syn_data(struct sock *sk, struct sk_buff *syn) | |||
2930 | */ | 2934 | */ |
2931 | if (tp->rx_opt.user_mss && tp->rx_opt.user_mss < tp->rx_opt.mss_clamp) | 2935 | if (tp->rx_opt.user_mss && tp->rx_opt.user_mss < tp->rx_opt.mss_clamp) |
2932 | tp->rx_opt.mss_clamp = tp->rx_opt.user_mss; | 2936 | tp->rx_opt.mss_clamp = tp->rx_opt.user_mss; |
2933 | space = tcp_mtu_to_mss(sk, inet_csk(sk)->icsk_pmtu_cookie) - | 2937 | space = __tcp_mtu_to_mss(sk, inet_csk(sk)->icsk_pmtu_cookie) - |
2934 | MAX_TCP_OPTION_SPACE; | 2938 | MAX_TCP_OPTION_SPACE; |
2935 | 2939 | ||
2936 | syn_data = skb_copy_expand(syn, skb_headroom(syn), space, | 2940 | syn_data = skb_copy_expand(syn, skb_headroom(syn), space, |