From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:42311) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZNFPk-00073g-2p for qemu-devel@nongnu.org; Thu, 06 Aug 2015 03:16:33 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZNFPg-0001KK-Ac for qemu-devel@nongnu.org; Thu, 06 Aug 2015 03:16:32 -0400 Received: from mx1.redhat.com ([209.132.183.28]:53625) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZNFPg-0001JW-32 for qemu-devel@nongnu.org; Thu, 06 Aug 2015 03:16:28 -0400 Message-ID: <55C309C3.3050401@redhat.com> Date: Thu, 06 Aug 2015 15:16:19 +0800 From: Jason Wang MIME-Version: 1.0 References: <1438677044-13030-1-git-send-email-yanghy@cn.fujitsu.com> <1438677044-13030-7-git-send-email-yanghy@cn.fujitsu.com> In-Reply-To: <1438677044-13030-7-git-send-email-yanghy@cn.fujitsu.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH v4 06/11] netfilter: add an API to pass the packet to next filter List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Yang Hongyang , qemu-devel@nongnu.org Cc: thuth@redhat.com, zhang.zhanghailiang@huawei.com, lizhijian@cn.fujitsu.com, eddie.dong@intel.com, mrhines@linux.vnet.ibm.com, stefanha@redhat.com On 08/04/2015 04:30 PM, Yang Hongyang wrote: > add an API qemu_netfilter_pass_to_next_iov() to pass the packet > to next filter, and a wrapper qemu_netfilter_pass_to_next(). > > Signed-off-by: Yang Hongyang > --- > include/net/filter.h | 12 ++++++++++++ > net/filter.c | 43 +++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 55 insertions(+) > > diff --git a/include/net/filter.h b/include/net/filter.h > index c146be2..867d5aa 100644 > --- a/include/net/filter.h > +++ b/include/net/filter.h > @@ -54,4 +54,16 @@ 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 */ > +void qemu_netfilter_pass_to_next_iov(NetFilterState *nf, > + NetClientState *sender, > + unsigned flags, > + const struct iovec *iov, > + int iovcnt); > +void qemu_netfilter_pass_to_next(NetFilterState *nf, > + NetClientState *sender, > + unsigned flags, > + const uint8_t *data, > + size_t size); sender, flags, data and size were all could be inferred from packet. How about just have a packet parameter? > + > #endif /* QEMU_NET_FILTER_H */ > diff --git a/net/filter.c b/net/filter.c > index 24ec4e1..166b851 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; > > @@ -130,6 +132,47 @@ void qmp_netfilter_del(const char *id, Error **errp) > qemu_opts_del(opts); > } > > +void qemu_netfilter_pass_to_next_iov(NetFilterState *nf, > + NetClientState *sender, > + unsigned flags, > + const struct iovec *iov, > + int iovcnt) > +{ > + int ret = 0; > + ssize_t size = iov_size(iov, iovcnt); > + NetFilterState *next = QTAILQ_NEXT(nf, next); > + > + while (next) { > + if (next->chain == nf->chain || next->chain == NET_FILTER_ALL) { > + ret = next->info->receive_iov(next, sender, flags, iov, iovcnt); > + if (ret == size) { > + return; > + } > + } > + next = QTAILQ_NEXT(next, next); > + } > + > + /* we have gone through all filters, pass it to receiver */ > + if (sender && sender->peer) { > + qemu_net_queue_send_iov(sender->peer->incoming_queue, sender, flags, > + iov, iovcnt, NULL); > + } > +} > + > +void qemu_netfilter_pass_to_next(NetFilterState *nf, > + NetClientState *sender, > + unsigned flags, > + const uint8_t *data, > + size_t size) > +{ > + struct iovec iov = { > + .iov_base = (void *)data, > + .iov_len = size > + }; > + > + return qemu_netfilter_pass_to_next_iov(nf, sender, flags, &iov, 1); > +} > + > typedef int (NetFilterInit)(const NetFilterOptions *opts, > const char *name, int chain, > NetClientState *netdev, Error **errp);