From patchwork Mon Feb 29 12:23:53 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhang Chen X-Patchwork-Id: 8452711 Return-Path: X-Original-To: patchwork-qemu-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 74D3B9F52D for ; Mon, 29 Feb 2016 12:24:18 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id A2FF02022A for ; Mon, 29 Feb 2016 12:24:17 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id A8EF120220 for ; Mon, 29 Feb 2016 12:24:16 +0000 (UTC) Received: from localhost ([::1]:36257 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aaMs3-0007Zg-Dz for patchwork-qemu-devel@patchwork.kernel.org; Mon, 29 Feb 2016 07:24:15 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38634) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aaMro-0007TD-Bb for qemu-devel@nongnu.org; Mon, 29 Feb 2016 07:24:01 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aaMrm-00055D-Vy for qemu-devel@nongnu.org; Mon, 29 Feb 2016 07:24:00 -0500 Received: from [59.151.112.132] (port=10467 helo=heian.cn.fujitsu.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aaMrl-00051A-27 for qemu-devel@nongnu.org; Mon, 29 Feb 2016 07:23:58 -0500 X-IronPort-AV: E=Sophos;i="5.22,518,1449504000"; d="scan'208";a="4026244" Received: from unknown (HELO cn.fujitsu.com) ([10.167.33.5]) by heian.cn.fujitsu.com with ESMTP; 29 Feb 2016 20:23:38 +0800 Received: from G08CNEXCHPEKD02.g08.fujitsu.local (unknown [10.167.33.83]) by cn.fujitsu.com (Postfix) with ESMTP id E3F9442AC84D; Mon, 29 Feb 2016 20:23:31 +0800 (CST) Received: from G08FNSTD140215.g08.fujitsu.local (10.167.226.56) by G08CNEXCHPEKD02.g08.fujitsu.local (10.167.33.89) with Microsoft SMTP Server (TLS) id 14.3.181.6; Mon, 29 Feb 2016 20:23:31 +0800 From: Zhang Chen To: qemu devel , Jason Wang Date: Mon, 29 Feb 2016 20:23:53 +0800 Message-ID: <1456748635-1912-2-git-send-email-zhangchen.fnst@cn.fujitsu.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1456748635-1912-1-git-send-email-zhangchen.fnst@cn.fujitsu.com> References: <1456748635-1912-1-git-send-email-zhangchen.fnst@cn.fujitsu.com> MIME-Version: 1.0 X-Originating-IP: [10.167.226.56] X-yoursite-MailScanner-ID: E3F9442AC84D.AF925 X-yoursite-MailScanner: Found to be clean X-yoursite-MailScanner-From: zhangchen.fnst@cn.fujitsu.com X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 59.151.112.132 Cc: Li Zhijian , Gui jianfeng , "eddie.dong" , zhanghailiang , "Dr. David Alan Gilbert" , Zhang Chen , Yang Hongyang Subject: [Qemu-devel] [PATCH V2 1/3] net/filter-traffic: add filter-traffic.h X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP We can reuse filter-traffic by filter-mirror, filter-redirector and so on. Signed-off-by: Zhang Chen Signed-off-by: Wen Congyang --- net/filter-mirror.c | 70 +++++++-------------------------------------------- net/filter-traffic.h | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+), 61 deletions(-) create mode 100644 net/filter-traffic.h diff --git a/net/filter-mirror.c b/net/filter-mirror.c index ee13d94..d9698f2 100644 --- a/net/filter-mirror.c +++ b/net/filter-mirror.c @@ -9,65 +9,13 @@ * later. See the COPYING file in the top-level directory. */ -#include "net/filter.h" -#include "net/net.h" -#include "qemu-common.h" -#include "qapi/qmp/qerror.h" -#include "qapi-visit.h" -#include "qom/object.h" -#include "qemu/main-loop.h" -#include "qemu/error-report.h" -#include "trace.h" -#include "sysemu/char.h" -#include "qemu/iov.h" -#include "qemu/sockets.h" +#include "net/filter-traffic.h" #define FILTER_MIRROR(obj) \ - OBJECT_CHECK(MirrorState, (obj), TYPE_FILTER_MIRROR) + OBJECT_CHECK(TrafficState, (obj), TYPE_FILTER_MIRROR) #define TYPE_FILTER_MIRROR "filter-mirror" -typedef struct MirrorState { - NetFilterState parent_obj; - char *outdev; - CharDriverState *chr_out; -} MirrorState; - -static int filter_mirror_send(NetFilterState *nf, - const struct iovec *iov, - int iovcnt) -{ - MirrorState *s = FILTER_MIRROR(nf); - int ret = 0; - ssize_t size = 0; - uint32_t len = 0; - char *buf; - - size = iov_size(iov, iovcnt); - if (!size) { - return 0; - } - - len = htonl(size); - ret = qemu_chr_fe_write_all(s->chr_out, (uint8_t *)&len, sizeof(len)); - if (ret != sizeof(len)) { - goto err; - } - - buf = g_malloc(size); - iov_to_buf(iov, iovcnt, 0, buf, size); - ret = qemu_chr_fe_write_all(s->chr_out, (uint8_t *)buf, size); - g_free(buf); - if (ret != size) { - goto err; - } - - return 0; - -err: - return ret < 0 ? ret : -EIO; -} - static ssize_t filter_mirror_receive_iov(NetFilterState *nf, NetClientState *sender, unsigned flags, @@ -77,7 +25,7 @@ static ssize_t filter_mirror_receive_iov(NetFilterState *nf, { int ret; - ret = filter_mirror_send(nf, iov, iovcnt); + ret = filter_traffic_send(nf, iov, iovcnt); if (ret) { error_report("filter_mirror_send failed(%s)", strerror(-ret)); } @@ -91,7 +39,7 @@ static ssize_t filter_mirror_receive_iov(NetFilterState *nf, static void filter_mirror_cleanup(NetFilterState *nf) { - MirrorState *s = FILTER_MIRROR(nf); + TrafficState *s = FILTER_MIRROR(nf); if (s->chr_out) { qemu_chr_fe_release(s->chr_out); @@ -100,7 +48,7 @@ static void filter_mirror_cleanup(NetFilterState *nf) static void filter_mirror_setup(NetFilterState *nf, Error **errp) { - MirrorState *s = FILTER_MIRROR(nf); + TrafficState *s = FILTER_MIRROR(nf); if (!s->outdev) { error_setg(errp, "filter filter mirror needs 'outdev' " @@ -132,7 +80,7 @@ static void filter_mirror_class_init(ObjectClass *oc, void *data) static char *filter_mirror_get_outdev(Object *obj, Error **errp) { - MirrorState *s = FILTER_MIRROR(obj); + TrafficState *s = FILTER_MIRROR(obj); return g_strdup(s->outdev); } @@ -140,7 +88,7 @@ static char *filter_mirror_get_outdev(Object *obj, Error **errp) static void filter_mirror_set_outdev(Object *obj, const char *value, Error **errp) { - MirrorState *s = FILTER_MIRROR(obj); + TrafficState *s = FILTER_MIRROR(obj); g_free(s->outdev); s->outdev = g_strdup(value); @@ -159,7 +107,7 @@ static void filter_mirror_init(Object *obj) static void filter_mirror_fini(Object *obj) { - MirrorState *s = FILTER_MIRROR(obj); + TrafficState *s = FILTER_MIRROR(obj); g_free(s->outdev); } @@ -170,7 +118,7 @@ static const TypeInfo filter_mirror_info = { .class_init = filter_mirror_class_init, .instance_init = filter_mirror_init, .instance_finalize = filter_mirror_fini, - .instance_size = sizeof(MirrorState), + .instance_size = sizeof(TrafficState), }; static void register_types(void) diff --git a/net/filter-traffic.h b/net/filter-traffic.h new file mode 100644 index 0000000..24cb5c3 --- /dev/null +++ b/net/filter-traffic.h @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2016 HUAWEI TECHNOLOGIES CO., LTD. + * Copyright (c) 2016 FUJITSU LIMITED + * Copyright (c) 2016 Intel Corporation + * + * Author: Zhang Chen + * + * 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 "net/filter.h" +#include "net/net.h" +#include "qemu-common.h" +#include "qapi/qmp/qerror.h" +#include "qapi-visit.h" +#include "qom/object.h" +#include "qemu/main-loop.h" +#include "qemu/error-report.h" +#include "trace.h" +#include "sysemu/char.h" +#include "qemu/iov.h" +#include "qemu/sockets.h" + +#ifndef QEMU_FILTER_MIRROR_H +#define QEMU_FILTER_MIRROR_H + +typedef struct TrafficState { + NetFilterState parent_obj; + NetQueue *incoming_queue;/* guest normal net queue */ + char *indev; + char *outdev; + CharDriverState *chr_in; + CharDriverState *chr_out; +} TrafficState; + +static int filter_traffic_send(NetFilterState *nf, + const struct iovec *iov, + int iovcnt) +{ + TrafficState *s = (TrafficState *)nf; + int ret = 0; + ssize_t size = 0; + uint32_t len = 0; + char *buf; + size = iov_size(iov, iovcnt); + if (!size) { + return 0; + } + + len = htonl(size); + ret = qemu_chr_fe_write_all(s->chr_out, (uint8_t *)&len, sizeof(len)); + if (ret != sizeof(len)) { + goto err; + } + + buf = g_malloc(size); + iov_to_buf(iov, iovcnt, 0, buf, size); + ret = qemu_chr_fe_write_all(s->chr_out, (uint8_t *)buf, size); + g_free(buf); + if (ret != size) { + goto err; + } + + return 0; + +err: + return ret < 0 ? ret : -EIO; +} + +#endif /* QEMU_FILTER_MIRROR_H */