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()
417 return remote_cid == transport_g2h->get_local_cid(); in vsock_use_local_transport()
425 if (!vsk->transport) in vsock_deassign_transport()
428 vsk->transport->destruct(vsk); in vsock_deassign_transport()
429 module_put(vsk->transport->module); in vsock_deassign_transport()
430 vsk->transport = NULL; in vsock_deassign_transport()
435 * Note: for connection oriented socket this must be called when vsk->remote_addr
438 * The vsk->remote_addr is used to decide which transport to use:
439 * - remote CID == VMADDR_CID_LOCAL or g2h->local_cid or VMADDR_CID_HOST if
441 * - remote CID <= VMADDR_CID_HOST or h2g is not loaded or remote flags field
442 * includes VMADDR_FLAG_TO_HOST flag value, will use guest->host transport;
443 * - remote CID > VMADDR_CID_HOST will use host->guest transport;
449 unsigned int remote_cid = vsk->remote_addr.svm_cid; in vsock_assign_transport()
453 /* If the packet is coming with the source and destination CIDs higher in vsock_assign_transport()
461 if (psk && vsk->local_addr.svm_cid > VMADDR_CID_HOST && in vsock_assign_transport()
462 vsk->remote_addr.svm_cid > VMADDR_CID_HOST) in vsock_assign_transport()
463 vsk->remote_addr.svm_flags |= VMADDR_FLAG_TO_HOST; in vsock_assign_transport()
465 remote_flags = vsk->remote_addr.svm_flags; in vsock_assign_transport()
467 switch (sk->sk_type) { in vsock_assign_transport()
482 return -ESOCKTNOSUPPORT; in vsock_assign_transport()
485 if (vsk->transport) { in vsock_assign_transport()
486 if (vsk->transport == new_transport) in vsock_assign_transport()
489 /* transport->release() must be called with sock lock acquired. in vsock_assign_transport()
495 vsk->transport->release(vsk); in vsock_assign_transport()
504 sk->sk_state = TCP_CLOSE; in vsock_assign_transport()
505 vsk->peer_shutdown = 0; in vsock_assign_transport()
511 if (!new_transport || !try_module_get(new_transport->module)) in vsock_assign_transport()
512 return -ENODEV; in vsock_assign_transport()
514 if (sk->sk_type == SOCK_SEQPACKET) { in vsock_assign_transport()
515 if (!new_transport->seqpacket_allow || in vsock_assign_transport()
516 !new_transport->seqpacket_allow(remote_cid)) { in vsock_assign_transport()
517 module_put(new_transport->module); in vsock_assign_transport()
518 return -ESOCKTNOSUPPORT; in vsock_assign_transport()
522 ret = new_transport->init(vsk, psk); in vsock_assign_transport()
524 module_put(new_transport->module); in vsock_assign_transport()
528 vsk->transport = new_transport; in vsock_assign_transport()
536 if (transport_g2h && cid == transport_g2h->get_local_cid()) in vsock_find_cid()
556 if (list_empty(&vlistener->accept_queue)) in vsock_dequeue_accept()
559 vconnected = list_entry(vlistener->accept_queue.next, in vsock_dequeue_accept()
562 list_del_init(&vconnected->accept_queue); in vsock_dequeue_accept()
574 return list_empty(&vsk->accept_queue); in vsock_is_accept_queue_empty()
580 return !list_empty(&vsk->pending_links); in vsock_is_pending()
587 if (!vsk->transport) in vsock_send_shutdown()
588 return -ENODEV; in vsock_send_shutdown()
590 return vsk->transport->shutdown(vsk, mode); in vsock_send_shutdown()
602 listener = vsk->listener; in vsock_pending_work()
612 } else if (!vsk->rejected) { in vsock_pending_work()
628 sk->sk_state = TCP_CLOSE; in vsock_pending_work()
651 vsock_addr_init(&new_addr, addr->svm_cid, addr->svm_port); in __vsock_bind_connectible()
653 if (addr->svm_port == VMADDR_PORT_ANY) { in __vsock_bind_connectible()
670 return -EADDRNOTAVAIL; in __vsock_bind_connectible()
675 if (addr->svm_port <= LAST_RESERVED_PORT && in __vsock_bind_connectible()
677 return -EACCES; in __vsock_bind_connectible()
681 return -EADDRINUSE; in __vsock_bind_connectible()
684 vsock_addr_init(&vsk->local_addr, new_addr.svm_cid, new_addr.svm_port); in __vsock_bind_connectible()
686 /* Remove connection oriented sockets from the unbound list and add them in __vsock_bind_connectible()
692 __vsock_insert_bound(vsock_bound_sockets(&vsk->local_addr), vsk); in __vsock_bind_connectible()
700 return vsk->transport->dgram_bind(vsk, addr); in __vsock_bind_dgram()
709 if (vsock_addr_bound(&vsk->local_addr)) in __vsock_bind()
710 return -EINVAL; in __vsock_bind()
714 * like AF_INET prevents binding to a non-local IP address (in most in __vsock_bind()
717 if (addr->svm_cid != VMADDR_CID_ANY && !vsock_find_cid(addr->svm_cid)) in __vsock_bind()
718 return -EADDRNOTAVAIL; in __vsock_bind()
720 switch (sk->sk_socket->type) { in __vsock_bind()
733 retval = -EINVAL; in __vsock_bind()
759 /* sk->sk_type is normally set in sock_init_data, but only if sock is in __vsock_create()
760 * non-NULL. We make sure that our sockets always have a type by in __vsock_create()
764 sk->sk_type = type; in __vsock_create()
767 vsock_addr_init(&vsk->local_addr, VMADDR_CID_ANY, VMADDR_PORT_ANY); in __vsock_create()
768 vsock_addr_init(&vsk->remote_addr, VMADDR_CID_ANY, VMADDR_PORT_ANY); in __vsock_create()
770 sk->sk_destruct = vsock_sk_destruct; in __vsock_create()
771 sk->sk_backlog_rcv = vsock_queue_rcv_skb; in __vsock_create()
774 INIT_LIST_HEAD(&vsk->bound_table); in __vsock_create()
775 INIT_LIST_HEAD(&vsk->connected_table); in __vsock_create()
776 vsk->listener = NULL; in __vsock_create()
777 INIT_LIST_HEAD(&vsk->pending_links); in __vsock_create()
778 INIT_LIST_HEAD(&vsk->accept_queue); in __vsock_create()
779 vsk->rejected = false; in __vsock_create()
780 vsk->sent_request = false; in __vsock_create()
781 vsk->ignore_connecting_rst = false; in __vsock_create()
782 vsk->peer_shutdown = 0; in __vsock_create()
783 INIT_DELAYED_WORK(&vsk->connect_work, vsock_connect_timeout); in __vsock_create()
784 INIT_DELAYED_WORK(&vsk->pending_work, vsock_pending_work); in __vsock_create()
788 vsk->trusted = psk->trusted; in __vsock_create()
789 vsk->owner = get_cred(psk->owner); in __vsock_create()
790 vsk->connect_timeout = psk->connect_timeout; in __vsock_create()
791 vsk->buffer_size = psk->buffer_size; in __vsock_create()
792 vsk->buffer_min_size = psk->buffer_min_size; in __vsock_create()
793 vsk->buffer_max_size = psk->buffer_max_size; in __vsock_create()
796 vsk->trusted = ns_capable_noaudit(&init_user_ns, CAP_NET_ADMIN); in __vsock_create()
797 vsk->owner = get_current_cred(); in __vsock_create()
798 vsk->connect_timeout = VSOCK_DEFAULT_CONNECT_TIMEOUT; in __vsock_create()
799 vsk->buffer_size = VSOCK_DEFAULT_BUFFER_SIZE; in __vsock_create()
800 vsk->buffer_min_size = VSOCK_DEFAULT_BUFFER_MIN_SIZE; in __vsock_create()
801 vsk->buffer_max_size = VSOCK_DEFAULT_BUFFER_MAX_SIZE; in __vsock_create()
834 if (vsk->transport) in __vsock_release()
835 vsk->transport->release(vsk); in __vsock_release()
836 else if (sock_type_connectible(sk->sk_type)) in __vsock_release()
840 sk->sk_shutdown = SHUTDOWN_MASK; in __vsock_release()
842 skb_queue_purge(&sk->sk_receive_queue); in __vsock_release()
859 __skb_queue_purge(&sk->sk_error_queue); in vsock_sk_destruct()
866 vsock_addr_init(&vsk->local_addr, VMADDR_CID_ANY, VMADDR_PORT_ANY); in vsock_sk_destruct()
867 vsock_addr_init(&vsk->remote_addr, VMADDR_CID_ANY, VMADDR_PORT_ANY); in vsock_sk_destruct()
869 put_cred(vsk->owner); in vsock_sk_destruct()
886 parent->sk_type, 0); in vsock_create_connected()
892 if (WARN_ON(!vsk->transport)) in vsock_stream_has_data()
895 return vsk->transport->stream_has_data(vsk); in vsock_stream_has_data()
903 if (WARN_ON(!vsk->transport)) in vsock_connectible_has_data()
906 if (sk->sk_type == SOCK_SEQPACKET) in vsock_connectible_has_data()
907 return vsk->transport->seqpacket_has_data(vsk); in vsock_connectible_has_data()
915 if (WARN_ON(!vsk->transport)) in vsock_stream_has_space()
918 return vsk->transport->stream_has_space(vsk); in vsock_stream_has_space()
926 if (vsock_stream_has_data(vsk) >= sk->sk_rcvlowat || in vsock_data_ready()
928 sk->sk_data_ready(sk); in vsock_data_ready()
941 struct sock *sk = sock->sk; in vsock_release()
946 sk->sk_prot->close(sk, 0); in vsock_release()
948 sock->sk = NULL; in vsock_release()
949 sock->state = SS_FREE; in vsock_release()
961 sk = sock->sk; in vsock_bind()
964 return -EINVAL; in vsock_bind()
981 sk = sock->sk; in vsock_getname()
988 if (sock->state != SS_CONNECTED) { in vsock_getname()
989 err = -ENOTCONN; in vsock_getname()
992 vm_addr = &vsk->remote_addr; in vsock_getname()
994 vm_addr = &vsk->local_addr; in vsock_getname()
998 err = -EINVAL; in vsock_getname()
1003 * MAX_SOCK_ADDR-sized buffer and don't set addr_len. Unfortunately in vsock_getname()
1030 return -EINVAL; in vsock_shutdown()
1032 /* If this is a connection oriented socket and it is not connected then in vsock_shutdown()
1038 sk = sock->sk; in vsock_shutdown()
1041 if (sock->state == SS_UNCONNECTED) { in vsock_shutdown()
1042 err = -ENOTCONN; in vsock_shutdown()
1043 if (sock_type_connectible(sk->sk_type)) in vsock_shutdown()
1046 sock->state = SS_DISCONNECTING; in vsock_shutdown()
1053 sk->sk_shutdown |= mode; in vsock_shutdown()
1054 sk->sk_state_change(sk); in vsock_shutdown()
1056 if (sock_type_connectible(sk->sk_type)) { in vsock_shutdown()
1074 sk = sock->sk; in vsock_poll()
1080 if (sk->sk_err || !skb_queue_empty_lockless(&sk->sk_error_queue)) in vsock_poll()
1087 if ((sk->sk_shutdown == SHUTDOWN_MASK) || in vsock_poll()
1088 ((sk->sk_shutdown & SEND_SHUTDOWN) && in vsock_poll()
1089 (vsk->peer_shutdown & SEND_SHUTDOWN))) { in vsock_poll()
1093 if (sk->sk_shutdown & RCV_SHUTDOWN || in vsock_poll()
1094 vsk->peer_shutdown & SEND_SHUTDOWN) { in vsock_poll()
1101 if (sock->type == SOCK_DGRAM) { in vsock_poll()
1106 if (!skb_queue_empty_lockless(&sk->sk_receive_queue) || in vsock_poll()
1107 (sk->sk_shutdown & RCV_SHUTDOWN)) { in vsock_poll()
1111 if (!(sk->sk_shutdown & SEND_SHUTDOWN)) in vsock_poll()
1114 } else if (sock_type_connectible(sk->sk_type)) { in vsock_poll()
1119 transport = vsk->transport; in vsock_poll()
1124 if (sk->sk_state == TCP_LISTEN in vsock_poll()
1129 if (transport && transport->stream_is_active(vsk) && in vsock_poll()
1130 !(sk->sk_shutdown & RCV_SHUTDOWN)) { in vsock_poll()
1133 int ret = transport->notify_poll_in( in vsock_poll()
1148 if (sk->sk_shutdown & RCV_SHUTDOWN || in vsock_poll()
1149 vsk->peer_shutdown & SEND_SHUTDOWN) { in vsock_poll()
1154 if (transport && sk->sk_state == TCP_ESTABLISHED) { in vsock_poll()
1155 if (!(sk->sk_shutdown & SEND_SHUTDOWN)) { in vsock_poll()
1157 int ret = transport->notify_poll_out( in vsock_poll()
1176 if (sk->sk_state == TCP_CLOSE || sk->sk_state == TCP_CLOSING) { in vsock_poll()
1177 if (!(sk->sk_shutdown & SEND_SHUTDOWN)) in vsock_poll()
1192 if (WARN_ON_ONCE(!vsk->transport)) in vsock_read_skb()
1193 return -ENODEV; in vsock_read_skb()
1195 return vsk->transport->read_skb(vsk, read_actor); in vsock_read_skb()
1207 if (msg->msg_flags & MSG_OOB) in vsock_dgram_sendmsg()
1208 return -EOPNOTSUPP; in vsock_dgram_sendmsg()
1212 sk = sock->sk; in vsock_dgram_sendmsg()
1217 transport = vsk->transport; in vsock_dgram_sendmsg()
1227 if (msg->msg_name && in vsock_dgram_sendmsg()
1228 vsock_addr_cast(msg->msg_name, msg->msg_namelen, in vsock_dgram_sendmsg()
1234 if (remote_addr->svm_cid == VMADDR_CID_ANY) in vsock_dgram_sendmsg()
1235 remote_addr->svm_cid = transport->get_local_cid(); in vsock_dgram_sendmsg()
1238 err = -EINVAL; in vsock_dgram_sendmsg()
1241 } else if (sock->state == SS_CONNECTED) { in vsock_dgram_sendmsg()
1242 remote_addr = &vsk->remote_addr; in vsock_dgram_sendmsg()
1244 if (remote_addr->svm_cid == VMADDR_CID_ANY) in vsock_dgram_sendmsg()
1245 remote_addr->svm_cid = transport->get_local_cid(); in vsock_dgram_sendmsg()
1250 if (!vsock_addr_bound(&vsk->remote_addr)) { in vsock_dgram_sendmsg()
1251 err = -EINVAL; in vsock_dgram_sendmsg()
1255 err = -EINVAL; in vsock_dgram_sendmsg()
1259 if (!transport->dgram_allow(remote_addr->svm_cid, in vsock_dgram_sendmsg()
1260 remote_addr->svm_port)) { in vsock_dgram_sendmsg()
1261 err = -EINVAL; in vsock_dgram_sendmsg()
1265 err = transport->dgram_enqueue(vsk, remote_addr, msg, len); in vsock_dgram_sendmsg()
1280 sk = sock->sk; in vsock_dgram_connect()
1284 if (err == -EAFNOSUPPORT && remote_addr->svm_family == AF_UNSPEC) { in vsock_dgram_connect()
1286 vsock_addr_init(&vsk->remote_addr, VMADDR_CID_ANY, in vsock_dgram_connect()
1288 sock->state = SS_UNCONNECTED; in vsock_dgram_connect()
1292 return -EINVAL; in vsock_dgram_connect()
1300 if (!vsk->transport->dgram_allow(remote_addr->svm_cid, in vsock_dgram_connect()
1301 remote_addr->svm_port)) { in vsock_dgram_connect()
1302 err = -EINVAL; in vsock_dgram_connect()
1306 memcpy(&vsk->remote_addr, remote_addr, sizeof(vsk->remote_addr)); in vsock_dgram_connect()
1307 sock->state = SS_CONNECTED; in vsock_dgram_connect()
1309 /* sock map disallows redirection of non-TCP sockets with sk_state != in vsock_dgram_connect()
1317 sk->sk_state = TCP_ESTABLISHED; in vsock_dgram_connect()
1327 struct sock *sk = sock->sk; in __vsock_dgram_recvmsg()
1330 return vsk->transport->dgram_dequeue(vsk, msg, len, flags); in __vsock_dgram_recvmsg()
1337 struct sock *sk = sock->sk; in vsock_dgram_recvmsg()
1340 prot = READ_ONCE(sk->sk_prot); in vsock_dgram_recvmsg()
1342 return prot->recvmsg(sk, msg, len, flags, NULL); in vsock_dgram_recvmsg()
1352 struct sock *sk = sock->sk; in vsock_do_ioctl()
1362 if (!vsk->transport || !vsk->transport->unsent_bytes) { in vsock_do_ioctl()
1363 ret = -EOPNOTSUPP; in vsock_do_ioctl()
1367 if (sock_type_connectible(sk->sk_type) && sk->sk_state == TCP_LISTEN) { in vsock_do_ioctl()
1368 ret = -EINVAL; in vsock_do_ioctl()
1372 n_bytes = vsk->transport->unsent_bytes(vsk); in vsock_do_ioctl()
1382 ret = -ENOIOCTLCMD; in vsock_do_ioctl()
1393 lock_sock(sock->sk); in vsock_ioctl()
1395 release_sock(sock->sk); in vsock_ioctl()
1421 const struct vsock_transport *transport = vsk->transport; in vsock_transport_cancel_pkt()
1423 if (!transport || !transport->cancel_pkt) in vsock_transport_cancel_pkt()
1424 return -EOPNOTSUPP; in vsock_transport_cancel_pkt()
1426 return transport->cancel_pkt(vsk); in vsock_transport_cancel_pkt()
1438 if (sk->sk_state == TCP_SYN_SENT && in vsock_connect_timeout()
1439 (sk->sk_shutdown != SHUTDOWN_MASK)) { in vsock_connect_timeout()
1440 sk->sk_state = TCP_CLOSE; in vsock_connect_timeout()
1441 sk->sk_socket->state = SS_UNCONNECTED; in vsock_connect_timeout()
1442 sk->sk_err = ETIMEDOUT; in vsock_connect_timeout()
1463 sk = sock->sk; in vsock_connect()
1469 switch (sock->state) { in vsock_connect()
1471 err = -EISCONN; in vsock_connect()
1474 err = -EINVAL; in vsock_connect()
1480 * for the connection or return -EALREADY should this be a in vsock_connect()
1481 * non-blocking call. in vsock_connect()
1483 err = -EALREADY; in vsock_connect()
1488 if ((sk->sk_state == TCP_LISTEN) || in vsock_connect()
1490 err = -EINVAL; in vsock_connect()
1495 memcpy(&vsk->remote_addr, remote_addr, in vsock_connect()
1496 sizeof(vsk->remote_addr)); in vsock_connect()
1502 transport = vsk->transport; in vsock_connect()
1504 /* The hypervisor and well-known contexts do not have socket in vsock_connect()
1508 !transport->stream_allow(remote_addr->svm_cid, in vsock_connect()
1509 remote_addr->svm_port)) { in vsock_connect()
1510 err = -ENETUNREACH; in vsock_connect()
1515 set_bit(SOCK_SUPPORT_ZC, &sk->sk_socket->flags); in vsock_connect()
1521 err = -EOPNOTSUPP; in vsock_connect()
1529 sk->sk_state = TCP_SYN_SENT; in vsock_connect()
1531 err = transport->connect(vsk); in vsock_connect()
1538 sk->sk_err = 0; in vsock_connect()
1541 * progress in case this is a non-blocking connect. in vsock_connect()
1543 sock->state = SS_CONNECTING; in vsock_connect()
1544 err = -EINPROGRESS; in vsock_connect()
1551 timeout = vsk->connect_timeout; in vsock_connect()
1557 while (sk->sk_state != TCP_ESTABLISHED && in vsock_connect()
1558 sk->sk_state != TCP_CLOSING && sk->sk_err == 0) { in vsock_connect()
1572 if (mod_delayed_work(system_wq, &vsk->connect_work, in vsock_connect()
1586 sk->sk_state = sk->sk_state == TCP_ESTABLISHED ? TCP_CLOSING : TCP_CLOSE; in vsock_connect()
1587 sock->state = SS_UNCONNECTED; in vsock_connect()
1591 } else if ((sk->sk_state != TCP_ESTABLISHED) && (timeout == 0)) { in vsock_connect()
1592 err = -ETIMEDOUT; in vsock_connect()
1593 sk->sk_state = TCP_CLOSE; in vsock_connect()
1594 sock->state = SS_UNCONNECTED; in vsock_connect()
1602 if (sk->sk_err) { in vsock_connect()
1603 err = -sk->sk_err; in vsock_connect()
1604 sk->sk_state = TCP_CLOSE; in vsock_connect()
1605 sock->state = SS_UNCONNECTED; in vsock_connect()
1628 listener = sock->sk; in vsock_accept()
1632 if (!sock_type_connectible(sock->type)) { in vsock_accept()
1633 err = -EOPNOTSUPP; in vsock_accept()
1637 if (listener->sk_state != TCP_LISTEN) { in vsock_accept()
1638 err = -EINVAL; in vsock_accept()
1645 timeout = sock_rcvtimeo(listener, arg->flags & O_NONBLOCK); in vsock_accept()
1649 listener->sk_err == 0) { in vsock_accept()
1659 err = -EAGAIN; in vsock_accept()
1667 if (listener->sk_err) in vsock_accept()
1668 err = -listener->sk_err; in vsock_accept()
1684 vconnected->rejected = true; in vsock_accept()
1686 newsock->state = SS_CONNECTED; in vsock_accept()
1688 if (vsock_msgzerocopy_allow(vconnected->transport)) in vsock_accept()
1690 &connected->sk_socket->flags); in vsock_accept()
1708 sk = sock->sk; in vsock_listen()
1712 if (!sock_type_connectible(sk->sk_type)) { in vsock_listen()
1713 err = -EOPNOTSUPP; in vsock_listen()
1717 if (sock->state != SS_UNCONNECTED) { in vsock_listen()
1718 err = -EINVAL; in vsock_listen()
1724 if (!vsock_addr_bound(&vsk->local_addr)) { in vsock_listen()
1725 err = -EINVAL; in vsock_listen()
1729 sk->sk_max_ack_backlog = backlog; in vsock_listen()
1730 sk->sk_state = TCP_LISTEN; in vsock_listen()
1743 if (val > vsk->buffer_max_size) in vsock_update_buffer_size()
1744 val = vsk->buffer_max_size; in vsock_update_buffer_size()
1746 if (val < vsk->buffer_min_size) in vsock_update_buffer_size()
1747 val = vsk->buffer_min_size; in vsock_update_buffer_size()
1749 if (val != vsk->buffer_size && in vsock_update_buffer_size()
1750 transport && transport->notify_buffer_size) in vsock_update_buffer_size()
1751 transport->notify_buffer_size(vsk, &val); in vsock_update_buffer_size()
1753 vsk->buffer_size = val; in vsock_update_buffer_size()
1769 return -ENOPROTOOPT; in vsock_connectible_setsockopt()
1774 err = -EINVAL; \ in vsock_connectible_setsockopt()
1778 err = -EFAULT; \ in vsock_connectible_setsockopt()
1784 sk = sock->sk; in vsock_connectible_setsockopt()
1789 transport = vsk->transport; in vsock_connectible_setsockopt()
1805 err = -EINVAL; in vsock_connectible_setsockopt()
1810 err = -EOPNOTSUPP; in vsock_connectible_setsockopt()
1826 vsk->buffer_max_size = val; in vsock_connectible_setsockopt()
1827 vsock_update_buffer_size(vsk, transport, vsk->buffer_size); in vsock_connectible_setsockopt()
1832 vsk->buffer_min_size = val; in vsock_connectible_setsockopt()
1833 vsock_update_buffer_size(vsk, transport, vsk->buffer_size); in vsock_connectible_setsockopt()
1845 tv.tv_sec < (MAX_SCHEDULE_TIMEOUT / HZ - 1)) { in vsock_connectible_setsockopt()
1846 vsk->connect_timeout = tv.tv_sec * HZ + in vsock_connectible_setsockopt()
1848 if (vsk->connect_timeout == 0) in vsock_connectible_setsockopt()
1849 vsk->connect_timeout = in vsock_connectible_setsockopt()
1853 err = -ERANGE; in vsock_connectible_setsockopt()
1859 err = -ENOPROTOOPT; in vsock_connectible_setsockopt()
1875 struct sock *sk = sock->sk; in vsock_connectible_getsockopt()
1889 return -ENOPROTOOPT; in vsock_connectible_getsockopt()
1892 return -EFAULT; in vsock_connectible_getsockopt()
1898 v.val64 = vsk->buffer_size; in vsock_connectible_getsockopt()
1902 v.val64 = vsk->buffer_max_size; in vsock_connectible_getsockopt()
1906 v.val64 = vsk->buffer_min_size; in vsock_connectible_getsockopt()
1911 lv = sock_get_timeout(vsk->connect_timeout, &v, in vsock_connectible_getsockopt()
1916 return -ENOPROTOOPT; in vsock_connectible_getsockopt()
1920 return -EINVAL; in vsock_connectible_getsockopt()
1924 return -EFAULT; in vsock_connectible_getsockopt()
1927 return -EFAULT; in vsock_connectible_getsockopt()
1944 sk = sock->sk; in vsock_connectible_sendmsg()
1949 if (msg->msg_flags & MSG_OOB) in vsock_connectible_sendmsg()
1950 return -EOPNOTSUPP; in vsock_connectible_sendmsg()
1954 transport = vsk->transport; in vsock_connectible_sendmsg()
1956 /* Callers should not provide a destination with connection oriented in vsock_connectible_sendmsg()
1959 if (msg->msg_namelen) { in vsock_connectible_sendmsg()
1960 err = sk->sk_state == TCP_ESTABLISHED ? -EISCONN : -EOPNOTSUPP; in vsock_connectible_sendmsg()
1965 if (sk->sk_shutdown & SEND_SHUTDOWN || in vsock_connectible_sendmsg()
1966 vsk->peer_shutdown & RCV_SHUTDOWN) { in vsock_connectible_sendmsg()
1967 err = -EPIPE; in vsock_connectible_sendmsg()
1971 if (!transport || sk->sk_state != TCP_ESTABLISHED || in vsock_connectible_sendmsg()
1972 !vsock_addr_bound(&vsk->local_addr)) { in vsock_connectible_sendmsg()
1973 err = -ENOTCONN; in vsock_connectible_sendmsg()
1977 if (!vsock_addr_bound(&vsk->remote_addr)) { in vsock_connectible_sendmsg()
1978 err = -EDESTADDRREQ; in vsock_connectible_sendmsg()
1982 if (msg->msg_flags & MSG_ZEROCOPY && in vsock_connectible_sendmsg()
1984 err = -EOPNOTSUPP; in vsock_connectible_sendmsg()
1989 timeout = sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT); in vsock_connectible_sendmsg()
1991 err = transport->notify_send_init(vsk, &send_data); in vsock_connectible_sendmsg()
2000 sk->sk_err == 0 && in vsock_connectible_sendmsg()
2001 !(sk->sk_shutdown & SEND_SHUTDOWN) && in vsock_connectible_sendmsg()
2002 !(vsk->peer_shutdown & RCV_SHUTDOWN)) { in vsock_connectible_sendmsg()
2004 /* Don't wait for non-blocking sockets. */ in vsock_connectible_sendmsg()
2006 err = -EAGAIN; in vsock_connectible_sendmsg()
2011 err = transport->notify_send_pre_block(vsk, &send_data); in vsock_connectible_sendmsg()
2025 err = -EAGAIN; in vsock_connectible_sendmsg()
2036 if (sk->sk_err) { in vsock_connectible_sendmsg()
2037 err = -sk->sk_err; in vsock_connectible_sendmsg()
2039 } else if ((sk->sk_shutdown & SEND_SHUTDOWN) || in vsock_connectible_sendmsg()
2040 (vsk->peer_shutdown & RCV_SHUTDOWN)) { in vsock_connectible_sendmsg()
2041 err = -EPIPE; in vsock_connectible_sendmsg()
2045 err = transport->notify_send_pre_enqueue(vsk, &send_data); in vsock_connectible_sendmsg()
2055 if (sk->sk_type == SOCK_SEQPACKET) { in vsock_connectible_sendmsg()
2056 written = transport->seqpacket_enqueue(vsk, in vsock_connectible_sendmsg()
2057 msg, len - total_written); in vsock_connectible_sendmsg()
2059 written = transport->stream_enqueue(vsk, in vsock_connectible_sendmsg()
2060 msg, len - total_written); in vsock_connectible_sendmsg()
2070 err = transport->notify_send_post_enqueue( in vsock_connectible_sendmsg()
2083 if (sk->sk_type == SOCK_STREAM || total_written == len) in vsock_connectible_sendmsg()
2087 if (sk->sk_type == SOCK_STREAM) in vsock_connectible_sendmsg()
2088 err = sk_stream_error(sk, msg->msg_flags, err); in vsock_connectible_sendmsg()
2107 transport = vsk->transport; in vsock_connectible_wait_data()
2115 if (sk->sk_err != 0 || in vsock_connectible_wait_data()
2116 (sk->sk_shutdown & RCV_SHUTDOWN) || in vsock_connectible_wait_data()
2117 (vsk->peer_shutdown & SEND_SHUTDOWN)) { in vsock_connectible_wait_data()
2121 /* Don't wait for non-blocking sockets. */ in vsock_connectible_wait_data()
2123 err = -EAGAIN; in vsock_connectible_wait_data()
2128 err = transport->notify_recv_pre_block(vsk, target, recv_data); in vsock_connectible_wait_data()
2141 err = -EAGAIN; in vsock_connectible_wait_data()
2156 return -ENOMEM; in vsock_connectible_wait_data()
2175 transport = vsk->transport; in __vsock_stream_recvmsg()
2184 if (target >= transport->stream_rcvhiwat(vsk)) { in __vsock_stream_recvmsg()
2185 err = -ENOMEM; in __vsock_stream_recvmsg()
2191 err = transport->notify_recv_init(vsk, target, &recv_data); in __vsock_stream_recvmsg()
2204 err = transport->notify_recv_pre_dequeue(vsk, target, in __vsock_stream_recvmsg()
2209 read = transport->stream_dequeue(vsk, msg, len - copied, flags); in __vsock_stream_recvmsg()
2217 err = transport->notify_recv_post_dequeue(vsk, target, read, in __vsock_stream_recvmsg()
2225 target -= read; in __vsock_stream_recvmsg()
2228 if (sk->sk_err) in __vsock_stream_recvmsg()
2229 err = -sk->sk_err; in __vsock_stream_recvmsg()
2230 else if (sk->sk_shutdown & RCV_SHUTDOWN) in __vsock_stream_recvmsg()
2251 transport = vsk->transport; in __vsock_seqpacket_recvmsg()
2259 msg_len = transport->seqpacket_dequeue(vsk, msg, flags); in __vsock_seqpacket_recvmsg()
2266 if (sk->sk_err) { in __vsock_seqpacket_recvmsg()
2267 err = -sk->sk_err; in __vsock_seqpacket_recvmsg()
2268 } else if (sk->sk_shutdown & RCV_SHUTDOWN) { in __vsock_seqpacket_recvmsg()
2272 * packet. in __vsock_seqpacket_recvmsg()
2277 err = len - msg_data_left(msg); in __vsock_seqpacket_recvmsg()
2279 /* Always set MSG_TRUNC if real length of packet is in __vsock_seqpacket_recvmsg()
2283 msg->msg_flags |= MSG_TRUNC; in __vsock_seqpacket_recvmsg()
2299 sk = sock->sk; in __vsock_connectible_recvmsg()
2309 transport = vsk->transport; in __vsock_connectible_recvmsg()
2311 if (!transport || sk->sk_state != TCP_ESTABLISHED) { in __vsock_connectible_recvmsg()
2320 err = -ENOTCONN; in __vsock_connectible_recvmsg()
2326 err = -EOPNOTSUPP; in __vsock_connectible_recvmsg()
2334 if (sk->sk_shutdown & RCV_SHUTDOWN) { in __vsock_connectible_recvmsg()
2339 /* It is valid on Linux to pass in a zero-length receive buffer. This in __vsock_connectible_recvmsg()
2347 if (sk->sk_type == SOCK_STREAM) in __vsock_connectible_recvmsg()
2362 struct sock *sk = sock->sk; in vsock_connectible_recvmsg()
2365 prot = READ_ONCE(sk->sk_prot); in vsock_connectible_recvmsg()
2367 return prot->recvmsg(sk, msg, len, flags, NULL); in vsock_connectible_recvmsg()
2381 if (val > vsk->buffer_size) in vsock_set_rcvlowat()
2382 return -EINVAL; in vsock_set_rcvlowat()
2384 transport = vsk->transport; in vsock_set_rcvlowat()
2386 if (transport && transport->notify_set_rcvlowat) { in vsock_set_rcvlowat()
2389 err = transport->notify_set_rcvlowat(vsk, val); in vsock_set_rcvlowat()
2394 WRITE_ONCE(sk->sk_rcvlowat, val ? : 1); in vsock_set_rcvlowat()
2449 return -EINVAL; in vsock_create()
2452 return -EPROTONOSUPPORT; in vsock_create()
2454 switch (sock->type) { in vsock_create()
2456 sock->ops = &vsock_dgram_ops; in vsock_create()
2459 sock->ops = &vsock_stream_ops; in vsock_create()
2462 sock->ops = &vsock_seqpacket_ops; in vsock_create()
2465 return -ESOCKTNOSUPPORT; in vsock_create()
2468 sock->state = SS_UNCONNECTED; in vsock_create()
2472 return -ENOMEM; in vsock_create()
2476 if (sock->type == SOCK_DGRAM) { in vsock_create()
2479 sock->sk = NULL; in vsock_create()
2488 if (sock_type_connectible(sock->type)) in vsock_create()
2489 set_bit(SOCK_CUSTOM_SOCKOPT, &sk->sk_socket->flags); in vsock_create()
2512 * guest CID instead of well-know host CID (VMADDR_CID_HOST). in vsock_dev_do_ioctl()
2515 cid = transport_g2h->get_local_cid(); in vsock_dev_do_ioctl()
2517 cid = transport_h2g->get_local_cid(); in vsock_dev_do_ioctl()
2520 retval = -EFAULT; in vsock_dev_do_ioctl()
2524 retval = -ENOIOCTLCMD; in vsock_dev_do_ioctl()
2606 return vsk->transport; in vsock_core_get_transport()
2625 err = -EBUSY; in vsock_core_register()
2633 err = -EBUSY; in vsock_core_register()
2641 err = -EBUSY; in vsock_core_register()
2649 err = -EBUSY; in vsock_core_register()
2691 MODULE_VERSION("1.0.2.0-k");