From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35909) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZL5iX-0000r4-JG for qemu-devel@nongnu.org; Fri, 31 Jul 2015 04:31:05 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZL5iS-000224-1k for qemu-devel@nongnu.org; Fri, 31 Jul 2015 04:31:01 -0400 Received: from [59.151.112.132] (port=44032 helo=heian.cn.fujitsu.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZL5iP-00020I-3u for qemu-devel@nongnu.org; Fri, 31 Jul 2015 04:30:55 -0400 Message-ID: <55BB3237.3010303@cn.fujitsu.com> Date: Fri, 31 Jul 2015 16:30:47 +0800 From: Yang Hongyang 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> In-Reply-To: <55BB10E7.4070407@redhat.com> Content-Type: text/plain; charset="windows-1252"; format=flowed 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: Jason Wang , 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 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. -- Thanks, Yang.