diff options
author | Jason Wang <jasowang@redhat.com> | 2012-04-11 16:43:52 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-04-15 03:23:31 -0400 |
commit | 586d17c5a01bf1ae4e215adc6c48457eee5482bc (patch) | |
tree | 20738485061d7965712bc711035883501d02bcc5 /include/linux/virtio_net.h | |
parent | 8831a3f2c9ee7d952e6d7a018d11c0c9c5b56749 (diff) |
virtio-net: send gratuitous packets when needed
As hypervior does not have the knowledge of guest network configuration, it's
better to ask guest to send gratuitous packets when needed.
This patch implements VIRTIO_NET_F_GUEST_ANNOUNCE feature: hypervisor would
notice the guest when it thinks it's time for guest to announce the link
presnece. Guest tests VIRTIO_NET_S_ANNOUNCE bit during config change interrupt
and woule send gratuitous packets through netif_notify_peers() and ack the
notification through ctrl vq.
We need to make sure the atomicy of read and ack in guest otherwise we may ack
more times than being notified. This is done through handling the whole config
change interrupt in an non-reentrant workqueue.
Signed-off-by: Jason Wang <jasowang@redhat.com>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/linux/virtio_net.h')
-rw-r--r-- | include/linux/virtio_net.h | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/include/linux/virtio_net.h b/include/linux/virtio_net.h index 970d5a2a9047..2470f541af50 100644 --- a/include/linux/virtio_net.h +++ b/include/linux/virtio_net.h | |||
@@ -49,8 +49,11 @@ | |||
49 | #define VIRTIO_NET_F_CTRL_RX 18 /* Control channel RX mode support */ | 49 | #define VIRTIO_NET_F_CTRL_RX 18 /* Control channel RX mode support */ |
50 | #define VIRTIO_NET_F_CTRL_VLAN 19 /* Control channel VLAN filtering */ | 50 | #define VIRTIO_NET_F_CTRL_VLAN 19 /* Control channel VLAN filtering */ |
51 | #define VIRTIO_NET_F_CTRL_RX_EXTRA 20 /* Extra RX mode control support */ | 51 | #define VIRTIO_NET_F_CTRL_RX_EXTRA 20 /* Extra RX mode control support */ |
52 | #define VIRTIO_NET_F_GUEST_ANNOUNCE 21 /* Guest can announce device on the | ||
53 | * network */ | ||
52 | 54 | ||
53 | #define VIRTIO_NET_S_LINK_UP 1 /* Link is up */ | 55 | #define VIRTIO_NET_S_LINK_UP 1 /* Link is up */ |
56 | #define VIRTIO_NET_S_ANNOUNCE 2 /* Announcement is needed */ | ||
54 | 57 | ||
55 | struct virtio_net_config { | 58 | struct virtio_net_config { |
56 | /* The config defining mac address (if VIRTIO_NET_F_MAC) */ | 59 | /* The config defining mac address (if VIRTIO_NET_F_MAC) */ |
@@ -152,4 +155,15 @@ struct virtio_net_ctrl_mac { | |||
152 | #define VIRTIO_NET_CTRL_VLAN_ADD 0 | 155 | #define VIRTIO_NET_CTRL_VLAN_ADD 0 |
153 | #define VIRTIO_NET_CTRL_VLAN_DEL 1 | 156 | #define VIRTIO_NET_CTRL_VLAN_DEL 1 |
154 | 157 | ||
158 | /* | ||
159 | * Control link announce acknowledgement | ||
160 | * | ||
161 | * The command VIRTIO_NET_CTRL_ANNOUNCE_ACK is used to indicate that | ||
162 | * driver has recevied the notification; device would clear the | ||
163 | * VIRTIO_NET_S_ANNOUNCE bit in the status field after it receives | ||
164 | * this command. | ||
165 | */ | ||
166 | #define VIRTIO_NET_CTRL_ANNOUNCE 3 | ||
167 | #define VIRTIO_NET_CTRL_ANNOUNCE_ACK 0 | ||
168 | |||
155 | #endif /* _LINUX_VIRTIO_NET_H */ | 169 | #endif /* _LINUX_VIRTIO_NET_H */ |