From patchwork Wed Nov 3 15:27:56 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Roth X-Patchwork-Id: 70014 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 5982F1007D2 for ; Thu, 4 Nov 2010 02:32:13 +1100 (EST) Received: from localhost ([127.0.0.1]:49446 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PDfJp-0002WQ-PZ for incoming@patchwork.ozlabs.org; Wed, 03 Nov 2010 11:32:09 -0400 Received: from [140.186.70.92] (port=51564 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PDfGY-0001HL-JE for qemu-devel@nongnu.org; Wed, 03 Nov 2010 11:28:48 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PDfGW-00071a-MK for qemu-devel@nongnu.org; Wed, 03 Nov 2010 11:28:46 -0400 Received: from e9.ny.us.ibm.com ([32.97.182.139]:59615) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PDfGW-00071J-Gt for qemu-devel@nongnu.org; Wed, 03 Nov 2010 11:28:44 -0400 Received: from d01relay01.pok.ibm.com (d01relay01.pok.ibm.com [9.56.227.233]) by e9.ny.us.ibm.com (8.14.4/8.13.1) with ESMTP id oA3F7eqN003084 for ; Wed, 3 Nov 2010 11:07:40 -0400 Received: from d01av01.pok.ibm.com (d01av01.pok.ibm.com [9.56.224.215]) by d01relay01.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id oA3FShl7409260 for ; Wed, 3 Nov 2010 11:28:43 -0400 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 oA3FSg3I006799 for ; Wed, 3 Nov 2010 11:28:43 -0400 Received: from localhost.localdomain (sig-9-76-99-21.mts.ibm.com [9.76.99.21]) by d01av01.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id oA3FSVD6005744; Wed, 3 Nov 2010 11:28:41 -0400 From: Michael Roth To: qemu-devel@nongnu.org Date: Wed, 3 Nov 2010 10:27:56 -0500 Message-Id: <1288798090-7127-2-git-send-email-mdroth@linux.vnet.ibm.com> X-Mailer: git-send-email 1.7.0.4 In-Reply-To: <1288798090-7127-1-git-send-email-mdroth@linux.vnet.ibm.com> References: <1288798090-7127-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: abeekhof@redhat.com, agl@linux.vnet.ibm.com, mdroth@linux.vnet.ibm.com, aliguori@linux.vnet.ibm.com Subject: [Qemu-devel] [RFC][RESEND][PATCH v1 01/15] 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 | 134 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ virtproxy.h | 34 +++++++++++++++ 2 files changed, 168 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..f30b859 --- /dev/null +++ b/virtproxy.c @@ -0,0 +1,134 @@ +/* + * 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 { + int channel_fd; + int listen_fd; + 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 */