All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Zhang, Chen" <chen.zhang@intel.com>
To: Jason Wang <jasowang@redhat.com>
Cc: qemu-dev <qemu-devel@nongnu.org>,
	Li Zhijian <lizhijian@cn.fujitsu.com>,
	Markus Armbruster <armbru@redhat.com>
Subject: RE: [PATCH V4 1/3] net/filter: Remove vnet_hdr from filter-mirror and filter-redirector
Date: Wed, 27 Oct 2021 06:19:19 +0000	[thread overview]
Message-ID: <MWHPR11MB0031AA6B818E9BBE4B1D78589B859@MWHPR11MB0031.namprd11.prod.outlook.com> (raw)
In-Reply-To: <8948cdd0-7f4c-9b77-a02f-582b4fe96adf@redhat.com>



> -----Original Message-----
> From: Jason Wang <jasowang@redhat.com>
> Sent: Wednesday, October 27, 2021 12:46 PM
> To: Zhang, Chen <chen.zhang@intel.com>
> Cc: qemu-dev <qemu-devel@nongnu.org>; Markus Armbruster
> <armbru@redhat.com>; Li Zhijian <lizhijian@cn.fujitsu.com>
> Subject: Re: [PATCH V4 1/3] net/filter: Remove vnet_hdr from filter-mirror
> and filter-redirector
> 
> 
> 在 2021/10/27 上午2:17, Zhang Chen 写道:
> > Make the vnet header a necessary part of filter transfer protocol.
> > So remove the module's vnet_hdr_support switch here.
> > It make other modules(like another filter-redirector,colo-compare...)
> > know how to parse net packet correctly. If local device is not the
> > virtio-net-pci, vnet_hdr_len will be 0.
> >
> > Signed-off-by: Zhang Chen <chen.zhang@intel.com>
> > ---
> >   net/filter-mirror.c | 88 ++++++++++-----------------------------------
> >   qemu-options.hx     | 14 ++++----
> >   2 files changed, 25 insertions(+), 77 deletions(-)
> >
> > diff --git a/net/filter-mirror.c b/net/filter-mirror.c index
> > f20240cc9f..4f0e26cc92 100644
> > --- a/net/filter-mirror.c
> > +++ b/net/filter-mirror.c
> > @@ -39,7 +39,6 @@ struct MirrorState {
> >       CharBackend chr_in;
> >       CharBackend chr_out;
> >       SocketReadState rs;
> > -    bool vnet_hdr;
> >   };
> >
> >   static int filter_send(MirrorState *s, @@ -48,7 +47,7 @@ static int
> > filter_send(MirrorState *s,
> >   {
> >       NetFilterState *nf = NETFILTER(s);
> >       int ret = 0;
> > -    ssize_t size = 0;
> > +    ssize_t size = 0, vnet_hdr_len = 0;
> >       uint32_t len = 0;
> >       char *buf;
> >
> > @@ -63,21 +62,18 @@ static int filter_send(MirrorState *s,
> >           goto err;
> >       }
> >
> > -    if (s->vnet_hdr) {
> > -        /*
> > -         * If vnet_hdr = on, we send vnet header len to make other
> > -         * module(like colo-compare) know how to parse net
> > -         * packet correctly.
> > -         */
> > -        ssize_t vnet_hdr_len;
> > -
> > -        vnet_hdr_len = nf->netdev->vnet_hdr_len;
> > +    /*
> > +     * The vnet header is the necessary part of filter transfer protocol.
> > +     * It make other module(like colo-compare) know how to parse net
> > +     * packet correctly. If device is not the virtio-net-pci,
> > +     * vnet_hdr_len will be 0.
> > +     */
> > +    vnet_hdr_len = nf->netdev->vnet_hdr_len;
> >
> > -        len = htonl(vnet_hdr_len);
> > -        ret = qemu_chr_fe_write_all(&s->chr_out, (uint8_t *)&len,
> sizeof(len));
> > -        if (ret != sizeof(len)) {
> > -            goto err;
> > -        }
> > +    len = htonl(vnet_hdr_len);
> > +    ret = qemu_chr_fe_write_all(&s->chr_out, (uint8_t *)&len, sizeof(len));
> > +    if (ret != sizeof(len)) {
> > +        goto err;
> >       }
> >
> >       buf = g_malloc(size);
> > @@ -232,6 +228,12 @@ static void redirector_rs_finalize(SocketReadState
> *rs)
> >       MirrorState *s = container_of(rs, MirrorState, rs);
> >       NetFilterState *nf = NETFILTER(s);
> >
> > +    /* Check remote vnet_hdr */
> > +    if (rs->vnet_hdr_len != nf->netdev->vnet_hdr_len) {
> > +        error_report("filter redirector got a different packet vnet_hdr"
> > +        " from local, please check the -device configuration");
> > +    }
> > +
> >       redirector_to_filter(nf, rs->buf, rs->packet_len);
> >   }
> >
> > @@ -252,7 +254,7 @@ static void filter_redirector_setup(NetFilterState
> *nf, Error **errp)
> >           }
> >       }
> >
> > -    net_socket_rs_init(&s->rs, redirector_rs_finalize, s->vnet_hdr);
> > +    net_socket_rs_init(&s->rs, redirector_rs_finalize, true);
> >
> >       if (s->indev) {
> >           chr = qemu_chr_find(s->indev); @@ -323,20 +325,6 @@ static
> > void filter_mirror_set_outdev(Object *obj,
> >       }
> >   }
> >
> > -static bool filter_mirror_get_vnet_hdr(Object *obj, Error **errp) -{
> > -    MirrorState *s = FILTER_MIRROR(obj);
> > -
> > -    return s->vnet_hdr;
> > -}
> > -
> > -static void filter_mirror_set_vnet_hdr(Object *obj, bool value, Error
> > **errp) -{
> > -    MirrorState *s = FILTER_MIRROR(obj);
> > -
> > -    s->vnet_hdr = value;
> > -}
> > -
> >   static char *filter_redirector_get_outdev(Object *obj, Error **errp)
> >   {
> >       MirrorState *s = FILTER_REDIRECTOR(obj); @@ -354,31 +342,12 @@
> > static void filter_redirector_set_outdev(Object *obj,
> >       s->outdev = g_strdup(value);
> >   }
> >
> > -static bool filter_redirector_get_vnet_hdr(Object *obj, Error **errp)
> > -{
> > -    MirrorState *s = FILTER_REDIRECTOR(obj);
> > -
> > -    return s->vnet_hdr;
> > -}
> > -
> > -static void filter_redirector_set_vnet_hdr(Object *obj,
> > -                                           bool value,
> > -                                           Error **errp)
> > -{
> > -    MirrorState *s = FILTER_REDIRECTOR(obj);
> > -
> > -    s->vnet_hdr = value;
> > -}
> > -
> >   static void filter_mirror_class_init(ObjectClass *oc, void *data)
> >   {
> >       NetFilterClass *nfc = NETFILTER_CLASS(oc);
> >
> >       object_class_property_add_str(oc, "outdev", filter_mirror_get_outdev,
> >                                     filter_mirror_set_outdev);
> > -    object_class_property_add_bool(oc, "vnet_hdr_support",
> > -                                   filter_mirror_get_vnet_hdr,
> > -                                   filter_mirror_set_vnet_hdr);
> >
> >       nfc->setup = filter_mirror_setup;
> >       nfc->cleanup = filter_mirror_cleanup; @@ -393,29 +362,12 @@
> > static void filter_redirector_class_init(ObjectClass *oc, void *data)
> >                                     filter_redirector_set_indev);
> >       object_class_property_add_str(oc, "outdev",
> filter_redirector_get_outdev,
> >                                     filter_redirector_set_outdev);
> > -    object_class_property_add_bool(oc, "vnet_hdr_support",
> > -                                   filter_redirector_get_vnet_hdr,
> > -                                   filter_redirector_set_vnet_hdr);
> >
> >       nfc->setup = filter_redirector_setup;
> >       nfc->cleanup = filter_redirector_cleanup;
> >       nfc->receive_iov = filter_redirector_receive_iov;
> >   }
> >
> > -static void filter_mirror_init(Object *obj) -{
> > -    MirrorState *s = FILTER_MIRROR(obj);
> > -
> > -    s->vnet_hdr = false;
> > -}
> > -
> > -static void filter_redirector_init(Object *obj) -{
> > -    MirrorState *s = FILTER_REDIRECTOR(obj);
> > -
> > -    s->vnet_hdr = false;
> > -}
> > -
> >   static void filter_mirror_fini(Object *obj)
> >   {
> >       MirrorState *s = FILTER_MIRROR(obj); @@ -435,7 +387,6 @@ static
> > const TypeInfo filter_redirector_info = {
> >       .name = TYPE_FILTER_REDIRECTOR,
> >       .parent = TYPE_NETFILTER,
> >       .class_init = filter_redirector_class_init,
> > -    .instance_init = filter_redirector_init,
> >       .instance_finalize = filter_redirector_fini,
> >       .instance_size = sizeof(MirrorState),
> >   };
> > @@ -444,7 +395,6 @@ static const TypeInfo filter_mirror_info = {
> >       .name = TYPE_FILTER_MIRROR,
> >       .parent = TYPE_NETFILTER,
> >       .class_init = filter_mirror_class_init,
> > -    .instance_init = filter_mirror_init,
> >       .instance_finalize = filter_mirror_fini,
> >       .instance_size = sizeof(MirrorState),
> >   };
> > diff --git a/qemu-options.hx b/qemu-options.hx index
> > 5f375bbfa6..38c03812a7 100644
> > --- a/qemu-options.hx
> > +++ b/qemu-options.hx
> > @@ -4946,18 +4946,16 @@ SRST
> >
> >           ``behind``: insert behind the specified filter (default).
> >
> > -    ``-object filter-
> mirror,id=id,netdev=netdevid,outdev=chardevid,queue=all|rx|tx[,vnet_hdr
> _support][,position=head|tail|id=<id>][,insert=behind|before]``
> > +    ``-object
> > + filter-mirror,id=id,netdev=netdevid,outdev=chardevid,queue=all|rx|tx
> > + [,position=head|tail|id=<id>][,insert=behind|before]``
> 
> 
> I wonder if we break management layer. If yes, maybe it's better to keep the
> vnet_hdr_support here.

Yes and no,   With this series of patches, filters have ability to automatically
Configure the appropriate vnet_hdr_support flag according to the current environment.
And can report error when can't fixing the vnet_hdr(The user cannot fix it from the previous way ).
So I think no need for the user to configure this option, some relevant background knowledge required.

For the management layer, keep the vnet_hdr_support may be meaningless except for compatibility.
In this situation, Do you think we still need to keep the vnet_hdr_support for management layer?
Enable/disable it do the same things for filters.

Thanks
Chen

> 
> Thanks
> 
> 
> >           filter-mirror on netdev netdevid,mirror net packet to
> > -        chardevchardevid, if it has the vnet\_hdr\_support flag,
> > -        filter-mirror will mirror packet with vnet\_hdr\_len.
> > +        chardev chardevid, filter-mirror will mirror packet with
> vnet\_hdr\_len.
> >
> > -    ``-object filter-
> redirector,id=id,netdev=netdevid,indev=chardevid,outdev=chardevid,queu
> e=all|rx|tx[,vnet_hdr_support][,position=head|tail|id=<id>][,insert=behind
> |before]``
> > +    ``-object
> > + filter-redirector,id=id,netdev=netdevid,indev=chardevid,outdev=chard
> > + evid,queue=all|rx|tx[,position=head|tail|id=<id>][,insert=behind|bef
> > + ore]``
> >           filter-redirector on netdev netdevid,redirect filter's net
> >           packet to chardev chardevid,and redirect indev's packet to
> > -        filter.if it has the vnet\_hdr\_support flag, filter-redirector
> > -        will redirect packet with vnet\_hdr\_len. 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
> > +        filter. filter-redirector will redirect packet with vnet\_hdr\_len.
> > +        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.
> >
> >       ``-object
> > filter-rewriter,id=id,netdev=netdevid,queue=all|rx|tx,[vnet_hdr_suppor
> > t][,position=head|tail|id=<id>][,insert=behind|before]``



  reply	other threads:[~2021-10-27  6:21 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-10-26 18:17 [PATCH V4 0/3] net/filter: Optimize filters vnet_hdr support Zhang Chen
2021-10-26 18:17 ` [PATCH V4 1/3] net/filter: Remove vnet_hdr from filter-mirror and filter-redirector Zhang Chen
2021-10-27  4:45   ` Jason Wang
2021-10-27  6:19     ` Zhang, Chen [this message]
2021-10-27  6:24       ` Jason Wang
2021-10-27  6:40         ` Zhang, Chen
2021-10-27  6:45           ` Jason Wang
2021-10-27  6:50             ` Zhang, Chen
2021-10-27  7:19             ` Markus Armbruster
2021-10-26 18:17 ` [PATCH V4 2/3] net/filter: Remove vnet_hdr from filter-rewriter Zhang Chen
2021-10-26 18:17 ` [PATCH V4 3/3] net/colo-compare.c: Remove vnet_hdr and check in payload from colo-compare Zhang Chen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=MWHPR11MB0031AA6B818E9BBE4B1D78589B859@MWHPR11MB0031.namprd11.prod.outlook.com \
    --to=chen.zhang@intel.com \
    --cc=armbru@redhat.com \
    --cc=jasowang@redhat.com \
    --cc=lizhijian@cn.fujitsu.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.