diff options
Diffstat (limited to 'net/ipv4/tcp_ipv4.c')
| -rw-r--r-- | net/ipv4/tcp_ipv4.c | 23 | 
1 files changed, 21 insertions, 2 deletions
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 595dcc3afac5..58207c7769d0 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c @@ -1445,9 +1445,15 @@ static void tcp_v4_init_req(struct request_sock *req,  }  static struct dst_entry *tcp_v4_route_req(const struct sock *sk, +					  struct sk_buff *skb,  					  struct flowi *fl, -					  const struct request_sock *req) +					  struct request_sock *req)  { +	tcp_v4_init_req(req, sk, skb); + +	if (security_inet_conn_request(sk, skb, req)) +		return NULL; +  	return inet_csk_route_req(sk, &fl->u.ip4, req);  } @@ -1467,7 +1473,6 @@ const struct tcp_request_sock_ops tcp_request_sock_ipv4_ops = {  	.req_md5_lookup	=	tcp_v4_md5_lookup,  	.calc_md5_hash	=	tcp_v4_md5_hash_skb,  #endif -	.init_req	=	tcp_v4_init_req,  #ifdef CONFIG_SYN_COOKIES  	.cookie_init_seq =	cookie_v4_init_sequence,  #endif @@ -2759,6 +2764,20 @@ void tcp4_proc_exit(void)  }  #endif /* CONFIG_PROC_FS */ +/* @wake is one when sk_stream_write_space() calls us. + * This sends EPOLLOUT only if notsent_bytes is half the limit. + * This mimics the strategy used in sock_def_write_space(). + */ +bool tcp_stream_memory_free(const struct sock *sk, int wake) +{ +	const struct tcp_sock *tp = tcp_sk(sk); +	u32 notsent_bytes = READ_ONCE(tp->write_seq) - +			    READ_ONCE(tp->snd_nxt); + +	return (notsent_bytes << wake) < tcp_notsent_lowat(tp); +} +EXPORT_SYMBOL(tcp_stream_memory_free); +  struct proto tcp_prot = {  	.name			= "TCP",  	.owner			= THIS_MODULE,  | 
