@@ -134,6 +134,18 @@ static int vhost_net_get_fd(NetClientState *backend)
}
}
+static void vhost_net_backend_stop(struct vhost_dev *dev)
+{
+ struct vhost_net *net = container_of(dev, struct vhost_net, dev);
+ NetClientState *nc = net->nc;
+ NetClientState *peer = nc->peer;
+
+ peer->link_down = 1;
+ if (peer->info->link_status_changed) {
+ peer->info->link_status_changed(peer);
+ }
+}
+
struct vhost_net *vhost_net_init(VhostNetOptions *options)
{
int r;
@@ -163,6 +175,7 @@ struct vhost_net *vhost_net_init(VhostNetOptions *options)
net->dev.nvqs = 2;
net->dev.vqs = net->vqs;
+ net->dev.stop = vhost_net_backend_stop;
r = vhost_dev_init(&net->dev, options->opaque,
options->backend_type);
@@ -35,6 +35,8 @@ struct vhost_log {
vhost_log_chunk_t *log;
};
+typedef void (*vhost_stop)(struct vhost_dev *dev);
+
struct vhost_memory;
struct vhost_dev {
MemoryListener memory_listener;
@@ -59,6 +61,8 @@ struct vhost_dev {
const VhostOps *vhost_ops;
void *opaque;
struct vhost_log *log;
+ /* backend request to stop */
+ vhost_stop stop;
};
int vhost_dev_init(struct vhost_dev *hdev, void *opaque,