|
@@ -361,6 +361,7 @@ static inline int tcp_urg_mode(const struct tcp_sock *tp)
|
|
#define OPTION_SACK_ADVERTISE (1 << 0)
|
|
#define OPTION_SACK_ADVERTISE (1 << 0)
|
|
#define OPTION_TS (1 << 1)
|
|
#define OPTION_TS (1 << 1)
|
|
#define OPTION_MD5 (1 << 2)
|
|
#define OPTION_MD5 (1 << 2)
|
|
|
|
+#define OPTION_WSCALE (1 << 3)
|
|
|
|
|
|
struct tcp_out_options {
|
|
struct tcp_out_options {
|
|
u8 options; /* bit field of OPTION_* */
|
|
u8 options; /* bit field of OPTION_* */
|
|
@@ -427,7 +428,7 @@ static void tcp_options_write(__be32 *ptr, struct tcp_sock *tp,
|
|
TCPOLEN_SACK_PERM);
|
|
TCPOLEN_SACK_PERM);
|
|
}
|
|
}
|
|
|
|
|
|
- if (unlikely(opts->ws)) {
|
|
|
|
|
|
+ if (unlikely(OPTION_WSCALE & opts->options)) {
|
|
*ptr++ = htonl((TCPOPT_NOP << 24) |
|
|
*ptr++ = htonl((TCPOPT_NOP << 24) |
|
|
(TCPOPT_WINDOW << 16) |
|
|
(TCPOPT_WINDOW << 16) |
|
|
(TCPOLEN_WINDOW << 8) |
|
|
(TCPOLEN_WINDOW << 8) |
|
|
@@ -494,8 +495,8 @@ static unsigned tcp_syn_options(struct sock *sk, struct sk_buff *skb,
|
|
}
|
|
}
|
|
if (likely(sysctl_tcp_window_scaling)) {
|
|
if (likely(sysctl_tcp_window_scaling)) {
|
|
opts->ws = tp->rx_opt.rcv_wscale;
|
|
opts->ws = tp->rx_opt.rcv_wscale;
|
|
- if (likely(opts->ws))
|
|
|
|
- size += TCPOLEN_WSCALE_ALIGNED;
|
|
|
|
|
|
+ opts->options |= OPTION_WSCALE;
|
|
|
|
+ size += TCPOLEN_WSCALE_ALIGNED;
|
|
}
|
|
}
|
|
if (likely(sysctl_tcp_sack)) {
|
|
if (likely(sysctl_tcp_sack)) {
|
|
opts->options |= OPTION_SACK_ADVERTISE;
|
|
opts->options |= OPTION_SACK_ADVERTISE;
|
|
@@ -537,8 +538,8 @@ static unsigned tcp_synack_options(struct sock *sk,
|
|
|
|
|
|
if (likely(ireq->wscale_ok)) {
|
|
if (likely(ireq->wscale_ok)) {
|
|
opts->ws = ireq->rcv_wscale;
|
|
opts->ws = ireq->rcv_wscale;
|
|
- if (likely(opts->ws))
|
|
|
|
- size += TCPOLEN_WSCALE_ALIGNED;
|
|
|
|
|
|
+ opts->options |= OPTION_WSCALE;
|
|
|
|
+ size += TCPOLEN_WSCALE_ALIGNED;
|
|
}
|
|
}
|
|
if (likely(doing_ts)) {
|
|
if (likely(doing_ts)) {
|
|
opts->options |= OPTION_TS;
|
|
opts->options |= OPTION_TS;
|