From patchwork Thu Feb 25 04:05:49 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhanghailiang X-Patchwork-Id: 8418431 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 657129F2F0 for ; Thu, 25 Feb 2016 04:07:15 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 1A7B920268 for ; Thu, 25 Feb 2016 04:07:11 +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 1F31820165 for ; Thu, 25 Feb 2016 04:07:06 +0000 (UTC) Received: from localhost ([::1]:39894 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aYnCj-00008F-1g for patchwork-qemu-devel@patchwork.kernel.org; Wed, 24 Feb 2016 23:07:05 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:57212) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aYnCX-00006S-JA for qemu-devel@nongnu.org; Wed, 24 Feb 2016 23:06:57 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aYnCT-0002d8-FW for qemu-devel@nongnu.org; Wed, 24 Feb 2016 23:06:53 -0500 Received: from szxga02-in.huawei.com ([119.145.14.65]:62978) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aYnCR-0002c4-KI for qemu-devel@nongnu.org; Wed, 24 Feb 2016 23:06:49 -0500 Received: from 172.24.1.49 (EHLO szxeml431-hub.china.huawei.com) ([172.24.1.49]) by szxrg02-dlp.huawei.com (MOS 4.3.7-GA FastPath queued) with ESMTP id DBX62019; Thu, 25 Feb 2016 12:06:34 +0800 (CST) Received: from localhost (10.177.24.212) by szxeml431-hub.china.huawei.com (10.82.67.208) with Microsoft SMTP Server id 14.3.235.1; Thu, 25 Feb 2016 12:06:23 +0800 From: zhanghailiang To: Date: Thu, 25 Feb 2016 12:05:49 +0800 Message-ID: <1456373149-26256-1-git-send-email-zhang.zhanghailiang@huawei.com> X-Mailer: git-send-email 1.9.0.msysgit.0 MIME-Version: 1.0 X-Originating-IP: [10.177.24.212] X-CFilter-Loop: Reflected X-Mirapoint-Virus-RAPID-Raw: score=unknown(0), refid=str=0001.0A020205.56CE7DCC.005D, ss=1, re=0.000, recu=0.000, reip=0.000, cl=1, cld=1, fgs=0, ip=0.0.0.0, so=2013-06-18 04:22:30, dmn=2013-03-21 17:37:32 X-Mirapoint-Loop-Id: 1355af9d6c00997d5bc5bcbbf81db99b X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.4.x-2.6.x [generic] X-Received-From: 119.145.14.65 Cc: Jason Wang , zhanghailiang , Yang Hongyang Subject: [Qemu-devel] [PATCH] filter/fiter-buffer: Add a 'status' property for filter object 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 With this property, users can control if this filter is 'enable' or 'disable'. The default behavior for filter is enabled. For buffer filter, we need to release all the buffered packets while disabled it. Here we use the 'disable' callback of NetFilterClass to realize this capability. We register it with filter_buffer_flush(). The other types of filters can realize their own 'disable' callback. We will skip the disabled filter when delivering packets in net layer. Signed-off-by: zhanghailiang Cc: Jason Wang Cc: Yang Hongyang --- This is picked from COLO series, which is to realize the new 'status' property for filter. --- include/net/filter.h | 4 ++++ net/filter-buffer.c | 1 + net/filter.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ qemu-options.hx | 4 +++- 4 files changed, 52 insertions(+), 1 deletion(-) diff --git a/include/net/filter.h b/include/net/filter.h index 5639976..bd27074 100644 --- a/include/net/filter.h +++ b/include/net/filter.h @@ -36,12 +36,15 @@ typedef ssize_t (FilterReceiveIOV)(NetFilterState *nc, int iovcnt, NetPacketSent *sent_cb); +typedef void (FilterDisable) (NetFilterState *nf); + typedef struct NetFilterClass { ObjectClass parent_class; /* optional */ FilterSetup *setup; FilterCleanup *cleanup; + FilterDisable *disable; /* mandatory */ FilterReceiveIOV *receive_iov; } NetFilterClass; @@ -55,6 +58,7 @@ struct NetFilterState { char *netdev_id; NetClientState *netdev; NetFilterDirection direction; + bool enabled; QTAILQ_ENTRY(NetFilterState) next; }; diff --git a/net/filter-buffer.c b/net/filter-buffer.c index 12ad2e3..b1464c9 100644 --- a/net/filter-buffer.c +++ b/net/filter-buffer.c @@ -131,6 +131,7 @@ static void filter_buffer_class_init(ObjectClass *oc, void *data) nfc->setup = filter_buffer_setup; nfc->cleanup = filter_buffer_cleanup; nfc->receive_iov = filter_buffer_receive_iov; + nfc->disable = filter_buffer_flush; } static void filter_buffer_get_interval(Object *obj, Visitor *v, diff --git a/net/filter.c b/net/filter.c index d2a514e..edd18c4 100644 --- a/net/filter.c +++ b/net/filter.c @@ -17,6 +17,11 @@ #include "qom/object_interfaces.h" #include "qemu/iov.h" +static inline bool qemu_can_skip_netfilter(NetFilterState *nf) +{ + return nf->enabled ? false : true; +} + ssize_t qemu_netfilter_receive(NetFilterState *nf, NetFilterDirection direction, NetClientState *sender, @@ -25,6 +30,9 @@ ssize_t qemu_netfilter_receive(NetFilterState *nf, int iovcnt, NetPacketSent *sent_cb) { + if (qemu_can_skip_netfilter(nf)) { + return 0; + } if (nf->direction == direction || nf->direction == NET_FILTER_DIRECTION_ALL) { return NETFILTER_GET_CLASS(OBJECT(nf))->receive_iov( @@ -134,8 +142,41 @@ static void netfilter_set_direction(Object *obj, int direction, Error **errp) nf->direction = direction; } +static char *netfilter_get_status(Object *obj, Error **errp) +{ + NetFilterState *nf = NETFILTER(obj); + + if (nf->enabled) { + return g_strdup("enable"); + } else { + return g_strdup("disable"); + } +} + +static void netfilter_set_status(Object *obj, const char *str, Error **errp) +{ + NetFilterState *nf = NETFILTER(obj); + NetFilterClass *nfc = NETFILTER_GET_CLASS(obj); + + if (!strcmp(str, "enable")) { + nf->enabled = true; + } else if (!strcmp(str, "disable")) { + nf->enabled = false; + if (nfc->disable) { + nfc->disable(nf); + } + } else { + error_setg(errp, "Invalid value for netfilter status, " + "should be 'enable' or 'disable'"); + } +} + static void netfilter_init(Object *obj) { + NetFilterState *nf = NETFILTER(obj); + + nf->enabled = true; + object_property_add_str(obj, "netdev", netfilter_get_netdev_id, netfilter_set_netdev_id, NULL); @@ -143,6 +184,9 @@ static void netfilter_init(Object *obj) NetFilterDirection_lookup, netfilter_get_direction, netfilter_set_direction, NULL); + object_property_add_str(obj, "status", + netfilter_get_status, netfilter_set_status, + NULL); } static void netfilter_complete(UserCreatable *uc, Error **errp) diff --git a/qemu-options.hx b/qemu-options.hx index f528405..15b8e48 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -3746,11 +3746,13 @@ version by providing the @var{passwordid} parameter. This provides the ID of a previously created @code{secret} object containing the password for decryption. -@item -object filter-buffer,id=@var{id},netdev=@var{netdevid},interval=@var{t}[,queue=@var{all|rx|tx}] +@item -object filter-buffer,id=@var{id},netdev=@var{netdevid},interval=@var{t}[,queue=@var{all|rx|tx}][,status=@var{enable|disable}] Interval @var{t} can't be 0, this filter batches the packet delivery: all packets arriving in a given interval on netdev @var{netdevid} are delayed until the end of the interval. Interval is in microseconds. +@option{status} is optional that indicate whether the netfilter is enabled +or disabled, the default status for netfilter will be enabled. queue @var{all|rx|tx} is an option that can be applied to any netfilter.