diff options
Diffstat (limited to 'net/ipv4/tcp_ipv4.c')
| -rw-r--r-- | net/ipv4/tcp_ipv4.c | 26 | 
1 files changed, 16 insertions, 10 deletions
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 06d2573685ca..fd365de4d5ff 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c @@ -692,6 +692,7 @@ static void tcp_v4_send_reset(const struct sock *sk, struct sk_buff *skb)  	u64 transmit_time = 0;  	struct sock *ctl_sk;  	struct net *net; +	u32 txhash = 0;  	/* Never send a reset in response to a reset. */  	if (th->rst) @@ -829,6 +830,8 @@ static void tcp_v4_send_reset(const struct sock *sk, struct sk_buff *skb)  				   inet_twsk(sk)->tw_priority : sk->sk_priority;  		transmit_time = tcp_transmit_time(sk);  		xfrm_sk_clone_policy(ctl_sk, sk); +		txhash = (sk->sk_state == TCP_TIME_WAIT) ? +			 inet_twsk(sk)->tw_txhash : sk->sk_txhash;  	} else {  		ctl_sk->sk_mark = 0;  		ctl_sk->sk_priority = 0; @@ -837,7 +840,7 @@ static void tcp_v4_send_reset(const struct sock *sk, struct sk_buff *skb)  			      skb, &TCP_SKB_CB(skb)->header.h4.opt,  			      ip_hdr(skb)->saddr, ip_hdr(skb)->daddr,  			      &arg, arg.iov[0].iov_len, -			      transmit_time); +			      transmit_time, txhash);  	xfrm_sk_free_policy(ctl_sk);  	sock_net_set(ctl_sk, &init_net); @@ -859,7 +862,7 @@ static void tcp_v4_send_ack(const struct sock *sk,  			    struct sk_buff *skb, u32 seq, u32 ack,  			    u32 win, u32 tsval, u32 tsecr, int oif,  			    struct tcp_md5sig_key *key, -			    int reply_flags, u8 tos) +			    int reply_flags, u8 tos, u32 txhash)  {  	const struct tcphdr *th = tcp_hdr(skb);  	struct { @@ -935,7 +938,7 @@ static void tcp_v4_send_ack(const struct sock *sk,  			      skb, &TCP_SKB_CB(skb)->header.h4.opt,  			      ip_hdr(skb)->saddr, ip_hdr(skb)->daddr,  			      &arg, arg.iov[0].iov_len, -			      transmit_time); +			      transmit_time, txhash);  	sock_net_set(ctl_sk, &init_net);  	__TCP_INC_STATS(net, TCP_MIB_OUTSEGS); @@ -955,7 +958,8 @@ static void tcp_v4_timewait_ack(struct sock *sk, struct sk_buff *skb)  			tw->tw_bound_dev_if,  			tcp_twsk_md5_key(tcptw),  			tw->tw_transparent ? IP_REPLY_ARG_NOSRCCHECK : 0, -			tw->tw_tos +			tw->tw_tos, +			tw->tw_txhash  			);  	inet_twsk_put(tw); @@ -988,7 +992,7 @@ static void tcp_v4_reqsk_send_ack(const struct sock *sk, struct sk_buff *skb,  			0,  			tcp_md5_do_lookup(sk, l3index, addr, AF_INET),  			inet_rsk(req)->no_srccheck ? IP_REPLY_ARG_NOSRCCHECK : 0, -			ip_hdr(skb)->tos); +			ip_hdr(skb)->tos, tcp_rsk(req)->txhash);  }  /* @@ -2963,7 +2967,6 @@ static int bpf_iter_tcp_seq_show(struct seq_file *seq, void *v)  	struct bpf_iter_meta meta;  	struct bpf_prog *prog;  	struct sock *sk = v; -	bool slow;  	uid_t uid;  	int ret; @@ -2971,7 +2974,7 @@ static int bpf_iter_tcp_seq_show(struct seq_file *seq, void *v)  		return 0;  	if (sk_fullsock(sk)) -		slow = lock_sock_fast(sk); +		lock_sock(sk);  	if (unlikely(sk_unhashed(sk))) {  		ret = SEQ_SKIP; @@ -2995,7 +2998,7 @@ static int bpf_iter_tcp_seq_show(struct seq_file *seq, void *v)  unlock:  	if (sk_fullsock(sk)) -		unlock_sock_fast(sk, slow); +		release_sock(sk);  	return ret;  } @@ -3113,7 +3116,7 @@ struct proto tcp_prot = {  	.keepalive		= tcp_set_keepalive,  	.recvmsg		= tcp_recvmsg,  	.sendmsg		= tcp_sendmsg, -	.sendpage		= tcp_sendpage, +	.splice_eof		= tcp_splice_eof,  	.backlog_rcv		= tcp_v4_do_rcv,  	.release_cb		= tcp_release_cb,  	.hash			= inet_hash, @@ -3276,6 +3279,9 @@ static int __net_init tcp_sk_init(struct net *net)  	else  		net->ipv4.tcp_congestion_control = &tcp_reno; +	net->ipv4.sysctl_tcp_syn_linear_timeouts = 4; +	net->ipv4.sysctl_tcp_shrink_window = 0; +  	return 0;  } @@ -3356,7 +3362,7 @@ static struct bpf_iter_reg tcp_reg_info = {  	.ctx_arg_info_size	= 1,  	.ctx_arg_info		= {  		{ offsetof(struct bpf_iter__tcp, sk_common), -		  PTR_TO_BTF_ID_OR_NULL }, +		  PTR_TO_BTF_ID_OR_NULL | PTR_TRUSTED },  	},  	.get_func_proto		= bpf_iter_tcp_get_func_proto,  	.seq_info		= &tcp_seq_info,  | 
