From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:56088) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZL3Uu-0004dQ-Qs for qemu-devel@nongnu.org; Fri, 31 Jul 2015 02:08:50 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZL3Uq-0004os-5r for qemu-devel@nongnu.org; Fri, 31 Jul 2015 02:08:48 -0400 Received: from mx1.redhat.com ([209.132.183.28]:42157) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZL3Up-0004od-VH for qemu-devel@nongnu.org; Fri, 31 Jul 2015 02:08:44 -0400 Message-ID: <55BB10E7.4070407@redhat.com> Date: Fri, 31 Jul 2015 14:08:39 +0800 From: Jason Wang MIME-Version: 1.0 References: <1438316014-8369-1-git-send-email-yanghy@cn.fujitsu.com> <1438316014-8369-9-git-send-email-yanghy@cn.fujitsu.com> In-Reply-To: <1438316014-8369-9-git-send-email-yanghy@cn.fujitsu.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH v2 8/9] netfilter: add a netbuffer filter List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Yang Hongyang , qemu-devel@nongnu.org Cc: thuth@redhat.com, mrhines@linux.vnet.ibm.com, stefanha@redhat.com, zhang.zhanghailiang@huawei.com, lizhijian@cn.fujitsu.com On 07/31/2015 12:13 PM, Yang Hongyang wrote: > This filter is to buffer/release packets, this feature can be used > when using MicroCheckpointing, or other Remus like VM FT solutions, you > can also use it to simulate the network delay. > It has an interval option, if supplied, this filter will release > packets by interval. > > Usage: > -netdev tap,id=bn0 > -netfilter buffer,id=f0,netdev=bn0,chain=in,interval=1000 > > NOTE: > the scale of interval is microsecond. > > Signed-off-by: Yang Hongyang > --- > net/Makefile.objs | 1 + > net/filter-buffer.c | 160 ++++++++++++++++++++++++++++++++++++++++++++++++++++ > net/filter.c | 2 + > net/filters.h | 17 ++++++ > qapi-schema.json | 18 +++++- > 5 files changed, 197 insertions(+), 1 deletion(-) > create mode 100644 net/filter-buffer.c > create mode 100644 net/filters.h > > diff --git a/net/Makefile.objs b/net/Makefile.objs > index 914aec0..5fa2f97 100644 > --- a/net/Makefile.objs > +++ b/net/Makefile.objs > @@ -14,3 +14,4 @@ common-obj-$(CONFIG_SLIRP) += slirp.o > common-obj-$(CONFIG_VDE) += vde.o > common-obj-$(CONFIG_NETMAP) += netmap.o > common-obj-y += filter.o > +common-obj-y += filter-buffer.o > diff --git a/net/filter-buffer.c b/net/filter-buffer.c > new file mode 100644 > index 0000000..7f2b050 > --- /dev/null > +++ b/net/filter-buffer.c > @@ -0,0 +1,160 @@ > +/* > + * Copyright (c) 2015 FUJITSU LIMITED > + * Author: Yang Hongyang > + * > + * 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/queue.h" > +#include "filters.h" > +#include "qemu-common.h" > +#include "qemu/error-report.h" > +#include "qemu/main-loop.h" > +#include "qemu/timer.h" > +#include "qemu/iov.h" > + > +typedef struct FILTERBUFFERState { > + NetFilterState nf; > + NetQueue *incoming_queue; > + NetQueue *inflight_queue; > + QEMUBH *flush_bh; > + int64_t interval; > + QEMUTimer release_timer; > +} FILTERBUFFERState; > + > +static void packet_send_completed(NetClientState *nc, ssize_t len) > +{ > + return; > +} > + > +static void filter_buffer_flush(NetFilterState *nf) > +{ > + FILTERBUFFERState *s = DO_UPCAST(FILTERBUFFERState, nf, nf); > + NetQueue *queue = s->inflight_queue; > + NetPacket *packet; > + > + while (queue && !QTAILQ_EMPTY(&queue->packets)) { > + packet = QTAILQ_FIRST(&queue->packets); > + QTAILQ_REMOVE(&queue->packets, packet, entry); > + queue->nq_count--; > + > + qemu_net_queue_send(packet->sender->peer->incoming_queue, > + packet->sender, > + packet->flags, > + packet->data, > + packet->size, > + packet->sent_cb); Need to check peer since it may be NULL e.g after it was deleted. And we probably need to queue the packet into next filter.