162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * SUCS NET3: 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Generic stream handling routines. These are generic for most 662306a36Sopenharmony_ci * protocols. Even IP. Tonight 8-). 762306a36Sopenharmony_ci * This is used because TCP, LLC (others too) layer all have mostly 862306a36Sopenharmony_ci * identical sendmsg() and recvmsg() code. 962306a36Sopenharmony_ci * So we (will) share it here. 1062306a36Sopenharmony_ci * 1162306a36Sopenharmony_ci * Authors: Arnaldo Carvalho de Melo <acme@conectiva.com.br> 1262306a36Sopenharmony_ci * (from old tcp.c code) 1362306a36Sopenharmony_ci * Alan Cox <alan@lxorguk.ukuu.org.uk> (Borrowed comments 8-)) 1462306a36Sopenharmony_ci */ 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#include <linux/module.h> 1762306a36Sopenharmony_ci#include <linux/sched/signal.h> 1862306a36Sopenharmony_ci#include <linux/net.h> 1962306a36Sopenharmony_ci#include <linux/signal.h> 2062306a36Sopenharmony_ci#include <linux/tcp.h> 2162306a36Sopenharmony_ci#include <linux/wait.h> 2262306a36Sopenharmony_ci#include <net/sock.h> 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci/** 2562306a36Sopenharmony_ci * sk_stream_write_space - stream socket write_space callback. 2662306a36Sopenharmony_ci * @sk: socket 2762306a36Sopenharmony_ci * 2862306a36Sopenharmony_ci * FIXME: write proper description 2962306a36Sopenharmony_ci */ 3062306a36Sopenharmony_civoid sk_stream_write_space(struct sock *sk) 3162306a36Sopenharmony_ci{ 3262306a36Sopenharmony_ci struct socket *sock = sk->sk_socket; 3362306a36Sopenharmony_ci struct socket_wq *wq; 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci if (__sk_stream_is_writeable(sk, 1) && sock) { 3662306a36Sopenharmony_ci clear_bit(SOCK_NOSPACE, &sock->flags); 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci rcu_read_lock(); 3962306a36Sopenharmony_ci wq = rcu_dereference(sk->sk_wq); 4062306a36Sopenharmony_ci if (skwq_has_sleeper(wq)) 4162306a36Sopenharmony_ci wake_up_interruptible_poll(&wq->wait, EPOLLOUT | 4262306a36Sopenharmony_ci EPOLLWRNORM | EPOLLWRBAND); 4362306a36Sopenharmony_ci if (wq && wq->fasync_list && !(sk->sk_shutdown & SEND_SHUTDOWN)) 4462306a36Sopenharmony_ci sock_wake_async(wq, SOCK_WAKE_SPACE, POLL_OUT); 4562306a36Sopenharmony_ci rcu_read_unlock(); 4662306a36Sopenharmony_ci } 4762306a36Sopenharmony_ci} 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci/** 5062306a36Sopenharmony_ci * sk_stream_wait_connect - Wait for a socket to get into the connected state 5162306a36Sopenharmony_ci * @sk: sock to wait on 5262306a36Sopenharmony_ci * @timeo_p: for how long to wait 5362306a36Sopenharmony_ci * 5462306a36Sopenharmony_ci * Must be called with the socket locked. 5562306a36Sopenharmony_ci */ 5662306a36Sopenharmony_ciint sk_stream_wait_connect(struct sock *sk, long *timeo_p) 5762306a36Sopenharmony_ci{ 5862306a36Sopenharmony_ci DEFINE_WAIT_FUNC(wait, woken_wake_function); 5962306a36Sopenharmony_ci struct task_struct *tsk = current; 6062306a36Sopenharmony_ci int done; 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci do { 6362306a36Sopenharmony_ci int err = sock_error(sk); 6462306a36Sopenharmony_ci if (err) 6562306a36Sopenharmony_ci return err; 6662306a36Sopenharmony_ci if ((1 << sk->sk_state) & ~(TCPF_SYN_SENT | TCPF_SYN_RECV)) 6762306a36Sopenharmony_ci return -EPIPE; 6862306a36Sopenharmony_ci if (!*timeo_p) 6962306a36Sopenharmony_ci return -EAGAIN; 7062306a36Sopenharmony_ci if (signal_pending(tsk)) 7162306a36Sopenharmony_ci return sock_intr_errno(*timeo_p); 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci add_wait_queue(sk_sleep(sk), &wait); 7462306a36Sopenharmony_ci sk->sk_write_pending++; 7562306a36Sopenharmony_ci done = sk_wait_event(sk, timeo_p, 7662306a36Sopenharmony_ci !READ_ONCE(sk->sk_err) && 7762306a36Sopenharmony_ci !((1 << READ_ONCE(sk->sk_state)) & 7862306a36Sopenharmony_ci ~(TCPF_ESTABLISHED | TCPF_CLOSE_WAIT)), &wait); 7962306a36Sopenharmony_ci remove_wait_queue(sk_sleep(sk), &wait); 8062306a36Sopenharmony_ci sk->sk_write_pending--; 8162306a36Sopenharmony_ci } while (!done); 8262306a36Sopenharmony_ci return done < 0 ? done : 0; 8362306a36Sopenharmony_ci} 8462306a36Sopenharmony_ciEXPORT_SYMBOL(sk_stream_wait_connect); 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci/** 8762306a36Sopenharmony_ci * sk_stream_closing - Return 1 if we still have things to send in our buffers. 8862306a36Sopenharmony_ci * @sk: socket to verify 8962306a36Sopenharmony_ci */ 9062306a36Sopenharmony_cistatic int sk_stream_closing(const struct sock *sk) 9162306a36Sopenharmony_ci{ 9262306a36Sopenharmony_ci return (1 << READ_ONCE(sk->sk_state)) & 9362306a36Sopenharmony_ci (TCPF_FIN_WAIT1 | TCPF_CLOSING | TCPF_LAST_ACK); 9462306a36Sopenharmony_ci} 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_civoid sk_stream_wait_close(struct sock *sk, long timeout) 9762306a36Sopenharmony_ci{ 9862306a36Sopenharmony_ci if (timeout) { 9962306a36Sopenharmony_ci DEFINE_WAIT_FUNC(wait, woken_wake_function); 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ci add_wait_queue(sk_sleep(sk), &wait); 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci do { 10462306a36Sopenharmony_ci if (sk_wait_event(sk, &timeout, !sk_stream_closing(sk), &wait)) 10562306a36Sopenharmony_ci break; 10662306a36Sopenharmony_ci } while (!signal_pending(current) && timeout); 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci remove_wait_queue(sk_sleep(sk), &wait); 10962306a36Sopenharmony_ci } 11062306a36Sopenharmony_ci} 11162306a36Sopenharmony_ciEXPORT_SYMBOL(sk_stream_wait_close); 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci/** 11462306a36Sopenharmony_ci * sk_stream_wait_memory - Wait for more memory for a socket 11562306a36Sopenharmony_ci * @sk: socket to wait for memory 11662306a36Sopenharmony_ci * @timeo_p: for how long 11762306a36Sopenharmony_ci */ 11862306a36Sopenharmony_ciint sk_stream_wait_memory(struct sock *sk, long *timeo_p) 11962306a36Sopenharmony_ci{ 12062306a36Sopenharmony_ci int ret, err = 0; 12162306a36Sopenharmony_ci long vm_wait = 0; 12262306a36Sopenharmony_ci long current_timeo = *timeo_p; 12362306a36Sopenharmony_ci DEFINE_WAIT_FUNC(wait, woken_wake_function); 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ci if (sk_stream_memory_free(sk)) 12662306a36Sopenharmony_ci current_timeo = vm_wait = get_random_u32_below(HZ / 5) + 2; 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_ci add_wait_queue(sk_sleep(sk), &wait); 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci while (1) { 13162306a36Sopenharmony_ci sk_set_bit(SOCKWQ_ASYNC_NOSPACE, sk); 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci if (sk->sk_err || (sk->sk_shutdown & SEND_SHUTDOWN)) 13462306a36Sopenharmony_ci goto do_error; 13562306a36Sopenharmony_ci if (!*timeo_p) 13662306a36Sopenharmony_ci goto do_eagain; 13762306a36Sopenharmony_ci if (signal_pending(current)) 13862306a36Sopenharmony_ci goto do_interrupted; 13962306a36Sopenharmony_ci sk_clear_bit(SOCKWQ_ASYNC_NOSPACE, sk); 14062306a36Sopenharmony_ci if (sk_stream_memory_free(sk) && !vm_wait) 14162306a36Sopenharmony_ci break; 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_ci set_bit(SOCK_NOSPACE, &sk->sk_socket->flags); 14462306a36Sopenharmony_ci sk->sk_write_pending++; 14562306a36Sopenharmony_ci ret = sk_wait_event(sk, ¤t_timeo, READ_ONCE(sk->sk_err) || 14662306a36Sopenharmony_ci (READ_ONCE(sk->sk_shutdown) & SEND_SHUTDOWN) || 14762306a36Sopenharmony_ci (sk_stream_memory_free(sk) && !vm_wait), 14862306a36Sopenharmony_ci &wait); 14962306a36Sopenharmony_ci sk->sk_write_pending--; 15062306a36Sopenharmony_ci if (ret < 0) 15162306a36Sopenharmony_ci goto do_error; 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_ci if (vm_wait) { 15462306a36Sopenharmony_ci vm_wait -= current_timeo; 15562306a36Sopenharmony_ci current_timeo = *timeo_p; 15662306a36Sopenharmony_ci if (current_timeo != MAX_SCHEDULE_TIMEOUT && 15762306a36Sopenharmony_ci (current_timeo -= vm_wait) < 0) 15862306a36Sopenharmony_ci current_timeo = 0; 15962306a36Sopenharmony_ci vm_wait = 0; 16062306a36Sopenharmony_ci } 16162306a36Sopenharmony_ci *timeo_p = current_timeo; 16262306a36Sopenharmony_ci } 16362306a36Sopenharmony_ciout: 16462306a36Sopenharmony_ci if (!sock_flag(sk, SOCK_DEAD)) 16562306a36Sopenharmony_ci remove_wait_queue(sk_sleep(sk), &wait); 16662306a36Sopenharmony_ci return err; 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_cido_error: 16962306a36Sopenharmony_ci err = -EPIPE; 17062306a36Sopenharmony_ci goto out; 17162306a36Sopenharmony_cido_eagain: 17262306a36Sopenharmony_ci /* Make sure that whenever EAGAIN is returned, EPOLLOUT event can 17362306a36Sopenharmony_ci * be generated later. 17462306a36Sopenharmony_ci * When TCP receives ACK packets that make room, tcp_check_space() 17562306a36Sopenharmony_ci * only calls tcp_new_space() if SOCK_NOSPACE is set. 17662306a36Sopenharmony_ci */ 17762306a36Sopenharmony_ci set_bit(SOCK_NOSPACE, &sk->sk_socket->flags); 17862306a36Sopenharmony_ci err = -EAGAIN; 17962306a36Sopenharmony_ci goto out; 18062306a36Sopenharmony_cido_interrupted: 18162306a36Sopenharmony_ci err = sock_intr_errno(*timeo_p); 18262306a36Sopenharmony_ci goto out; 18362306a36Sopenharmony_ci} 18462306a36Sopenharmony_ciEXPORT_SYMBOL(sk_stream_wait_memory); 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ciint sk_stream_error(struct sock *sk, int flags, int err) 18762306a36Sopenharmony_ci{ 18862306a36Sopenharmony_ci if (err == -EPIPE) 18962306a36Sopenharmony_ci err = sock_error(sk) ? : -EPIPE; 19062306a36Sopenharmony_ci if (err == -EPIPE && !(flags & MSG_NOSIGNAL)) 19162306a36Sopenharmony_ci send_sig(SIGPIPE, current, 0); 19262306a36Sopenharmony_ci return err; 19362306a36Sopenharmony_ci} 19462306a36Sopenharmony_ciEXPORT_SYMBOL(sk_stream_error); 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_civoid sk_stream_kill_queues(struct sock *sk) 19762306a36Sopenharmony_ci{ 19862306a36Sopenharmony_ci /* First the read buffer. */ 19962306a36Sopenharmony_ci __skb_queue_purge(&sk->sk_receive_queue); 20062306a36Sopenharmony_ci 20162306a36Sopenharmony_ci /* Next, the error queue. 20262306a36Sopenharmony_ci * We need to use queue lock, because other threads might 20362306a36Sopenharmony_ci * add packets to the queue without socket lock being held. 20462306a36Sopenharmony_ci */ 20562306a36Sopenharmony_ci skb_queue_purge(&sk->sk_error_queue); 20662306a36Sopenharmony_ci 20762306a36Sopenharmony_ci /* Next, the write queue. */ 20862306a36Sopenharmony_ci WARN_ON_ONCE(!skb_queue_empty(&sk->sk_write_queue)); 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_ci /* Account for returned memory. */ 21162306a36Sopenharmony_ci sk_mem_reclaim_final(sk); 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_ci WARN_ON_ONCE(sk->sk_wmem_queued); 21462306a36Sopenharmony_ci 21562306a36Sopenharmony_ci /* It is _impossible_ for the backlog to contain anything 21662306a36Sopenharmony_ci * when we get here. All user references to this socket 21762306a36Sopenharmony_ci * have gone away, only the net layer knows can touch it. 21862306a36Sopenharmony_ci */ 21962306a36Sopenharmony_ci} 22062306a36Sopenharmony_ciEXPORT_SYMBOL(sk_stream_kill_queues); 221