Lines Matching +full:tx +full:- +full:termination +full:- +full:fix

1 // SPDX-License-Identifier: GPL-2.0-only
51 /* the maximum queue length for tx in packets. 0 is no limit */
80 const int oldstate = sk->sk_state; in dccp_set_state()
82 dccp_pr_debug("%s(%p) %s --> %s\n", dccp_role(sk), sk, in dccp_set_state()
92 dccp_feat_list_purge(&dccp_sk(sk)->dccps_featneg); in dccp_set_state()
100 sk->sk_prot->unhash(sk); in dccp_set_state()
101 if (inet_csk(sk)->icsk_bind_hash != NULL && in dccp_set_state()
102 !(sk->sk_userlocks & SOCK_BINDPORT_LOCK)) in dccp_set_state()
120 switch (sk->sk_state) { in dccp_finish_passive_close()
141 sk->sk_shutdown = SHUTDOWN_MASK; in dccp_done()
144 sk->sk_state_change(sk); in dccp_done()
178 ccid_hc_tx_delete(dp->dccps_hc_tx_ccid, sk); in dccp_destruct_common()
179 dp->dccps_hc_tx_ccid = NULL; in dccp_destruct_common()
197 icsk->icsk_rto = DCCP_TIMEOUT_INIT; in dccp_init_sock()
198 icsk->icsk_syn_retries = sysctl_dccp_request_retries; in dccp_init_sock()
199 sk->sk_state = DCCP_CLOSED; in dccp_init_sock()
200 sk->sk_write_space = dccp_write_space; in dccp_init_sock()
201 sk->sk_destruct = dccp_sk_destruct; in dccp_init_sock()
202 icsk->icsk_sync_mss = dccp_sync_mss; in dccp_init_sock()
203 dp->dccps_mss_cache = 536; in dccp_init_sock()
204 dp->dccps_rate_last = jiffies; in dccp_init_sock()
205 dp->dccps_role = DCCP_ROLE_UNDEFINED; in dccp_init_sock()
206 dp->dccps_service = DCCP_SERVICE_CODE_IS_ABSENT; in dccp_init_sock()
207 dp->dccps_tx_qlen = sysctl_dccp_tx_qlen; in dccp_init_sock()
211 INIT_LIST_HEAD(&dp->dccps_featneg); in dccp_init_sock()
224 __skb_queue_purge(&sk->sk_write_queue); in dccp_destroy_sock()
225 if (sk->sk_send_head != NULL) { in dccp_destroy_sock()
226 kfree_skb(sk->sk_send_head); in dccp_destroy_sock()
227 sk->sk_send_head = NULL; in dccp_destroy_sock()
231 if (inet_csk(sk)->icsk_bind_hash != NULL) in dccp_destroy_sock()
234 kfree(dp->dccps_service_list); in dccp_destroy_sock()
235 dp->dccps_service_list = NULL; in dccp_destroy_sock()
237 if (dp->dccps_hc_rx_ackvec != NULL) { in dccp_destroy_sock()
238 dccp_ackvec_free(dp->dccps_hc_rx_ackvec); in dccp_destroy_sock()
239 dp->dccps_hc_rx_ackvec = NULL; in dccp_destroy_sock()
241 ccid_hc_rx_delete(dp->dccps_hc_rx_ccid, sk); in dccp_destroy_sock()
242 dp->dccps_hc_rx_ccid = NULL; in dccp_destroy_sock()
245 dccp_feat_list_purge(&dp->dccps_featneg); in dccp_destroy_sock()
261 const int old_state = sk->sk_state; in dccp_disconnect()
274 sk->sk_err = ECONNRESET; in dccp_disconnect()
276 sk->sk_err = ECONNRESET; in dccp_disconnect()
279 ccid_hc_rx_delete(dp->dccps_hc_rx_ccid, sk); in dccp_disconnect()
280 dp->dccps_hc_rx_ccid = NULL; in dccp_disconnect()
282 __skb_queue_purge(&sk->sk_receive_queue); in dccp_disconnect()
283 __skb_queue_purge(&sk->sk_write_queue); in dccp_disconnect()
284 if (sk->sk_send_head != NULL) { in dccp_disconnect()
285 __kfree_skb(sk->sk_send_head); in dccp_disconnect()
286 sk->sk_send_head = NULL; in dccp_disconnect()
289 inet->inet_dport = 0; in dccp_disconnect()
293 sk->sk_shutdown = 0; in dccp_disconnect()
296 icsk->icsk_backoff = 0; in dccp_disconnect()
300 WARN_ON(inet->inet_num && !icsk->icsk_bind_hash); in dccp_disconnect()
318 struct sock *sk = sock->sk; in dccp_poll()
335 if (READ_ONCE(sk->sk_err)) in dccp_poll()
337 shutdown = READ_ONCE(sk->sk_shutdown); in dccp_poll()
346 if (atomic_read(&sk->sk_rmem_alloc) > 0) in dccp_poll()
354 set_bit(SOCK_NOSPACE, &sk->sk_socket->flags); in dccp_poll()
371 int rc = -ENOTCONN; in dccp_ioctl()
375 if (sk->sk_state == DCCP_LISTEN) in dccp_ioctl()
392 skb = skb_peek(&sk->sk_receive_queue); in dccp_ioctl()
398 *karg = skb->len; in dccp_ioctl()
404 rc = -ENOIOCTLCMD; in dccp_ioctl()
422 return -EINVAL; in dccp_setsockopt_service()
427 return -ENOMEM; in dccp_setsockopt_service()
429 sl->dccpsl_nr = optlen / sizeof(u32) - 1; in dccp_setsockopt_service()
430 if (copy_from_sockptr_offset(sl->dccpsl_list, optval, in dccp_setsockopt_service()
431 sizeof(service), optlen - sizeof(service)) || in dccp_setsockopt_service()
434 return -EFAULT; in dccp_setsockopt_service()
439 dp->dccps_service = service; in dccp_setsockopt_service()
441 kfree(dp->dccps_service_list); in dccp_setsockopt_service()
443 dp->dccps_service_list = sl; in dccp_setsockopt_service()
454 return -EINVAL; in dccp_setsockopt_cscov()
459 * lowest-value first, negotiation will pick the smallest shared value. in dccp_setsockopt_cscov()
463 len = 16 - cscov; in dccp_setsockopt_cscov()
467 return -ENOBUFS; in dccp_setsockopt_cscov()
476 dccp_sk(sk)->dccps_pcrlen = cscov; in dccp_setsockopt_cscov()
478 dccp_sk(sk)->dccps_pcslen = cscov; in dccp_setsockopt_cscov()
491 return -EINVAL; in dccp_setsockopt_ccid()
517 DCCP_WARN("sockopt(PACKET_SIZE) is deprecated: fix your app\n"); in do_dccp_setsockopt()
521 DCCP_WARN("sockopt(CHANGE_L/R) is deprecated: fix your app\n"); in do_dccp_setsockopt()
530 return -EINVAL; in do_dccp_setsockopt()
533 return -EFAULT; in do_dccp_setsockopt()
541 if (dp->dccps_role != DCCP_ROLE_SERVER) in do_dccp_setsockopt()
542 err = -EOPNOTSUPP; in do_dccp_setsockopt()
544 dp->dccps_server_timewait = (val != 0); in do_dccp_setsockopt()
553 if (sk->sk_state != DCCP_CLOSED) in do_dccp_setsockopt()
554 err = -EISCONN; in do_dccp_setsockopt()
556 err = -EINVAL; in do_dccp_setsockopt()
558 dp->dccps_qpolicy = val; in do_dccp_setsockopt()
562 err = -EINVAL; in do_dccp_setsockopt()
564 dp->dccps_tx_qlen = val; in do_dccp_setsockopt()
567 err = -ENOPROTOOPT; in do_dccp_setsockopt()
579 return inet_csk(sk)->icsk_af_ops->setsockopt(sk, level, in dccp_setsockopt()
593 int err = -ENOENT, slen = 0, total_len = sizeof(u32); in dccp_getsockopt_service()
596 if ((sl = dp->dccps_service_list) != NULL) { in dccp_getsockopt_service()
597 slen = sl->dccpsl_nr * sizeof(u32); in dccp_getsockopt_service()
601 err = -EINVAL; in dccp_getsockopt_service()
607 put_user(dp->dccps_service, optval) || in dccp_getsockopt_service()
608 (sl != NULL && copy_to_user(optval + 1, sl->dccpsl_list, slen))) in dccp_getsockopt_service()
609 err = -EFAULT; in dccp_getsockopt_service()
622 return -EFAULT; in do_dccp_getsockopt()
625 return -EINVAL; in do_dccp_getsockopt()
631 DCCP_WARN("sockopt(PACKET_SIZE) is deprecated: fix your app\n"); in do_dccp_getsockopt()
637 val = READ_ONCE(dp->dccps_mss_cache); in do_dccp_getsockopt()
644 return -ENOPROTOOPT; in do_dccp_getsockopt()
649 return -ENOPROTOOPT; in do_dccp_getsockopt()
652 val = dp->dccps_server_timewait; in do_dccp_getsockopt()
655 val = dp->dccps_pcslen; in do_dccp_getsockopt()
658 val = dp->dccps_pcrlen; in do_dccp_getsockopt()
661 val = dp->dccps_qpolicy; in do_dccp_getsockopt()
664 val = dp->dccps_tx_qlen; in do_dccp_getsockopt()
667 return ccid_hc_rx_getsockopt(dp->dccps_hc_rx_ccid, sk, optname, in do_dccp_getsockopt()
670 return ccid_hc_tx_getsockopt(dp->dccps_hc_tx_ccid, sk, optname, in do_dccp_getsockopt()
673 return -ENOPROTOOPT; in do_dccp_getsockopt()
678 return -EFAULT; in do_dccp_getsockopt()
687 return inet_csk(sk)->icsk_af_ops->getsockopt(sk, level, in dccp_getsockopt()
700 * Assign an (opaque) qpolicy priority value to skb->priority. in dccp_msghdr_parse()
703 * The skb->priority is normally used for the SO_PRIORITY option, which in dccp_msghdr_parse()
705 * to skb->priority happens later (on layer 3), we overload this field in dccp_msghdr_parse()
709 skb->priority = 0; in dccp_msghdr_parse()
713 return -EINVAL; in dccp_msghdr_parse()
715 if (cmsg->cmsg_level != SOL_DCCP) in dccp_msghdr_parse()
718 if (cmsg->cmsg_type <= DCCP_SCM_QPOLICY_MAX && in dccp_msghdr_parse()
719 !dccp_qpolicy_param_ok(skb->sk, cmsg->cmsg_type)) in dccp_msghdr_parse()
720 return -EINVAL; in dccp_msghdr_parse()
722 switch (cmsg->cmsg_type) { in dccp_msghdr_parse()
724 if (cmsg->cmsg_len != CMSG_LEN(sizeof(__u32))) in dccp_msghdr_parse()
725 return -EINVAL; in dccp_msghdr_parse()
726 skb->priority = *(__u32 *)CMSG_DATA(cmsg); in dccp_msghdr_parse()
729 return -EINVAL; in dccp_msghdr_parse()
738 const int flags = msg->msg_flags; in dccp_sendmsg()
746 if (len > READ_ONCE(dp->dccps_mss_cache)) in dccp_sendmsg()
747 return -EMSGSIZE; in dccp_sendmsg()
758 if ((1 << sk->sk_state) & ~(DCCPF_OPEN | DCCPF_PARTOPEN)) in dccp_sendmsg()
762 size = sk->sk_prot->max_header + len; in dccp_sendmsg()
770 rc = -EAGAIN; in dccp_sendmsg()
774 if (sk->sk_state == DCCP_CLOSED) { in dccp_sendmsg()
775 rc = -ENOTCONN; in dccp_sendmsg()
780 if (len > dp->dccps_mss_cache) { in dccp_sendmsg()
781 rc = -EMSGSIZE; in dccp_sendmsg()
785 skb_reserve(skb, sk->sk_prot->max_header); in dccp_sendmsg()
796 * The xmit_timer is set if the TX CCID is rate-based and will expire in dccp_sendmsg()
798 * network. Window-based CCIDs do not use this timer. in dccp_sendmsg()
800 if (!timer_pending(&dp->dccps_xmit_timer)) in dccp_sendmsg()
820 if (sk->sk_state == DCCP_LISTEN) { in dccp_recvmsg()
821 len = -ENOTCONN; in dccp_recvmsg()
828 struct sk_buff *skb = skb_peek(&sk->sk_receive_queue); in dccp_recvmsg()
835 switch (dh->dccph_type) { in dccp_recvmsg()
847 dccp_packet_name(dh->dccph_type)); in dccp_recvmsg()
852 dccp_packet_name(dh->dccph_type)); in dccp_recvmsg()
861 if (sk->sk_err) { in dccp_recvmsg()
866 if (sk->sk_shutdown & RCV_SHUTDOWN) { in dccp_recvmsg()
871 if (sk->sk_state == DCCP_CLOSED) { in dccp_recvmsg()
876 len = -ENOTCONN; in dccp_recvmsg()
884 len = -EAGAIN; in dccp_recvmsg()
896 if (len > skb->len) in dccp_recvmsg()
897 len = skb->len; in dccp_recvmsg()
898 else if (len < skb->len) in dccp_recvmsg()
899 msg->msg_flags |= MSG_TRUNC; in dccp_recvmsg()
903 len = -EFAULT; in dccp_recvmsg()
907 len = skb->len; in dccp_recvmsg()
922 struct sock *sk = sock->sk; in inet_dccp_listen()
928 err = -EINVAL; in inet_dccp_listen()
929 if (sock->state != SS_UNCONNECTED || sock->type != SOCK_DCCP) in inet_dccp_listen()
932 old_state = sk->sk_state; in inet_dccp_listen()
936 WRITE_ONCE(sk->sk_max_ack_backlog, backlog); in inet_dccp_listen()
943 dp->dccps_role = DCCP_ROLE_LISTEN; in inet_dccp_listen()
947 err = -EPROTO; in inet_dccp_listen()
968 switch (sk->sk_state) { in dccp_terminate_connection()
980 if (dccp_sk(sk)->dccps_role == DCCP_ROLE_SERVER && in dccp_terminate_connection()
981 !dccp_sk(sk)->dccps_server_timewait) in dccp_terminate_connection()
1000 sk->sk_shutdown = SHUTDOWN_MASK; in dccp_close()
1002 if (sk->sk_state == DCCP_LISTEN) { in dccp_close()
1011 sk_stop_timer(sk, &dp->dccps_xmit_timer); in dccp_close()
1015 * descriptor close, not protocol-sourced closes, because the in dccp_close()
1018 while ((skb = __skb_dequeue(&sk->sk_receive_queue)) != NULL) { in dccp_close()
1019 data_was_unread += skb->len; in dccp_close()
1024 if (sk->sk_state == DCCP_CLOSED) in dccp_close()
1032 } else if (sock_flag(sk, SOCK_LINGER) && !sk->sk_lingertime) { in dccp_close()
1034 sk->sk_prot->disconnect(sk, 0); in dccp_close()
1035 } else if (sk->sk_state != DCCP_CLOSED) { in dccp_close()
1037 * Normal connection termination. May need to wait if there are in dccp_close()
1038 * still packets in the TX queue that are delayed by the CCID. in dccp_close()
1046 * - we have been closed by the peer but still have application data; in dccp_close()
1047 * - abortive termination (unread data or zero linger time), in dccp_close()
1048 * - normal termination but queue could not be flushed within time limit in dccp_close()
1050 __skb_queue_purge(&sk->sk_write_queue); in dccp_close()
1055 state = sk->sk_state; in dccp_close()
1074 if (state != DCCP_CLOSED && sk->sk_state == DCCP_CLOSED) in dccp_close()
1077 if (sk->sk_state == DCCP_CLOSED) in dccp_close()
1101 return -ENOMEM; in dccp_mib_init()
1134 rc = -ENOBUFS; in dccp_init()
1155 goal = nr_pages >> (21 - PAGE_SHIFT); in dccp_init()
1157 goal = nr_pages >> (23 - PAGE_SHIFT); in dccp_init()
1168 while (hash_size & (hash_size - 1)) in dccp_init()
1169 hash_size--; in dccp_init()
1170 dccp_hashinfo.ehash_mask = hash_size - 1; in dccp_init()
1173 } while (!dccp_hashinfo.ehash && --ehash_order > 0); in dccp_init()
1196 } while (!dccp_hashinfo.bhash && --bhash_order >= 0); in dccp_init()
1293 MODULE_DESCRIPTION("DCCP - Datagram Congestion Controlled Protocol");