Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/rump/net/lib/libsockin Translate function parameters bet...



details:   https://anonhg.NetBSD.org/src/rev/60059f72f0c8
branches:  trunk
changeset: 787084:60059f72f0c8
user:      stacktic <stacktic%NetBSD.org@localhost>
date:      Sat Jun 01 10:09:05 2013 +0000

description:
Translate function parameters between the hypervisor and rump kernel

diffstat:

 sys/rump/net/lib/libsockin/rumpcomp_user.c |  415 ++++++++++++++++++++++++++++-
 1 files changed, 413 insertions(+), 2 deletions(-)

diffs (truncated from 525 to 300 lines):

diff -r e4843bfaa68f -r 60059f72f0c8 sys/rump/net/lib/libsockin/rumpcomp_user.c
--- a/sys/rump/net/lib/libsockin/rumpcomp_user.c        Sat Jun 01 09:50:32 2013 +0000
+++ b/sys/rump/net/lib/libsockin/rumpcomp_user.c        Sat Jun 01 10:09:05 2013 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: rumpcomp_user.c,v 1.5 2013/04/30 12:39:21 pooka Exp $  */
+/*     $NetBSD: rumpcomp_user.c,v 1.6 2013/06/01 10:09:05 stacktic Exp $       */
 
 /*
  * Copyright (c) 2008 Antti Kantee.  All Rights Reserved.
@@ -32,18 +32,388 @@
 #include <errno.h>
 #include <poll.h>
 
+#include <stdint.h>
+
 #include <rump/rumpuser_component.h>
+#include <rump/rumpdefs.h>
 
 #include "rumpcomp_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>
+
+#include <stdlib.h>
+#include <string.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_UNIX);
+       translate(AF_INET);
+       translate(AF_SNA);
+       translate(AF_DECnet);
+       translate(AF_APPLETALK);
+       translate(AF_IPX);
+       translate(AF_INET6);
+       translate(AF_ISDN);
+       translate(AF_BLUETOOTH);
+       translate(AF_ROUTE);
+       default: return AF_UNSPEC;
+       }
+}
+
+#undef translate
+#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_UNIX);
+       translate_back(AF_INET);
+       translate_back(AF_SNA);
+       translate_back(AF_DECnet);
+       translate_back(AF_APPLETALK);
+       translate_back(AF_IPX);
+       translate_back(AF_INET6);
+       translate_back(AF_ISDN);
+       translate_back(AF_BLUETOOTH);
+       translate_back(AF_ROUTE);
+       default: return RUMP_AF_UNSPEC;
+       }
+}
+
+#undef translate_back
+
+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},
+       {RUMP_MSG_NOSIGNAL,     MSG_NOSIGNAL},
+};
+
+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)



Home | Main Index | Thread Index | Old Index