From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:37953) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bSIrg-0007og-2p for qemu-devel@nongnu.org; Wed, 27 Jul 2016 03:02:49 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bSIrb-000651-RF for qemu-devel@nongnu.org; Wed, 27 Jul 2016 03:02:46 -0400 Received: from mx1.redhat.com ([209.132.183.28]:43368) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bSIrb-00064x-IC for qemu-devel@nongnu.org; Wed, 27 Jul 2016 03:02:43 -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: Jason Wang Message-ID: Date: Wed, 27 Jul 2016 15:02:35 +0800 MIME-Version: 1.0 In-Reply-To: <1467714580-17581-2-git-send-email-zhangchen.fnst@cn.fujitsu.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: quoted-printable 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: Zhang Chen , qemu devel , "Daniel P . Berrange" , Paolo Bonzini Cc: Li Zhijian , Wen Congyang , "eddie . dong" On 2016=E5=B9=B407=E6=9C=8805=E6=97=A5 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=3Df1,netdev=3Dhn0,queue=3Dtx,indev=3Dred0 > -object filter-redirector,id=3Df2,netdev=3Dhn0,queue=3Drx,outdev=3Dred1 > -object filter-rewriter,id=3Drew0,netdev=3Dhn0,queue=3Dall > > 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 +=3D filter-buffer.o > common-obj-y +=3D filter-mirror.o > common-obj-y +=3D colo-compare.o > common-obj-y +=3D colo-base.o > +common-obj-y +=3D 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 =3D 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=20 unprocessed_connections, why still need this list? > + NetQueue *incoming_queue; > + /* hashtable to save connection */ > + GHashTable *connection_track_table; > + /* to save unprocessed_connections */ > + GQueue unprocessed_connections; Unused in this series. > + /* 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 =3D FILTER_COLO_REWRITER(nf); > + > + g_queue_free(&s->conn_list); > +} > + > +static void colo_rewriter_setup(NetFilterState *nf, Error **errp) > +{ > + RewriterState *s =3D FILTER_COLO_REWRITER(nf); > + > + g_queue_init(&s->conn_list); > + s->hashtable_size =3D 0; > + > + s->connection_track_table =3D g_hash_table_new_full(connection_key= _hash, > + connection_key_e= qual, > + g_free, > + connection_destr= oy); > + s->incoming_queue =3D qemu_new_net_queue(qemu_netfilter_pass_to_ne= xt, nf); > +} > + > +static void colo_rewriter_class_init(ObjectClass *oc, void *data) > +{ > + NetFilterClass *nfc =3D NETFILTER_CLASS(oc); > + > + nfc->setup =3D colo_rewriter_setup; > + nfc->cleanup =3D colo_rewriter_cleanup; > + nfc->receive_iov =3D colo_rewriter_receive_iov; > +} > + > +static const TypeInfo colo_rewriter_info =3D { > + .name =3D TYPE_FILTER_REWRITER, > + .parent =3D TYPE_NETFILTER, > + .class_init =3D colo_rewriter_class_init, > + .instance_size =3D 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 out= dev id from indev id, id can not > be the same. we can just use indev or outdev, but at least one of ind= ev or outdev > need to be specified. > =20 > +@item -object filter-rewriter,id=3D@var{id},netdev=3D@var{netdevid},re= writer-mode=3D@var{mode}[,queue=3D@var{all|rx|tx}] > + > +Filter-rewriter is a part of COLO project.It will rewrite tcp packet t= o > +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=3Df1,netdev=3Dhn0,queue=3Dtx,indev=3Dred0 > +-object filter-redirector,id=3Df2,netdev=3Dhn0,queue=3Drx,outdev=3Dred= 1 > +-object filter-rewriter,id=3Drew0,netdev=3Dhn0,queue=3Dall > + > @item -object filter-dump,id=3D@var{id},netdev=3D@var{dev},file=3D@va= r{filename}][,maxlen=3D@var{len}] > =20 > 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 *typ= e) > 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; > } > =20