From patchwork Wed Nov 25 18:49:04 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark McLoughlin X-Patchwork-Id: 39423 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 D6567B6EDF for ; Thu, 26 Nov 2009 06:08:43 +1100 (EST) Received: from localhost ([127.0.0.1]:55033 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NDNEG-0004Ur-9T for incoming@patchwork.ozlabs.org; Wed, 25 Nov 2009 14:08:40 -0500 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NDMyj-0007OD-0j for qemu-devel@nongnu.org; Wed, 25 Nov 2009 13:52:37 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NDMyY-0007HK-IS for qemu-devel@nongnu.org; Wed, 25 Nov 2009 13:52:32 -0500 Received: from [199.232.76.173] (port=48995 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NDMyX-0007Gu-NF for qemu-devel@nongnu.org; Wed, 25 Nov 2009 13:52:25 -0500 Received: from mx1.redhat.com ([209.132.183.28]:60055) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1NDMyW-0000E9-UL for qemu-devel@nongnu.org; Wed, 25 Nov 2009 13:52:25 -0500 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id nAPIqNNm015239 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 25 Nov 2009 13:52:24 -0500 Received: from blaa.localdomain (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id nAPIqNvc000340; Wed, 25 Nov 2009 13:52:23 -0500 Received: by blaa.localdomain (Postfix, from userid 500) id A678239B4; Wed, 25 Nov 2009 18:49:40 +0000 (GMT) From: Mark McLoughlin To: qemu-devel@nongnu.org Date: Wed, 25 Nov 2009 18:49:04 +0000 Message-Id: <1259174977-26212-12-git-send-email-markmc@redhat.com> In-Reply-To: <1259174977-26212-1-git-send-email-markmc@redhat.com> References: <1259174977-26212-1-git-send-email-markmc@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-detected-operating-system: by monty-python.gnu.org: Genre and OS details not recognized. Cc: Mark McLoughlin Subject: [Qemu-devel] [PATCH 11/44] net: convert tap to NetClientInfo 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: Mark McLoughlin --- net/tap.c | 82 +++++++++++++++++++++++++++++++++--------------------------- 1 files changed, 45 insertions(+), 37 deletions(-) diff --git a/net/tap.c b/net/tap.c index b2e5908..d34feec 100644 --- a/net/tap.c +++ b/net/tap.c @@ -47,7 +47,7 @@ #define TAP_BUFSIZE (4096 + 65536) typedef struct TAPState { - VLANClientState *vc; + VLANClientState nc; int fd; char down_script[1024]; char down_script_arg[128]; @@ -92,7 +92,7 @@ static void tap_writable(void *opaque) tap_write_poll(s, 0); - qemu_flush_queued_packets(s->vc); + qemu_flush_queued_packets(&s->nc); } static ssize_t tap_write_packet(TAPState *s, const struct iovec *iov, int iovcnt) @@ -111,10 +111,10 @@ static ssize_t tap_write_packet(TAPState *s, const struct iovec *iov, int iovcnt return len; } -static ssize_t tap_receive_iov(VLANClientState *vc, const struct iovec *iov, +static ssize_t tap_receive_iov(VLANClientState *nc, const struct iovec *iov, int iovcnt) { - TAPState *s = vc->opaque; + TAPState *s = DO_UPCAST(TAPState, nc, nc); const struct iovec *iovp = iov; struct iovec iov_copy[iovcnt + 1]; struct virtio_net_hdr hdr = { 0, }; @@ -130,9 +130,9 @@ static ssize_t tap_receive_iov(VLANClientState *vc, const struct iovec *iov, return tap_write_packet(s, iovp, iovcnt); } -static ssize_t tap_receive_raw(VLANClientState *vc, const uint8_t *buf, size_t size) +static ssize_t tap_receive_raw(VLANClientState *nc, const uint8_t *buf, size_t size) { - TAPState *s = vc->opaque; + TAPState *s = DO_UPCAST(TAPState, nc, nc); struct iovec iov[2]; int iovcnt = 0; struct virtio_net_hdr hdr = { 0, }; @@ -150,13 +150,13 @@ static ssize_t tap_receive_raw(VLANClientState *vc, const uint8_t *buf, size_t s return tap_write_packet(s, iov, iovcnt); } -static ssize_t tap_receive(VLANClientState *vc, const uint8_t *buf, size_t size) +static ssize_t tap_receive(VLANClientState *nc, const uint8_t *buf, size_t size) { - TAPState *s = vc->opaque; + TAPState *s = DO_UPCAST(TAPState, nc, nc); struct iovec iov[1]; if (s->has_vnet_hdr && !s->using_vnet_hdr) { - return tap_receive_raw(vc, buf, size); + return tap_receive_raw(nc, buf, size); } iov[0].iov_base = (char *)buf; @@ -169,7 +169,7 @@ static int tap_can_send(void *opaque) { TAPState *s = opaque; - return qemu_can_send_packet(s->vc); + return qemu_can_send_packet(&s->nc); } #ifndef __sun__ @@ -179,9 +179,9 @@ ssize_t tap_read_packet(int tapfd, uint8_t *buf, int maxlen) } #endif -static void tap_send_completed(VLANClientState *vc, ssize_t len) +static void tap_send_completed(VLANClientState *nc, ssize_t len) { - TAPState *s = vc->opaque; + TAPState *s = DO_UPCAST(TAPState, nc, nc); tap_read_poll(s, 1); } @@ -203,56 +203,56 @@ static void tap_send(void *opaque) size -= sizeof(struct virtio_net_hdr); } - size = qemu_send_packet_async(s->vc, buf, size, tap_send_completed); + size = qemu_send_packet_async(&s->nc, buf, size, tap_send_completed); if (size == 0) { tap_read_poll(s, 0); } - } while (size > 0 && qemu_can_send_packet(s->vc)); + } while (size > 0 && qemu_can_send_packet(&s->nc)); } -int tap_has_ufo(VLANClientState *vc) +int tap_has_ufo(VLANClientState *nc) { - TAPState *s = vc->opaque; + TAPState *s = DO_UPCAST(TAPState, nc, nc); - assert(vc->type == NET_CLIENT_TYPE_TAP); + assert(nc->type == NET_CLIENT_TYPE_TAP); return s->has_ufo; } -int tap_has_vnet_hdr(VLANClientState *vc) +int tap_has_vnet_hdr(VLANClientState *nc) { - TAPState *s = vc->opaque; + TAPState *s = DO_UPCAST(TAPState, nc, nc); - assert(vc->type == NET_CLIENT_TYPE_TAP); + assert(nc->type == NET_CLIENT_TYPE_TAP); return s->has_vnet_hdr; } -void tap_using_vnet_hdr(VLANClientState *vc, int using_vnet_hdr) +void tap_using_vnet_hdr(VLANClientState *nc, int using_vnet_hdr) { - TAPState *s = vc->opaque; + TAPState *s = DO_UPCAST(TAPState, nc, nc); using_vnet_hdr = using_vnet_hdr != 0; - assert(vc->type == NET_CLIENT_TYPE_TAP); + assert(nc->type == NET_CLIENT_TYPE_TAP); assert(s->has_vnet_hdr == using_vnet_hdr); s->using_vnet_hdr = using_vnet_hdr; } -void tap_set_offload(VLANClientState *vc, int csum, int tso4, +void tap_set_offload(VLANClientState *nc, int csum, int tso4, int tso6, int ecn, int ufo) { - TAPState *s = vc->opaque; + TAPState *s = DO_UPCAST(TAPState, nc, nc); return tap_fd_set_offload(s->fd, csum, tso4, tso6, ecn, ufo); } -static void tap_cleanup(VLANClientState *vc) +static void tap_cleanup(VLANClientState *nc) { - TAPState *s = vc->opaque; + TAPState *s = DO_UPCAST(TAPState, nc, nc); - qemu_purge_queued_packets(vc); + qemu_purge_queued_packets(nc); if (s->down_script[0]) launch_script(s->down_script, s->down_script_arg, s->fd); @@ -260,29 +260,37 @@ static void tap_cleanup(VLANClientState *vc) tap_read_poll(s, 0); tap_write_poll(s, 0); close(s->fd); - qemu_free(s); } /* fd support */ +static NetClientInfo net_tap_info = { + .type = NET_CLIENT_TYPE_TAP, + .size = sizeof(TAPState), + .receive = tap_receive, + .receive_raw = tap_receive_raw, + .receive_iov = tap_receive_iov, + .cleanup = tap_cleanup, +}; + static TAPState *net_tap_fd_init(VLANState *vlan, const char *model, const char *name, int fd, int vnet_hdr) { + VLANClientState *nc; TAPState *s; - s = qemu_mallocz(sizeof(TAPState)); + nc = qemu_new_net_client(&net_tap_info, vlan, NULL, model, name); + + s = DO_UPCAST(TAPState, nc, nc); + s->fd = fd; s->has_vnet_hdr = vnet_hdr != 0; s->using_vnet_hdr = 0; - s->vc = qemu_new_vlan_client(NET_CLIENT_TYPE_TAP, - vlan, NULL, model, name, NULL, - tap_receive, tap_receive_raw, - tap_receive_iov, tap_cleanup, s); s->has_ufo = tap_probe_has_ufo(s->fd); - tap_set_offload(s->vc, 0, 0, 0, 0, 0); + tap_set_offload(&s->nc, 0, 0, 0, 0, 0); tap_read_poll(s, 1); return s; } @@ -415,7 +423,7 @@ int net_init_tap(QemuOpts *opts, Monitor *mon, const char *name, VLANState *vlan } if (qemu_opt_get(opts, "fd")) { - snprintf(s->vc->info_str, sizeof(s->vc->info_str), "fd=%d", fd); + snprintf(s->nc.info_str, sizeof(s->nc.info_str), "fd=%d", fd); } else { const char *ifname, *script, *downscript; @@ -423,7 +431,7 @@ int net_init_tap(QemuOpts *opts, Monitor *mon, const char *name, VLANState *vlan script = qemu_opt_get(opts, "script"); downscript = qemu_opt_get(opts, "downscript"); - snprintf(s->vc->info_str, sizeof(s->vc->info_str), + snprintf(s->nc.info_str, sizeof(s->nc.info_str), "ifname=%s,script=%s,downscript=%s", ifname, script, downscript);