On 02/18/2016 03:50 PM, Zhang Chen wrote: > > > On 02/18/2016 10:41 AM, Jason Wang wrote: >> >> On 02/05/2016 02:50 PM, Zhang Chen wrote: >>> From: ZhangChen <zhangchen.f...@cn.fujitsu.com> >>> >>> Filter-redirector is a netfilter plugin. >>> It gives qemu the ability to redirect net packet. >>> redirector can redirect filter's net packet to outdev. >>> and redirect indev's packet to filter. >>> >>> filter >>> + >>> | >>> | >>> redirector | >>> +-------------------------+ >>> | | | >>> | | | >>> | | | >>> indev +----------------+ +----------------> outdev >>> | | | >>> | | | >>> | | | >>> +-------------------------+ >>> | >>> | >>> v >>> filter > > v > > change it to filter ........ filter ...... guest > It's may more clearly expressed. > >>> usage: >>> >>> -netdev tap,id=hn0 >>> -chardev socket,id=s0,host=ip_primary,port=X,server,nowait >>> -chardev socket,id=s1,host=ip_primary,port=Y,server,nowait >>> -filter-redirector,id=r0,netdev=hn0,queue=tx/rx/all,indev=s0,outdev=s1 >>> >>> Signed-off-by: ZhangChen <zhangchen.f...@cn.fujitsu.com> >>> Signed-off-by: Wen Congyang <we...@cn.fujitsu.com> >>> --- >> Thanks a lot for the patch. Like mirror, let's design a unit-test for >> this. And what's more, is there any chance to unify the codes? (At least >> parts of the codes could be reused). > > We can make filter-redirector based on filter-mirror. > if you want to use redirector ,you must open mirror before. > like this: > > -netdev tap,id=hn0 > -chardev socket,id=mirror0,host=ip_primary,port=X,server,nowait > -filter-mirror,id=m0,netdev=hn0,queue=tx/rx/all,redirector=on,outdev=mirror0 > > -filter-redirector,id=r0,netdev=hn0,queue=tx/rx/all,indev=s0 > > How about this?
This looks like a burden for user who just want to use redirector. Maybe we can do : - Still two type of filters but sharing a single state. - Using a internal flag to differ mirrors from redirectors? > > >>> net/Makefile.objs | 1 + >>> net/filter-redirector.c | 245 >>> ++++++++++++++++++++++++++++++++++++++++++++++++ >>> qemu-options.hx | 6 ++ >>> vl.c | 3 +- >>> 4 files changed, 254 insertions(+), 1 deletion(-) >>> create mode 100644 net/filter-redirector.c >>> >>> diff --git a/net/Makefile.objs b/net/Makefile.objs >>> index 5fa2f97..f4290a5 100644 >>> --- a/net/Makefile.objs >>> +++ b/net/Makefile.objs >>> @@ -15,3 +15,4 @@ common-obj-$(CONFIG_VDE) += vde.o >>> common-obj-$(CONFIG_NETMAP) += netmap.o >>> common-obj-y += filter.o >>> common-obj-y += filter-buffer.o >>> +common-obj-y += filter-redirector.o >>> diff --git a/net/filter-redirector.c b/net/filter-redirector.c >>> new file mode 100644 >>> index 0000000..364e463 >>> --- /dev/null >>> +++ b/net/filter-redirector.c >>> @@ -0,0 +1,245 @@ >>> +/* >>> + * Copyright (c) 2016 HUAWEI TECHNOLOGIES CO., LTD. >>> + * Copyright (c) 2016 FUJITSU LIMITED >>> + * Copyright (c) 2016 Intel Corporation >>> + * >>> + * Author: Zhang Chen <zhangchen.f...@cn.fujitsu.com> >>> + * >>> + * 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/net.h" >>> +#include "qemu-common.h" >>> +#include "qapi/qmp/qerror.h" >>> +#include "qapi-visit.h" >>> +#include "qom/object.h" >>> +#include "qemu/main-loop.h" >>> +#include "qemu/error-report.h" >>> +#include "trace.h" >>> +#include "sysemu/char.h" >>> +#include "qemu/iov.h" >>> +#include "qemu/sockets.h" >>> + >>> +#define FILTER_REDIRECTOR(obj) \ >>> + OBJECT_CHECK(RedirectorState, (obj), TYPE_FILTER_REDIRECTOR) >>> + >>> +#define TYPE_FILTER_REDIRECTOR "filter-redirector" >>> +#define REDIRECT_HEADER_LEN sizeof(uint32_t) >>> + >>> +typedef struct RedirectorState { >>> + NetFilterState parent_obj; >>> + NetQueue *incoming_queue;/* guest normal net queue */ >> The comment looks unless and maybe even wrong when queue=rx? > > We design redirector that indev's data always be passed to guest finally. > so, It's no relation between the queue=rx/tx/all. just related to > indev = xxx. > we need incoming_queue to inject packet from indev. So what happens if queue=rx or you want to forbid queue=rx for redirector?