virtio-net.c (9d8c6a258c70d8ff494489140a4fcb3a965909b2) virtio-net.c (b2c929f02ba37b206144735313af10fb9cc5d1a4)
1/*
2 * Virtio Network Device
3 *
4 * Copyright IBM, Corp. 2007
5 *
6 * Authors:
7 * Anthony Liguori <aliguori@us.ibm.com>
8 *

--- 136 unchanged lines hidden (view full) ---

145
146static bool virtio_net_started(VirtIONet *n, uint8_t status)
147{
148 VirtIODevice *vdev = VIRTIO_DEVICE(n);
149 return (status & VIRTIO_CONFIG_S_DRIVER_OK) &&
150 (n->status & VIRTIO_NET_S_LINK_UP) && vdev->vm_running;
151}
152
1/*
2 * Virtio Network Device
3 *
4 * Copyright IBM, Corp. 2007
5 *
6 * Authors:
7 * Anthony Liguori <aliguori@us.ibm.com>
8 *

--- 136 unchanged lines hidden (view full) ---

145
146static bool virtio_net_started(VirtIONet *n, uint8_t status)
147{
148 VirtIODevice *vdev = VIRTIO_DEVICE(n);
149 return (status & VIRTIO_CONFIG_S_DRIVER_OK) &&
150 (n->status & VIRTIO_NET_S_LINK_UP) && vdev->vm_running;
151}
152
153static void virtio_net_announce_notify(VirtIONet *net)
154{
155 VirtIODevice *vdev = VIRTIO_DEVICE(net);
156 trace_virtio_net_announce_notify();
157
158 net->status |= VIRTIO_NET_S_ANNOUNCE;
159 virtio_notify_config(vdev);
160}
161
153static void virtio_net_announce_timer(void *opaque)
154{
155 VirtIONet *n = opaque;
162static void virtio_net_announce_timer(void *opaque)
163{
164 VirtIONet *n = opaque;
156 VirtIODevice *vdev = VIRTIO_DEVICE(n);
157 trace_virtio_net_announce_timer(n->announce_timer.round);
158
159 n->announce_timer.round--;
165 trace_virtio_net_announce_timer(n->announce_timer.round);
166
167 n->announce_timer.round--;
160 n->status |= VIRTIO_NET_S_ANNOUNCE;
161 virtio_notify_config(vdev);
168 virtio_net_announce_notify(n);
162}
163
169}
170
171static void virtio_net_announce(NetClientState *nc)
172{
173 VirtIONet *n = qemu_get_nic_opaque(nc);
174 VirtIODevice *vdev = VIRTIO_DEVICE(n);
175
176 /*
177 * Make sure the virtio migration announcement timer isn't running
178 * If it is, let it trigger announcement so that we do not cause
179 * confusion.
180 */
181 if (n->announce_timer.round) {
182 return;
183 }
184
185 if (virtio_vdev_has_feature(vdev, VIRTIO_NET_F_GUEST_ANNOUNCE) &&
186 virtio_vdev_has_feature(vdev, VIRTIO_NET_F_CTRL_VQ)) {
187 virtio_net_announce_notify(n);
188 }
189}
190
164static void virtio_net_vhost_status(VirtIONet *n, uint8_t status)
165{
166 VirtIODevice *vdev = VIRTIO_DEVICE(n);
167 NetClientState *nc = qemu_get_queue(n->nic);
168 int queues = n->multiqueue ? n->max_queues : 1;
169
170 if (!get_vhost_net(nc->peer)) {
171 return;

--- 2379 unchanged lines hidden (view full) ---

2551
2552static NetClientInfo net_virtio_info = {
2553 .type = NET_CLIENT_DRIVER_NIC,
2554 .size = sizeof(NICState),
2555 .can_receive = virtio_net_can_receive,
2556 .receive = virtio_net_receive,
2557 .link_status_changed = virtio_net_set_link_status,
2558 .query_rx_filter = virtio_net_query_rxfilter,
191static void virtio_net_vhost_status(VirtIONet *n, uint8_t status)
192{
193 VirtIODevice *vdev = VIRTIO_DEVICE(n);
194 NetClientState *nc = qemu_get_queue(n->nic);
195 int queues = n->multiqueue ? n->max_queues : 1;
196
197 if (!get_vhost_net(nc->peer)) {
198 return;

--- 2379 unchanged lines hidden (view full) ---

2578
2579static NetClientInfo net_virtio_info = {
2580 .type = NET_CLIENT_DRIVER_NIC,
2581 .size = sizeof(NICState),
2582 .can_receive = virtio_net_can_receive,
2583 .receive = virtio_net_receive,
2584 .link_status_changed = virtio_net_set_link_status,
2585 .query_rx_filter = virtio_net_query_rxfilter,
2586 .announce = virtio_net_announce,
2559};
2560
2561static bool virtio_net_guest_notifier_pending(VirtIODevice *vdev, int idx)
2562{
2563 VirtIONet *n = VIRTIO_NET(vdev);
2564 NetClientState *nc = qemu_get_subqueue(n->nic, vq2q(idx));
2565 assert(n->vhost_started);
2566 return vhost_net_virtqueue_pending(get_vhost_net(nc->peer), idx);

--- 120 unchanged lines hidden (view full) ---

2687
2688 n->ctrl_vq = virtio_add_queue(vdev, 64, virtio_net_handle_ctrl);
2689 qemu_macaddr_default_if_unset(&n->nic_conf.macaddr);
2690 memcpy(&n->mac[0], &n->nic_conf.macaddr, sizeof(n->mac));
2691 n->status = VIRTIO_NET_S_LINK_UP;
2692 qemu_announce_timer_reset(&n->announce_timer, migrate_announce_params(),
2693 QEMU_CLOCK_VIRTUAL,
2694 virtio_net_announce_timer, n);
2587};
2588
2589static bool virtio_net_guest_notifier_pending(VirtIODevice *vdev, int idx)
2590{
2591 VirtIONet *n = VIRTIO_NET(vdev);
2592 NetClientState *nc = qemu_get_subqueue(n->nic, vq2q(idx));
2593 assert(n->vhost_started);
2594 return vhost_net_virtqueue_pending(get_vhost_net(nc->peer), idx);

--- 120 unchanged lines hidden (view full) ---

2715
2716 n->ctrl_vq = virtio_add_queue(vdev, 64, virtio_net_handle_ctrl);
2717 qemu_macaddr_default_if_unset(&n->nic_conf.macaddr);
2718 memcpy(&n->mac[0], &n->nic_conf.macaddr, sizeof(n->mac));
2719 n->status = VIRTIO_NET_S_LINK_UP;
2720 qemu_announce_timer_reset(&n->announce_timer, migrate_announce_params(),
2721 QEMU_CLOCK_VIRTUAL,
2722 virtio_net_announce_timer, n);
2723 n->announce_timer.round = 0;
2695
2696 if (n->netclient_type) {
2697 /*
2698 * Happen when virtio_net_set_netclient_name has been called.
2699 */
2700 n->nic = qemu_new_nic(&net_virtio_info, &n->nic_conf,
2701 n->netclient_type, n->netclient_name, n);
2702 } else {

--- 196 unchanged lines hidden ---
2724
2725 if (n->netclient_type) {
2726 /*
2727 * Happen when virtio_net_set_netclient_name has been called.
2728 */
2729 n->nic = qemu_new_nic(&net_virtio_info, &n->nic_conf,
2730 n->netclient_type, n->netclient_name, n);
2731 } else {

--- 196 unchanged lines hidden ---