qemu-devel.nongnu.org archive mirror
 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, Yang Hongyang <hongyang.yang@easystack.cn>
Subject: Re: [Qemu-devel] [PATCH] filter/fiter-buffer: Add a 'status' property for filter object
Date: Fri, 26 Feb 2016 15:21:38 +0800	[thread overview]
Message-ID: <56CFFD02.3080604@huawei.com> (raw)
In-Reply-To: <56CFF58B.2050702@redhat.com>

On 2016/2/26 14:49, Jason Wang wrote:
>
>
> On 02/25/2016 12:05 PM, zhanghailiang wrote:
>> With this property, users can control if this filter is 'enable'
>> or 'disable'. The default behavior for filter is enabled.
>>
>> For buffer filter, we need to release all the buffered packets
>> while disabled it. Here we use the 'disable' callback of NetFilterClass
>> to realize this capability. We register it with filter_buffer_flush().
>> The other types of filters can realize their own 'disable' callback.
>>
>> We will skip the disabled filter when delivering packets in net layer.
>>
>> Signed-off-by: zhanghailiang <zhang.zhanghailiang@huawei.com>
>> Cc: Jason Wang <jasowang@redhat.com>
>> Cc: Yang Hongyang <hongyang.yang@easystack.cn>
>> ---
>> This is picked from COLO series, which is to realize the new 'status'
>> property for filter.
>
> Looks good overall, just few nits. And let's split this into two patches.
>

OK, and how to do the split ?
One patch to add the 'status' property and notifier for filter, and another to
realize the status changing callback for buffer filter ?

>> ---
>>   include/net/filter.h |  4 ++++
>>   net/filter-buffer.c  |  1 +
>>   net/filter.c         | 44 ++++++++++++++++++++++++++++++++++++++++++++
>>   qemu-options.hx      |  4 +++-
>>   4 files changed, 52 insertions(+), 1 deletion(-)
>>
>> diff --git a/include/net/filter.h b/include/net/filter.h
>> index 5639976..bd27074 100644
>> --- a/include/net/filter.h
>> +++ b/include/net/filter.h
>> @@ -36,12 +36,15 @@ typedef ssize_t (FilterReceiveIOV)(NetFilterState *nc,
>>                                      int iovcnt,
>>                                      NetPacketSent *sent_cb);
>>
>> +typedef void (FilterDisable) (NetFilterState *nf);
>
> Let's rename this to 'FilterStatusChanged' to be aligned with link status.
>

OK.

>> +
>>   typedef struct NetFilterClass {
>>       ObjectClass parent_class;
>>
>>       /* optional */
>>       FilterSetup *setup;
>>       FilterCleanup *cleanup;
>> +    FilterDisable *disable;
>
> So we can use 'status_changed' instead of 'disable' here.
>

>>       /* mandatory */
>>       FilterReceiveIOV *receive_iov;
>>   } NetFilterClass;
>> @@ -55,6 +58,7 @@ struct NetFilterState {
>>       char *netdev_id;
>>       NetClientState *netdev;
>>       NetFilterDirection direction;
>> +    bool enabled;
>
> 'status' is much better.
>

What's the type of 'status' ? 'char *' ?

>>       QTAILQ_ENTRY(NetFilterState) next;
>>   };
>>
>> diff --git a/net/filter-buffer.c b/net/filter-buffer.c
>> index 12ad2e3..b1464c9 100644
>> --- a/net/filter-buffer.c
>> +++ b/net/filter-buffer.c
>> @@ -131,6 +131,7 @@ static void filter_buffer_class_init(ObjectClass *oc, void *data)
>>       nfc->setup = filter_buffer_setup;
>>       nfc->cleanup = filter_buffer_cleanup;
>>       nfc->receive_iov = filter_buffer_receive_iov;
>> +    nfc->disable = filter_buffer_flush;
>
> I believe we should start and stop the timer during status changed.
>

Yes, you are right, it is needed.

>>   }
>>
>>   static void filter_buffer_get_interval(Object *obj, Visitor *v,
>> diff --git a/net/filter.c b/net/filter.c
>> index d2a514e..edd18c4 100644
>> --- a/net/filter.c
>> +++ b/net/filter.c
>> @@ -17,6 +17,11 @@
>>   #include "qom/object_interfaces.h"
>>   #include "qemu/iov.h"
>>
>> +static inline bool qemu_can_skip_netfilter(NetFilterState *nf)
>> +{
>> +    return nf->enabled ? false : true;
>> +}
>> +
>>   ssize_t qemu_netfilter_receive(NetFilterState *nf,
>>                                  NetFilterDirection direction,
>>                                  NetClientState *sender,
>> @@ -25,6 +30,9 @@ ssize_t qemu_netfilter_receive(NetFilterState *nf,
>>                                  int iovcnt,
>>                                  NetPacketSent *sent_cb)
>>   {
>> +    if (qemu_can_skip_netfilter(nf)) {
>> +        return 0;
>> +    }
>>       if (nf->direction == direction ||
>>           nf->direction == NET_FILTER_DIRECTION_ALL) {
>>           return NETFILTER_GET_CLASS(OBJECT(nf))->receive_iov(
>> @@ -134,8 +142,41 @@ static void netfilter_set_direction(Object *obj, int direction, Error **errp)
>>       nf->direction = direction;
>>   }
>>
>> +static char *netfilter_get_status(Object *obj, Error **errp)
>> +{
>> +    NetFilterState *nf = NETFILTER(obj);
>> +
>> +    if (nf->enabled) {
>> +        return g_strdup("enable");
>
> Let's use "on" and "off" here.
>

OK.

>> +    } else {
>> +        return g_strdup("disable");
>> +    }
>> +}
>> +
>> +static void netfilter_set_status(Object *obj, const char *str, Error **errp)
>> +{
>> +    NetFilterState *nf = NETFILTER(obj);
>> +    NetFilterClass *nfc = NETFILTER_GET_CLASS(obj);
>> +
>> +    if (!strcmp(str, "enable")) {
>> +        nf->enabled = true;
>
> We'd better also call status changed here, in case the filter (e.g
> future implementation) need some setup.
>

I will fix it. Thanks.

>> +    } else if (!strcmp(str, "disable")) {
>> +        nf->enabled = false;
>> +        if (nfc->disable) {
>> +            nfc->disable(nf);
>> +        }
>> +    } else {
>> +        error_setg(errp, "Invalid value for netfilter status, "
>> +                         "should be 'enable' or 'disable'");
>> +    }
>> +}
>> +
>>   static void netfilter_init(Object *obj)
>>   {
>> +    NetFilterState *nf = NETFILTER(obj);
>> +
>> +    nf->enabled = true;
>> +
>>       object_property_add_str(obj, "netdev",
>>                               netfilter_get_netdev_id, netfilter_set_netdev_id,
>>                               NULL);
>> @@ -143,6 +184,9 @@ static void netfilter_init(Object *obj)
>>                                NetFilterDirection_lookup,
>>                                netfilter_get_direction, netfilter_set_direction,
>>                                NULL);
>> +    object_property_add_str(obj, "status",
>> +                            netfilter_get_status, netfilter_set_status,
>> +                            NULL);
>>   }
>>
>>   static void netfilter_complete(UserCreatable *uc, Error **errp)
>> diff --git a/qemu-options.hx b/qemu-options.hx
>> index f528405..15b8e48 100644
>> --- a/qemu-options.hx
>> +++ b/qemu-options.hx
>> @@ -3746,11 +3746,13 @@ version by providing the @var{passwordid} parameter. This provides
>>   the ID of a previously created @code{secret} object containing the
>>   password for decryption.
>>
>> -@item -object filter-buffer,id=@var{id},netdev=@var{netdevid},interval=@var{t}[,queue=@var{all|rx|tx}]
>> +@item -object filter-buffer,id=@var{id},netdev=@var{netdevid},interval=@var{t}[,queue=@var{all|rx|tx}][,status=@var{enable|disable}]
>>
>>   Interval @var{t} can't be 0, this filter batches the packet delivery: all
>>   packets arriving in a given interval on netdev @var{netdevid} are delayed
>>   until the end of the interval. Interval is in microseconds.
>> +@option{status} is optional that indicate whether the netfilter is enabled
>> +or disabled, the default status for netfilter will be enabled.
>>
>>   queue @var{all|rx|tx} is an option that can be applied to any netfilter.
>>
>
>
> .
>

      reply	other threads:[~2016-02-26  7:22 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-02-25  4:05 [Qemu-devel] [PATCH] filter/fiter-buffer: Add a 'status' property for filter object zhanghailiang
2016-02-26  6:49 ` Jason Wang
2016-02-26  7:21   ` Hailiang Zhang [this message]

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=56CFFD02.3080604@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 \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).