From patchwork Fri Jan 22 08:11:47 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Li Zhijian X-Patchwork-Id: 571562 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id C9E8614031F for ; Fri, 22 Jan 2016 19:14:31 +1100 (AEDT) Received: from localhost ([::1]:51222 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aMWrV-0001Mp-Sd for incoming@patchwork.ozlabs.org; Fri, 22 Jan 2016 03:14:29 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51886) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aMWrH-0000v3-7I for qemu-devel@nongnu.org; Fri, 22 Jan 2016 03:14:16 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aMWrE-0005sd-0z for qemu-devel@nongnu.org; Fri, 22 Jan 2016 03:14:15 -0500 Received: from [59.151.112.132] (port=9878 helo=heian.cn.fujitsu.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aMWrD-0005sI-Bz for qemu-devel@nongnu.org; Fri, 22 Jan 2016 03:14:11 -0500 X-IronPort-AV: E=Sophos;i="5.20,346,1444665600"; d="scan'208";a="2866466" Received: from unknown (HELO cn.fujitsu.com) ([10.167.33.5]) by heian.cn.fujitsu.com with ESMTP; 22 Jan 2016 16:14:04 +0800 Received: from G08CNEXCHPEKD01.g08.fujitsu.local (unknown [10.167.33.80]) by cn.fujitsu.com (Postfix) with ESMTP id E051340427C5; Fri, 22 Jan 2016 16:13:43 +0800 (CST) Received: from G08FNSTD140138.localdomain (10.167.226.45) by G08CNEXCHPEKD01.g08.fujitsu.local (10.167.33.89) with Microsoft SMTP Server (TLS) id 14.3.181.6; Fri, 22 Jan 2016 16:13:43 +0800 From: Li Zhijian To: , Date: Fri, 22 Jan 2016 16:11:47 +0800 Message-ID: <1453450307-16982-1-git-send-email-lizhijian@cn.fujitsu.com> X-Mailer: git-send-email 2.5.0 MIME-Version: 1.0 X-Originating-IP: [10.167.226.45] X-yoursite-MailScanner-ID: E051340427C5.AB836 X-yoursite-MailScanner: Found to be clean X-yoursite-MailScanner-From: lizhijian@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 Subject: [Qemu-devel] [PATCH] net: walk through filters reversely if traffic is outgress 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Previously, if the netdev has more than one filters, the ingress or outgress traffic pass the filter in the same order. this patch is to make the outgress pass the filter in a reverse order Signed-off-by: Wen Congyang Signed-off-by: Li Zhijian --- include/net/net.h | 4 +++- net/filter.c | 21 +++++++++++++++++++-- net/net.c | 23 ++++++++++++++++++----- 3 files changed, 40 insertions(+), 8 deletions(-) diff --git a/include/net/net.h b/include/net/net.h index 7af3e15..1d807cc 100644 --- a/include/net/net.h +++ b/include/net/net.h @@ -79,6 +79,8 @@ typedef struct NetClientInfo { SetVnetBE *set_vnet_be; } NetClientInfo; +QTAILQ_HEAD(NetFilterHead, NetFilterState); + struct NetClientState { NetClientInfo *info; int link_down; @@ -92,7 +94,7 @@ struct NetClientState { NetClientDestructor *destructor; unsigned int queue_index; unsigned rxfilter_notify_enabled:1; - QTAILQ_HEAD(, NetFilterState) filters; + struct NetFilterHead filters; }; typedef struct NICState { diff --git a/net/filter.c b/net/filter.c index 5d90f83..17a8398 100644 --- a/net/filter.c +++ b/net/filter.c @@ -34,6 +34,22 @@ ssize_t qemu_netfilter_receive(NetFilterState *nf, return 0; } +static NetFilterState *netfilter_next(NetFilterState *nf, + NetFilterDirection dir) +{ + NetFilterState *next; + + if (dir == NET_FILTER_DIRECTION_TX) { + /* forward walk through filters */ + next = QTAILQ_NEXT(nf, next); + } else { + /* reverse order */ + next = QTAILQ_PREV(nf, NetFilterHead, next); + } + + return next; +} + ssize_t qemu_netfilter_pass_to_next(NetClientState *sender, unsigned flags, const struct iovec *iov, @@ -43,7 +59,7 @@ ssize_t qemu_netfilter_pass_to_next(NetClientState *sender, int ret = 0; int direction; NetFilterState *nf = opaque; - NetFilterState *next = QTAILQ_NEXT(nf, next); + NetFilterState *next = NULL; if (!sender || !sender->peer) { /* no receiver, or sender been deleted, no need to pass it further */ @@ -61,6 +77,7 @@ ssize_t qemu_netfilter_pass_to_next(NetClientState *sender, direction = nf->direction; } + next = netfilter_next(nf, direction); while (next) { /* * if qemu_netfilter_pass_to_next been called, means that @@ -73,7 +90,7 @@ ssize_t qemu_netfilter_pass_to_next(NetClientState *sender, if (ret) { return ret; } - next = QTAILQ_NEXT(next, next); + next = netfilter_next(next, direction); } /* diff --git a/net/net.c b/net/net.c index 87dd356..05ec996 100644 --- a/net/net.c +++ b/net/net.c @@ -580,11 +580,24 @@ static ssize_t filter_receive_iov(NetClientState *nc, ssize_t ret = 0; NetFilterState *nf = NULL; - QTAILQ_FOREACH(nf, &nc->filters, next) { - ret = qemu_netfilter_receive(nf, direction, sender, flags, iov, - iovcnt, sent_cb); - if (ret) { - return ret; + assert(direction == NET_FILTER_DIRECTION_TX || + direction == NET_FILTER_DIRECTION_RX); + + if (direction == NET_FILTER_DIRECTION_TX) { + QTAILQ_FOREACH(nf, &nc->filters, next) { + ret = qemu_netfilter_receive(nf, direction, sender, flags, iov, + iovcnt, sent_cb); + if (ret) { + return ret; + } + } + } else { + QTAILQ_FOREACH_REVERSE(nf, &nc->filters, NetFilterHead, next) { + ret = qemu_netfilter_receive(nf, direction, sender, flags, iov, + iovcnt, sent_cb); + if (ret) { + return ret; + } } }