From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49652) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bSJXr-0007NT-HW for qemu-devel@nongnu.org; Wed, 27 Jul 2016 03:46:24 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bSJXn-00016Y-94 for qemu-devel@nongnu.org; Wed, 27 Jul 2016 03:46:22 -0400 Received: from [59.151.112.132] (port=31709 helo=heian.cn.fujitsu.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bSJXl-00015N-Kw for qemu-devel@nongnu.org; Wed, 27 Jul 2016 03:46:19 -0400 References: <1467714580-17581-1-git-send-email-zhangchen.fnst@cn.fujitsu.com> <1467714580-17581-2-git-send-email-zhangchen.fnst@cn.fujitsu.com> From: Zhang Chen Message-ID: <032d85d2-5fa5-f709-81e4-6c6b4022f1bc@cn.fujitsu.com> Date: Wed, 27 Jul 2016 15:45:49 +0800 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 8bit Subject: Re: [Qemu-devel] [RFC PATCH V3 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 , "eddie . dong" On 07/27/2016 03:02 PM, Jason Wang wrote: > > > On 2016年07月05日 18:29, Zhang Chen wrote: >> Filter-rewriter is a part of COLO project. >> It will rewrite some of secondary packet to make >> secondary guest's tcp connection established successfully. >> In this module we will rewrite tcp packet's ack to the secondary >> from primary,and rewrite tcp packet's seq to the primary from >> secondary. >> >> 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 | 108 >> ++++++++++++++++++++++++++++++++++++++++++++++++++ >> qemu-options.hx | 13 ++++++ >> vl.c | 3 +- >> 4 files changed, 124 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..c4f2739 >> --- /dev/null >> +++ b/net/filter-rewriter.c >> @@ -0,0 +1,108 @@ >> +/* >> + * 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; > > The connection were either in conntection_track_table or > unprocessed_connections, why still need this list? I will remove it in next version,filter-rewriter needn't flush packet before checkpoint. > >> + NetQueue *incoming_queue; >> + /* hashtable to save connection */ >> + GHashTable *connection_track_table; >> + /* to save unprocessed_connections */ >> + GQueue unprocessed_connections; > > Unused in this series. Yes,I will remove it. Thanks Zhang Chen > >> + /* 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); >> + >> + 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); >> + 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..4afd511 100644 >> --- a/qemu-options.hx >> +++ b/qemu-options.hx >> @@ -3859,6 +3859,19 @@ 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 tcp packet to >> +secondary from primary to keep secondary tcp connection,and rewrite >> +tcp packet to primary from secondary make tcp packet can be handled by >> +client. >> + >> +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")) { >> return false; >> } > > > > . > -- Thanks zhangchen