xref: /qemu/hw/net/vhost_net.c (revision 81647a655fa4ff99fd5748363a174edd87a40950)
1d5970055SMichael S. Tsirkin /*
2d5970055SMichael S. Tsirkin  * vhost-net support
3d5970055SMichael S. Tsirkin  *
4d5970055SMichael S. Tsirkin  * Copyright Red Hat, Inc. 2010
5d5970055SMichael S. Tsirkin  *
6d5970055SMichael S. Tsirkin  * Authors:
7d5970055SMichael S. Tsirkin  *  Michael S. Tsirkin <mst@redhat.com>
8d5970055SMichael S. Tsirkin  *
9d5970055SMichael S. Tsirkin  * This work is licensed under the terms of the GNU GPL, version 2.  See
10d5970055SMichael S. Tsirkin  * the COPYING file in the top-level directory.
116b620ca3SPaolo Bonzini  *
126b620ca3SPaolo Bonzini  * Contributions after 2012-01-13 are licensed under the terms of the
136b620ca3SPaolo Bonzini  * GNU GPL, version 2 or (at your option) any later version.
14d5970055SMichael S. Tsirkin  */
15d5970055SMichael S. Tsirkin 
161422e32dSPaolo Bonzini #include "net/net.h"
17d5970055SMichael S. Tsirkin #include "net/tap.h"
18d5970055SMichael S. Tsirkin 
190d09e41aSPaolo Bonzini #include "hw/virtio/virtio-net.h"
200d09e41aSPaolo Bonzini #include "net/vhost_net.h"
211de7afc9SPaolo Bonzini #include "qemu/error-report.h"
22d5970055SMichael S. Tsirkin 
23d5970055SMichael S. Tsirkin #include "config.h"
24d5970055SMichael S. Tsirkin 
25d5970055SMichael S. Tsirkin #ifdef CONFIG_VHOST_NET
26d5970055SMichael S. Tsirkin #include <linux/vhost.h>
27d5970055SMichael S. Tsirkin #include <sys/socket.h>
28d5970055SMichael S. Tsirkin #include <linux/kvm.h>
29d5970055SMichael S. Tsirkin #include <fcntl.h>
30d5970055SMichael S. Tsirkin #include <sys/ioctl.h>
31d5970055SMichael S. Tsirkin #include <linux/virtio_ring.h>
32d5970055SMichael S. Tsirkin #include <netpacket/packet.h>
33d5970055SMichael S. Tsirkin #include <net/ethernet.h>
34d5970055SMichael S. Tsirkin #include <net/if.h>
35d5970055SMichael S. Tsirkin #include <netinet/in.h>
36d5970055SMichael S. Tsirkin 
37d5970055SMichael S. Tsirkin #include <stdio.h>
38d5970055SMichael S. Tsirkin 
390d09e41aSPaolo Bonzini #include "hw/virtio/vhost.h"
401c819449SKONRAD Frederic #include "hw/virtio/virtio-bus.h"
41d5970055SMichael S. Tsirkin 
42d5970055SMichael S. Tsirkin struct vhost_net {
43d5970055SMichael S. Tsirkin     struct vhost_dev dev;
44d5970055SMichael S. Tsirkin     struct vhost_virtqueue vqs[2];
45d5970055SMichael S. Tsirkin     int backend;
4635277d14SStefan Hajnoczi     NetClientState *nc;
47d5970055SMichael S. Tsirkin };
48d5970055SMichael S. Tsirkin 
492e6d46d7SNikolay Nikolaev /* Features supported by host kernel. */
502e6d46d7SNikolay Nikolaev static const int kernel_feature_bits[] = {
512e6d46d7SNikolay Nikolaev     VIRTIO_F_NOTIFY_ON_EMPTY,
522e6d46d7SNikolay Nikolaev     VIRTIO_RING_F_INDIRECT_DESC,
532e6d46d7SNikolay Nikolaev     VIRTIO_RING_F_EVENT_IDX,
542e6d46d7SNikolay Nikolaev     VIRTIO_NET_F_MRG_RXBUF,
552e6d46d7SNikolay Nikolaev     VHOST_INVALID_FEATURE_BIT
562e6d46d7SNikolay Nikolaev };
572e6d46d7SNikolay Nikolaev 
582e6d46d7SNikolay Nikolaev static const int *vhost_net_get_feature_bits(struct vhost_net *net)
592e6d46d7SNikolay Nikolaev {
602e6d46d7SNikolay Nikolaev     const int *feature_bits = 0;
612e6d46d7SNikolay Nikolaev 
622e6d46d7SNikolay Nikolaev     switch (net->nc->info->type) {
632e6d46d7SNikolay Nikolaev     case NET_CLIENT_OPTIONS_KIND_TAP:
642e6d46d7SNikolay Nikolaev         feature_bits = kernel_feature_bits;
652e6d46d7SNikolay Nikolaev         break;
662e6d46d7SNikolay Nikolaev     default:
672e6d46d7SNikolay Nikolaev         error_report("Feature bits not defined for this type: %d",
682e6d46d7SNikolay Nikolaev                 net->nc->info->type);
692e6d46d7SNikolay Nikolaev         break;
702e6d46d7SNikolay Nikolaev     }
712e6d46d7SNikolay Nikolaev 
722e6d46d7SNikolay Nikolaev     return feature_bits;
732e6d46d7SNikolay Nikolaev }
742e6d46d7SNikolay Nikolaev 
75d5970055SMichael S. Tsirkin unsigned vhost_net_get_features(struct vhost_net *net, unsigned features)
76d5970055SMichael S. Tsirkin {
772e6d46d7SNikolay Nikolaev     return vhost_get_features(&net->dev, vhost_net_get_feature_bits(net),
782e6d46d7SNikolay Nikolaev             features);
79d5970055SMichael S. Tsirkin }
80d5970055SMichael S. Tsirkin 
81d5970055SMichael S. Tsirkin void vhost_net_ack_features(struct vhost_net *net, unsigned features)
82d5970055SMichael S. Tsirkin {
832e6d46d7SNikolay Nikolaev     vhost_ack_features(&net->dev, vhost_net_get_feature_bits(net), features);
84d5970055SMichael S. Tsirkin }
85d5970055SMichael S. Tsirkin 
864e68f7a0SStefan Hajnoczi static int vhost_net_get_fd(NetClientState *backend)
87d5970055SMichael S. Tsirkin {
88d5970055SMichael S. Tsirkin     switch (backend->info->type) {
892be64a68SLaszlo Ersek     case NET_CLIENT_OPTIONS_KIND_TAP:
90d5970055SMichael S. Tsirkin         return tap_get_fd(backend);
91d5970055SMichael S. Tsirkin     default:
92d5970055SMichael S. Tsirkin         fprintf(stderr, "vhost-net requires tap backend\n");
93d5970055SMichael S. Tsirkin         return -EBADFD;
94d5970055SMichael S. Tsirkin     }
95d5970055SMichael S. Tsirkin }
96d5970055SMichael S. Tsirkin 
97*81647a65SNikolay Nikolaev struct vhost_net *vhost_net_init(VhostNetOptions *options)
98d5970055SMichael S. Tsirkin {
99d5970055SMichael S. Tsirkin     int r;
1007267c094SAnthony Liguori     struct vhost_net *net = g_malloc(sizeof *net);
101*81647a65SNikolay Nikolaev 
102*81647a65SNikolay Nikolaev     if (!options->net_backend) {
103*81647a65SNikolay Nikolaev         fprintf(stderr, "vhost-net requires net backend to be setup\n");
104d5970055SMichael S. Tsirkin         goto fail;
105d5970055SMichael S. Tsirkin     }
106*81647a65SNikolay Nikolaev 
107*81647a65SNikolay Nikolaev     r = vhost_net_get_fd(options->net_backend);
108d5970055SMichael S. Tsirkin     if (r < 0) {
109d5970055SMichael S. Tsirkin         goto fail;
110d5970055SMichael S. Tsirkin     }
111*81647a65SNikolay Nikolaev     net->nc = options->net_backend;
112*81647a65SNikolay Nikolaev     net->dev.backend_features = qemu_has_vnet_hdr(options->net_backend) ? 0 :
113d5970055SMichael S. Tsirkin         (1 << VHOST_NET_F_VIRTIO_NET_HDR);
114d5970055SMichael S. Tsirkin     net->backend = r;
115d5970055SMichael S. Tsirkin 
116f56a1247SMichael S. Tsirkin     net->dev.nvqs = 2;
117f56a1247SMichael S. Tsirkin     net->dev.vqs = net->vqs;
118f56a1247SMichael S. Tsirkin 
119*81647a65SNikolay Nikolaev     r = vhost_dev_init(&net->dev, options->opaque,
120*81647a65SNikolay Nikolaev                        options->force);
121d5970055SMichael S. Tsirkin     if (r < 0) {
122d5970055SMichael S. Tsirkin         goto fail;
123d5970055SMichael S. Tsirkin     }
124*81647a65SNikolay Nikolaev     if (!qemu_has_vnet_hdr_len(options->net_backend,
125ca736c8eSMichael S. Tsirkin                                sizeof(struct virtio_net_hdr_mrg_rxbuf))) {
126ca736c8eSMichael S. Tsirkin         net->dev.features &= ~(1 << VIRTIO_NET_F_MRG_RXBUF);
127ca736c8eSMichael S. Tsirkin     }
128d5970055SMichael S. Tsirkin     if (~net->dev.features & net->dev.backend_features) {
1290bfcd599SBlue Swirl         fprintf(stderr, "vhost lacks feature mask %" PRIu64 " for backend\n",
13029f91781SJes Sorensen                 (uint64_t)(~net->dev.features & net->dev.backend_features));
131d5970055SMichael S. Tsirkin         vhost_dev_cleanup(&net->dev);
132d5970055SMichael S. Tsirkin         goto fail;
133d5970055SMichael S. Tsirkin     }
134d5970055SMichael S. Tsirkin 
135d5970055SMichael S. Tsirkin     /* Set sane init value. Override when guest acks. */
136d5970055SMichael S. Tsirkin     vhost_net_ack_features(net, 0);
137d5970055SMichael S. Tsirkin     return net;
138d5970055SMichael S. Tsirkin fail:
1397267c094SAnthony Liguori     g_free(net);
140d5970055SMichael S. Tsirkin     return NULL;
141d5970055SMichael S. Tsirkin }
142d5970055SMichael S. Tsirkin 
1435430a28fSmst@redhat.com bool vhost_net_query(VHostNetState *net, VirtIODevice *dev)
1445430a28fSmst@redhat.com {
1455430a28fSmst@redhat.com     return vhost_dev_query(&net->dev, dev);
1465430a28fSmst@redhat.com }
1475430a28fSmst@redhat.com 
148a9f98bb5SJason Wang static int vhost_net_start_one(struct vhost_net *net,
149a9f98bb5SJason Wang                                VirtIODevice *dev,
150a9f98bb5SJason Wang                                int vq_index)
151d5970055SMichael S. Tsirkin {
152d5970055SMichael S. Tsirkin     struct vhost_vring_file file = { };
153d5970055SMichael S. Tsirkin     int r;
154b0b3db79SMichael S. Tsirkin 
155a9f98bb5SJason Wang     if (net->dev.started) {
156a9f98bb5SJason Wang         return 0;
157a9f98bb5SJason Wang     }
158a9f98bb5SJason Wang 
159a9f98bb5SJason Wang     net->dev.nvqs = 2;
160a9f98bb5SJason Wang     net->dev.vqs = net->vqs;
161a9f98bb5SJason Wang     net->dev.vq_index = vq_index;
162a9f98bb5SJason Wang 
163b0b3db79SMichael S. Tsirkin     r = vhost_dev_enable_notifiers(&net->dev, dev);
164b0b3db79SMichael S. Tsirkin     if (r < 0) {
165b0b3db79SMichael S. Tsirkin         goto fail_notifiers;
166b0b3db79SMichael S. Tsirkin     }
167d5970055SMichael S. Tsirkin 
168d5970055SMichael S. Tsirkin     r = vhost_dev_start(&net->dev, dev);
169d5970055SMichael S. Tsirkin     if (r < 0) {
170b0b3db79SMichael S. Tsirkin         goto fail_start;
171d5970055SMichael S. Tsirkin     }
172d5970055SMichael S. Tsirkin 
173212d69f2SNikolay Nikolaev     if (net->nc->info->poll) {
17435277d14SStefan Hajnoczi         net->nc->info->poll(net->nc, false);
175212d69f2SNikolay Nikolaev     }
176212d69f2SNikolay Nikolaev 
177d5970055SMichael S. Tsirkin     qemu_set_fd_handler(net->backend, NULL, NULL, NULL);
178d5970055SMichael S. Tsirkin     file.fd = net->backend;
179d5970055SMichael S. Tsirkin     for (file.index = 0; file.index < net->dev.nvqs; ++file.index) {
180d5970055SMichael S. Tsirkin         r = ioctl(net->dev.control, VHOST_NET_SET_BACKEND, &file);
181d5970055SMichael S. Tsirkin         if (r < 0) {
182d5970055SMichael S. Tsirkin             r = -errno;
183d5970055SMichael S. Tsirkin             goto fail;
184d5970055SMichael S. Tsirkin         }
185d5970055SMichael S. Tsirkin     }
186d5970055SMichael S. Tsirkin     return 0;
187d5970055SMichael S. Tsirkin fail:
188d5970055SMichael S. Tsirkin     file.fd = -1;
1896b37c87cSMichael S. Tsirkin     while (file.index-- > 0) {
190d5970055SMichael S. Tsirkin         int r = ioctl(net->dev.control, VHOST_NET_SET_BACKEND, &file);
191d5970055SMichael S. Tsirkin         assert(r >= 0);
192d5970055SMichael S. Tsirkin     }
193212d69f2SNikolay Nikolaev     if (net->nc->info->poll) {
19435277d14SStefan Hajnoczi         net->nc->info->poll(net->nc, true);
195212d69f2SNikolay Nikolaev     }
196d5970055SMichael S. Tsirkin     vhost_dev_stop(&net->dev, dev);
197b0b3db79SMichael S. Tsirkin fail_start:
198b0b3db79SMichael S. Tsirkin     vhost_dev_disable_notifiers(&net->dev, dev);
199b0b3db79SMichael S. Tsirkin fail_notifiers:
200d5970055SMichael S. Tsirkin     return r;
201d5970055SMichael S. Tsirkin }
202d5970055SMichael S. Tsirkin 
203a9f98bb5SJason Wang static void vhost_net_stop_one(struct vhost_net *net,
204d5970055SMichael S. Tsirkin                                VirtIODevice *dev)
205d5970055SMichael S. Tsirkin {
206d5970055SMichael S. Tsirkin     struct vhost_vring_file file = { .fd = -1 };
207d5970055SMichael S. Tsirkin 
208a9f98bb5SJason Wang     if (!net->dev.started) {
209a9f98bb5SJason Wang         return;
210a9f98bb5SJason Wang     }
211a9f98bb5SJason Wang 
212d5970055SMichael S. Tsirkin     for (file.index = 0; file.index < net->dev.nvqs; ++file.index) {
213d5970055SMichael S. Tsirkin         int r = ioctl(net->dev.control, VHOST_NET_SET_BACKEND, &file);
214d5970055SMichael S. Tsirkin         assert(r >= 0);
215d5970055SMichael S. Tsirkin     }
216212d69f2SNikolay Nikolaev     if (net->nc->info->poll) {
21735277d14SStefan Hajnoczi         net->nc->info->poll(net->nc, true);
218212d69f2SNikolay Nikolaev     }
219d5970055SMichael S. Tsirkin     vhost_dev_stop(&net->dev, dev);
220b0b3db79SMichael S. Tsirkin     vhost_dev_disable_notifiers(&net->dev, dev);
221d5970055SMichael S. Tsirkin }
222d5970055SMichael S. Tsirkin 
223a9f98bb5SJason Wang int vhost_net_start(VirtIODevice *dev, NetClientState *ncs,
224a9f98bb5SJason Wang                     int total_queues)
225a9f98bb5SJason Wang {
2261c819449SKONRAD Frederic     BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(dev)));
2271c819449SKONRAD Frederic     VirtioBusState *vbus = VIRTIO_BUS(qbus);
2281c819449SKONRAD Frederic     VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(vbus);
229a9f98bb5SJason Wang     int r, i = 0;
230a9f98bb5SJason Wang 
2311c819449SKONRAD Frederic     if (!k->set_guest_notifiers) {
232312fd5f2SMarkus Armbruster         error_report("binding does not support guest notifiers");
233a9f98bb5SJason Wang         r = -ENOSYS;
234a9f98bb5SJason Wang         goto err;
235a9f98bb5SJason Wang     }
236a9f98bb5SJason Wang 
237a9f98bb5SJason Wang     for (i = 0; i < total_queues; i++) {
238ed8b4afeSNikolay Nikolaev         r = vhost_net_start_one(get_vhost_net(ncs[i].peer), dev, i * 2);
239a9f98bb5SJason Wang 
240a9f98bb5SJason Wang         if (r < 0) {
241a9f98bb5SJason Wang             goto err;
242a9f98bb5SJason Wang         }
243a9f98bb5SJason Wang     }
244a9f98bb5SJason Wang 
2451c819449SKONRAD Frederic     r = k->set_guest_notifiers(qbus->parent, total_queues * 2, true);
246a9f98bb5SJason Wang     if (r < 0) {
247312fd5f2SMarkus Armbruster         error_report("Error binding guest notifier: %d", -r);
248a9f98bb5SJason Wang         goto err;
249a9f98bb5SJason Wang     }
250a9f98bb5SJason Wang 
251a9f98bb5SJason Wang     return 0;
252a9f98bb5SJason Wang 
253a9f98bb5SJason Wang err:
254a9f98bb5SJason Wang     while (--i >= 0) {
255ed8b4afeSNikolay Nikolaev         vhost_net_stop_one(get_vhost_net(ncs[i].peer), dev);
256a9f98bb5SJason Wang     }
257a9f98bb5SJason Wang     return r;
258a9f98bb5SJason Wang }
259a9f98bb5SJason Wang 
260a9f98bb5SJason Wang void vhost_net_stop(VirtIODevice *dev, NetClientState *ncs,
261a9f98bb5SJason Wang                     int total_queues)
262a9f98bb5SJason Wang {
2631c819449SKONRAD Frederic     BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(dev)));
2641c819449SKONRAD Frederic     VirtioBusState *vbus = VIRTIO_BUS(qbus);
2651c819449SKONRAD Frederic     VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(vbus);
266a9f98bb5SJason Wang     int i, r;
267a9f98bb5SJason Wang 
2681c819449SKONRAD Frederic     r = k->set_guest_notifiers(qbus->parent, total_queues * 2, false);
269a9f98bb5SJason Wang     if (r < 0) {
270a9f98bb5SJason Wang         fprintf(stderr, "vhost guest notifier cleanup failed: %d\n", r);
271a9f98bb5SJason Wang         fflush(stderr);
272a9f98bb5SJason Wang     }
273a9f98bb5SJason Wang     assert(r >= 0);
274a9f98bb5SJason Wang 
275a9f98bb5SJason Wang     for (i = 0; i < total_queues; i++) {
276ed8b4afeSNikolay Nikolaev         vhost_net_stop_one(get_vhost_net(ncs[i].peer), dev);
277a9f98bb5SJason Wang     }
278a9f98bb5SJason Wang }
279a9f98bb5SJason Wang 
280d5970055SMichael S. Tsirkin void vhost_net_cleanup(struct vhost_net *net)
281d5970055SMichael S. Tsirkin {
282d5970055SMichael S. Tsirkin     vhost_dev_cleanup(&net->dev);
2837267c094SAnthony Liguori     g_free(net);
284d5970055SMichael S. Tsirkin }
285f56a1247SMichael S. Tsirkin 
286f56a1247SMichael S. Tsirkin bool vhost_net_virtqueue_pending(VHostNetState *net, int idx)
287f56a1247SMichael S. Tsirkin {
288f56a1247SMichael S. Tsirkin     return vhost_virtqueue_pending(&net->dev, idx);
289f56a1247SMichael S. Tsirkin }
290f56a1247SMichael S. Tsirkin 
291f56a1247SMichael S. Tsirkin void vhost_net_virtqueue_mask(VHostNetState *net, VirtIODevice *dev,
292f56a1247SMichael S. Tsirkin                               int idx, bool mask)
293f56a1247SMichael S. Tsirkin {
294f56a1247SMichael S. Tsirkin     vhost_virtqueue_mask(&net->dev, dev, idx, mask);
295f56a1247SMichael S. Tsirkin }
296ed8b4afeSNikolay Nikolaev 
297ed8b4afeSNikolay Nikolaev VHostNetState *get_vhost_net(NetClientState *nc)
298ed8b4afeSNikolay Nikolaev {
299ed8b4afeSNikolay Nikolaev     VHostNetState *vhost_net = 0;
300ed8b4afeSNikolay Nikolaev 
301ed8b4afeSNikolay Nikolaev     if (!nc) {
302ed8b4afeSNikolay Nikolaev         return 0;
303ed8b4afeSNikolay Nikolaev     }
304ed8b4afeSNikolay Nikolaev 
305ed8b4afeSNikolay Nikolaev     switch (nc->info->type) {
306ed8b4afeSNikolay Nikolaev     case NET_CLIENT_OPTIONS_KIND_TAP:
307ed8b4afeSNikolay Nikolaev         vhost_net = tap_get_vhost_net(nc);
308ed8b4afeSNikolay Nikolaev         break;
309ed8b4afeSNikolay Nikolaev     default:
310ed8b4afeSNikolay Nikolaev         break;
311ed8b4afeSNikolay Nikolaev     }
312ed8b4afeSNikolay Nikolaev 
313ed8b4afeSNikolay Nikolaev     return vhost_net;
314ed8b4afeSNikolay Nikolaev }
315d5970055SMichael S. Tsirkin #else
316*81647a65SNikolay Nikolaev struct vhost_net *vhost_net_init(VhostNetOptions *options)
317d5970055SMichael S. Tsirkin {
31835f75462SMichael Tokarev     error_report("vhost-net support is not compiled in");
319d5970055SMichael S. Tsirkin     return NULL;
320d5970055SMichael S. Tsirkin }
321d5970055SMichael S. Tsirkin 
3225430a28fSmst@redhat.com bool vhost_net_query(VHostNetState *net, VirtIODevice *dev)
3235430a28fSmst@redhat.com {
3245430a28fSmst@redhat.com     return false;
3255430a28fSmst@redhat.com }
3265430a28fSmst@redhat.com 
327a9f98bb5SJason Wang int vhost_net_start(VirtIODevice *dev,
328a9f98bb5SJason Wang                     NetClientState *ncs,
329a9f98bb5SJason Wang                     int total_queues)
330d5970055SMichael S. Tsirkin {
331d5970055SMichael S. Tsirkin     return -ENOSYS;
332d5970055SMichael S. Tsirkin }
333a9f98bb5SJason Wang void vhost_net_stop(VirtIODevice *dev,
334a9f98bb5SJason Wang                     NetClientState *ncs,
335a9f98bb5SJason Wang                     int total_queues)
336d5970055SMichael S. Tsirkin {
337d5970055SMichael S. Tsirkin }
338d5970055SMichael S. Tsirkin 
339d5970055SMichael S. Tsirkin void vhost_net_cleanup(struct vhost_net *net)
340d5970055SMichael S. Tsirkin {
341d5970055SMichael S. Tsirkin }
342d5970055SMichael S. Tsirkin 
343d5970055SMichael S. Tsirkin unsigned vhost_net_get_features(struct vhost_net *net, unsigned features)
344d5970055SMichael S. Tsirkin {
345d5970055SMichael S. Tsirkin     return features;
346d5970055SMichael S. Tsirkin }
347d5970055SMichael S. Tsirkin void vhost_net_ack_features(struct vhost_net *net, unsigned features)
348d5970055SMichael S. Tsirkin {
349d5970055SMichael S. Tsirkin }
350f56a1247SMichael S. Tsirkin 
351f56a1247SMichael S. Tsirkin bool vhost_net_virtqueue_pending(VHostNetState *net, int idx)
352f56a1247SMichael S. Tsirkin {
3534dd72e04SStefan Weil     return false;
354f56a1247SMichael S. Tsirkin }
355f56a1247SMichael S. Tsirkin 
356f56a1247SMichael S. Tsirkin void vhost_net_virtqueue_mask(VHostNetState *net, VirtIODevice *dev,
357f56a1247SMichael S. Tsirkin                               int idx, bool mask)
358f56a1247SMichael S. Tsirkin {
359f56a1247SMichael S. Tsirkin }
360ed8b4afeSNikolay Nikolaev 
361ed8b4afeSNikolay Nikolaev VHostNetState *get_vhost_net(NetClientState *nc)
362ed8b4afeSNikolay Nikolaev {
363ed8b4afeSNikolay Nikolaev     return 0;
364ed8b4afeSNikolay Nikolaev }
365d5970055SMichael S. Tsirkin #endif
366