From patchwork Wed Nov 10 22:27:57 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Roth X-Patchwork-Id: 70710 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 7E8E7B7116 for ; Thu, 11 Nov 2010 09:52:50 +1100 (EST) Received: from localhost ([127.0.0.1]:58301 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PGJWO-0008GK-VS for incoming@patchwork.ozlabs.org; Wed, 10 Nov 2010 17:52:05 -0500 Received: from [140.186.70.92] (port=41131 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PGJDO-0000T3-AK for qemu-devel@nongnu.org; Wed, 10 Nov 2010 17:32:31 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PGJ9e-0007o7-9c for qemu-devel@nongnu.org; Wed, 10 Nov 2010 17:28:35 -0500 Received: from e8.ny.us.ibm.com ([32.97.182.138]:57108) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PGJ9e-0007o2-6X for qemu-devel@nongnu.org; Wed, 10 Nov 2010 17:28:34 -0500 Received: from d01relay07.pok.ibm.com (d01relay07.pok.ibm.com [9.56.227.147]) by e8.ny.us.ibm.com (8.14.4/8.13.1) with ESMTP id oAAMBgZ2002678 for ; Wed, 10 Nov 2010 17:11:42 -0500 Received: from d01av01.pok.ibm.com (d01av01.pok.ibm.com [9.56.224.215]) by d01relay07.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id oAAMSSee1450204 for ; Wed, 10 Nov 2010 17:28:28 -0500 Received: from d01av01.pok.ibm.com (loopback [127.0.0.1]) by d01av01.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id oAAMSRFg001838 for ; Wed, 10 Nov 2010 17:28:28 -0500 Received: from localhost.localdomain (sig-9-65-242-217.mts.ibm.com [9.65.242.217]) by d01av01.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id oAAMSI5M001385; Wed, 10 Nov 2010 17:28:26 -0500 From: Michael Roth To: qemu-devel@nongnu.org Date: Wed, 10 Nov 2010 16:27:57 -0600 Message-Id: <1289428095-5059-2-git-send-email-mdroth@linux.vnet.ibm.com> X-Mailer: git-send-email 1.7.0.4 In-Reply-To: <1289428095-5059-1-git-send-email-mdroth@linux.vnet.ibm.com> References: <1289428095-5059-1-git-send-email-mdroth@linux.vnet.ibm.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6, seldom 2.4 (older, 4) Cc: agl@linux.vnet.ibm.com, abeekhof@redhat.com, mdroth@linux.vnet.ibm.com, aliguori@linux.vnet.ibm.com, ryanh@us.ibm.com, amit.shah@redhat.com Subject: [Qemu-devel] [RFC][PATCH v2 01/19] virtproxy: base data structures and constants X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Signed-off-by: Michael Roth --- virtproxy.c | 136 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ virtproxy.h | 34 +++++++++++++++ 2 files changed, 170 insertions(+), 0 deletions(-) create mode 100644 virtproxy.c create mode 100644 virtproxy.h diff --git a/virtproxy.c b/virtproxy.c new file mode 100644 index 0000000..8f18d83 --- /dev/null +++ b/virtproxy.c @@ -0,0 +1,136 @@ +/* + * virt-proxy - host/guest communication layer + * + * Copyright IBM Corp. 2010 + * + * Authors: + * Michael Roth + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + * + */ + +#include "virtproxy.h" + +#define VP_SERVICE_ID_LEN 32 /* max length of service id string */ +#define VP_PKT_DATA_LEN 1024 /* max proxied bytes per VPPacket */ +#define VP_CONN_DATA_LEN 1024 /* max bytes conns can send at a time */ +#define VP_MAGIC 0x1F374059 + +/* listening fd, one for each service we're forwarding to remote end */ +typedef struct VPOForward { + VPDriver *drv; + int listen_fd; + char service_id[VP_SERVICE_ID_LEN]; + QLIST_ENTRY(VPOForward) next; +} VPOForward; + +/* service_id->path/port mapping of each service forwarded from remote end */ +typedef struct VPIForward { + VPDriver *drv; + char service_id[VP_SERVICE_ID_LEN]; + QemuOpts *socket_opts; + QLIST_ENTRY(VPIForward) next; +} VPIForward; + +/* proxied client/server connected states */ +typedef struct VPConn { + VPDriver *drv; + int client_fd; + int server_fd; + enum { + VP_CONN_CLIENT = 1, + VP_CONN_SERVER, + } type; + enum { + VP_STATE_NEW = 1, /* accept()'d and registered fd */ + VP_STATE_INIT, /* sent init pkt to remote end, waiting for ack */ + VP_STATE_CONNECTED, /* client and server connected */ + } state; + QLIST_ENTRY(VPConn) next; +} VPConn; + +typedef struct VPControlMsg { + enum { + VP_CONTROL_CONNECT_INIT = 1, + VP_CONTROL_CONNECT_ACK, + VP_CONTROL_CLOSE, + } type; + union { + /* tell remote end connect to server and map client_fd to it */ + struct { + int client_fd; + char service_id[VP_SERVICE_ID_LEN]; + } connect_init; + /* tell remote end we've created the connection to the server, + * and give them the corresponding fd to use so we don't have + * to do a reverse lookup everytime + */ + struct { + int client_fd; + int server_fd; + } connect_ack; + /* tell remote end to close fd in question, presumably because + * connection was closed on our end + */ + struct { + int client_fd; + int server_fd; + } close; + } args; +} VPControlMsg; + +typedef struct VPPacket { + enum { + VP_PKT_CONTROL = 1, + VP_PKT_CLIENT, + VP_PKT_SERVER, + } type; + union { + VPControlMsg msg; + struct { + int client_fd; + int server_fd; + int bytes; + char data[VP_PKT_DATA_LEN]; + } proxied; + } payload; + int magic; +} __attribute__((__packed__)) VPPacket; + +struct VPDriver { + enum vp_context ctx; + int channel_fd; + int listen_fd; + CharDriverState *chr; + char buf[sizeof(VPPacket)]; + int buflen; + QLIST_HEAD(, VPOForward) oforwards; + QLIST_HEAD(, VPIForward) iforwards; + QLIST_HEAD(, VPConn) conns; +}; + +static QemuOptsList vp_socket_opts = { + .name = "vp_socket_opts", + .head = QTAILQ_HEAD_INITIALIZER(vp_socket_opts.head), + .desc = { + { + .name = "path", + .type = QEMU_OPT_STRING, + },{ + .name = "host", + .type = QEMU_OPT_STRING, + },{ + .name = "port", + .type = QEMU_OPT_STRING, + },{ + .name = "ipv4", + .type = QEMU_OPT_BOOL, + },{ + .name = "ipv6", + .type = QEMU_OPT_BOOL, + }, + { /* end if list */ } + }, +}; diff --git a/virtproxy.h b/virtproxy.h new file mode 100644 index 0000000..0203421 --- /dev/null +++ b/virtproxy.h @@ -0,0 +1,34 @@ +/* + * virt-proxy - host/guest communication layer + * + * Copyright IBM Corp. 2010 + * + * Authors: + * Michael Roth + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + * + */ + +#ifndef VIRTPROXY_H +#define VIRTPROXY_H + +#include "qemu-common.h" +#include "qemu-queue.h" + +typedef struct VPDriver VPDriver; + +/* wrappers for s/vp/qemu/ functions we need */ +int vp_send_all(int fd, const void *buf, int len1); +int vp_set_fd_handler2(int fd, + IOCanReadHandler *fd_read_poll, + IOHandler *fd_read, + IOHandler *fd_write, + void *opaque); +int vp_set_fd_handler(int fd, + IOHandler *fd_read, + IOHandler *fd_write, + void *opaque); + +#endif /* VIRTPROXY_H */