net/vmw_vsock/af_vsock.c
Source file repositories/reference/linux-study-clean/net/vmw_vsock/af_vsock.c
File Facts
- System
- Linux kernel
- Corpus path
net/vmw_vsock/af_vsock.c- Extension
.c- Size
- 79545 bytes
- Lines
- 3143
- Domain
- Networking Core
- Bucket
- Sockets, Protocols, Packet Path, And Network Policy
- Inferred role
- Networking Core: operation-table or driver-model contract
- Status
- pattern implementation candidate
Why This File Exists
Networking stack implementation surface: socket APIs, protocol dispatch, packet flow, routing, filtering, and network namespaces.
- Networking stack implementation surface: socket APIs, protocol dispatch, packet flow, routing, filtering, and network namespaces.
- Defines an operation table; this is where Linux turns generic core objects into subsystem-specific behavior.
- Touches user memory; correctness depends on fault-safe copying and privilege boundary handling.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/compat.hlinux/types.hlinux/bitops.hlinux/cred.hlinux/errqueue.hlinux/init.hlinux/io.hlinux/kernel.hlinux/sched/signal.hlinux/kmod.hlinux/list.hlinux/miscdevice.hlinux/module.hlinux/mutex.hlinux/net.hlinux/proc_fs.hlinux/poll.hlinux/random.hlinux/skbuff.hlinux/smp.hlinux/uio.hlinux/socket.hlinux/stddef.hlinux/sysctl.hlinux/unistd.hlinux/wait.hlinux/workqueue.hnet/sock.hnet/af_vsock.hnet/netns/vsock.huapi/linux/vm_sockets.huapi/asm-generic/ioctls.h
Detected Declarations
function vsock_auto_bindfunction vsock_init_tablesfunction __vsock_insert_boundfunction __vsock_insert_connectedfunction __vsock_remove_boundfunction __vsock_remove_connectedfunction list_for_each_entryfunction __vsock_find_connected_socket_netfunction list_for_each_entryfunction vsock_insert_unboundfunction vsock_insert_connectedfunction vsock_remove_boundfunction vsock_remove_connectedfunction vsock_remove_sockfunction vsock_for_each_connected_socketfunction list_for_each_entryfunction vsock_add_pendingfunction vsock_remove_pendingfunction vsock_pending_to_acceptfunction vsock_enqueue_acceptfunction vsock_use_local_transportfunction vsock_deassign_transportfunction vsock_assign_transportfunction vsock_registered_transport_cidfunction vsock_find_cidfunction vsock_is_accept_queue_emptyfunction vsock_is_pendingfunction vsock_send_shutdownfunction vsock_pending_workfunction __vsock_bind_connectiblefunction __vsock_bind_dgramfunction __vsock_bindfunction sock_type_connectiblefunction __vsock_releasefunction vsock_sk_destructfunction vsock_queue_rcv_skbfunction vsock_stream_has_datafunction vsock_connectible_has_datafunction vsock_stream_has_spacefunction vsock_data_readyfunction saved_closefunction vsock_bindfunction vsock_getnamefunction vsock_lingerfunction vsock_shutdownfunction vsock_poll_shutdownfunction vsock_pollfunction vsock_read_skb
Annotated Snippet
static const struct proto_ops vsock_dgram_ops = {
.family = PF_VSOCK,
.owner = THIS_MODULE,
.release = vsock_release,
.bind = vsock_bind,
.connect = vsock_dgram_connect,
.socketpair = sock_no_socketpair,
.accept = sock_no_accept,
.getname = vsock_getname,
.poll = vsock_poll,
.ioctl = vsock_ioctl,
.listen = sock_no_listen,
.shutdown = vsock_shutdown,
.sendmsg = vsock_dgram_sendmsg,
.recvmsg = vsock_dgram_recvmsg,
.mmap = sock_no_mmap,
.read_skb = vsock_read_skb,
};
static int vsock_transport_cancel_pkt(struct vsock_sock *vsk)
{
const struct vsock_transport *transport = vsk->transport;
if (!transport || !transport->cancel_pkt)
return -EOPNOTSUPP;
return transport->cancel_pkt(vsk);
}
static void vsock_connect_timeout(struct work_struct *work)
{
struct sock *sk;
struct vsock_sock *vsk;
vsk = container_of(work, struct vsock_sock, connect_work.work);
sk = sk_vsock(vsk);
lock_sock(sk);
if (sk->sk_state == TCP_SYN_SENT &&
(sk->sk_shutdown != SHUTDOWN_MASK)) {
sk->sk_state = TCP_CLOSE;
sk->sk_socket->state = SS_UNCONNECTED;
sk->sk_err = ETIMEDOUT;
sk_error_report(sk);
vsock_transport_cancel_pkt(vsk);
}
release_sock(sk);
sock_put(sk);
}
static int vsock_connect(struct socket *sock, struct sockaddr_unsized *addr,
int addr_len, int flags)
{
int err;
struct sock *sk;
struct vsock_sock *vsk;
const struct vsock_transport *transport;
struct sockaddr_vm *remote_addr;
long timeout;
DEFINE_WAIT(wait);
err = 0;
sk = sock->sk;
vsk = vsock_sk(sk);
lock_sock(sk);
/* XXX AF_UNSPEC should make us disconnect like AF_INET. */
switch (sock->state) {
case SS_CONNECTED:
err = -EISCONN;
goto out;
case SS_DISCONNECTING:
err = -EINVAL;
goto out;
case SS_CONNECTING:
/* This continues on so we can move sock into the SS_CONNECTED
* state once the connection has completed (at which point err
* will be set to zero also). Otherwise, we will either wait
* for the connection or return -EALREADY should this be a
* non-blocking call.
*/
err = -EALREADY;
if (flags & O_NONBLOCK)
goto out;
break;
default:
if ((sk->sk_state == TCP_LISTEN) ||
vsock_addr_cast(addr, addr_len, &remote_addr) != 0) {
Annotation
- Immediate include surface: `linux/compat.h`, `linux/types.h`, `linux/bitops.h`, `linux/cred.h`, `linux/errqueue.h`, `linux/init.h`, `linux/io.h`, `linux/kernel.h`.
- Detected declarations: `function vsock_auto_bind`, `function vsock_init_tables`, `function __vsock_insert_bound`, `function __vsock_insert_connected`, `function __vsock_remove_bound`, `function __vsock_remove_connected`, `function list_for_each_entry`, `function __vsock_find_connected_socket_net`, `function list_for_each_entry`, `function vsock_insert_unbound`.
- Atlas domain: Networking Core / Sockets, Protocols, Packet Path, And Network Policy.
- Implementation status: pattern implementation candidate.
- This snippet crosses the user/kernel memory boundary; validate fault handling and access checks before translating the pattern.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.