1 /* 2 * vhost-net support 3 * 4 * Copyright Red Hat, Inc. 2010 5 * 6 * Authors: 7 * Michael S. Tsirkin <mst@redhat.com> 8 * 9 * This work is licensed under the terms of the GNU GPL, version 2. See 10 * the COPYING file in the top-level directory. 11 * 12 * Contributions after 2012-01-13 are licensed under the terms of the 13 * GNU GPL, version 2 or (at your option) any later version. 14 */ 15 16 #include "qemu/osdep.h" 17 #include "net/net.h" 18 #include "net/tap.h" 19 #include "net/vhost-user.h" 20 21 #include "hw/virtio/virtio-net.h" 22 #include "net/vhost_net.h" 23 #include "qemu/error-report.h" 24 25 26 #ifdef CONFIG_VHOST_NET 27 #include <linux/vhost.h> 28 #include <sys/socket.h> 29 #include <linux/kvm.h> 30 #include <netpacket/packet.h> 31 #include <net/ethernet.h> 32 #include <net/if.h> 33 #include <netinet/in.h> 34 35 36 #include "standard-headers/linux/virtio_ring.h" 37 #include "hw/virtio/vhost.h" 38 #include "hw/virtio/virtio-bus.h" 39 40 struct vhost_net { 41 struct vhost_dev dev; 42 struct vhost_virtqueue vqs[2]; 43 int backend; 44 NetClientState *nc; 45 }; 46 47 /* Features supported by host kernel. */ 48 static const int kernel_feature_bits[] = { 49 VIRTIO_F_NOTIFY_ON_EMPTY, 50 VIRTIO_RING_F_INDIRECT_DESC, 51 VIRTIO_RING_F_EVENT_IDX, 52 VIRTIO_NET_F_MRG_RXBUF, 53 VIRTIO_F_VERSION_1, 54 VIRTIO_NET_F_MTU, 55 VIRTIO_F_IOMMU_PLATFORM, 56 VHOST_INVALID_FEATURE_BIT 57 }; 58 59 /* Features supported by others. */ 60 static const int user_feature_bits[] = { 61 VIRTIO_F_NOTIFY_ON_EMPTY, 62 VIRTIO_RING_F_INDIRECT_DESC, 63 VIRTIO_RING_F_EVENT_IDX, 64 65 VIRTIO_F_ANY_LAYOUT, 66 VIRTIO_F_VERSION_1, 67 VIRTIO_NET_F_CSUM, 68 VIRTIO_NET_F_GUEST_CSUM, 69 VIRTIO_NET_F_GSO, 70 VIRTIO_NET_F_GUEST_TSO4, 71 VIRTIO_NET_F_GUEST_TSO6, 72 VIRTIO_NET_F_GUEST_ECN, 73 VIRTIO_NET_F_GUEST_UFO, 74 VIRTIO_NET_F_HOST_TSO4, 75 VIRTIO_NET_F_HOST_TSO6, 76 VIRTIO_NET_F_HOST_ECN, 77 VIRTIO_NET_F_HOST_UFO, 78 VIRTIO_NET_F_MRG_RXBUF, 79 VIRTIO_NET_F_MTU, 80 81 /* This bit implies RARP isn't sent by QEMU out of band */ 82 VIRTIO_NET_F_GUEST_ANNOUNCE, 83 84 VIRTIO_NET_F_MQ, 85 86 VHOST_INVALID_FEATURE_BIT 87 }; 88 89 static const int *vhost_net_get_feature_bits(struct vhost_net *net) 90 { 91 const int *feature_bits = 0; 92 93 switch (net->nc->info->type) { 94 case NET_CLIENT_DRIVER_TAP: 95 feature_bits = kernel_feature_bits; 96 break; 97 case NET_CLIENT_DRIVER_VHOST_USER: 98 feature_bits = user_feature_bits; 99 break; 100 default: 101 error_report("Feature bits not defined for this type: %d", 102 net->nc->info->type); 103 break; 104 } 105 106 return feature_bits; 107 } 108 109 uint64_t vhost_net_get_features(struct vhost_net *net, uint64_t features) 110 { 111 return vhost_get_features(&net->dev, vhost_net_get_feature_bits(net), 112 features); 113 } 114 115 void vhost_net_ack_features(struct vhost_net *net, uint64_t features) 116 { 117 net->dev.acked_features = net->dev.backend_features; 118 vhost_ack_features(&net->dev, vhost_net_get_feature_bits(net), features); 119 } 120 121 uint64_t vhost_net_get_max_queues(VHostNetState *net) 122 { 123 return net->dev.max_queues; 124 } 125 126 uint64_t vhost_net_get_acked_features(VHostNetState *net) 127 { 128 return net->dev.acked_features; 129 } 130 131 static int vhost_net_get_fd(NetClientState *backend) 132 { 133 switch (backend->info->type) { 134 case NET_CLIENT_DRIVER_TAP: 135 return tap_get_fd(backend); 136 default: 137 fprintf(stderr, "vhost-net requires tap backend\n"); 138 return -EBADFD; 139 } 140 } 141 142 struct vhost_net *vhost_net_init(VhostNetOptions *options) 143 { 144 int r; 145 bool backend_kernel = options->backend_type == VHOST_BACKEND_TYPE_KERNEL; 146 struct vhost_net *net = g_new0(struct vhost_net, 1); 147 uint64_t features = 0; 148 149 if (!options->net_backend) { 150 fprintf(stderr, "vhost-net requires net backend to be setup\n"); 151 goto fail; 152 } 153 net->nc = options->net_backend; 154 155 net->dev.max_queues = 1; 156 net->dev.nvqs = 2; 157 net->dev.vqs = net->vqs; 158 159 if (backend_kernel) { 160 r = vhost_net_get_fd(options->net_backend); 161 if (r < 0) { 162 goto fail; 163 } 164 net->dev.backend_features = qemu_has_vnet_hdr(options->net_backend) 165 ? 0 : (1ULL << VHOST_NET_F_VIRTIO_NET_HDR); 166 net->backend = r; 167 net->dev.protocol_features = 0; 168 } else { 169 net->dev.backend_features = 0; 170 net->dev.protocol_features = 0; 171 net->backend = -1; 172 173 /* vhost-user needs vq_index to initiate a specific queue pair */ 174 net->dev.vq_index = net->nc->queue_index * net->dev.nvqs; 175 } 176 177 r = vhost_dev_init(&net->dev, options->opaque, 178 options->backend_type, options->busyloop_timeout); 179 if (r < 0) { 180 goto fail; 181 } 182 if (backend_kernel) { 183 if (!qemu_has_vnet_hdr_len(options->net_backend, 184 sizeof(struct virtio_net_hdr_mrg_rxbuf))) { 185 net->dev.features &= ~(1ULL << VIRTIO_NET_F_MRG_RXBUF); 186 } 187 if (~net->dev.features & net->dev.backend_features) { 188 fprintf(stderr, "vhost lacks feature mask %" PRIu64 189 " for backend\n", 190 (uint64_t)(~net->dev.features & net->dev.backend_features)); 191 goto fail; 192 } 193 } 194 195 /* Set sane init value. Override when guest acks. */ 196 if (net->nc->info->type == NET_CLIENT_DRIVER_VHOST_USER) { 197 features = vhost_user_get_acked_features(net->nc); 198 if (~net->dev.features & features) { 199 fprintf(stderr, "vhost lacks feature mask %" PRIu64 200 " for backend\n", 201 (uint64_t)(~net->dev.features & features)); 202 goto fail; 203 } 204 } 205 206 vhost_net_ack_features(net, features); 207 208 return net; 209 210 fail: 211 vhost_dev_cleanup(&net->dev); 212 g_free(net); 213 return NULL; 214 } 215 216 static void vhost_net_set_vq_index(struct vhost_net *net, int vq_index) 217 { 218 net->dev.vq_index = vq_index; 219 } 220 221 static int vhost_net_start_one(struct vhost_net *net, 222 VirtIODevice *dev) 223 { 224 struct vhost_vring_file file = { }; 225 int r; 226 227 net->dev.nvqs = 2; 228 net->dev.vqs = net->vqs; 229 230 r = vhost_dev_enable_notifiers(&net->dev, dev); 231 if (r < 0) { 232 goto fail_notifiers; 233 } 234 235 r = vhost_dev_start(&net->dev, dev); 236 if (r < 0) { 237 goto fail_start; 238 } 239 240 if (net->nc->info->poll) { 241 net->nc->info->poll(net->nc, false); 242 } 243 244 if (net->nc->info->type == NET_CLIENT_DRIVER_TAP) { 245 qemu_set_fd_handler(net->backend, NULL, NULL, NULL); 246 file.fd = net->backend; 247 for (file.index = 0; file.index < net->dev.nvqs; ++file.index) { 248 r = vhost_net_set_backend(&net->dev, &file); 249 if (r < 0) { 250 r = -errno; 251 goto fail; 252 } 253 } 254 } 255 return 0; 256 fail: 257 file.fd = -1; 258 if (net->nc->info->type == NET_CLIENT_DRIVER_TAP) { 259 while (file.index-- > 0) { 260 int r = vhost_net_set_backend(&net->dev, &file); 261 assert(r >= 0); 262 } 263 } 264 if (net->nc->info->poll) { 265 net->nc->info->poll(net->nc, true); 266 } 267 vhost_dev_stop(&net->dev, dev); 268 fail_start: 269 vhost_dev_disable_notifiers(&net->dev, dev); 270 fail_notifiers: 271 return r; 272 } 273 274 static void vhost_net_stop_one(struct vhost_net *net, 275 VirtIODevice *dev) 276 { 277 struct vhost_vring_file file = { .fd = -1 }; 278 279 if (net->nc->info->type == NET_CLIENT_DRIVER_TAP) { 280 for (file.index = 0; file.index < net->dev.nvqs; ++file.index) { 281 int r = vhost_net_set_backend(&net->dev, &file); 282 assert(r >= 0); 283 } 284 } 285 if (net->nc->info->poll) { 286 net->nc->info->poll(net->nc, true); 287 } 288 vhost_dev_stop(&net->dev, dev); 289 vhost_dev_disable_notifiers(&net->dev, dev); 290 } 291 292 int vhost_net_start(VirtIODevice *dev, NetClientState *ncs, 293 int total_queues) 294 { 295 BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(dev))); 296 VirtioBusState *vbus = VIRTIO_BUS(qbus); 297 VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(vbus); 298 int r, e, i; 299 300 if (!k->set_guest_notifiers) { 301 error_report("binding does not support guest notifiers"); 302 return -ENOSYS; 303 } 304 305 for (i = 0; i < total_queues; i++) { 306 struct vhost_net *net; 307 308 net = get_vhost_net(ncs[i].peer); 309 vhost_net_set_vq_index(net, i * 2); 310 311 /* Suppress the masking guest notifiers on vhost user 312 * because vhost user doesn't interrupt masking/unmasking 313 * properly. 314 */ 315 if (net->nc->info->type == NET_CLIENT_DRIVER_VHOST_USER) { 316 dev->use_guest_notifier_mask = false; 317 } 318 } 319 320 r = k->set_guest_notifiers(qbus->parent, total_queues * 2, true); 321 if (r < 0) { 322 error_report("Error binding guest notifier: %d", -r); 323 goto err; 324 } 325 326 for (i = 0; i < total_queues; i++) { 327 r = vhost_net_start_one(get_vhost_net(ncs[i].peer), dev); 328 329 if (r < 0) { 330 goto err_start; 331 } 332 333 if (ncs[i].peer->vring_enable) { 334 /* restore vring enable state */ 335 r = vhost_set_vring_enable(ncs[i].peer, ncs[i].peer->vring_enable); 336 337 if (r < 0) { 338 goto err_start; 339 } 340 } 341 } 342 343 return 0; 344 345 err_start: 346 while (--i >= 0) { 347 vhost_net_stop_one(get_vhost_net(ncs[i].peer), dev); 348 } 349 e = k->set_guest_notifiers(qbus->parent, total_queues * 2, false); 350 if (e < 0) { 351 fprintf(stderr, "vhost guest notifier cleanup failed: %d\n", e); 352 fflush(stderr); 353 } 354 err: 355 return r; 356 } 357 358 void vhost_net_stop(VirtIODevice *dev, NetClientState *ncs, 359 int total_queues) 360 { 361 BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(dev))); 362 VirtioBusState *vbus = VIRTIO_BUS(qbus); 363 VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(vbus); 364 int i, r; 365 366 for (i = 0; i < total_queues; i++) { 367 vhost_net_stop_one(get_vhost_net(ncs[i].peer), dev); 368 } 369 370 r = k->set_guest_notifiers(qbus->parent, total_queues * 2, false); 371 if (r < 0) { 372 fprintf(stderr, "vhost guest notifier cleanup failed: %d\n", r); 373 fflush(stderr); 374 } 375 assert(r >= 0); 376 } 377 378 void vhost_net_cleanup(struct vhost_net *net) 379 { 380 vhost_dev_cleanup(&net->dev); 381 } 382 383 int vhost_net_notify_migration_done(struct vhost_net *net, char* mac_addr) 384 { 385 const VhostOps *vhost_ops = net->dev.vhost_ops; 386 387 assert(vhost_ops->backend_type == VHOST_BACKEND_TYPE_USER); 388 assert(vhost_ops->vhost_migration_done); 389 390 return vhost_ops->vhost_migration_done(&net->dev, mac_addr); 391 } 392 393 bool vhost_net_virtqueue_pending(VHostNetState *net, int idx) 394 { 395 return vhost_virtqueue_pending(&net->dev, idx); 396 } 397 398 void vhost_net_virtqueue_mask(VHostNetState *net, VirtIODevice *dev, 399 int idx, bool mask) 400 { 401 vhost_virtqueue_mask(&net->dev, dev, idx, mask); 402 } 403 404 VHostNetState *get_vhost_net(NetClientState *nc) 405 { 406 VHostNetState *vhost_net = 0; 407 408 if (!nc) { 409 return 0; 410 } 411 412 switch (nc->info->type) { 413 case NET_CLIENT_DRIVER_TAP: 414 vhost_net = tap_get_vhost_net(nc); 415 break; 416 case NET_CLIENT_DRIVER_VHOST_USER: 417 vhost_net = vhost_user_get_vhost_net(nc); 418 assert(vhost_net); 419 break; 420 default: 421 break; 422 } 423 424 return vhost_net; 425 } 426 427 int vhost_set_vring_enable(NetClientState *nc, int enable) 428 { 429 VHostNetState *net = get_vhost_net(nc); 430 const VhostOps *vhost_ops = net->dev.vhost_ops; 431 432 nc->vring_enable = enable; 433 434 if (vhost_ops && vhost_ops->vhost_set_vring_enable) { 435 return vhost_ops->vhost_set_vring_enable(&net->dev, enable); 436 } 437 438 return 0; 439 } 440 441 int vhost_net_set_mtu(struct vhost_net *net, uint16_t mtu) 442 { 443 const VhostOps *vhost_ops = net->dev.vhost_ops; 444 445 if (!vhost_ops->vhost_net_set_mtu) { 446 return 0; 447 } 448 449 return vhost_ops->vhost_net_set_mtu(&net->dev, mtu); 450 } 451 452 #else 453 uint64_t vhost_net_get_max_queues(VHostNetState *net) 454 { 455 return 1; 456 } 457 458 struct vhost_net *vhost_net_init(VhostNetOptions *options) 459 { 460 error_report("vhost-net support is not compiled in"); 461 return NULL; 462 } 463 464 int vhost_net_start(VirtIODevice *dev, 465 NetClientState *ncs, 466 int total_queues) 467 { 468 return -ENOSYS; 469 } 470 void vhost_net_stop(VirtIODevice *dev, 471 NetClientState *ncs, 472 int total_queues) 473 { 474 } 475 476 void vhost_net_cleanup(struct vhost_net *net) 477 { 478 } 479 480 uint64_t vhost_net_get_features(struct vhost_net *net, uint64_t features) 481 { 482 return features; 483 } 484 485 void vhost_net_ack_features(struct vhost_net *net, uint64_t features) 486 { 487 } 488 489 uint64_t vhost_net_get_acked_features(VHostNetState *net) 490 { 491 return 0; 492 } 493 494 bool vhost_net_virtqueue_pending(VHostNetState *net, int idx) 495 { 496 return false; 497 } 498 499 void vhost_net_virtqueue_mask(VHostNetState *net, VirtIODevice *dev, 500 int idx, bool mask) 501 { 502 } 503 504 int vhost_net_notify_migration_done(struct vhost_net *net, char* mac_addr) 505 { 506 return -1; 507 } 508 509 VHostNetState *get_vhost_net(NetClientState *nc) 510 { 511 return 0; 512 } 513 514 int vhost_set_vring_enable(NetClientState *nc, int enable) 515 { 516 return 0; 517 } 518 519 int vhost_net_set_mtu(struct vhost_net *net, uint16_t mtu) 520 { 521 return 0; 522 } 523 #endif 524