From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34932) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZNIJf-0002MQ-O3 for qemu-devel@nongnu.org; Thu, 06 Aug 2015 06:22:28 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZNIJe-0001Rl-U6 for qemu-devel@nongnu.org; Thu, 06 Aug 2015 06:22:27 -0400 Received: from [59.151.112.132] (port=2494 helo=heian.cn.fujitsu.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZNIJd-0001Qe-Oq for qemu-devel@nongnu.org; Thu, 06 Aug 2015 06:22:26 -0400 From: Yang Hongyang Date: Thu, 6 Aug 2015 18:21:51 +0800 Message-ID: <1438856515-17422-7-git-send-email-yanghy@cn.fujitsu.com> In-Reply-To: <1438856515-17422-1-git-send-email-yanghy@cn.fujitsu.com> References: <1438856515-17422-1-git-send-email-yanghy@cn.fujitsu.com> MIME-Version: 1.0 Content-Type: text/plain Subject: [Qemu-devel] [PATCH v5 06/10] netfilter: add an API to pass the packet to next filter List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: thuth@redhat.com, zhang.zhanghailiang@huawei.com, lizhijian@cn.fujitsu.com, jasowang@redhat.com, mrhines@linux.vnet.ibm.com, stefanha@redhat.com, Yang Hongyang add an API qemu_netfilter_pass_to_next() to pass the packet to next filter. Signed-off-by: Yang Hongyang --- v5: fold params to NetPacket struct --- include/net/filter.h | 3 +++ net/filter.c | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/include/net/filter.h b/include/net/filter.h index f15d83d..9278d40 100644 --- a/include/net/filter.h +++ b/include/net/filter.h @@ -57,4 +57,7 @@ void qemu_del_net_filter(NetFilterState *nf); void netfilter_add(QemuOpts *opts, Error **errp); void qmp_netfilter_add(QDict *qdict, QObject **ret, Error **errp); +/* pass the packet to the next filter */ +ssize_t qemu_netfilter_pass_to_next(NetFilterState *nf, NetPacket *packet); + #endif /* QEMU_NET_FILTER_H */ diff --git a/net/filter.c b/net/filter.c index dfce544..84245a7 100644 --- a/net/filter.c +++ b/net/filter.c @@ -14,9 +14,11 @@ #include "qapi/dealloc-visitor.h" #include "qemu/config-file.h" #include "qmp-commands.h" +#include "qemu/iov.h" #include "net/filter.h" #include "net/net.h" +#include "net/queue.h" static QTAILQ_HEAD(, NetFilterState) net_filters; @@ -127,6 +129,37 @@ void qmp_netfilter_del(const char *id, Error **errp) qemu_opts_del(opts); } +ssize_t qemu_netfilter_pass_to_next(NetFilterState *nf, NetPacket *packet) +{ + int ret = 0; + NetFilterState *next = QTAILQ_NEXT(nf, next); + struct iovec iov = { + .iov_base = (void *)packet->data, + .iov_len = packet->size + }; + + while (next) { + if (next->chain == nf->chain || next->chain == NET_FILTER_ALL) { + ret = next->info->receive_iov(next, packet->sender, packet->flags, + &iov, 1, packet->sent_cb); + if (ret) { + return ret; + } + } + next = QTAILQ_NEXT(next, next); + } + + /* we have gone through all filters, pass it to receiver */ + if (packet->sender && packet->sender->peer) { + return qemu_net_queue_send_iov(packet->sender->peer->incoming_queue, + packet->sender, packet->flags, + &iov, 1, packet->sent_cb); + } + + /* no receiver, or sender is deleted, drop this packet, return success */ + return packet->size; +} + typedef int (NetFilterInit)(const NetFilterOptions *opts, const char *name, int chain, NetClientState *netdev, Error **errp); -- 1.9.1