All of lore.kernel.org
 help / color / mirror / Atom feed
From: Hailiang Zhang <zhang.zhanghailiang@huawei.com>
To: Jason Wang <jasowang@redhat.com>, qemu-devel@nongnu.org
Cc: peter.huangpeng@huawei.com, zhangchen.fnst@cn.fujitsu.com,
	hongyang.yang@easystack.cn
Subject: Re: [Qemu-devel] [PATCH RFC 6/7] net/filter: Add a default filter to each netdev
Date: Wed, 27 Jan 2016 14:41:47 +0800	[thread overview]
Message-ID: <56A866AB.1080205@huawei.com> (raw)
In-Reply-To: <56A85CB7.1020400@redhat.com>

On 2016/1/27 13:59, Jason Wang wrote:
>
>
> On 01/27/2016 08:37 AM, Hailiang Zhang wrote:
>> On 2016/1/26 11:18, Jason Wang wrote:
>>>
>>>
>>> On 01/25/2016 03:22 PM, Hailiang Zhang wrote:
>>>> On 2016/1/25 13:18, Jason Wang wrote:
>>>>>
>>>>>
>>>>> On 01/22/2016 04:36 PM, zhanghailiang wrote:
>>>>>> We add each netdev a default buffer filter, which the name is
>>>>>> 'nop', and the default buffer filter is disabled, so it has
>>>>>> no side effect for packets delivering in qemu net layer.
>>>>>>
>>>>>> The default buffer filter can be used by COLO or Micro-checkpoint,
>>>>>> The reason we add the default filter is we hope to support
>>>>>> hot add network during COLO state in future.
>>>>>>
>>>>>> Signed-off-by: zhanghailiang <zhang.zhanghailiang@huawei.com>
>>>>>> ---
>>>>>>     include/net/filter.h | 11 +++++++++++
>>>>>>     net/dump.c           |  2 --
>>>>>>     net/filter.c         | 15 ++++++++++++++-
>>>>>>     net/net.c            | 18 ++++++++++++++++++
>>>>>>     4 files changed, 43 insertions(+), 3 deletions(-)
>>>>>>
>>>>>> diff --git a/include/net/filter.h b/include/net/filter.h
>>>>>> index c7bd8f9..2043609 100644
>>>>>> --- a/include/net/filter.h
>>>>>> +++ b/include/net/filter.h
>>>>>> @@ -22,6 +22,16 @@
>>>>>>     #define NETFILTER_CLASS(klass) \
>>>>>>         OBJECT_CLASS_CHECK(NetFilterClass, (klass), TYPE_NETFILTER)
>>>>>>
>>>
>>> [...]
>>>
>>>>>>
>>>>>>         nf->netdev = ncs[0];
>>>>>> +    nf->is_default = !strcmp(path, DEFAULT_FILTER_NAME);
>>>>>> +    /*
>>>>>> +    * For the default buffer filter, it will be disabled by default,
>>>>>> +    * So it will not buffer any packets.
>>>>>> +    */
>>>>>> +    if (nf->is_default) {
>>>>>> +        nf->enabled = false;
>>>>>> +    }
>>>>>
>>>>> This seems not very elegant. Besides DEFAULT_FILTER_NAME(TYPE), we may
>>>>> also want a DEFAULT_FILTER_PROPERTIES? Then you can store the "status"
>>>>> into properties.
>>>>>
>>>>
>>>> A little confused, do you mean add a 'default' property for filter ?
>>>> Just like the new 'status' property which is exported to users ?
>>>> Is the type of 'default' property string or bool ?
>>>
>>> For example, is it possible to store the default property into a string
>>> and just create the filter through qemu_opts_parse_noisily() by just
>>
>> We still need to use some *visit* helpers to realize the capability,
>> because the object_add() helper need a 'Visitor *v' parameter, and the
>> codes
>> will be like:
>> QemuOptsList qemu_filter_opts = {
>>      .name = "default-filter",
>>      .head = QTAILQ_HEAD_INITIALIZER(qemu_filter_opts.head),
>>      .desc = {
>>          {
>>              .name = "netdev",
>>              .type = QEMU_OPT_STRING,
>>          },{
>>              .name = "status",
>>              .type = QEMU_OPT_STRING,
>>          },
>>          { /* end of list */ }
>>      },
>> };
>> void netdev_add_filter(const char *netdev_id,
>>                         const char *filter_type,
>>                         const char *id,
>>                         bool is_default,
>>                         Error **errp)
>> {
>>     sprintf(optarg, "netdev=%s,status=%s", netdev_id,
>>                      is_default ? "disable" : "enable");
>>      opts = qemu_opts_parse_noisily(&qemu_filter_opts,
>>                                     optarg, false);
>>      if (!opts) {
>>          error_report("Failed to parse param '%s'", optarg);
>>          exit(1);
>>      }
>>
>>      qdict = qemu_opts_to_qdict(opts, NULL);
>>      ov = opts_visitor_new(opts);
>>      visit_start_struct(opts_get_visitor(ov), &dummy, NULL, NULL, 0,
>> &err);
>>      if (err) {
>>          goto out_clean;
>>      }
>>      object_add(filter_type, id, qdict, opts_get_visitor(ov), &err);
>>      if (err) {
>>          goto out_clean;
>>      }
>>
>>      visit_end_struct(opts_get_visitor(ov), &err);
>>      if (err) {
>>          qmp_object_del(id, NULL);
>>          goto out_clean;
>>      }
>>
>> }
>>
>> Or, we can simplify patch 4 by using qmp_object_add(), codes will be
>> like:
>>
>> void netdev_add_filter(const char *netdev_id,
>>                         const char *filter_type,
>>                         const char *id,
>>                         bool is_default,
>>                         Error **errp)
>> {
>>      ... ...
>>
>>      qov = qmp_output_visitor_new();
>>      ov = qmp_output_get_visitor(qov);
>>      visit_start_struct(ov,  &dummy, NULL, NULL, 0, &err);
>>      if (err) {
>>          goto out;
>>      }
>>      visit_type_str(ov, &nc->name, "netdev", &err);
>>      if (err) {
>>          goto out;
>>      }
>>      status = is_default ? g_strdup("disable") : g_strdup("enable");
>>      visit_type_str(ov, &status, "status", &err);
>>      g_free(status);
>>      if (err) {
>>          goto out;
>>      }
>>      visit_end_struct(ov, &err);
>>      if (err) {
>>          goto out;
>>      }
>>      obj = qmp_output_get_qobject(qov);
>>      g_assert(obj != NULL);
>>      qmp_object_add(filter_type, id, true, obj, &err);
>>      qmp_output_visitor_cleanup(qov);
>>      qobject_decref(obj);
>>
>> }
>>
>> what's your suggestion ? :)
>>
>
> Can we just reuse object_create()? here
>

Yes, the codes is more clean if we reuse it.
I will fix it like that in v2, thanks.

>> Thanks,
>> Hailiang
>
>
> .
>

  reply	other threads:[~2016-01-27  6:42 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-01-22  8:36 [Qemu-devel] [PATCH RFC 0/7] Netfilter: Add each netdev a default filter zhanghailiang
2016-01-22  8:36 ` [Qemu-devel] [PATCH RFC 1/7] net/filter: Fix the output information for command 'info network' zhanghailiang
2016-01-25  5:01   ` Jason Wang
2016-01-25  5:58     ` Hailiang Zhang
2016-01-26  3:05       ` Jason Wang
2016-01-26  3:34         ` Hailiang Zhang
2016-01-22  8:36 ` [Qemu-devel] [PATCH RFC 2/7] net/filter: Add a 'status' property for filter object zhanghailiang
2016-01-25  5:05   ` Jason Wang
2016-01-25  6:00     ` Hailiang Zhang
2016-01-22  8:36 ` [Qemu-devel] [PATCH RFC 3/7] net/filter: Skip the disabled filter when delivering packets zhanghailiang
2016-01-22  9:32   ` Wen Congyang
2016-01-25  5:04     ` Jason Wang
2016-01-25  5:59       ` Hailiang Zhang
2016-01-22  8:36 ` [Qemu-devel] [PATCH RFC 4/7] net/filter: Introduce a helper to add a filter to the netdev zhanghailiang
2016-01-25  5:20   ` Jason Wang
2016-01-25  7:42     ` Hailiang Zhang
2016-01-22  8:36 ` [Qemu-devel] [PATCH RFC 5/7] filter-buffer: Accept zero interval zhanghailiang
2016-01-25  5:19   ` Jason Wang
2016-01-25  7:41     ` Hailiang Zhang
2016-01-22  8:36 ` [Qemu-devel] [PATCH RFC 6/7] net/filter: Add a default filter to each netdev zhanghailiang
2016-01-25  5:18   ` Jason Wang
2016-01-25  7:22     ` Hailiang Zhang
2016-01-25 11:19       ` Hailiang Zhang
2016-01-27  3:29         ` Jason Wang
2016-01-26  3:18       ` Jason Wang
2016-01-26  3:39         ` Hailiang Zhang
2016-01-27  0:37         ` Hailiang Zhang
2016-01-27  5:59           ` Jason Wang
2016-01-27  6:41             ` Hailiang Zhang [this message]
2016-01-22  8:36 ` [Qemu-devel] [PATCH RFC 7/7] net/filter: prevent the default filter to be deleted zhanghailiang
2016-01-25  5:25   ` Jason Wang
2016-01-25  7:43     ` Hailiang Zhang
2016-01-22  8:53 ` [Qemu-devel] [PATCH RFC 0/7] Netfilter: Add each netdev a default filter Hailiang Zhang
2016-01-22 10:07 ` Daniel P. Berrange
2016-01-22 10:35   ` Hailiang Zhang
2016-01-22 10:38     ` Daniel P. Berrange
2016-01-25  1:59       ` Hailiang Zhang
2016-01-25  5:24         ` Hailiang Zhang
2016-01-25  3:32   ` Jason Wang
2016-01-25  5:49     ` Hailiang Zhang

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=56A866AB.1080205@huawei.com \
    --to=zhang.zhanghailiang@huawei.com \
    --cc=hongyang.yang@easystack.cn \
    --cc=jasowang@redhat.com \
    --cc=peter.huangpeng@huawei.com \
    --cc=qemu-devel@nongnu.org \
    --cc=zhangchen.fnst@cn.fujitsu.com \
    /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.