diff options
| -rw-r--r-- | include/linux/rtnetlink.h | 2 | ||||
| -rw-r--r-- | net/ipv4/tcp_input.c | 3 | ||||
| -rw-r--r-- | net/ipv4/tcp_output.c | 4 |
3 files changed, 6 insertions, 3 deletions
diff --git a/include/linux/rtnetlink.h b/include/linux/rtnetlink.h index adf2068d12b5..9c802a6b04d3 100644 --- a/include/linux/rtnetlink.h +++ b/include/linux/rtnetlink.h | |||
| @@ -377,7 +377,7 @@ enum | |||
| 377 | #define RTAX_MAX (__RTAX_MAX - 1) | 377 | #define RTAX_MAX (__RTAX_MAX - 1) |
| 378 | 378 | ||
| 379 | #define RTAX_FEATURE_ECN 0x00000001 | 379 | #define RTAX_FEATURE_ECN 0x00000001 |
| 380 | #define RTAX_FEATURE_SACK 0x00000002 | 380 | #define RTAX_FEATURE_NO_SACK 0x00000002 |
| 381 | #define RTAX_FEATURE_TIMESTAMP 0x00000004 | 381 | #define RTAX_FEATURE_TIMESTAMP 0x00000004 |
| 382 | #define RTAX_FEATURE_ALLFRAG 0x00000008 | 382 | #define RTAX_FEATURE_ALLFRAG 0x00000008 |
| 383 | 383 | ||
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index c7625005486d..5fb25f977451 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
| @@ -3763,7 +3763,8 @@ void tcp_parse_options(struct sk_buff *skb, struct tcp_options_received *opt_rx, | |||
| 3763 | break; | 3763 | break; |
| 3764 | case TCPOPT_SACK_PERM: | 3764 | case TCPOPT_SACK_PERM: |
| 3765 | if (opsize == TCPOLEN_SACK_PERM && th->syn && | 3765 | if (opsize == TCPOLEN_SACK_PERM && th->syn && |
| 3766 | !estab && sysctl_tcp_sack) { | 3766 | !estab && sysctl_tcp_sack && |
| 3767 | !dst_feature(dst, RTAX_FEATURE_NO_SACK)) { | ||
| 3767 | opt_rx->sack_ok = 1; | 3768 | opt_rx->sack_ok = 1; |
| 3768 | tcp_sack_reset(opt_rx); | 3769 | tcp_sack_reset(opt_rx); |
| 3769 | } | 3770 | } |
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index 2e2eb74ac4cc..b35802af3c4c 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c | |||
| @@ -464,6 +464,7 @@ static unsigned tcp_syn_options(struct sock *sk, struct sk_buff *skb, | |||
| 464 | struct tcp_md5sig_key **md5) { | 464 | struct tcp_md5sig_key **md5) { |
| 465 | struct tcp_sock *tp = tcp_sk(sk); | 465 | struct tcp_sock *tp = tcp_sk(sk); |
| 466 | unsigned size = 0; | 466 | unsigned size = 0; |
| 467 | struct dst_entry *dst = __sk_dst_get(sk); | ||
| 467 | 468 | ||
| 468 | #ifdef CONFIG_TCP_MD5SIG | 469 | #ifdef CONFIG_TCP_MD5SIG |
| 469 | *md5 = tp->af_specific->md5_lookup(sk, sk); | 470 | *md5 = tp->af_specific->md5_lookup(sk, sk); |
| @@ -498,7 +499,8 @@ static unsigned tcp_syn_options(struct sock *sk, struct sk_buff *skb, | |||
| 498 | opts->options |= OPTION_WSCALE; | 499 | opts->options |= OPTION_WSCALE; |
| 499 | size += TCPOLEN_WSCALE_ALIGNED; | 500 | size += TCPOLEN_WSCALE_ALIGNED; |
| 500 | } | 501 | } |
| 501 | if (likely(sysctl_tcp_sack)) { | 502 | if (likely(sysctl_tcp_sack && |
| 503 | !dst_feature(dst, RTAX_FEATURE_NO_SACK))) { | ||
| 502 | opts->options |= OPTION_SACK_ADVERTISE; | 504 | opts->options |= OPTION_SACK_ADVERTISE; |
| 503 | if (unlikely(!(OPTION_TS & opts->options))) | 505 | if (unlikely(!(OPTION_TS & opts->options))) |
| 504 | size += TCPOLEN_SACKPERM_ALIGNED; | 506 | size += TCPOLEN_SACKPERM_ALIGNED; |
