|
@@ -76,9 +76,6 @@
|
|
|
#include <asm/unaligned.h>
|
|
|
#include <linux/errqueue.h>
|
|
|
|
|
|
-int sysctl_tcp_timestamps __read_mostly = 1;
|
|
|
-int sysctl_tcp_window_scaling __read_mostly = 1;
|
|
|
-int sysctl_tcp_sack __read_mostly = 1;
|
|
|
int sysctl_tcp_fack __read_mostly;
|
|
|
int sysctl_tcp_max_reordering __read_mostly = 300;
|
|
|
int sysctl_tcp_dsack __read_mostly = 1;
|
|
@@ -3724,7 +3721,8 @@ static void tcp_parse_fastopen_option(int len, const unsigned char *cookie,
|
|
|
* But, this can also be called on packets in the established flow when
|
|
|
* the fast version below fails.
|
|
|
*/
|
|
|
-void tcp_parse_options(const struct sk_buff *skb,
|
|
|
+void tcp_parse_options(const struct net *net,
|
|
|
+ const struct sk_buff *skb,
|
|
|
struct tcp_options_received *opt_rx, int estab,
|
|
|
struct tcp_fastopen_cookie *foc)
|
|
|
{
|
|
@@ -3765,7 +3763,7 @@ void tcp_parse_options(const struct sk_buff *skb,
|
|
|
break;
|
|
|
case TCPOPT_WINDOW:
|
|
|
if (opsize == TCPOLEN_WINDOW && th->syn &&
|
|
|
- !estab && sysctl_tcp_window_scaling) {
|
|
|
+ !estab && net->ipv4.sysctl_tcp_window_scaling) {
|
|
|
__u8 snd_wscale = *(__u8 *)ptr;
|
|
|
opt_rx->wscale_ok = 1;
|
|
|
if (snd_wscale > TCP_MAX_WSCALE) {
|
|
@@ -3781,7 +3779,7 @@ void tcp_parse_options(const struct sk_buff *skb,
|
|
|
case TCPOPT_TIMESTAMP:
|
|
|
if ((opsize == TCPOLEN_TIMESTAMP) &&
|
|
|
((estab && opt_rx->tstamp_ok) ||
|
|
|
- (!estab && sysctl_tcp_timestamps))) {
|
|
|
+ (!estab && net->ipv4.sysctl_tcp_timestamps))) {
|
|
|
opt_rx->saw_tstamp = 1;
|
|
|
opt_rx->rcv_tsval = get_unaligned_be32(ptr);
|
|
|
opt_rx->rcv_tsecr = get_unaligned_be32(ptr + 4);
|
|
@@ -3789,7 +3787,7 @@ void tcp_parse_options(const struct sk_buff *skb,
|
|
|
break;
|
|
|
case TCPOPT_SACK_PERM:
|
|
|
if (opsize == TCPOLEN_SACK_PERM && th->syn &&
|
|
|
- !estab && sysctl_tcp_sack) {
|
|
|
+ !estab && net->ipv4.sysctl_tcp_sack) {
|
|
|
opt_rx->sack_ok = TCP_SACK_SEEN;
|
|
|
tcp_sack_reset(opt_rx);
|
|
|
}
|
|
@@ -3858,7 +3856,8 @@ static bool tcp_parse_aligned_timestamp(struct tcp_sock *tp, const struct tcphdr
|
|
|
/* Fast parse options. This hopes to only see timestamps.
|
|
|
* If it is wrong it falls back on tcp_parse_options().
|
|
|
*/
|
|
|
-static bool tcp_fast_parse_options(const struct sk_buff *skb,
|
|
|
+static bool tcp_fast_parse_options(const struct net *net,
|
|
|
+ const struct sk_buff *skb,
|
|
|
const struct tcphdr *th, struct tcp_sock *tp)
|
|
|
{
|
|
|
/* In the spirit of fast parsing, compare doff directly to constant
|
|
@@ -3873,7 +3872,7 @@ static bool tcp_fast_parse_options(const struct sk_buff *skb,
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
- tcp_parse_options(skb, &tp->rx_opt, 1, NULL);
|
|
|
+ tcp_parse_options(net, skb, &tp->rx_opt, 1, NULL);
|
|
|
if (tp->rx_opt.saw_tstamp && tp->rx_opt.rcv_tsecr)
|
|
|
tp->rx_opt.rcv_tsecr -= tp->tsoffset;
|
|
|
|
|
@@ -5234,7 +5233,8 @@ static bool tcp_validate_incoming(struct sock *sk, struct sk_buff *skb,
|
|
|
bool rst_seq_match = false;
|
|
|
|
|
|
/* RFC1323: H1. Apply PAWS check first. */
|
|
|
- if (tcp_fast_parse_options(skb, th, tp) && tp->rx_opt.saw_tstamp &&
|
|
|
+ if (tcp_fast_parse_options(sock_net(sk), skb, th, tp) &&
|
|
|
+ tp->rx_opt.saw_tstamp &&
|
|
|
tcp_paws_discard(sk, skb)) {
|
|
|
if (!th->rst) {
|
|
|
NET_INC_STATS(sock_net(sk), LINUX_MIB_PAWSESTABREJECTED);
|
|
@@ -5605,7 +5605,7 @@ static bool tcp_rcv_fastopen_synack(struct sock *sk, struct sk_buff *synack,
|
|
|
/* Get original SYNACK MSS value if user MSS sets mss_clamp */
|
|
|
tcp_clear_options(&opt);
|
|
|
opt.user_mss = opt.mss_clamp = 0;
|
|
|
- tcp_parse_options(synack, &opt, 0, NULL);
|
|
|
+ tcp_parse_options(sock_net(sk), synack, &opt, 0, NULL);
|
|
|
mss = opt.mss_clamp;
|
|
|
}
|
|
|
|
|
@@ -5659,7 +5659,7 @@ static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb,
|
|
|
int saved_clamp = tp->rx_opt.mss_clamp;
|
|
|
bool fastopen_fail;
|
|
|
|
|
|
- tcp_parse_options(skb, &tp->rx_opt, 0, &foc);
|
|
|
+ tcp_parse_options(sock_net(sk), skb, &tp->rx_opt, 0, &foc);
|
|
|
if (tp->rx_opt.saw_tstamp && tp->rx_opt.rcv_tsecr)
|
|
|
tp->rx_opt.rcv_tsecr -= tp->tsoffset;
|
|
|
|
|
@@ -6332,7 +6332,8 @@ int tcp_conn_request(struct request_sock_ops *rsk_ops,
|
|
|
tcp_clear_options(&tmp_opt);
|
|
|
tmp_opt.mss_clamp = af_ops->mss_clamp;
|
|
|
tmp_opt.user_mss = tp->rx_opt.user_mss;
|
|
|
- tcp_parse_options(skb, &tmp_opt, 0, want_cookie ? NULL : &foc);
|
|
|
+ tcp_parse_options(sock_net(sk), skb, &tmp_opt, 0,
|
|
|
+ want_cookie ? NULL : &foc);
|
|
|
|
|
|
if (want_cookie && !tmp_opt.saw_tstamp)
|
|
|
tcp_clear_options(&tmp_opt);
|
|
@@ -6350,7 +6351,7 @@ int tcp_conn_request(struct request_sock_ops *rsk_ops,
|
|
|
goto drop_and_free;
|
|
|
|
|
|
if (tmp_opt.tstamp_ok)
|
|
|
- tcp_rsk(req)->ts_off = af_ops->init_ts_off(skb);
|
|
|
+ tcp_rsk(req)->ts_off = af_ops->init_ts_off(net, skb);
|
|
|
|
|
|
if (!want_cookie && !isn) {
|
|
|
/* Kill the following clause, if you dislike this way. */
|