From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49760) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bJtxC-0000Ub-Hq for qemu-devel@nongnu.org; Sun, 03 Jul 2016 22:49:47 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bJtx7-00073O-7R for qemu-devel@nongnu.org; Sun, 03 Jul 2016 22:49:45 -0400 Received: from mx1.redhat.com ([209.132.183.28]:59368) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bJtx6-00072w-Ve for qemu-devel@nongnu.org; Sun, 03 Jul 2016 22:49:41 -0400 References: <1467440540-6630-1-git-send-email-zhangchen.fnst@cn.fujitsu.com> <1467440540-6630-2-git-send-email-zhangchen.fnst@cn.fujitsu.com> From: Jason Wang Message-ID: <5779CEB9.8020706@redhat.com> Date: Mon, 4 Jul 2016 10:49:29 +0800 MIME-Version: 1.0 In-Reply-To: <1467440540-6630-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 V2 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 Cc: Li Zhijian , Wen Congyang , zhanghailiang , "eddie . dong" , "Dr . David Alan Gilbert" On 2016=E5=B9=B407=E6=9C=8802=E6=97=A5 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=20 only rewrite ack now. > > 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 | 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 +=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..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 =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; > + 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 =3D 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 =3D FILTER_COLO_REWRITER(nf); > + > + g_queue_init(&s->conn_list); > + qemu_mutex_init(&s->conn_list_lock); > + 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..d7ab165 100644 > --- a/qemu-options.hx > +++ b/qemu-options.hx > @@ -3859,6 +3859,16 @@ 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 some of seco= ndary packet. Need to be more verbose here. > + > +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")) { So this makes the patch can't be applied cleanly on master. And I think we don't want to manually compare 100 kinds of filters in=20 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 ? > return false; > } > =20