From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49579) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZL6Pi-0007Bj-1r for qemu-devel@nongnu.org; Fri, 31 Jul 2015 05:15:39 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZL6Pd-0004tq-B3 for qemu-devel@nongnu.org; Fri, 31 Jul 2015 05:15:37 -0400 Received: from mx1.redhat.com ([209.132.183.28]:32771) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZL6Pc-0004ti-Tv for qemu-devel@nongnu.org; Fri, 31 Jul 2015 05:15:33 -0400 Message-ID: <55BB3CAF.7060802@redhat.com> Date: Fri, 31 Jul 2015 17:15:27 +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> <55BB10E7.4070407@redhat.com> <55BB3237.3010303@cn.fujitsu.com> In-Reply-To: <55BB3237.3010303@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: lizhijian@cn.fujitsu.com, thuth@redhat.com, stefanha@redhat.com, mrhines@linux.vnet.ibm.com, zhang.zhanghailiang@huawei.com On 07/31/2015 04:30 PM, Yang Hongyang wrote: > On 07/31/2015 02:08 PM, Jason Wang wrote: >> >> >> 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. > > Yes, if the peer is NULL, we can just free the packet and continue. > we might need to check the sender too, because the sender might be > deleted > too... > > I was thinking when we remove the netdev, we also remove/free the filters > attached to it automatically, do you think it is reasonable? because > if the > netdev is removed, the filters which attached to it is useless. Yes, please do this.