[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH RFC 6/7] net/filter: Add a default filter to eac
From: |
Jason Wang |
Subject: |
Re: [Qemu-devel] [PATCH RFC 6/7] net/filter: Add a default filter to each netdev |
Date: |
Wed, 27 Jan 2016 11:29:43 +0800 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.5.1 |
On 01/25/2016 07:19 PM, Hailiang Zhang wrote:
> On 2016/1/25 15:22, 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 <address@hidden>
>>>> ---
>>>> 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)
>>>>
>>>> +#define DEFAULT_FILTER_NAME "nop"
>>>
>>> Maybe DEFAULT_FILTER_TYPE?
>>>
>>
>>>> +
>>>> +#define TYPE_FILTER_BUFFER "filter-buffer"
>>>> +#define TYPE_FILTER_DUMP "filter-dump"
>>>> +
>>>> +#define NETFILTER_ID_BUFFER 1
>>>> +#define NETFILTER_ID_DUMP 2
>>>> +
>>>> +extern const char *const netfilter_type_lookup[];
>>>> +
>>>> typedef void (FilterSetup) (NetFilterState *nf, Error **errp);
>>>> typedef void (FilterCleanup) (NetFilterState *nf);
>>>> /*
>>>> @@ -55,6 +65,7 @@ struct NetFilterState {
>>>> char *netdev_id;
>>>> NetClientState *netdev;
>>>> NetFilterDirection direction;
>>>> + bool is_default;
>>>> bool enabled;
>>>> QTAILQ_ENTRY(NetFilterState) next;
>>>> };
>>>> diff --git a/net/dump.c b/net/dump.c
>>>> index 88d9582..82727a6 100644
>>>> --- a/net/dump.c
>>>> +++ b/net/dump.c
>>>> @@ -229,8 +229,6 @@ int net_init_dump(const NetClientOptions *opts,
>>>> const char *name,
>>>>
>>>> /* Dumping via filter */
>>>>
>>>> -#define TYPE_FILTER_DUMP "filter-dump"
>>>> -
>>>> #define FILTER_DUMP(obj) \
>>>> OBJECT_CHECK(NetFilterDumpState, (obj), TYPE_FILTER_DUMP)
>>>>
>>>> diff --git a/net/filter.c b/net/filter.c
>>>> index 4d96301..a126a3b 100644
>>>> --- a/net/filter.c
>>>> +++ b/net/filter.c
>>>> @@ -21,6 +21,11 @@
>>>> #include "qapi/qmp-input-visitor.h"
>>>> #include "monitor/monitor.h"
>>>>
>>>> +const char *const netfilter_type_lookup[] = {
>>>> + [NETFILTER_ID_BUFFER] = TYPE_FILTER_BUFFER,
>>>> + [NETFILTER_ID_DUMP] = TYPE_FILTER_DUMP,
>>>> +};
>>>> +
>>>> ssize_t qemu_netfilter_receive(NetFilterState *nf,
>>>> NetFilterDirection direction,
>>>> NetClientState *sender,
>>>> @@ -200,7 +205,7 @@ static void netfilter_complete(UserCreatable
>>>> *uc, Error **errp)
>>>> NetFilterClass *nfc = NETFILTER_GET_CLASS(uc);
>>>> int queues;
>>>> Error *local_err = NULL;
>>>> -
>>>> + char *path = object_get_canonical_path_component(OBJECT(nf));
>>>>
>>>> if (!nf->netdev_id) {
>>>> error_setg(errp, "Parameter 'netdev' is required");
>>>> @@ -225,6 +230,14 @@ static void netfilter_complete(UserCreatable
>>>> *uc, Error **errp)
>>>> }
>>>>
>>>> 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 ?
>>
>
> I don't think it is necessary to add a 'default' property, because
> we don't want such a property to be controlled by user. It is
> only used internally.
If it was only used internally, then just not export the ability to
configure default filter and its properties to user.
> We have another choice to deal with this,
> Add a 'bool is_default' parameter for netdev_add_filter(),
> and handle the default filter in it, just like:
This does not scale consider if somebody want to add more common
properties to netfilters.
>
> void netdev_add_filter(const char *netdev_id,
> const char *filter_type,
> const char *id,
> bool is_default,
> Error **errp)
> {
> ... ...
> object_add(filter_type, id, qdict, iv, &err);
> .... ...
> if (is_default) {
> Object *obj, *container;
> NetFilterState *nf;
>
> container = object_get_objects_root();
> obj = object_resolve_path_component(container, id);
> if (!obj) {
> error_setg(errp, "object id not found");
> return;
> }
> nf = NETFILTER(obj);
> nf->is_default = true;
> nf->enabled = false;
> }
>
> }
>
> Is this acceptable ?
>
> Thanks,
> Hailiang
>
>>>>
>>>> if (nfc->setup) {
>>>> nfc->setup(nf, &local_err);
>>>> diff --git a/net/net.c b/net/net.c
>>>> index ec43105..9630234 100644
>>>> --- a/net/net.c
>>>> +++ b/net/net.c
>>>> @@ -76,6 +76,12 @@ const char *host_net_devices[] = {
>>>>
>>>> int default_net = 1;
>>>>
>>>> +/*
>>>> + * FIXME: Export this with an option for users to control
>>>> + * this with comand line ?
>>>
>>> This could be done in the future.
>>>
>>
>> Should i change the tag to 'TODO' ?
>>
>>>> + */
>>>> +int default_netfilter = NETFILTER_ID_BUFFER;
>>>
>>> Why not just use a string here?
>>>
>>
>> No special, i will convert it to use string here.
>>
>>>> +
>>>> /***********************************************************/
>>>> /* network device redirectors */
>>>>
>>>> @@ -1032,6 +1038,18 @@ static int net_client_init1(const void
>>>> *object, int is_netdev, Error **errp)
>>>> }
>>>> return -1;
>>>> }
>>>> +
>>>> + if (is_netdev) {
>>>> + const Netdev *netdev = object;
>>>> + /*
>>>> + * Here we add each netdev a default filter whose name is
>>>> 'nop',
>>>> + * it will disabled by default, Users can enable it when
>>>> necessary.
>>>> + */
>>>
>>> If we support default properties, the above comment could be removed.
>>>
>>>> + netdev_add_filter(netdev->id,
>>>> + netfilter_type_lookup[default_netfilter],
>>>> + DEFAULT_FILTER_NAME,
>>>
>>> I believe some logic to generate id automatically is needed here.
>>>
>>
>> Yes, you are right, here this patch will break QEMU with multi-NICs
>> configured,
>> the error report is " attempt to add duplicate property 'nop' to
>> object".
>> I will fix it in next version.
>>
>> Thanks,
>> Hailiang
>>
>>>> + errp);
>>>> + }
>>>> return 0;
>>>> }
>>>>
>>>
>>>
>>> .
>>>
>>
>
>
>
- Re: [Qemu-devel] [PATCH RFC 3/7] net/filter: Skip the disabled filter when delivering packets, (continued)
[Qemu-devel] [PATCH RFC 5/7] filter-buffer: Accept zero interval, zhanghailiang, 2016/01/22
[Qemu-devel] [PATCH RFC 6/7] net/filter: Add a default filter to each netdev, zhanghailiang, 2016/01/22
- Re: [Qemu-devel] [PATCH RFC 6/7] net/filter: Add a default filter to each netdev, Jason Wang, 2016/01/25
- Re: [Qemu-devel] [PATCH RFC 6/7] net/filter: Add a default filter to each netdev, Jason Wang, 2016/01/25
- Re: [Qemu-devel] [PATCH RFC 6/7] net/filter: Add a default filter to each netdev, Hailiang Zhang, 2016/01/25
- Re: [Qemu-devel] [PATCH RFC 6/7] net/filter: Add a default filter to each netdev, Hailiang Zhang, 2016/01/26
- Re: [Qemu-devel] [PATCH RFC 6/7] net/filter: Add a default filter to each netdev, Jason Wang, 2016/01/27
- Re: [Qemu-devel] [PATCH RFC 6/7] net/filter: Add a default filter to each netdev, Hailiang Zhang, 2016/01/27
Re: [Qemu-devel] [PATCH RFC 0/7] Netfilter: Add each netdev a default filter, Hailiang Zhang, 2016/01/22
Re: [Qemu-devel] [PATCH RFC 0/7] Netfilter: Add each netdev a default filter, Daniel P. Berrange, 2016/01/22