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