diff options
author | Jason King <jason.king@joyent.com> | 2021-03-25 17:46:34 +0000 |
---|---|---|
committer | Jason King <jason.king@joyent.com> | 2021-03-25 17:46:34 +0000 |
commit | 122f260adaadbd2a4b4bcf8496c2714e7e43fd5d (patch) | |
tree | 44ee8cfbcb43511aa775654e322c1e76363f97dd | |
parent | c9f9deed3a7ca88d2368ac1f9c1d653662df95d1 (diff) | |
download | illumos-joyent-122f260adaadbd2a4b4bcf8496c2714e7e43fd5d.tar.gz |
More workvsock
-rw-r--r-- | usr/src/uts/common/Makefile.files | 3 | ||||
-rw-r--r-- | usr/src/uts/common/Makefile.rules | 6 | ||||
-rw-r--r-- | usr/src/uts/common/io/vsock/vsock_vio.c | 102 | ||||
-rw-r--r-- | usr/src/uts/common/io/vsock/vsock_vio.h | 84 |
4 files changed, 194 insertions, 1 deletions
diff --git a/usr/src/uts/common/Makefile.files b/usr/src/uts/common/Makefile.files index 4aa4a03310..4075f7952d 100644 --- a/usr/src/uts/common/Makefile.files +++ b/usr/src/uts/common/Makefile.files @@ -2133,6 +2133,9 @@ VIOBLK_OBJS = vioblk.o # Virtio network driver VIOIF_OBJS = vioif.o +# Virtio transport for AF_VSOCK +VSOCK_VIO_OBJS = vsock_vio.o + # # kiconv modules # diff --git a/usr/src/uts/common/Makefile.rules b/usr/src/uts/common/Makefile.rules index c103d6a591..9038019ab3 100644 --- a/usr/src/uts/common/Makefile.rules +++ b/usr/src/uts/common/Makefile.rules @@ -23,7 +23,7 @@ # Copyright (c) 1991, 2010, Oracle and/or its affiliates. All rights reserved. # Copyright 2016 Garrett D'Amore <garrett@damore.org> # Copyright 2013 Saso Kiselkov. All rights reserved. -# Copyright 2020 Joyent, Inc. +# Copyright 2021 Joyent, Inc. # Copyright 2018 Nexenta Systems, Inc. # Copyright (c) 2017 by Delphix. All rights reserved. # Copyright 2020 Oxide Computer Company @@ -1548,6 +1548,10 @@ $(OBJS_DIR)/%.o: $(UTSBASE)/common/io/vioif/%.c $(COMPILE.c) -o $@ $< $(CTFCONVERT_O) +$(OBJS_DIR)/%.o: $(UTSBASE)/common/io/vsock/%.c + $(COMPILE.c) -o $@ $< + $(CTFCONVERT_O) + # # krtld must refer to its own bzero/bcopy until the kernel is fully linked # diff --git a/usr/src/uts/common/io/vsock/vsock_vio.c b/usr/src/uts/common/io/vsock/vsock_vio.c new file mode 100644 index 0000000000..be20e95677 --- /dev/null +++ b/usr/src/uts/common/io/vsock/vsock_vio.c @@ -0,0 +1,102 @@ +/* + * This file and its contents are supplied under the terms of the + * Common Development and Distribution License ("CDDL"), version 1.0. + * You may only use this file in accordance with the terms of version + * 1.0 of the CDDL. + * + * A full copy of the text of the CDDL should have accompanied this + * source. A copy of the CDDL is also available via the Internet at + * http://www.illumos.org/license/CDDL. + */ + +/* + * Copyright 2021 Joyent, Inc. + */ + +/* + * AF_VSOCK VIRTIO TRANSPORT + */ + +#include <sys/stropts.h> +#include <sys/stream.h> +#include <sys/strsubr.h> +#include <sys/modctl.h> +#include <sys/strsun.h> + +#include "virtio.h" +#include "vsock.h" + +static struct cb_ops vsock_vio_cb_ops = { + .cb_rev CB_REV, + .cb_flags = D_MP | D_NEW, + + .cb_open = nulldev, + .cb_close = nulldev, + .cb_strategy = nodev, + .cb_print = nodev, + .cb_dump = nodev, + .cb_read = nodev, + .cb_write = nodev, + .cb_ioctl = nodev, + .cb_devmap = nodev, + .cb_mmap = nodev, + .cb_segmap = nodev, + .cb_chpoll = nochpoll, + .cb_prop_op = ddi_prop_op, + .cb_str = NULL, + .cb_aread = nodev, + .cb_awrite = nodev, +}; + +statuc struct dev_ops vsock_vio_dev_ops = { + .devo_rev = DEVO_REV, + .devo_refcnt = 0, + + .devo_attach = vsock_vio_attach, + .devo_detach = vsock_vio_detach, + .devo_quiesce = vsock_vio_quiesce, + + .devo_cb_ops = &vsock_vio_cb_ops, + + .devo_getinfo = NULL, + .devo_identify = nulldev, + .devo_probe = nulldev, + .devo_reset = nodev, + .devo_bus_ops = NULL, + .devo_power = NULL, +}; + +static struct modldrv vsock_vio_modldrv = { + .drv_modops = &mod_driverops, + .drv_linkinfo = "AF_VSOCK VIRTIO transport driver", + .drv_dev_ops = &vsock_vio_dev_ops, +}; + +static struct modlinkage vsock_vio_modlinkage = { + .ml_rev = MODREV_1, + .ml_linkage = { &vsock_vio_modldrv, NULL } +}; + +int +_init(void) +{ + int rc; + + rc = mod_install(&vsock_vio_modlinkage); + return (rc); +} + +int +_fini(void) +{ + int rc; + + rc = mod_remove(&vsock_vio_modlinkage); + return (rc); +} + +int +_info(struct modinfo *modinfop) +{ + return (mod_info(&vsock_vio_modlinkage, modinfop)); +} diff --git a/usr/src/uts/common/io/vsock/vsock_vio.h b/usr/src/uts/common/io/vsock/vsock_vio.h new file mode 100644 index 0000000000..953d7dc1fa --- /dev/null +++ b/usr/src/uts/common/io/vsock/vsock_vio.h @@ -0,0 +1,84 @@ +/* + * This file and its contents are supplied under the terms of the + * Common Development and Distribution License ("CDDL"), version 1.0. + * You may only use this file in accordance with the terms of version + * 1.0 of the CDDL. + * + * A full copy of the text of the CDDL should have accompanied this + * source. A copy of the CDDL is also available via the Internet at + * http://www.illumos.org/license/CDDL. + */ + +/* + * Copyright 2021 Joyent, Inc. + */ + +#ifndef _VSOCK_VIO_H +#define _VSOCK_VIO_H + +/* + * xxx + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * VIRTIO VSOCK CONFIGURATION REGISTERS + * + * These are offsets into the device-specific configuration space available + * through the virtio_dev_*() family of functions. + */ +#define VIRTO_VSOCK_CONFIG_CID 0x00 /* 16 R */ + +/* + * VIRTIO VSOCK VIRTQUEUES + */ +#define VIRTIO_VSOCK_VIRTQ_RX 0 +#define VIRTIO_VSOCK_VIRTQ_TX 1 +#define VIRTIO_VOCK_VIRTQ_EVENT 2 + +struct virtio_vsock_hdr { + uint64_t vvh_src_cid; + uint64_t vvh_dst_cid; + uint32_t vvh_src_port; + uint32_t vvh_dst_port; + uint32_t vvh_len; + uint16_t vvh_type; + uint16_t vvh_op; + uint32_t vvh_flags; + uint32_t vvh_buf_alloc; + uint32_t vvh_fwd_cnt; +} __packed; + +#define VIRTIO_VSOCK_OP_INVALID 0 + +#define VIRTIO_VSOCK_OP_REQUEST 1 +#define VIRTIO_VSOCK_OP_RESPONSE 2 +#define VIRTIO_VSOCK_OP_RST 3 +#define VIRTIO_VSOCK_OP_SHUTDOWN 4 + +#define VIRTIO_VSOCK_OP_RW 5 + +#define VIRTIO_VSOCK_OP_CREDIT_UPDATE 6 +#define VIRTIO_VSOCK_OP_CREDIT_REQUEST 7 + +struct vsock_dev { + dev_info_t *vsd_dip; + virtio_t *vsd_virtio; + + kmutex_t vsd_mutex; + + virtio_queue_t *vsd_rx_vq; + virtio_queue_t *vsd_tx_vq; + virtio_queue_t *vsd_event_vq; + + uint64_t vsd_cid; +}; + +#ifdef __cplusplus +} +#endif + +#endif /* _VSOCK_H */ |