[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [V4 PATCH 4/5] virtio-net: notify guest to annouce itse
From: |
Michael S. Tsirkin |
Subject: |
Re: [Qemu-devel] [V4 PATCH 4/5] virtio-net: notify guest to annouce itself |
Date: |
Tue, 13 Mar 2012 16:18:34 +0200 |
User-agent: |
Mutt/1.5.21 (2010-09-15) |
On Tue, Mar 13, 2012 at 04:56:40PM +0800, Jason Wang wrote:
> It's hard to track all mac addresses and their usage (vlan, bondings,
> ipv6) in qemu to send proper gratuitous packet. The better choice is
> to let guest to send them.
>
> So, this patch introduces a new rw config status bit of virtio-net,
> VIRTIO_NET_S_ANNOUNCE which is used to notify guest to announce
> presence of its link through config update interrupt. When gust have
> done the announcement, it should clear that bit. The feature is negotiated by
> a new feature bit VIRTIO_NET_F_ANNOUNCE.
>
> Signed-off-by: Jason Wang <address@hidden>
> ---
> hw/virtio-net.c | 19 ++++++++++++++++++-
> hw/virtio-net.h | 3 +++
> 2 files changed, 21 insertions(+), 1 deletions(-)
>
> diff --git a/hw/virtio-net.c b/hw/virtio-net.c
> index bc5e3a8..a591a48 100644
> --- a/hw/virtio-net.c
> +++ b/hw/virtio-net.c
> @@ -95,6 +95,8 @@ static void virtio_net_set_config(VirtIODevice *vdev, const
> uint8_t *config)
> memcpy(n->mac, netcfg.mac, ETH_ALEN);
> qemu_format_nic_info_str(&n->nic->nc, n->mac);
> }
> +
> + memcpy(&n->status, &netcfg.status, sizeof(n->status));
This overwrites all of status, which seems wrong as
it will also overwrite the link state - that should
have been read-only.
> }
>
> static bool virtio_net_started(VirtIONet *n, uint8_t status)
> @@ -227,7 +229,7 @@ static uint32_t virtio_net_get_features(VirtIODevice
> *vdev, uint32_t features)
> {
> VirtIONet *n = to_virtio_net(vdev);
>
> - features |= (1 << VIRTIO_NET_F_MAC);
> + features |= (1 << VIRTIO_NET_F_MAC | 1 << VIRTIO_NET_F_GUEST_ANNOUNCE);
>
Why do you force this bit on?
We have a property below ...
> if (peer_has_vnet_hdr(n)) {
> tap_using_vnet_hdr(n->nic->nc.peer, 1);
> @@ -983,6 +985,20 @@ static void virtio_net_cleanup(VLANClientState *nc)
> n->nic = NULL;
> }
>
> +static int virtio_net_announce(VLANClientState *nc)
> +{
> + VirtIONet *n = DO_UPCAST(NICState, nc, nc)->opaque;
> +
> + if (n->vdev.guest_features & (0x1 << VIRTIO_NET_F_GUEST_ANNOUNCE)
> + && n->status & VIRTIO_NET_S_LINK_UP) {
> + n->status |= VIRTIO_NET_S_ANNOUNCE;
> + virtio_notify_config(&n->vdev);
> + return 0;
> + }
> +
> + return 1;
> +}
> +
> static NetClientInfo net_virtio_info = {
> .type = NET_CLIENT_TYPE_NIC,
> .size = sizeof(NICState),
> @@ -990,6 +1006,7 @@ static NetClientInfo net_virtio_info = {
> .receive = virtio_net_receive,
> .cleanup = virtio_net_cleanup,
> .link_status_changed = virtio_net_set_link_status,
> + .announce = virtio_net_announce,
> };
>
> VirtIODevice *virtio_net_init(DeviceState *dev, NICConf *conf,
> diff --git a/hw/virtio-net.h b/hw/virtio-net.h
> index 4468741..9f8cea7 100644
> --- a/hw/virtio-net.h
> +++ b/hw/virtio-net.h
> @@ -44,8 +44,10 @@
> #define VIRTIO_NET_F_CTRL_RX 18 /* Control channel RX mode support */
> #define VIRTIO_NET_F_CTRL_VLAN 19 /* Control channel VLAN filtering */
> #define VIRTIO_NET_F_CTRL_RX_EXTRA 20 /* Extra RX mode control support */
> +#define VIRTIO_NET_F_GUEST_ANNOUNCE 21 /* Guest can announce itself */
>
> #define VIRTIO_NET_S_LINK_UP 1 /* Link is up */
> +#define VIRTIO_NET_S_ANNOUNCE 2 /* Announcement is needed */
>
> #define TX_TIMER_INTERVAL 150000 /* 150 us */
>
> @@ -176,6 +178,7 @@ struct virtio_net_ctrl_mac {
> DEFINE_PROP_BIT("guest_tso6", _state, _field,
> VIRTIO_NET_F_GUEST_TSO6, true), \
> DEFINE_PROP_BIT("guest_ecn", _state, _field, VIRTIO_NET_F_GUEST_ECN,
> true), \
> DEFINE_PROP_BIT("guest_ufo", _state, _field, VIRTIO_NET_F_GUEST_UFO,
> true), \
> + DEFINE_PROP_BIT("guest_announce", _state, _field,
> VIRTIO_NET_F_GUEST_ANNOUNCE, true), \
> DEFINE_PROP_BIT("host_tso4", _state, _field, VIRTIO_NET_F_HOST_TSO4,
> true), \
> DEFINE_PROP_BIT("host_tso6", _state, _field, VIRTIO_NET_F_HOST_TSO6,
> true), \
> DEFINE_PROP_BIT("host_ecn", _state, _field, VIRTIO_NET_F_HOST_ECN,
> true), \
- Re: [Qemu-devel] [V4 PATCH 2/5] net: announce self after vm start, (continued)