[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT/LWIP PATCH] sockets: Adopt to updated vfscore
Adopts the sockets glue implementation to the updated vfscore library. Signed-off-by: Simon Kuenzer <simon.kuenzer@xxxxxxxxx> --- include/lwipopts.h | 10 ++++ sockets.c | 132 +++++++++++++++++++++++++++++++++++++---------------- 2 files changed, 102 insertions(+), 40 deletions(-) diff --git a/include/lwipopts.h b/include/lwipopts.h index c94c23d..c72c161 100644 --- a/include/lwipopts.h +++ b/include/lwipopts.h @@ -194,6 +194,16 @@ void sys_free(void *ptr); #define FD_SET #endif +/* Stop lwip to provide icovec */ +#include <sys/uio.h> + +/* + * We need to stop lwip introducing `struct iovec` because it is provided by + * our libc already. The only way lwip allows us to do this is to define iovec + * as iovec. This keeps depending definitions of lwip still working. + */ +#define iovec iovec + /* * disable BSD-style socket interface * We will provide the layer with socket.c|unikraft diff --git a/sockets.c b/sockets.c index bdf21ad..fd6d61a 100644 --- a/sockets.c +++ b/sockets.c @@ -36,6 +36,8 @@ /* network stub calls */ #include <sys/time.h> #include <vfscore/file.h> +#include <vfscore/fs.h> +#include <vfscore/vnode.h> #include <uk/alloc.h> #include <uk/essentials.h> #include <uk/errptr.h> @@ -68,99 +70,149 @@ EXIT: return file; } -static int sock_fd_alloc(struct vfscore_fops *fops, int sock_fd) +static int sock_fd_alloc(struct vnops *v_op, int sock_fd) { int ret = 0; int vfs_fd; struct sock_net_file *file = NULL; + struct dentry *s_dentry; + struct vnode *s_vnode; - /* Allocate file descriptor */ + /* Reserve file descriptor number */ vfs_fd = vfscore_alloc_fd(); if (vfs_fd < 0) { ret = -ENFILE; - LWIP_DEBUGF(SOCKETS_DEBUG, ("failed to allocate socket fd\n")); - goto EXIT; + LWIP_DEBUGF(SOCKETS_DEBUG, + ("Failed to allocate file descriptor number\n")); + goto ERR_EXIT; } - file = uk_malloc(uk_alloc_get_default(), sizeof(*file)); + /* Allocate file, dentry, and vnode */ + file = uk_calloc(uk_alloc_get_default(), 1, sizeof(*file)); if (!file) { ret = -ENOMEM; LWIP_DEBUGF(SOCKETS_DEBUG, - ("failed to allocate socket fd: no mem\n")); - goto UK_MEM_ALLOC_ERR; + ("Failed to allocate socket file: Out of memory\n")); + goto ERR_MALLOC_FILE; } - file->vfscore_file.fops = fops; + s_dentry = uk_calloc(uk_alloc_get_default(), 1, sizeof(*s_dentry)); + if (!s_dentry) { + ret = -ENOMEM; + LWIP_DEBUGF(SOCKETS_DEBUG, + ("Failed to allocate socket dentry: Out of memory\n")); + goto ERR_MALLOC_DENTRY; + } + s_vnode = uk_calloc(uk_alloc_get_default(), 1, sizeof(*s_vnode)); + if (!s_vnode) { + ret = -ENOMEM; + LWIP_DEBUGF(SOCKETS_DEBUG, + ("Failed to allocate socket vnode: Out of memory\n")); + goto ERR_MALLOC_VNODE; + } + + /* Put things together, and fill out necessary fields */ + file->vfscore_file.fd = vfs_fd; + file->vfscore_file.f_flags = FWRITE | FREAD; + file->vfscore_file.f_count = 1; + file->vfscore_file.f_dentry = s_dentry; + + s_dentry->d_vnode = s_vnode; + + s_vnode->v_op = v_op; + uk_mutex_init(&s_vnode->v_lock); + s_vnode->v_refcnt = 1; + s_vnode->v_data = file; + file->sock_fd = sock_fd; - LWIP_DEBUGF(SOCKETS_DEBUG, ("allocated socket %d (%x)\n", + LWIP_DEBUGF(SOCKETS_DEBUG, ("Allocated socket %d (%x)\n", file->vfscore_file.fd, file->sock_fd)); + /* Storing the information within the vfs structure */ - vfscore_install_fd(vfs_fd, &file->vfscore_file); - ret = vfs_fd; -EXIT: - return ret; + ret = vfscore_install_fd(vfs_fd, &file->vfscore_file); + if (ret) { + LWIP_DEBUGF(SOCKETS_DEBUG, + ("Failed to install socket fd\n")); + goto ERR_VFS_INSTALL; + } + + /* Return file descriptor of our socket */ + return vfs_fd; -UK_MEM_ALLOC_ERR: +ERR_VFS_INSTALL: + uk_free(uk_alloc_get_default(), s_vnode); +ERR_MALLOC_VNODE: + uk_free(uk_alloc_get_default(), s_dentry); +ERR_MALLOC_DENTRY: + uk_free(uk_alloc_get_default(), file); +ERR_MALLOC_FILE: vfscore_put_fd(vfs_fd); - goto EXIT; +ERR_EXIT: + UK_ASSERT(ret < 0); + return ret; } -static int sock_net_close(struct vfscore_file *vfscore_file) +static int sock_net_close(struct vnode *s_vnode, + struct vfscore_file *vfscore_file __maybe_unused) { int ret = 0; struct sock_net_file *file = NULL; - file = __containerof(vfscore_file, struct sock_net_file, vfscore_file); - + file = s_vnode->v_data; LWIP_DEBUGF(SOCKETS_DEBUG, ("close %d (%x)\n", file->vfscore_file.fd, file->sock_fd)); + UK_ASSERT(vfscore_file->f_dentry->d_vnode == s_vnode); + /* Close and release the lwip socket */ ret = lwip_close(file->sock_fd); - /* Release the file descriptor */ + /* Release the file descriptor number */ vfscore_put_fd(file->vfscore_file.fd); - /* Free the sock net structure */ + /* Free socket vnode */ + uk_free(uk_alloc_get_default(), file->vfscore_file.f_dentry->d_vnode); + /* Free socket dentry */ + uk_free(uk_alloc_get_default(), file->vfscore_file.f_dentry); + /* Free socket file */ uk_free(uk_alloc_get_default(), file); return ret; } -static ssize_t sock_net_write(struct vfscore_file *vfscore_file, - const void *buf, size_t count) +static ssize_t sock_net_write(struct vnode *s_vnode, + struct uio *buf, int ioflag __unused) { int ret = 0; struct sock_net_file *file = NULL; - file = __containerof(vfscore_file, struct sock_net_file, - vfscore_file); - LWIP_DEBUGF(SOCKETS_DEBUG, ("write %d (%x):%s\n", + file = s_vnode->v_data; + LWIP_DEBUGF(SOCKETS_DEBUG, ("%s fd:%d lwip_fd:%d\n", + __func__, file->vfscore_file.fd, - file->sock_fd, - (char *) buf)); - ret = lwip_write(file->sock_fd, buf, count); + file->sock_fd)); + ret = lwip_writev(file->sock_fd, buf->uio_iov, buf->uio_iovcnt); return ret; } -static ssize_t sock_net_read(struct vfscore_file *vfscore_file, void *buf, - size_t count) +static ssize_t sock_net_read(struct vnode *s_vnode, + struct vfscore_file *vfscore_file __unused, + struct uio *buf, int ioflag __unused) { int ret = 0; struct sock_net_file *file = NULL; - file = __containerof(vfscore_file, struct sock_net_file, - vfscore_file); - LWIP_DEBUGF(SOCKETS_DEBUG, ("write %d (%x):%s\n", + file = s_vnode->v_data; + LWIP_DEBUGF(SOCKETS_DEBUG, ("%s fd:%d lwip_fd:%d\n", + __func__, file->vfscore_file.fd, - file->sock_fd, - (char *) buf)); - ret = lwip_read(file->sock_fd, buf, count); + file->sock_fd)); + ret = lwip_readv(file->sock_fd, buf->uio_iov, buf->uio_iovcnt); return ret; } -static struct vfscore_fops sock_net_fops = { - .close = sock_net_close, - .write = sock_net_write, - .read = sock_net_read, +static struct vnops sock_net_fops = { + .vop_close = sock_net_close, + .vop_write = sock_net_write, + .vop_read = sock_net_read, }; int socket(int domain, int type, int protocol) -- 2.11.0 _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |