From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36651) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bJyWS-00053u-BS for qemu-devel@nongnu.org; Mon, 04 Jul 2016 03:42:29 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bJyWO-0005Vp-1u for qemu-devel@nongnu.org; Mon, 04 Jul 2016 03:42:27 -0400 Received: from [59.151.112.132] (port=32109 helo=heian.cn.fujitsu.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bJyWM-0005Ud-QE for qemu-devel@nongnu.org; Mon, 04 Jul 2016 03:42:23 -0400 References: <1467440540-6630-1-git-send-email-zhangchen.fnst@cn.fujitsu.com> <1467440540-6630-2-git-send-email-zhangchen.fnst@cn.fujitsu.com> <5779CEB9.8020706@redhat.com> From: Zhang Chen Message-ID: <577A137E.7090804@cn.fujitsu.com> Date: Mon, 4 Jul 2016 15:42:54 +0800 MIME-Version: 1.0 In-Reply-To: <5779CEB9.8020706@redhat.com> Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 8bit Subject: Re: [Qemu-devel] [RFC PATCH V2 1/3] filter-rewriter: introduce filter-rewriter initialization List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Jason Wang , qemu devel Cc: Li Zhijian , Wen Congyang , zhanghailiang , "eddie . dong" , "Dr . David Alan Gilbert" On 07/04/2016 10:49 AM, Jason Wang wrote: > > > On 2016年07月02日 14:22, Zhang Chen wrote: >> Filter-rewriter is a part of COLO project. >> It will rewrite some of secondary packet to make >> secondary guest's connection established successfully. > > Probably need to be more verbose here. E.g we only care about tcp and > only rewrite ack now. > ok~ I will add more comments in next version. >> >> usage: >> >> colo secondary: >> -object filter-redirector,id=f1,netdev=hn0,queue=tx,indev=red0 >> -object filter-redirector,id=f2,netdev=hn0,queue=rx,outdev=red1 >> -object filter-rewriter,id=rew0,netdev=hn0,queue=all >> >> Signed-off-by: Zhang Chen >> Signed-off-by: Li Zhijian >> Signed-off-by: Wen Congyang >> --- >> net/Makefile.objs | 1 + >> net/filter-rewriter.c | 112 >> ++++++++++++++++++++++++++++++++++++++++++++++++++ >> qemu-options.hx | 10 +++++ >> vl.c | 3 +- >> 4 files changed, 125 insertions(+), 1 deletion(-) >> create mode 100644 net/filter-rewriter.c >> >> diff --git a/net/Makefile.objs b/net/Makefile.objs >> index 119589f..645bd10 100644 >> --- a/net/Makefile.objs >> +++ b/net/Makefile.objs >> @@ -18,3 +18,4 @@ common-obj-y += filter-buffer.o >> common-obj-y += filter-mirror.o >> common-obj-y += colo-compare.o >> common-obj-y += colo-base.o >> +common-obj-y += filter-rewriter.o >> diff --git a/net/filter-rewriter.c b/net/filter-rewriter.c >> new file mode 100644 >> index 0000000..08b015d >> --- /dev/null >> +++ b/net/filter-rewriter.c >> @@ -0,0 +1,112 @@ >> +/* >> + * Copyright (c) 2016 HUAWEI TECHNOLOGIES CO., LTD. >> + * Copyright (c) 2016 FUJITSU LIMITED >> + * Copyright (c) 2016 Intel Corporation >> + * >> + * Author: Zhang Chen >> + * >> + * 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 "qemu/osdep.h" >> +#include "net/colo-base.h" >> +#include "net/filter.h" >> +#include "net/net.h" >> +#include "qemu-common.h" >> +#include "qapi/error.h" >> +#include "qapi/qmp/qerror.h" >> +#include "qapi-visit.h" >> +#include "qom/object.h" >> +#include "qemu/main-loop.h" >> +#include "qemu/iov.h" >> +#include "net/checksum.h" >> + >> +#define FILTER_COLO_REWRITER(obj) \ >> + OBJECT_CHECK(RewriterState, (obj), TYPE_FILTER_REWRITER) >> + >> +#define TYPE_FILTER_REWRITER "filter-rewriter" >> + >> +enum { >> + PRIMARY = 0, >> + SECONDARY, >> +}; >> + >> +typedef struct RewriterState { >> + NetFilterState parent_obj; >> + /* connection list: the connections belonged to this NIC could >> be found >> + * in this list. >> + * element type: Connection >> + */ >> + GQueue conn_list; >> + NetQueue *incoming_queue; >> + /* to protect conn_list */ >> + QemuMutex conn_list_lock; >> + /* hashtable to save connection */ >> + GHashTable *connection_track_table; >> + /* to save unprocessed_connections */ >> + GQueue unprocessed_connections; >> + /* current hash size */ >> + uint32_t hashtable_size; >> +} RewriterState; >> + >> +static ssize_t colo_rewriter_receive_iov(NetFilterState *nf, >> + NetClientState *sender, >> + unsigned flags, >> + const struct iovec *iov, >> + int iovcnt, >> + NetPacketSent *sent_cb) >> +{ >> + /* >> + * if we get tcp packet >> + * we will rewrite it to make secondary guest's >> + * connection established successfully >> + */ >> + return 0; >> +} >> + >> +static void colo_rewriter_cleanup(NetFilterState *nf) >> +{ >> + RewriterState *s = FILTER_COLO_REWRITER(nf); >> + >> + qemu_mutex_destroy(&s->conn_list_lock); >> + g_queue_free(&s->conn_list); >> +} >> + >> +static void colo_rewriter_setup(NetFilterState *nf, Error **errp) >> +{ >> + RewriterState *s = FILTER_COLO_REWRITER(nf); >> + >> + g_queue_init(&s->conn_list); >> + qemu_mutex_init(&s->conn_list_lock); >> + s->hashtable_size = 0; >> + >> + s->connection_track_table = >> g_hash_table_new_full(connection_key_hash, >> + connection_key_equal, >> + g_free, >> + connection_destroy); >> + s->incoming_queue = >> qemu_new_net_queue(qemu_netfilter_pass_to_next, nf); >> +} >> + >> +static void colo_rewriter_class_init(ObjectClass *oc, void *data) >> +{ >> + NetFilterClass *nfc = NETFILTER_CLASS(oc); >> + >> + nfc->setup = colo_rewriter_setup; >> + nfc->cleanup = colo_rewriter_cleanup; >> + nfc->receive_iov = colo_rewriter_receive_iov; >> +} >> + >> +static const TypeInfo colo_rewriter_info = { >> + .name = TYPE_FILTER_REWRITER, >> + .parent = TYPE_NETFILTER, >> + .class_init = colo_rewriter_class_init, >> + .instance_size = sizeof(RewriterState), >> +}; >> + >> +static void register_types(void) >> +{ >> + type_register_static(&colo_rewriter_info); >> +} >> + >> +type_init(register_types); >> diff --git a/qemu-options.hx b/qemu-options.hx >> index 14bade5..d7ab165 100644 >> --- a/qemu-options.hx >> +++ b/qemu-options.hx >> @@ -3859,6 +3859,16 @@ Create a filter-redirector we need to differ >> outdev id from indev id, id can not >> be the same. we can just use indev or outdev, but at least one of >> indev or outdev >> need to be specified. >> +@item -object >> filter-rewriter,id=@var{id},netdev=@var{netdevid},rewriter-mode=@var{mode}[,queue=@var{all|rx|tx}] >> + >> +Filter-rewriter is a part of COLO project.It will rewrite some of >> secondary packet. > > Need to be more verbose here. OK~ > >> + >> +usage: >> +colo secondary: >> +-object filter-redirector,id=f1,netdev=hn0,queue=tx,indev=red0 >> +-object filter-redirector,id=f2,netdev=hn0,queue=rx,outdev=red1 >> +-object filter-rewriter,id=rew0,netdev=hn0,queue=all >> + >> @item -object >> filter-dump,id=@var{id},netdev=@var{dev},file=@var{filename}][,maxlen=@var{len}] >> Dump the network traffic on netdev @var{dev} to the file >> specified by >> diff --git a/vl.c b/vl.c >> index c6b9a6f..b47be6a 100644 >> --- a/vl.c >> +++ b/vl.c >> @@ -2866,7 +2866,8 @@ static bool object_create_initial(const char >> *type) >> g_str_equal(type, "filter-dump") || >> g_str_equal(type, "filter-mirror") || >> g_str_equal(type, "filter-redirector") || >> - g_str_equal(type, "colo-compare")) { >> + g_str_equal(type, "colo-compare") || >> + g_str_equal(type, "filter-rewriter")) { > > So this makes the patch can't be applied cleanly on master. Yes,filter-rewriter based on colo-base in colo-compare... So, should we make colo-base be a independent patch set? Now, colo-base used by colo-compare and filter-rewriter. > > And I think we don't want to manually compare 100 kinds of filters in > the future. How about doing something better, e.g: > > - introduce something like filter_register_type() > - recored the name of the type in a list > - iterate it here > > ? > Maybe we need do this after colo-compare and filter-rewriter be merged. and make filter-dump and other filter all in this type. Thanks Zhang Chen >> return false; >> } > > > > . > -- Thanks zhangchen