Lines Matching +full:packet +full:- +full:oriented
1 // SPDX-License-Identifier: GPL-2.0-only
5 * Copyright (C) 2007-2013 VMware, Inc. All rights reserved.
10 * - There are two kinds of sockets: those created by user action (such as
13 * - There are two "global" tables, one for bound sockets (sockets that have
17 * within them. - Note, though, that the bound table contains an extra entry
26 * - Sockets created by user action will either be "client" sockets that
30 * - "Server" sockets are referred to as listener sockets throughout this
36 * bound to, we check if the source of the packet is from one that has an
37 * existing pending connection. If it does, we process the packet for the
46 * - It is possible that these pending sockets will never reach the connected
47 * state; in fact, we may never receive another packet after the connection
52 * up (sock_put() -> sk_free() -> our sk_destruct implementation). Note this
56 * - Lock ordering for pending or accept queue sockets is:
64 * - Sockets created by user action will be cleaned up when the user process
70 * - A socket's reference count is what ensures that the structure won't be
78 * - sk->sk_state uses the TCP state constants because they are widely used by
81 * TCP_CLOSE - unconnected
82 * TCP_SYN_SENT - connecting
83 * TCP_ESTABLISHED - connected
84 * TCP_CLOSING - disconnecting
85 * TCP_LISTEN - listening
115 #include <uapi/asm-generic/ioctls.h>
142 /* Transport used for host->guest communication */
144 /* Transport used for guest->host communication */
164 * vsock_bind_table[VSOCK_HASH_SIZE - 1] are for bound sockets and
170 #define VSOCK_HASH(addr) ((addr)->svm_port % VSOCK_HASH_SIZE)
176 (((src)->svm_cid ^ (dst)->svm_port) % VSOCK_HASH_SIZE)
180 vsock_connected_sockets(&(vsk)->remote_addr, &(vsk)->local_addr)
195 if (vsock_addr_bound(&vsk->local_addr)) in vsock_auto_bind()
215 sock_hold(&vsk->sk); in __vsock_insert_bound()
216 list_add(&vsk->bound_table, list); in __vsock_insert_bound()
222 sock_hold(&vsk->sk); in __vsock_insert_connected()
223 list_add(&vsk->connected_table, list); in __vsock_insert_connected()
228 list_del_init(&vsk->bound_table); in __vsock_remove_bound()
229 sock_put(&vsk->sk); in __vsock_remove_bound()
234 list_del_init(&vsk->connected_table); in __vsock_remove_connected()
235 sock_put(&vsk->sk); in __vsock_remove_connected()
243 if (vsock_addr_equals_addr(addr, &vsk->local_addr)) in __vsock_find_bound_socket()
246 if (addr->svm_port == vsk->local_addr.svm_port && in __vsock_find_bound_socket()
247 (vsk->local_addr.svm_cid == VMADDR_CID_ANY || in __vsock_find_bound_socket()
248 addr->svm_cid == VMADDR_CID_ANY)) in __vsock_find_bound_socket()
262 if (vsock_addr_equals_addr(src, &vsk->remote_addr) && in __vsock_find_connected_socket()
263 dst->svm_port == vsk->local_addr.svm_port) { in __vsock_find_connected_socket()
281 &vsk->remote_addr, &vsk->local_addr); in vsock_insert_connected()
359 if (vsk->transport != transport) in vsock_for_each_connected_socket()
380 list_add_tail(&vpending->pending_links, &vlistener->pending_links); in vsock_add_pending()
388 list_del_init(&vpending->pending_links); in vsock_remove_pending()
404 list_add_tail(&vconnected->accept_queue, &vlistener->accept_queue); in vsock_enqueue_accept()
419 return remote_cid == transport_g2h->get_local_cid(); in vsock_use_local_transport()
427 if (!vsk->transport) in vsock_deassign_transport()
430 vsk->transport->destruct(vsk); in vsock_deassign_transport()
431 module_put(vsk->transport->module); in vsock_deassign_transport()
432 vsk->transport = NULL; in vsock_deassign_transport()
437 * Note: for connection oriented socket this must be called when vsk->remote_addr
440 * The vsk->remote_addr is used to decide which transport to use:
441 * - remote CID == VMADDR_CID_LOCAL or g2h->local_cid or VMADDR_CID_HOST if
443 * - remote CID <= VMADDR_CID_HOST or h2g is not loaded or remote flags field
444 * includes VMADDR_FLAG_TO_HOST flag value, will use guest->host transport;
445 * - remote CID > VMADDR_CID_HOST will use host->guest transport;
451 unsigned int remote_cid = vsk->remote_addr.svm_cid; in vsock_assign_transport()
455 /* If the packet is coming with the source and destination CIDs higher in vsock_assign_transport()
463 if (psk && vsk->local_addr.svm_cid > VMADDR_CID_HOST && in vsock_assign_transport()
464 vsk->remote_addr.svm_cid > VMADDR_CID_HOST) in vsock_assign_transport()
465 vsk->remote_addr.svm_flags |= VMADDR_FLAG_TO_HOST; in vsock_assign_transport()
467 remote_flags = vsk->remote_addr.svm_flags; in vsock_assign_transport()
471 switch (sk->sk_type) { in vsock_assign_transport()
486 ret = -ESOCKTNOSUPPORT; in vsock_assign_transport()
490 if (vsk->transport && vsk->transport == new_transport) { in vsock_assign_transport()
498 if (!new_transport || !try_module_get(new_transport->module)) { in vsock_assign_transport()
499 ret = -ENODEV; in vsock_assign_transport()
509 if (vsk->transport) { in vsock_assign_transport()
510 /* transport->release() must be called with sock lock acquired. in vsock_assign_transport()
516 vsk->transport->release(vsk); in vsock_assign_transport()
525 sk->sk_state = TCP_CLOSE; in vsock_assign_transport()
526 vsk->peer_shutdown = 0; in vsock_assign_transport()
529 if (sk->sk_type == SOCK_SEQPACKET) { in vsock_assign_transport()
530 if (!new_transport->seqpacket_allow || in vsock_assign_transport()
531 !new_transport->seqpacket_allow(remote_cid)) { in vsock_assign_transport()
532 module_put(new_transport->module); in vsock_assign_transport()
533 return -ESOCKTNOSUPPORT; in vsock_assign_transport()
537 ret = new_transport->init(vsk, psk); in vsock_assign_transport()
539 module_put(new_transport->module); in vsock_assign_transport()
543 vsk->transport = new_transport; in vsock_assign_transport()
554 * Otherwise we may race with module removal. Do not use on `vsk->transport`.
562 cid = (*transport)->get_local_cid(); in vsock_registered_transport_cid()
590 if (list_empty(&vlistener->accept_queue)) in vsock_dequeue_accept()
593 vconnected = list_entry(vlistener->accept_queue.next, in vsock_dequeue_accept()
596 list_del_init(&vconnected->accept_queue); in vsock_dequeue_accept()
608 return list_empty(&vsk->accept_queue); in vsock_is_accept_queue_empty()
614 return !list_empty(&vsk->pending_links); in vsock_is_pending()
621 if (!vsk->transport) in vsock_send_shutdown()
622 return -ENODEV; in vsock_send_shutdown()
624 return vsk->transport->shutdown(vsk, mode); in vsock_send_shutdown()
636 listener = vsk->listener; in vsock_pending_work()
646 } else if (!vsk->rejected) { in vsock_pending_work()
662 sk->sk_state = TCP_CLOSE; in vsock_pending_work()
685 vsock_addr_init(&new_addr, addr->svm_cid, addr->svm_port); in __vsock_bind_connectible()
687 if (addr->svm_port == VMADDR_PORT_ANY) { in __vsock_bind_connectible()
705 return -EADDRNOTAVAIL; in __vsock_bind_connectible()
710 if (addr->svm_port <= LAST_RESERVED_PORT && in __vsock_bind_connectible()
712 return -EACCES; in __vsock_bind_connectible()
716 return -EADDRINUSE; in __vsock_bind_connectible()
719 vsock_addr_init(&vsk->local_addr, new_addr.svm_cid, new_addr.svm_port); in __vsock_bind_connectible()
721 /* Remove connection oriented sockets from the unbound list and add them in __vsock_bind_connectible()
727 __vsock_insert_bound(vsock_bound_sockets(&vsk->local_addr), vsk); in __vsock_bind_connectible()
735 return vsk->transport->dgram_bind(vsk, addr); in __vsock_bind_dgram()
744 if (vsock_addr_bound(&vsk->local_addr)) in __vsock_bind()
745 return -EINVAL; in __vsock_bind()
749 * like AF_INET prevents binding to a non-local IP address (in most in __vsock_bind()
752 if (addr->svm_cid != VMADDR_CID_ANY && !vsock_find_cid(addr->svm_cid)) in __vsock_bind()
753 return -EADDRNOTAVAIL; in __vsock_bind()
755 switch (sk->sk_socket->type) { in __vsock_bind()
768 retval = -EINVAL; in __vsock_bind()
794 /* sk->sk_type is normally set in sock_init_data, but only if sock is in __vsock_create()
795 * non-NULL. We make sure that our sockets always have a type by in __vsock_create()
799 sk->sk_type = type; in __vsock_create()
802 vsock_addr_init(&vsk->local_addr, VMADDR_CID_ANY, VMADDR_PORT_ANY); in __vsock_create()
803 vsock_addr_init(&vsk->remote_addr, VMADDR_CID_ANY, VMADDR_PORT_ANY); in __vsock_create()
805 sk->sk_destruct = vsock_sk_destruct; in __vsock_create()
806 sk->sk_backlog_rcv = vsock_queue_rcv_skb; in __vsock_create()
809 INIT_LIST_HEAD(&vsk->bound_table); in __vsock_create()
810 INIT_LIST_HEAD(&vsk->connected_table); in __vsock_create()
811 vsk->listener = NULL; in __vsock_create()
812 INIT_LIST_HEAD(&vsk->pending_links); in __vsock_create()
813 INIT_LIST_HEAD(&vsk->accept_queue); in __vsock_create()
814 vsk->rejected = false; in __vsock_create()
815 vsk->sent_request = false; in __vsock_create()
816 vsk->ignore_connecting_rst = false; in __vsock_create()
817 vsk->peer_shutdown = 0; in __vsock_create()
818 INIT_DELAYED_WORK(&vsk->connect_work, vsock_connect_timeout); in __vsock_create()
819 INIT_DELAYED_WORK(&vsk->pending_work, vsock_pending_work); in __vsock_create()
823 vsk->trusted = psk->trusted; in __vsock_create()
824 vsk->owner = get_cred(psk->owner); in __vsock_create()
825 vsk->connect_timeout = psk->connect_timeout; in __vsock_create()
826 vsk->buffer_size = psk->buffer_size; in __vsock_create()
827 vsk->buffer_min_size = psk->buffer_min_size; in __vsock_create()
828 vsk->buffer_max_size = psk->buffer_max_size; in __vsock_create()
831 vsk->trusted = ns_capable_noaudit(&init_user_ns, CAP_NET_ADMIN); in __vsock_create()
832 vsk->owner = get_current_cred(); in __vsock_create()
833 vsk->connect_timeout = VSOCK_DEFAULT_CONNECT_TIMEOUT; in __vsock_create()
834 vsk->buffer_size = VSOCK_DEFAULT_BUFFER_SIZE; in __vsock_create()
835 vsk->buffer_min_size = VSOCK_DEFAULT_BUFFER_MIN_SIZE; in __vsock_create()
836 vsk->buffer_max_size = VSOCK_DEFAULT_BUFFER_MAX_SIZE; in __vsock_create()
869 if (vsk->transport) in __vsock_release()
870 vsk->transport->release(vsk); in __vsock_release()
871 else if (sock_type_connectible(sk->sk_type)) in __vsock_release()
875 sk->sk_shutdown = SHUTDOWN_MASK; in __vsock_release()
877 skb_queue_purge(&sk->sk_receive_queue); in __vsock_release()
894 __skb_queue_purge(&sk->sk_error_queue); in vsock_sk_destruct()
901 vsock_addr_init(&vsk->local_addr, VMADDR_CID_ANY, VMADDR_PORT_ANY); in vsock_sk_destruct()
902 vsock_addr_init(&vsk->remote_addr, VMADDR_CID_ANY, VMADDR_PORT_ANY); in vsock_sk_destruct()
904 put_cred(vsk->owner); in vsock_sk_destruct()
921 parent->sk_type, 0); in vsock_create_connected()
927 if (WARN_ON(!vsk->transport)) in vsock_stream_has_data()
930 return vsk->transport->stream_has_data(vsk); in vsock_stream_has_data()
938 if (WARN_ON(!vsk->transport)) in vsock_connectible_has_data()
941 if (sk->sk_type == SOCK_SEQPACKET) in vsock_connectible_has_data()
942 return vsk->transport->seqpacket_has_data(vsk); in vsock_connectible_has_data()
950 if (WARN_ON(!vsk->transport)) in vsock_stream_has_space()
953 return vsk->transport->stream_has_space(vsk); in vsock_stream_has_space()
961 if (vsock_stream_has_data(vsk) >= sk->sk_rcvlowat || in vsock_data_ready()
963 sk->sk_data_ready(sk); in vsock_data_ready()
976 struct sock *sk = sock->sk; in vsock_release()
981 sk->sk_prot->close(sk, 0); in vsock_release()
983 sock->sk = NULL; in vsock_release()
984 sock->state = SS_FREE; in vsock_release()
996 sk = sock->sk; in vsock_bind()
999 return -EINVAL; in vsock_bind()
1016 sk = sock->sk; in vsock_getname()
1023 if (sock->state != SS_CONNECTED) { in vsock_getname()
1024 err = -ENOTCONN; in vsock_getname()
1027 vm_addr = &vsk->remote_addr; in vsock_getname()
1029 vm_addr = &vsk->local_addr; in vsock_getname()
1051 timeout = sk->sk_lingertime; in vsock_linger()
1059 unsent = vsk->transport->unsent_bytes; in vsock_linger()
1088 return -EINVAL; in vsock_shutdown()
1090 /* If this is a connection oriented socket and it is not connected then in vsock_shutdown()
1096 sk = sock->sk; in vsock_shutdown()
1099 if (sock->state == SS_UNCONNECTED) { in vsock_shutdown()
1100 err = -ENOTCONN; in vsock_shutdown()
1101 if (sock_type_connectible(sk->sk_type)) in vsock_shutdown()
1104 sock->state = SS_DISCONNECTING; in vsock_shutdown()
1111 sk->sk_shutdown |= mode; in vsock_shutdown()
1112 sk->sk_state_change(sk); in vsock_shutdown()
1114 if (sock_type_connectible(sk->sk_type)) { in vsock_shutdown()
1132 sk = sock->sk; in vsock_poll()
1138 if (sk->sk_err || !skb_queue_empty_lockless(&sk->sk_error_queue)) in vsock_poll()
1145 if ((sk->sk_shutdown == SHUTDOWN_MASK) || in vsock_poll()
1146 ((sk->sk_shutdown & SEND_SHUTDOWN) && in vsock_poll()
1147 (vsk->peer_shutdown & SEND_SHUTDOWN))) { in vsock_poll()
1151 if (sk->sk_shutdown & RCV_SHUTDOWN || in vsock_poll()
1152 vsk->peer_shutdown & SEND_SHUTDOWN) { in vsock_poll()
1159 if (sock->type == SOCK_DGRAM) { in vsock_poll()
1164 if (!skb_queue_empty_lockless(&sk->sk_receive_queue) || in vsock_poll()
1165 (sk->sk_shutdown & RCV_SHUTDOWN)) { in vsock_poll()
1169 if (!(sk->sk_shutdown & SEND_SHUTDOWN)) in vsock_poll()
1172 } else if (sock_type_connectible(sk->sk_type)) { in vsock_poll()
1177 transport = vsk->transport; in vsock_poll()
1182 if (sk->sk_state == TCP_LISTEN in vsock_poll()
1187 if (transport && transport->stream_is_active(vsk) && in vsock_poll()
1188 !(sk->sk_shutdown & RCV_SHUTDOWN)) { in vsock_poll()
1191 int ret = transport->notify_poll_in( in vsock_poll()
1206 if (sk->sk_shutdown & RCV_SHUTDOWN || in vsock_poll()
1207 vsk->peer_shutdown & SEND_SHUTDOWN) { in vsock_poll()
1212 if (transport && sk->sk_state == TCP_ESTABLISHED) { in vsock_poll()
1213 if (!(sk->sk_shutdown & SEND_SHUTDOWN)) { in vsock_poll()
1215 int ret = transport->notify_poll_out( in vsock_poll()
1234 if (sk->sk_state == TCP_CLOSE || sk->sk_state == TCP_CLOSING) { in vsock_poll()
1235 if (!(sk->sk_shutdown & SEND_SHUTDOWN)) in vsock_poll()
1250 if (WARN_ON_ONCE(!vsk->transport)) in vsock_read_skb()
1251 return -ENODEV; in vsock_read_skb()
1253 return vsk->transport->read_skb(vsk, read_actor); in vsock_read_skb()
1265 if (msg->msg_flags & MSG_OOB) in vsock_dgram_sendmsg()
1266 return -EOPNOTSUPP; in vsock_dgram_sendmsg()
1270 sk = sock->sk; in vsock_dgram_sendmsg()
1275 transport = vsk->transport; in vsock_dgram_sendmsg()
1285 if (msg->msg_name && in vsock_dgram_sendmsg()
1286 vsock_addr_cast(msg->msg_name, msg->msg_namelen, in vsock_dgram_sendmsg()
1292 if (remote_addr->svm_cid == VMADDR_CID_ANY) in vsock_dgram_sendmsg()
1293 remote_addr->svm_cid = transport->get_local_cid(); in vsock_dgram_sendmsg()
1296 err = -EINVAL; in vsock_dgram_sendmsg()
1299 } else if (sock->state == SS_CONNECTED) { in vsock_dgram_sendmsg()
1300 remote_addr = &vsk->remote_addr; in vsock_dgram_sendmsg()
1302 if (remote_addr->svm_cid == VMADDR_CID_ANY) in vsock_dgram_sendmsg()
1303 remote_addr->svm_cid = transport->get_local_cid(); in vsock_dgram_sendmsg()
1308 if (!vsock_addr_bound(&vsk->remote_addr)) { in vsock_dgram_sendmsg()
1309 err = -EINVAL; in vsock_dgram_sendmsg()
1313 err = -EINVAL; in vsock_dgram_sendmsg()
1317 if (!transport->dgram_allow(remote_addr->svm_cid, in vsock_dgram_sendmsg()
1318 remote_addr->svm_port)) { in vsock_dgram_sendmsg()
1319 err = -EINVAL; in vsock_dgram_sendmsg()
1323 err = transport->dgram_enqueue(vsk, remote_addr, msg, len); in vsock_dgram_sendmsg()
1338 sk = sock->sk; in vsock_dgram_connect()
1342 if (err == -EAFNOSUPPORT && remote_addr->svm_family == AF_UNSPEC) { in vsock_dgram_connect()
1344 vsock_addr_init(&vsk->remote_addr, VMADDR_CID_ANY, in vsock_dgram_connect()
1346 sock->state = SS_UNCONNECTED; in vsock_dgram_connect()
1350 return -EINVAL; in vsock_dgram_connect()
1358 if (!vsk->transport->dgram_allow(remote_addr->svm_cid, in vsock_dgram_connect()
1359 remote_addr->svm_port)) { in vsock_dgram_connect()
1360 err = -EINVAL; in vsock_dgram_connect()
1364 memcpy(&vsk->remote_addr, remote_addr, sizeof(vsk->remote_addr)); in vsock_dgram_connect()
1365 sock->state = SS_CONNECTED; in vsock_dgram_connect()
1367 /* sock map disallows redirection of non-TCP sockets with sk_state != in vsock_dgram_connect()
1375 sk->sk_state = TCP_ESTABLISHED; in vsock_dgram_connect()
1385 struct sock *sk = sock->sk; in __vsock_dgram_recvmsg()
1388 return vsk->transport->dgram_dequeue(vsk, msg, len, flags); in __vsock_dgram_recvmsg()
1395 struct sock *sk = sock->sk; in vsock_dgram_recvmsg()
1398 prot = READ_ONCE(sk->sk_prot); in vsock_dgram_recvmsg()
1400 return prot->recvmsg(sk, msg, len, flags, NULL); in vsock_dgram_recvmsg()
1410 struct sock *sk = sock->sk; in vsock_do_ioctl()
1420 if (!vsk->transport) { in vsock_do_ioctl()
1421 ret = -EOPNOTSUPP; in vsock_do_ioctl()
1425 if (sock_type_connectible(sk->sk_type) && in vsock_do_ioctl()
1426 sk->sk_state == TCP_LISTEN) { in vsock_do_ioctl()
1427 ret = -EINVAL; in vsock_do_ioctl()
1442 if (!vsk->transport || !vsk->transport->unsent_bytes) { in vsock_do_ioctl()
1443 ret = -EOPNOTSUPP; in vsock_do_ioctl()
1447 if (sock_type_connectible(sk->sk_type) && sk->sk_state == TCP_LISTEN) { in vsock_do_ioctl()
1448 ret = -EINVAL; in vsock_do_ioctl()
1452 n_bytes = vsk->transport->unsent_bytes(vsk); in vsock_do_ioctl()
1462 ret = -ENOIOCTLCMD; in vsock_do_ioctl()
1473 lock_sock(sock->sk); in vsock_ioctl()
1475 release_sock(sock->sk); in vsock_ioctl()
1501 const struct vsock_transport *transport = vsk->transport; in vsock_transport_cancel_pkt()
1503 if (!transport || !transport->cancel_pkt) in vsock_transport_cancel_pkt()
1504 return -EOPNOTSUPP; in vsock_transport_cancel_pkt()
1506 return transport->cancel_pkt(vsk); in vsock_transport_cancel_pkt()
1518 if (sk->sk_state == TCP_SYN_SENT && in vsock_connect_timeout()
1519 (sk->sk_shutdown != SHUTDOWN_MASK)) { in vsock_connect_timeout()
1520 sk->sk_state = TCP_CLOSE; in vsock_connect_timeout()
1521 sk->sk_socket->state = SS_UNCONNECTED; in vsock_connect_timeout()
1522 sk->sk_err = ETIMEDOUT; in vsock_connect_timeout()
1543 sk = sock->sk; in vsock_connect()
1549 switch (sock->state) { in vsock_connect()
1551 err = -EISCONN; in vsock_connect()
1554 err = -EINVAL; in vsock_connect()
1560 * for the connection or return -EALREADY should this be a in vsock_connect()
1561 * non-blocking call. in vsock_connect()
1563 err = -EALREADY; in vsock_connect()
1568 if ((sk->sk_state == TCP_LISTEN) || in vsock_connect()
1570 err = -EINVAL; in vsock_connect()
1575 memcpy(&vsk->remote_addr, remote_addr, in vsock_connect()
1576 sizeof(vsk->remote_addr)); in vsock_connect()
1582 transport = vsk->transport; in vsock_connect()
1584 /* The hypervisor and well-known contexts do not have socket in vsock_connect()
1588 !transport->stream_allow(remote_addr->svm_cid, in vsock_connect()
1589 remote_addr->svm_port)) { in vsock_connect()
1590 err = -ENETUNREACH; in vsock_connect()
1595 set_bit(SOCK_SUPPORT_ZC, &sk->sk_socket->flags); in vsock_connect()
1601 err = -EOPNOTSUPP; in vsock_connect()
1609 sk->sk_state = TCP_SYN_SENT; in vsock_connect()
1611 err = transport->connect(vsk); in vsock_connect()
1618 sk->sk_err = 0; in vsock_connect()
1621 * progress in case this is a non-blocking connect. in vsock_connect()
1623 sock->state = SS_CONNECTING; in vsock_connect()
1624 err = -EINPROGRESS; in vsock_connect()
1631 timeout = vsk->connect_timeout; in vsock_connect()
1637 while (sk->sk_state != TCP_ESTABLISHED && in vsock_connect()
1638 sk->sk_state != TCP_CLOSING && sk->sk_err == 0) { in vsock_connect()
1652 if (mod_delayed_work(system_percpu_wq, &vsk->connect_work, in vsock_connect()
1666 sk->sk_state = sk->sk_state == TCP_ESTABLISHED ? TCP_CLOSING : TCP_CLOSE; in vsock_connect()
1667 sock->state = SS_UNCONNECTED; in vsock_connect()
1671 } else if ((sk->sk_state != TCP_ESTABLISHED) && (timeout == 0)) { in vsock_connect()
1672 err = -ETIMEDOUT; in vsock_connect()
1673 sk->sk_state = TCP_CLOSE; in vsock_connect()
1674 sock->state = SS_UNCONNECTED; in vsock_connect()
1682 if (sk->sk_err) { in vsock_connect()
1683 err = -sk->sk_err; in vsock_connect()
1684 sk->sk_state = TCP_CLOSE; in vsock_connect()
1685 sock->state = SS_UNCONNECTED; in vsock_connect()
1708 listener = sock->sk; in vsock_accept()
1712 if (!sock_type_connectible(sock->type)) { in vsock_accept()
1713 err = -EOPNOTSUPP; in vsock_accept()
1717 if (listener->sk_state != TCP_LISTEN) { in vsock_accept()
1718 err = -EINVAL; in vsock_accept()
1725 timeout = sock_rcvtimeo(listener, arg->flags & O_NONBLOCK); in vsock_accept()
1729 listener->sk_err == 0) { in vsock_accept()
1739 err = -EAGAIN; in vsock_accept()
1747 if (listener->sk_err) in vsock_accept()
1748 err = -listener->sk_err; in vsock_accept()
1764 vconnected->rejected = true; in vsock_accept()
1766 newsock->state = SS_CONNECTED; in vsock_accept()
1768 if (vsock_msgzerocopy_allow(vconnected->transport)) in vsock_accept()
1770 &connected->sk_socket->flags); in vsock_accept()
1788 sk = sock->sk; in vsock_listen()
1792 if (!sock_type_connectible(sk->sk_type)) { in vsock_listen()
1793 err = -EOPNOTSUPP; in vsock_listen()
1797 if (sock->state != SS_UNCONNECTED) { in vsock_listen()
1798 err = -EINVAL; in vsock_listen()
1804 if (!vsock_addr_bound(&vsk->local_addr)) { in vsock_listen()
1805 err = -EINVAL; in vsock_listen()
1809 sk->sk_max_ack_backlog = backlog; in vsock_listen()
1810 sk->sk_state = TCP_LISTEN; in vsock_listen()
1823 if (val > vsk->buffer_max_size) in vsock_update_buffer_size()
1824 val = vsk->buffer_max_size; in vsock_update_buffer_size()
1826 if (val < vsk->buffer_min_size) in vsock_update_buffer_size()
1827 val = vsk->buffer_min_size; in vsock_update_buffer_size()
1829 if (val != vsk->buffer_size && in vsock_update_buffer_size()
1830 transport && transport->notify_buffer_size) in vsock_update_buffer_size()
1831 transport->notify_buffer_size(vsk, &val); in vsock_update_buffer_size()
1833 vsk->buffer_size = val; in vsock_update_buffer_size()
1849 return -ENOPROTOOPT; in vsock_connectible_setsockopt()
1854 err = -EINVAL; \ in vsock_connectible_setsockopt()
1858 err = -EFAULT; \ in vsock_connectible_setsockopt()
1864 sk = sock->sk; in vsock_connectible_setsockopt()
1869 transport = vsk->transport; in vsock_connectible_setsockopt()
1885 err = -EINVAL; in vsock_connectible_setsockopt()
1890 err = -EOPNOTSUPP; in vsock_connectible_setsockopt()
1906 vsk->buffer_max_size = val; in vsock_connectible_setsockopt()
1907 vsock_update_buffer_size(vsk, transport, vsk->buffer_size); in vsock_connectible_setsockopt()
1912 vsk->buffer_min_size = val; in vsock_connectible_setsockopt()
1913 vsock_update_buffer_size(vsk, transport, vsk->buffer_size); in vsock_connectible_setsockopt()
1925 tv.tv_sec < (MAX_SCHEDULE_TIMEOUT / HZ - 1)) { in vsock_connectible_setsockopt()
1926 vsk->connect_timeout = tv.tv_sec * HZ + in vsock_connectible_setsockopt()
1928 if (vsk->connect_timeout == 0) in vsock_connectible_setsockopt()
1929 vsk->connect_timeout = in vsock_connectible_setsockopt()
1933 err = -ERANGE; in vsock_connectible_setsockopt()
1939 err = -ENOPROTOOPT; in vsock_connectible_setsockopt()
1955 struct sock *sk = sock->sk; in vsock_connectible_getsockopt()
1969 return -ENOPROTOOPT; in vsock_connectible_getsockopt()
1972 return -EFAULT; in vsock_connectible_getsockopt()
1978 v.val64 = vsk->buffer_size; in vsock_connectible_getsockopt()
1982 v.val64 = vsk->buffer_max_size; in vsock_connectible_getsockopt()
1986 v.val64 = vsk->buffer_min_size; in vsock_connectible_getsockopt()
1991 lv = sock_get_timeout(vsk->connect_timeout, &v, in vsock_connectible_getsockopt()
1996 return -ENOPROTOOPT; in vsock_connectible_getsockopt()
2000 return -EINVAL; in vsock_connectible_getsockopt()
2004 return -EFAULT; in vsock_connectible_getsockopt()
2007 return -EFAULT; in vsock_connectible_getsockopt()
2024 sk = sock->sk; in vsock_connectible_sendmsg()
2029 if (msg->msg_flags & MSG_OOB) in vsock_connectible_sendmsg()
2030 return -EOPNOTSUPP; in vsock_connectible_sendmsg()
2034 transport = vsk->transport; in vsock_connectible_sendmsg()
2036 /* Callers should not provide a destination with connection oriented in vsock_connectible_sendmsg()
2039 if (msg->msg_namelen) { in vsock_connectible_sendmsg()
2040 err = sk->sk_state == TCP_ESTABLISHED ? -EISCONN : -EOPNOTSUPP; in vsock_connectible_sendmsg()
2045 if (sk->sk_shutdown & SEND_SHUTDOWN || in vsock_connectible_sendmsg()
2046 vsk->peer_shutdown & RCV_SHUTDOWN) { in vsock_connectible_sendmsg()
2047 err = -EPIPE; in vsock_connectible_sendmsg()
2051 if (!transport || sk->sk_state != TCP_ESTABLISHED || in vsock_connectible_sendmsg()
2052 !vsock_addr_bound(&vsk->local_addr)) { in vsock_connectible_sendmsg()
2053 err = -ENOTCONN; in vsock_connectible_sendmsg()
2057 if (!vsock_addr_bound(&vsk->remote_addr)) { in vsock_connectible_sendmsg()
2058 err = -EDESTADDRREQ; in vsock_connectible_sendmsg()
2062 if (msg->msg_flags & MSG_ZEROCOPY && in vsock_connectible_sendmsg()
2064 err = -EOPNOTSUPP; in vsock_connectible_sendmsg()
2069 timeout = sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT); in vsock_connectible_sendmsg()
2071 err = transport->notify_send_init(vsk, &send_data); in vsock_connectible_sendmsg()
2080 sk->sk_err == 0 && in vsock_connectible_sendmsg()
2081 !(sk->sk_shutdown & SEND_SHUTDOWN) && in vsock_connectible_sendmsg()
2082 !(vsk->peer_shutdown & RCV_SHUTDOWN)) { in vsock_connectible_sendmsg()
2084 /* Don't wait for non-blocking sockets. */ in vsock_connectible_sendmsg()
2086 err = -EAGAIN; in vsock_connectible_sendmsg()
2091 err = transport->notify_send_pre_block(vsk, &send_data); in vsock_connectible_sendmsg()
2105 err = -EAGAIN; in vsock_connectible_sendmsg()
2116 if (sk->sk_err) { in vsock_connectible_sendmsg()
2117 err = -sk->sk_err; in vsock_connectible_sendmsg()
2119 } else if ((sk->sk_shutdown & SEND_SHUTDOWN) || in vsock_connectible_sendmsg()
2120 (vsk->peer_shutdown & RCV_SHUTDOWN)) { in vsock_connectible_sendmsg()
2121 err = -EPIPE; in vsock_connectible_sendmsg()
2125 err = transport->notify_send_pre_enqueue(vsk, &send_data); in vsock_connectible_sendmsg()
2135 if (sk->sk_type == SOCK_SEQPACKET) { in vsock_connectible_sendmsg()
2136 written = transport->seqpacket_enqueue(vsk, in vsock_connectible_sendmsg()
2137 msg, len - total_written); in vsock_connectible_sendmsg()
2139 written = transport->stream_enqueue(vsk, in vsock_connectible_sendmsg()
2140 msg, len - total_written); in vsock_connectible_sendmsg()
2150 err = transport->notify_send_post_enqueue( in vsock_connectible_sendmsg()
2163 if (sk->sk_type == SOCK_STREAM || total_written == len) in vsock_connectible_sendmsg()
2167 if (sk->sk_type == SOCK_STREAM) in vsock_connectible_sendmsg()
2168 err = sk_stream_error(sk, msg->msg_flags, err); in vsock_connectible_sendmsg()
2187 transport = vsk->transport; in vsock_connectible_wait_data()
2195 if (sk->sk_err != 0 || in vsock_connectible_wait_data()
2196 (sk->sk_shutdown & RCV_SHUTDOWN) || in vsock_connectible_wait_data()
2197 (vsk->peer_shutdown & SEND_SHUTDOWN)) { in vsock_connectible_wait_data()
2201 /* Don't wait for non-blocking sockets. */ in vsock_connectible_wait_data()
2203 err = -EAGAIN; in vsock_connectible_wait_data()
2208 err = transport->notify_recv_pre_block(vsk, target, recv_data); in vsock_connectible_wait_data()
2221 err = -EAGAIN; in vsock_connectible_wait_data()
2236 return -ENOMEM; in vsock_connectible_wait_data()
2255 transport = vsk->transport; in __vsock_stream_recvmsg()
2264 if (target >= transport->stream_rcvhiwat(vsk)) { in __vsock_stream_recvmsg()
2265 err = -ENOMEM; in __vsock_stream_recvmsg()
2271 err = transport->notify_recv_init(vsk, target, &recv_data); in __vsock_stream_recvmsg()
2284 err = transport->notify_recv_pre_dequeue(vsk, target, in __vsock_stream_recvmsg()
2289 read = transport->stream_dequeue(vsk, msg, len - copied, flags); in __vsock_stream_recvmsg()
2297 err = transport->notify_recv_post_dequeue(vsk, target, read, in __vsock_stream_recvmsg()
2305 target -= read; in __vsock_stream_recvmsg()
2308 if (sk->sk_err) in __vsock_stream_recvmsg()
2309 err = -sk->sk_err; in __vsock_stream_recvmsg()
2310 else if (sk->sk_shutdown & RCV_SHUTDOWN) in __vsock_stream_recvmsg()
2331 transport = vsk->transport; in __vsock_seqpacket_recvmsg()
2339 msg_len = transport->seqpacket_dequeue(vsk, msg, flags); in __vsock_seqpacket_recvmsg()
2346 if (sk->sk_err) { in __vsock_seqpacket_recvmsg()
2347 err = -sk->sk_err; in __vsock_seqpacket_recvmsg()
2348 } else if (sk->sk_shutdown & RCV_SHUTDOWN) { in __vsock_seqpacket_recvmsg()
2352 * packet. in __vsock_seqpacket_recvmsg()
2357 err = len - msg_data_left(msg); in __vsock_seqpacket_recvmsg()
2359 /* Always set MSG_TRUNC if real length of packet is in __vsock_seqpacket_recvmsg()
2363 msg->msg_flags |= MSG_TRUNC; in __vsock_seqpacket_recvmsg()
2379 sk = sock->sk; in __vsock_connectible_recvmsg()
2389 transport = vsk->transport; in __vsock_connectible_recvmsg()
2391 if (!transport || sk->sk_state != TCP_ESTABLISHED) { in __vsock_connectible_recvmsg()
2400 err = -ENOTCONN; in __vsock_connectible_recvmsg()
2406 err = -EOPNOTSUPP; in __vsock_connectible_recvmsg()
2414 if (sk->sk_shutdown & RCV_SHUTDOWN) { in __vsock_connectible_recvmsg()
2419 /* It is valid on Linux to pass in a zero-length receive buffer. This in __vsock_connectible_recvmsg()
2427 if (sk->sk_type == SOCK_STREAM) in __vsock_connectible_recvmsg()
2442 struct sock *sk = sock->sk; in vsock_connectible_recvmsg()
2445 prot = READ_ONCE(sk->sk_prot); in vsock_connectible_recvmsg()
2447 return prot->recvmsg(sk, msg, len, flags, NULL); in vsock_connectible_recvmsg()
2461 if (val > vsk->buffer_size) in vsock_set_rcvlowat()
2462 return -EINVAL; in vsock_set_rcvlowat()
2464 transport = vsk->transport; in vsock_set_rcvlowat()
2466 if (transport && transport->notify_set_rcvlowat) { in vsock_set_rcvlowat()
2469 err = transport->notify_set_rcvlowat(vsk, val); in vsock_set_rcvlowat()
2474 WRITE_ONCE(sk->sk_rcvlowat, val ? : 1); in vsock_set_rcvlowat()
2529 return -EINVAL; in vsock_create()
2532 return -EPROTONOSUPPORT; in vsock_create()
2534 switch (sock->type) { in vsock_create()
2536 sock->ops = &vsock_dgram_ops; in vsock_create()
2539 sock->ops = &vsock_stream_ops; in vsock_create()
2542 sock->ops = &vsock_seqpacket_ops; in vsock_create()
2545 return -ESOCKTNOSUPPORT; in vsock_create()
2548 sock->state = SS_UNCONNECTED; in vsock_create()
2552 return -ENOMEM; in vsock_create()
2556 if (sock->type == SOCK_DGRAM) { in vsock_create()
2559 sock->sk = NULL; in vsock_create()
2568 if (sock_type_connectible(sock->type)) in vsock_create()
2569 set_bit(SOCK_CUSTOM_SOCKOPT, &sk->sk_socket->flags); in vsock_create()
2592 * guest CID instead of well-know host CID (VMADDR_CID_HOST). in vsock_dev_do_ioctl()
2601 retval = -EFAULT; in vsock_dev_do_ioctl()
2605 retval = -ENOIOCTLCMD; in vsock_dev_do_ioctl()
2687 return vsk->transport; in vsock_core_get_transport()
2706 err = -EBUSY; in vsock_core_register()
2714 err = -EBUSY; in vsock_core_register()
2722 err = -EBUSY; in vsock_core_register()
2730 err = -EBUSY; in vsock_core_register()
2772 MODULE_VERSION("1.0.2.0-k");