All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Amos Kong <akong@redhat.com>
Cc: vyasevic@redhat.com, sf@sfritsch.de, qemu-devel@nongnu.org,
	lcapitulino@redhat.com
Subject: Re: [Qemu-devel] [PATCH v4 for 2.0] virtio-net: add vlan receive state to RxFilterInfo
Date: Wed, 26 Mar 2014 08:46:35 +0200	[thread overview]
Message-ID: <20140326064635.GB12840@redhat.com> (raw)
In-Reply-To: <1395793183-19894-1-git-send-email-akong@redhat.com>

On Wed, Mar 26, 2014 at 08:19:43AM +0800, Amos Kong wrote:
> Stefan Fritsch just fixed a virtio-net driver bug [1], virtio-net won't
> filter out VLAN-tagged packets if VIRTIO_NET_F_CTRL_VLAN isn't negotiated.

Yes but that fix is unfortunately wrong as it tests guest_features
on reset.
How about preparing a correct one?


> This patch added a new field to @RxFilterInfo to indicate vlan receive
> state ('normal', 'none', 'all'). If VIRTIO_NET_F_CTRL_VLAN isn't
> negotiated, vlan receive state will be 'all', then all VLAN-tagged packets
> will be received by guest.
> 
> This patch also fixed a boundary issue in visiting vlan table.
> 
> [1] http://lists.nongnu.org/archive/html/qemu-devel/2014-02/msg02604.html
> 
> Signed-off-by: Amos Kong <akong@redhat.com>
> ---
> V2: don't make vlan-table optional, add a flag to indicate
>     if vlan table is used by management
> V3: change the new filed to RxState (mst)
> V4: fix boundary of vlan mapping (eric)
> ---
>  hw/net/virtio-net.c | 42 +++++++++++++++++++++++++++++-------------
>  qapi-schema.json    |  3 +++
>  qmp-commands.hx     |  2 ++
>  3 files changed, 34 insertions(+), 13 deletions(-)
> 
> diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
> index fd23c46..43b4eda 100644
> --- a/hw/net/virtio-net.c
> +++ b/hw/net/virtio-net.c
> @@ -222,13 +222,33 @@ static char *mac_strdup_printf(const uint8_t *mac)
>                              mac[1], mac[2], mac[3], mac[4], mac[5]);
>  }
>  
> +static intList *get_vlan_table(VirtIONet *n)
> +{
> +    intList *list, *entry;
> +    int i, j;
> +
> +    list = NULL;
> +    for (i = 0; i < MAX_VLAN >> 5; i++) {
> +        for (j = 0; n->vlans[i] && j <= 0x1f; j++) {
> +            if (n->vlans[i] & (1U << j)) {
> +                entry = g_malloc0(sizeof(*entry));
> +                entry->value = (i << 5) + j;
> +                entry->next = list;
> +                list = entry;
> +            }
> +        }
> +    }
> +
> +    return list;
> +}
> +
>  static RxFilterInfo *virtio_net_query_rxfilter(NetClientState *nc)
>  {
>      VirtIONet *n = qemu_get_nic_opaque(nc);
> +    VirtIODevice *vdev = VIRTIO_DEVICE(n);
>      RxFilterInfo *info;
>      strList *str_list, *entry;
> -    intList *int_list, *int_entry;
> -    int i, j;
> +    int i;
>  
>      info = g_malloc0(sizeof(*info));
>      info->name = g_strdup(nc->name);
> @@ -273,19 +293,15 @@ static RxFilterInfo *virtio_net_query_rxfilter(NetClientState *nc)
>          str_list = entry;
>      }
>      info->multicast_table = str_list;
> +    info->vlan_table = get_vlan_table(n);
>  
> -    int_list = NULL;
> -    for (i = 0; i < MAX_VLAN >> 5; i++) {
> -        for (j = 0; n->vlans[i] && j < 0x1f; j++) {
> -            if (n->vlans[i] & (1U << j)) {
> -                int_entry = g_malloc0(sizeof(*int_entry));
> -                int_entry->value = (i << 5) + j;
> -                int_entry->next = int_list;
> -                int_list = int_entry;
> -            }
> -        }
> +    if (!((1 << VIRTIO_NET_F_CTRL_VLAN) & vdev->guest_features)) {
> +        info->vlan = RX_STATE_ALL;
> +    } else if (!info->vlan_table) {
> +        info->vlan = RX_STATE_NONE;
> +    } else {
> +        info->vlan = RX_STATE_NORMAL;
>      }

Generally I'm not sure why do we have NONE - for mac
and unicast too - we could send an empty list instead.

I'm fine with keeping it as is for now though.

> -    info->vlan_table = int_list;
>  
>      /* enable event notification after query */
>      nc->rxfilter_notify_enabled = 1;
> diff --git a/qapi-schema.json b/qapi-schema.json
> index b68cd44..391356f 100644
> --- a/qapi-schema.json
> +++ b/qapi-schema.json
> @@ -4184,6 +4184,8 @@
>  #
>  # @unicast: unicast receive state
>  #
> +# @vlan: vlan receive state (Since 2.0)
> +#
>  # @broadcast-allowed: whether to receive broadcast
>  #
>  # @multicast-overflow: multicast table is overflowed or not
> @@ -4207,6 +4209,7 @@
>      'promiscuous':        'bool',
>      'multicast':          'RxState',
>      'unicast':            'RxState',
> +    'vlan':               'RxState',
>      'broadcast-allowed':  'bool',
>      'multicast-overflow': 'bool',
>      'unicast-overflow':   'bool',
> diff --git a/qmp-commands.hx b/qmp-commands.hx
> index a22621f..ed3ab92 100644
> --- a/qmp-commands.hx
> +++ b/qmp-commands.hx
> @@ -3407,6 +3407,7 @@ Each array entry contains the following:
>  - "promiscuous": promiscuous mode is enabled (json-bool)
>  - "multicast": multicast receive state (one of 'normal', 'none', 'all')
>  - "unicast": unicast receive state  (one of 'normal', 'none', 'all')
> +- "vlan": vlan receive state (one of 'normal', 'none', 'all') (Since 2.0)
>  - "broadcast-allowed": allow to receive broadcast (json-bool)
>  - "multicast-overflow": multicast table is overflowed (json-bool)
>  - "unicast-overflow": unicast table is overflowed (json-bool)
> @@ -3424,6 +3425,7 @@ Example:
>              "name": "vnet0",
>              "main-mac": "52:54:00:12:34:56",
>              "unicast": "normal",
> +            "vlan": "normal",
>              "vlan-table": [
>                  4,
>                  0
> -- 
> 1.8.5.3

  parent reply	other threads:[~2014-03-26  6:46 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-03-26  0:19 [Qemu-devel] [PATCH v4 for 2.0] virtio-net: add vlan receive state to RxFilterInfo Amos Kong
2014-03-26  1:51 ` Eric Blake
2014-03-26  6:46 ` Michael S. Tsirkin [this message]
2014-03-26 10:36   ` Amos Kong

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=20140326064635.GB12840@redhat.com \
    --to=mst@redhat.com \
    --cc=akong@redhat.com \
    --cc=lcapitulino@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=sf@sfritsch.de \
    --cc=vyasevic@redhat.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.