Module Name: src Committed By: pooka Date: Thu Mar 13 01:40:30 UTC 2014
Modified Files: src/sys/rump/net/lib/libsockin: Makefile sockin.c Added Files: src/sys/rump/net/lib/libsockin: sockin_user.c sockin_user.h Removed Files: src/sys/rump/net/lib/libsockin: rumpcomp_user.c rumpcomp_user.h Log Message: rename rumpcomp_user.* -> sockin_user.* To generate a diff of this commit: cvs rdiff -u -r1.6 -r1.7 src/sys/rump/net/lib/libsockin/Makefile cvs rdiff -u -r1.8 -r0 src/sys/rump/net/lib/libsockin/rumpcomp_user.c cvs rdiff -u -r1.3 -r0 src/sys/rump/net/lib/libsockin/rumpcomp_user.h cvs rdiff -u -r1.35 -r1.36 src/sys/rump/net/lib/libsockin/sockin.c cvs rdiff -u -r0 -r1.1 src/sys/rump/net/lib/libsockin/sockin_user.c \ src/sys/rump/net/lib/libsockin/sockin_user.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/rump/net/lib/libsockin/Makefile diff -u src/sys/rump/net/lib/libsockin/Makefile:1.6 src/sys/rump/net/lib/libsockin/Makefile:1.7 --- src/sys/rump/net/lib/libsockin/Makefile:1.6 Mon Mar 18 13:14:11 2013 +++ src/sys/rump/net/lib/libsockin/Makefile Thu Mar 13 01:40:30 2014 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.6 2013/03/18 13:14:11 pooka Exp $ +# $NetBSD: Makefile,v 1.7 2014/03/13 01:40:30 pooka Exp $ # LIB= rumpnet_sockin @@ -8,7 +8,7 @@ SRCS+= component.c CPPFLAGS+= -I${RUMPTOP}/librump/rumpkern -RUMPCOMP_USER= #defined +RUMPCOMP_USER_SRCS= sockin_user.c .include <bsd.lib.mk> .include <bsd.klinks.mk> Index: src/sys/rump/net/lib/libsockin/sockin.c diff -u src/sys/rump/net/lib/libsockin/sockin.c:1.35 src/sys/rump/net/lib/libsockin/sockin.c:1.36 --- src/sys/rump/net/lib/libsockin/sockin.c:1.35 Thu Aug 29 17:49:21 2013 +++ src/sys/rump/net/lib/libsockin/sockin.c Thu Mar 13 01:40:30 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: sockin.c,v 1.35 2013/08/29 17:49:21 rmind Exp $ */ +/* $NetBSD: sockin.c,v 1.36 2014/03/13 01:40:30 pooka Exp $ */ /* * Copyright (c) 2008, 2009 Antti Kantee. All Rights Reserved. @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sockin.c,v 1.35 2013/08/29 17:49:21 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sockin.c,v 1.36 2014/03/13 01:40:30 pooka Exp $"); #include <sys/param.h> #include <sys/condvar.h> @@ -54,7 +54,7 @@ __KERNEL_RCSID(0, "$NetBSD: sockin.c,v 1 #include <rump/rumpuser.h> #include "rump_private.h" -#include "rumpcomp_user.h" +#include "sockin_user.h" /* * An inet communication domain which uses the socket interface. Added files: Index: src/sys/rump/net/lib/libsockin/sockin_user.c diff -u /dev/null src/sys/rump/net/lib/libsockin/sockin_user.c:1.1 --- /dev/null Thu Mar 13 01:40:30 2014 +++ src/sys/rump/net/lib/libsockin/sockin_user.c Thu Mar 13 01:40:30 2014 @@ -0,0 +1,587 @@ +/* $NetBSD: sockin_user.c,v 1.1 2014/03/13 01:40:30 pooka Exp $ */ + +/* + * Copyright (c) 2008 Antti Kantee. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* for struct msghdr content visibility */ +#define _XOPEN_SOURCE 4 +#define _XOPEN_SOURCE_EXTENDED 1 + +#ifndef _KERNEL +#include <sys/types.h> +#include <sys/socket.h> + +#include <errno.h> +#include <poll.h> +#include <stdlib.h> +#include <string.h> +#include <stdint.h> + +#include <rump/rumpuser_component.h> +#include <rump/rumpdefs.h> + +#include "sockin_user.h" + +#define seterror(_v_) if ((_v_) == -1) rv = errno; else rv = 0; + +#ifndef __arraycount +#define __arraycount(a) (sizeof(a) / sizeof(*a)) +#endif + +#ifndef __UNCONST +#define __UNCONST(a) ((void*)(const void*)a) +#endif + +#include <netinet/in.h> +#include <netinet/tcp.h> +#include <netinet/udp.h> + + +static int translate_so_sockopt(int); +static int translate_ip_sockopt(int); +static int translate_tcp_sockopt(int); +static int translate_domain(int); + +#define translate(_a_) case RUMP_##_a_: return _a_ +static int +translate_so_sockopt(int lopt) +{ + + switch (lopt) { + translate(SO_DEBUG); +#ifndef SO_REUSEPORT + case RUMP_SO_REUSEPORT: return SO_REUSEADDR; +#else + translate(SO_REUSEPORT); +#endif + translate(SO_TYPE); + translate(SO_ERROR); + translate(SO_DONTROUTE); + translate(SO_BROADCAST); + translate(SO_SNDBUF); + translate(SO_RCVBUF); + translate(SO_KEEPALIVE); + translate(SO_OOBINLINE); + translate(SO_LINGER); + default: return -1; + } +} + +static int +translate_ip_sockopt(int lopt) +{ + + switch (lopt) { + translate(IP_TOS); + translate(IP_TTL); + translate(IP_HDRINCL); + translate(IP_MULTICAST_TTL); + translate(IP_MULTICAST_LOOP); + translate(IP_MULTICAST_IF); + translate(IP_ADD_MEMBERSHIP); + translate(IP_DROP_MEMBERSHIP); + default: return -1; + } +} + +static int +translate_tcp_sockopt(int lopt) +{ + + switch (lopt) { + translate(TCP_NODELAY); + translate(TCP_MAXSEG); + default: return -1; + } +} + +static int +translate_domain(int domain) +{ + + switch (domain) { + translate(AF_INET); + translate(AF_INET6); + default: return AF_UNSPEC; + } +} + +#undef translate + +static void +translate_sockopt(int *levelp, int *namep) +{ + int level, name; + + level = *levelp; + name = *namep; + + switch (level) { + case RUMP_SOL_SOCKET: + level = SOL_SOCKET; + name = translate_so_sockopt(name); + break; + case RUMP_IPPROTO_IP: +#ifdef SOL_IP + level = SOL_IP; +#else + level = IPPROTO_IP; +#endif + name = translate_ip_sockopt(name); + break; + case RUMP_IPPROTO_TCP: +#ifdef SOL_TCP + level = SOL_TCP; +#else + level = IPPROTO_TCP; +#endif + name = translate_tcp_sockopt(name); + break; + case RUMP_IPPROTO_UDP: +#ifdef SOL_UDP + level = SOL_UDP; +#else + level = IPPROTO_UDP; +#endif + name = -1; + break; + default: + level = -1; + } + *levelp = level; + *namep = name; +} + +#ifndef __NetBSD__ +static const struct { + int bfl; + int lfl; +} bsd_to_native_msg_flags_[] = { + {RUMP_MSG_OOB, MSG_OOB}, + {RUMP_MSG_PEEK, MSG_PEEK}, + {RUMP_MSG_DONTROUTE, MSG_DONTROUTE}, + {RUMP_MSG_EOR, MSG_EOR}, + {RUMP_MSG_TRUNC, MSG_TRUNC}, + {RUMP_MSG_CTRUNC, MSG_CTRUNC}, + {RUMP_MSG_WAITALL, MSG_WAITALL}, + {RUMP_MSG_DONTWAIT, MSG_DONTWAIT}, + + /* might be better to always set NOSIGNAL ... */ +#ifdef MSG_NOSIGNAL + {RUMP_MSG_NOSIGNAL, MSG_NOSIGNAL}, +#endif +}; + +static int native_to_bsd_msg_flags(int); + +static int +native_to_bsd_msg_flags(int lflag) +{ + unsigned int i; + int bfl, lfl; + int bflag = 0; + + if (lflag == 0) + return (0); + + for(i = 0; i < __arraycount(bsd_to_native_msg_flags_); i++) { + bfl = bsd_to_native_msg_flags_[i].bfl; + lfl = bsd_to_native_msg_flags_[i].lfl; + + if (lflag & lfl) { + lflag ^= lfl; + bflag |= bfl; + } + } + if (lflag != 0) + return (-1); + + return (bflag); +} + +static int +bsd_to_native_msg_flags(int bflag) +{ + unsigned int i; + int lflag = 0; + + if (bflag == 0) + return (0); + + for(i = 0; i < __arraycount(bsd_to_native_msg_flags_); i++) { + if (bflag & bsd_to_native_msg_flags_[i].bfl) + lflag |= bsd_to_native_msg_flags_[i].lfl; + } + + return (lflag); +} +#endif + +struct rump_sockaddr { + uint8_t sa_len; /* total length */ + uint8_t sa_family; /* address family */ + char sa_data[14]; /* actually longer; address value */ +}; + +struct rump_msghdr { + void *msg_name; /* optional address */ + uint32_t msg_namelen; /* size of address */ + struct iovec *msg_iov; /* scatter/gather array */ + int msg_iovlen; /* # elements in msg_iov */ + void *msg_control; /* ancillary data, see below */ + uint32_t msg_controllen; /* ancillary data buffer len */ + int msg_flags; /* flags on received message */ +}; + +static struct sockaddr *translate_sockaddr(const struct sockaddr *, + uint32_t); +static void translate_sockaddr_back(const struct sockaddr *, + struct rump_sockaddr *, uint32_t len); +static struct msghdr *translate_msghdr(const struct rump_msghdr *, int *); +static void translate_msghdr_back(const struct msghdr *, struct rump_msghdr *); + +#if defined(__NetBSD__) +static struct sockaddr * +translate_sockaddr(const struct sockaddr *addr, uint32_t len) +{ + + return (struct sockaddr *)__UNCONST(addr); +} + +static void +translate_sockaddr_back(const struct sockaddr *laddr, + struct rump_sockaddr *baddr, uint32_t len) +{ + + return; +} + +static struct msghdr * +translate_msghdr(const struct rump_msghdr *bmsg, int *flags) +{ + + return (struct msghdr *)__UNCONST(bmsg); +} + +static void +translate_msghdr_back(const struct msghdr *lmsg, struct rump_msghdr *bmsg) +{ + + return; +} + +#else +static struct sockaddr * +translate_sockaddr(const struct sockaddr *addr, uint32_t len) +{ + struct sockaddr *laddr; + const struct rump_sockaddr *baddr; + + baddr = (const struct rump_sockaddr *)addr; + laddr = malloc(len); + if (laddr == NULL) + return NULL; + memcpy(laddr, baddr, len); + laddr->sa_family = translate_domain(baddr->sa_family); + /* No sa_len for Linux and SunOS */ +#if defined(__DragonFly__) || defined(__FreeBSD__) || defined(__OpenBSD__) + laddr->sa_len = len; +#endif + return laddr; +} + +#define translate_back(_a_) case _a_: return RUMP_##_a_ +static int translate_domain_back(int); +static int +translate_domain_back(int domain) +{ + + switch (domain) { + translate_back(AF_INET); + translate_back(AF_INET6); + default: return RUMP_AF_UNSPEC; + } +} +#undef translate_back + +static void +translate_sockaddr_back(const struct sockaddr *laddr, + struct rump_sockaddr *baddr, + uint32_t len) +{ + + if (baddr != NULL) { + memcpy(baddr, laddr, len); + baddr->sa_family = translate_domain_back(laddr->sa_family); + baddr->sa_len = len; + } + free(__UNCONST(laddr)); +} + +static struct msghdr * +translate_msghdr(const struct rump_msghdr *bmsg, int *flags) +{ + struct msghdr *rv; + + *flags = bsd_to_native_msg_flags(*flags); + if (*flags < 0) + *flags = 0; + + rv = malloc(sizeof(*rv)); + rv->msg_namelen = bmsg->msg_namelen; + rv->msg_iov = bmsg->msg_iov; + rv->msg_iovlen = bmsg->msg_iovlen; + rv->msg_control = bmsg->msg_control; + rv->msg_controllen = bmsg->msg_controllen; + rv->msg_flags = 0; + + if (bmsg->msg_name != NULL) { + rv->msg_name = translate_sockaddr(bmsg->msg_name, + bmsg->msg_namelen); + if (rv->msg_name == NULL) { + free(rv); + return NULL; + } + } else + rv->msg_name = NULL; + return rv; +} + +static void +translate_msghdr_back(const struct msghdr *lmsg, struct rump_msghdr *bmsg) +{ + + if (bmsg == NULL) { + if (lmsg->msg_name != NULL) + free(lmsg->msg_name); + free(__UNCONST(lmsg)); + return; + } + bmsg->msg_namelen = lmsg->msg_namelen; + bmsg->msg_iov = lmsg->msg_iov; + bmsg->msg_iovlen = lmsg->msg_iovlen; + bmsg->msg_control = lmsg->msg_control; + bmsg->msg_controllen = lmsg->msg_controllen; + bmsg->msg_flags = native_to_bsd_msg_flags(lmsg->msg_flags); + + if (lmsg->msg_name != NULL) + translate_sockaddr_back(lmsg->msg_name, bmsg->msg_name, + bmsg->msg_namelen); + else + bmsg->msg_name = NULL; + + free(__UNCONST(lmsg)); +} +#endif + +int +rumpcomp_sockin_socket(int domain, int type, int proto, int *s) +{ + void *cookie; + int rv; + + domain = translate_domain(domain); + + cookie = rumpuser_component_unschedule(); + *s = socket(domain, type, proto); + seterror(*s); + rumpuser_component_schedule(cookie); + + return rumpuser_component_errtrans(rv); +} + +int +rumpcomp_sockin_sendmsg(int s, const struct msghdr *msg, int flags, size_t *snd) +{ + void *cookie; + ssize_t nn; + int rv; + + msg = translate_msghdr((struct rump_msghdr *)msg, &flags); + + cookie = rumpuser_component_unschedule(); + nn = sendmsg(s, msg, flags); + seterror(nn); + *snd = (size_t)nn; + rumpuser_component_schedule(cookie); + + translate_msghdr_back(msg, NULL); + + return rumpuser_component_errtrans(rv); +} + +int +rumpcomp_sockin_recvmsg(int s, struct msghdr *msg, int flags, size_t *rcv) +{ + void *cookie; + ssize_t nn; + int rv; + struct rump_msghdr *saveptr; + + saveptr = (struct rump_msghdr *)msg; + msg = translate_msghdr(saveptr, &flags); + + cookie = rumpuser_component_unschedule(); + nn = recvmsg(s, msg, flags); + seterror(nn); + *rcv = (size_t)nn; + rumpuser_component_schedule(cookie); + + translate_msghdr_back(msg, saveptr); + + return rumpuser_component_errtrans(rv); +} + +int +rumpcomp_sockin_connect(int s, const struct sockaddr *name, int len) +{ + void *cookie; + int rv; + + name = translate_sockaddr(name, len); + + cookie = rumpuser_component_unschedule(); + rv = connect(s, name, (socklen_t)len); + seterror(rv); + rumpuser_component_schedule(cookie); + + translate_sockaddr_back(name, NULL, len); + + return rumpuser_component_errtrans(rv); +} + +int +rumpcomp_sockin_bind(int s, const struct sockaddr *name, int len) +{ + void *cookie; + int rv; + + name = translate_sockaddr(name, len); + + cookie = rumpuser_component_unschedule(); + rv = bind(s, name, (socklen_t)len); + seterror(rv); + rumpuser_component_schedule(cookie); + + translate_sockaddr_back(name, NULL, len); + + return rumpuser_component_errtrans(rv); +} + +int +rumpcomp_sockin_accept(int s, struct sockaddr *name, int *lenp, int *s2) +{ + void *cookie; + int rv; + struct rump_sockaddr *saveptr; + + saveptr = (struct rump_sockaddr *)name; + name = translate_sockaddr(name, *lenp); + + cookie = rumpuser_component_unschedule(); + *s2 = accept(s, name, (socklen_t *)lenp); + seterror(*s2); + rumpuser_component_schedule(cookie); + + translate_sockaddr_back(name, saveptr, *lenp); + + return rumpuser_component_errtrans(rv); +} + +int +rumpcomp_sockin_listen(int s, int backlog) +{ + void *cookie; + int rv; + + cookie = rumpuser_component_unschedule(); + rv = listen(s, backlog); + seterror(rv); + rumpuser_component_schedule(cookie); + + return rumpuser_component_errtrans(rv); +} + +int +rumpcomp_sockin_getname(int s, struct sockaddr *so, int *lenp, + enum rumpcomp_sockin_getnametype which) +{ + socklen_t slen = *lenp; + int rv; + struct rump_sockaddr *saveptr; + + saveptr = (struct rump_sockaddr *)so; + so = translate_sockaddr(so, *lenp); + + if (which == RUMPCOMP_SOCKIN_SOCKNAME) + rv = getsockname(s, so, &slen); + else + rv = getpeername(s, so, &slen); + + seterror(rv); + translate_sockaddr_back(so, saveptr, *lenp); + + *lenp = slen; + + return rumpuser_component_errtrans(rv); +} + +int +rumpcomp_sockin_setsockopt(int s, int level, int name, + const void *data, int dlen) +{ + socklen_t slen = dlen; + int rv; + + translate_sockopt(&level, &name); + if (level == -1 || name == -1) { +#ifdef SETSOCKOPT_STRICT + errno = EINVAL; + rv = -1; +#else + rv = 0; +#endif + } else + rv = setsockopt(s, level, name, data, slen); + + seterror(rv); + + return rumpuser_component_errtrans(rv); +} + +int +rumpcomp_sockin_poll(struct pollfd *fds, int nfds, int timeout, int *nready) +{ + void *cookie; + int rv; + + cookie = rumpuser_component_unschedule(); + *nready = poll(fds, (nfds_t)nfds, timeout); + seterror(*nready); + rumpuser_component_schedule(cookie); + + return rumpuser_component_errtrans(rv); +} +#endif Index: src/sys/rump/net/lib/libsockin/sockin_user.h diff -u /dev/null src/sys/rump/net/lib/libsockin/sockin_user.h:1.1 --- /dev/null Thu Mar 13 01:40:30 2014 +++ src/sys/rump/net/lib/libsockin/sockin_user.h Thu Mar 13 01:40:30 2014 @@ -0,0 +1,43 @@ +/* $NetBSD: sockin_user.h,v 1.1 2014/03/13 01:40:30 pooka Exp $ */ + +/* + * Copyright (c) 2008 Antti Kantee. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +enum rumpcomp_sockin_getnametype { + RUMPCOMP_SOCKIN_SOCKNAME, + RUMPCOMP_SOCKIN_PEERNAME +}; + +int rumpcomp_sockin_socket(int, int, int, int *); +int rumpcomp_sockin_sendmsg(int, const struct msghdr *, int, size_t *); +int rumpcomp_sockin_recvmsg(int, struct msghdr *, int, size_t *); +int rumpcomp_sockin_connect(int, const struct sockaddr *, int); +int rumpcomp_sockin_bind(int, const struct sockaddr *, int); +int rumpcomp_sockin_accept(int, struct sockaddr *, int *, int *); +int rumpcomp_sockin_listen(int, int); +int rumpcomp_sockin_getname(int, struct sockaddr *, int *, + enum rumpcomp_sockin_getnametype); +int rumpcomp_sockin_setsockopt(int, int, int, const void *, int); +int rumpcomp_sockin_poll(struct pollfd *, int, int, int *);