1 /* 2 * Virtio Network Device 3 * 4 * Copyright IBM, Corp. 2007 5 * 6 * Authors: 7 * Anthony Liguori <aliguori@us.ibm.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 */ 13 14 #include "qemu/osdep.h" 15 #include "qemu/atomic.h" 16 #include "qemu/iov.h" 17 #include "qemu/log.h" 18 #include "qemu/main-loop.h" 19 #include "qemu/module.h" 20 #include "hw/virtio/virtio.h" 21 #include "net/net.h" 22 #include "net/checksum.h" 23 #include "net/tap.h" 24 #include "qemu/error-report.h" 25 #include "qemu/timer.h" 26 #include "qemu/option.h" 27 #include "qemu/option_int.h" 28 #include "qemu/config-file.h" 29 #include "qapi/qmp/qdict.h" 30 #include "hw/virtio/virtio-net.h" 31 #include "net/vhost_net.h" 32 #include "net/announce.h" 33 #include "hw/virtio/virtio-bus.h" 34 #include "qapi/error.h" 35 #include "qapi/qapi-events-net.h" 36 #include "hw/qdev-properties.h" 37 #include "qapi/qapi-types-migration.h" 38 #include "qapi/qapi-events-migration.h" 39 #include "hw/virtio/virtio-access.h" 40 #include "migration/misc.h" 41 #include "standard-headers/linux/ethtool.h" 42 #include "sysemu/sysemu.h" 43 #include "trace.h" 44 #include "monitor/qdev.h" 45 #include "hw/pci/pci.h" 46 #include "net_rx_pkt.h" 47 #include "hw/virtio/vhost.h" 48 #include "sysemu/qtest.h" 49 50 #define VIRTIO_NET_VM_VERSION 11 51 52 #define MAX_VLAN (1 << 12) /* Per 802.1Q definition */ 53 54 /* previously fixed value */ 55 #define VIRTIO_NET_RX_QUEUE_DEFAULT_SIZE 256 56 #define VIRTIO_NET_TX_QUEUE_DEFAULT_SIZE 256 57 58 /* for now, only allow larger queue_pairs; with virtio-1, guest can downsize */ 59 #define VIRTIO_NET_RX_QUEUE_MIN_SIZE VIRTIO_NET_RX_QUEUE_DEFAULT_SIZE 60 #define VIRTIO_NET_TX_QUEUE_MIN_SIZE VIRTIO_NET_TX_QUEUE_DEFAULT_SIZE 61 62 #define VIRTIO_NET_IP4_ADDR_SIZE 8 /* ipv4 saddr + daddr */ 63 64 #define VIRTIO_NET_TCP_FLAG 0x3F 65 #define VIRTIO_NET_TCP_HDR_LENGTH 0xF000 66 67 /* IPv4 max payload, 16 bits in the header */ 68 #define VIRTIO_NET_MAX_IP4_PAYLOAD (65535 - sizeof(struct ip_header)) 69 #define VIRTIO_NET_MAX_TCP_PAYLOAD 65535 70 71 /* header length value in ip header without option */ 72 #define VIRTIO_NET_IP4_HEADER_LENGTH 5 73 74 #define VIRTIO_NET_IP6_ADDR_SIZE 32 /* ipv6 saddr + daddr */ 75 #define VIRTIO_NET_MAX_IP6_PAYLOAD VIRTIO_NET_MAX_TCP_PAYLOAD 76 77 /* Purge coalesced packets timer interval, This value affects the performance 78 a lot, and should be tuned carefully, '300000'(300us) is the recommended 79 value to pass the WHQL test, '50000' can gain 2x netperf throughput with 80 tso/gso/gro 'off'. */ 81 #define VIRTIO_NET_RSC_DEFAULT_INTERVAL 300000 82 83 #define VIRTIO_NET_RSS_SUPPORTED_HASHES (VIRTIO_NET_RSS_HASH_TYPE_IPv4 | \ 84 VIRTIO_NET_RSS_HASH_TYPE_TCPv4 | \ 85 VIRTIO_NET_RSS_HASH_TYPE_UDPv4 | \ 86 VIRTIO_NET_RSS_HASH_TYPE_IPv6 | \ 87 VIRTIO_NET_RSS_HASH_TYPE_TCPv6 | \ 88 VIRTIO_NET_RSS_HASH_TYPE_UDPv6 | \ 89 VIRTIO_NET_RSS_HASH_TYPE_IP_EX | \ 90 VIRTIO_NET_RSS_HASH_TYPE_TCP_EX | \ 91 VIRTIO_NET_RSS_HASH_TYPE_UDP_EX) 92 93 static const VirtIOFeature feature_sizes[] = { 94 {.flags = 1ULL << VIRTIO_NET_F_MAC, 95 .end = endof(struct virtio_net_config, mac)}, 96 {.flags = 1ULL << VIRTIO_NET_F_STATUS, 97 .end = endof(struct virtio_net_config, status)}, 98 {.flags = 1ULL << VIRTIO_NET_F_MQ, 99 .end = endof(struct virtio_net_config, max_virtqueue_pairs)}, 100 {.flags = 1ULL << VIRTIO_NET_F_MTU, 101 .end = endof(struct virtio_net_config, mtu)}, 102 {.flags = 1ULL << VIRTIO_NET_F_SPEED_DUPLEX, 103 .end = endof(struct virtio_net_config, duplex)}, 104 {.flags = (1ULL << VIRTIO_NET_F_RSS) | (1ULL << VIRTIO_NET_F_HASH_REPORT), 105 .end = endof(struct virtio_net_config, supported_hash_types)}, 106 {} 107 }; 108 109 static const VirtIOConfigSizeParams cfg_size_params = { 110 .min_size = endof(struct virtio_net_config, mac), 111 .max_size = sizeof(struct virtio_net_config), 112 .feature_sizes = feature_sizes 113 }; 114 115 static VirtIONetQueue *virtio_net_get_subqueue(NetClientState *nc) 116 { 117 VirtIONet *n = qemu_get_nic_opaque(nc); 118 119 return &n->vqs[nc->queue_index]; 120 } 121 122 static int vq2q(int queue_index) 123 { 124 return queue_index / 2; 125 } 126 127 static void flush_or_purge_queued_packets(NetClientState *nc) 128 { 129 if (!nc->peer) { 130 return; 131 } 132 133 qemu_flush_or_purge_queued_packets(nc->peer, true); 134 assert(!virtio_net_get_subqueue(nc)->async_tx.elem); 135 } 136 137 /* TODO 138 * - we could suppress RX interrupt if we were so inclined. 139 */ 140 141 static void virtio_net_get_config(VirtIODevice *vdev, uint8_t *config) 142 { 143 VirtIONet *n = VIRTIO_NET(vdev); 144 struct virtio_net_config netcfg; 145 NetClientState *nc = qemu_get_queue(n->nic); 146 static const MACAddr zero = { .a = { 0, 0, 0, 0, 0, 0 } }; 147 148 int ret = 0; 149 memset(&netcfg, 0 , sizeof(struct virtio_net_config)); 150 virtio_stw_p(vdev, &netcfg.status, n->status); 151 virtio_stw_p(vdev, &netcfg.max_virtqueue_pairs, n->max_queue_pairs); 152 virtio_stw_p(vdev, &netcfg.mtu, n->net_conf.mtu); 153 memcpy(netcfg.mac, n->mac, ETH_ALEN); 154 virtio_stl_p(vdev, &netcfg.speed, n->net_conf.speed); 155 netcfg.duplex = n->net_conf.duplex; 156 netcfg.rss_max_key_size = VIRTIO_NET_RSS_MAX_KEY_SIZE; 157 virtio_stw_p(vdev, &netcfg.rss_max_indirection_table_length, 158 virtio_host_has_feature(vdev, VIRTIO_NET_F_RSS) ? 159 VIRTIO_NET_RSS_MAX_TABLE_LEN : 1); 160 virtio_stl_p(vdev, &netcfg.supported_hash_types, 161 VIRTIO_NET_RSS_SUPPORTED_HASHES); 162 memcpy(config, &netcfg, n->config_size); 163 164 /* 165 * Is this VDPA? No peer means not VDPA: there's no way to 166 * disconnect/reconnect a VDPA peer. 167 */ 168 if (nc->peer && nc->peer->info->type == NET_CLIENT_DRIVER_VHOST_VDPA) { 169 ret = vhost_net_get_config(get_vhost_net(nc->peer), (uint8_t *)&netcfg, 170 n->config_size); 171 if (ret != -1) { 172 /* 173 * Some NIC/kernel combinations present 0 as the mac address. As 174 * that is not a legal address, try to proceed with the 175 * address from the QEMU command line in the hope that the 176 * address has been configured correctly elsewhere - just not 177 * reported by the device. 178 */ 179 if (memcmp(&netcfg.mac, &zero, sizeof(zero)) == 0) { 180 info_report("Zero hardware mac address detected. Ignoring."); 181 memcpy(netcfg.mac, n->mac, ETH_ALEN); 182 } 183 memcpy(config, &netcfg, n->config_size); 184 } 185 } 186 } 187 188 static void virtio_net_set_config(VirtIODevice *vdev, const uint8_t *config) 189 { 190 VirtIONet *n = VIRTIO_NET(vdev); 191 struct virtio_net_config netcfg = {}; 192 NetClientState *nc = qemu_get_queue(n->nic); 193 194 memcpy(&netcfg, config, n->config_size); 195 196 if (!virtio_vdev_has_feature(vdev, VIRTIO_NET_F_CTRL_MAC_ADDR) && 197 !virtio_vdev_has_feature(vdev, VIRTIO_F_VERSION_1) && 198 memcmp(netcfg.mac, n->mac, ETH_ALEN)) { 199 memcpy(n->mac, netcfg.mac, ETH_ALEN); 200 qemu_format_nic_info_str(qemu_get_queue(n->nic), n->mac); 201 } 202 203 /* 204 * Is this VDPA? No peer means not VDPA: there's no way to 205 * disconnect/reconnect a VDPA peer. 206 */ 207 if (nc->peer && nc->peer->info->type == NET_CLIENT_DRIVER_VHOST_VDPA) { 208 vhost_net_set_config(get_vhost_net(nc->peer), 209 (uint8_t *)&netcfg, 0, n->config_size, 210 VHOST_SET_CONFIG_TYPE_MASTER); 211 } 212 } 213 214 static bool virtio_net_started(VirtIONet *n, uint8_t status) 215 { 216 VirtIODevice *vdev = VIRTIO_DEVICE(n); 217 return (status & VIRTIO_CONFIG_S_DRIVER_OK) && 218 (n->status & VIRTIO_NET_S_LINK_UP) && vdev->vm_running; 219 } 220 221 static void virtio_net_announce_notify(VirtIONet *net) 222 { 223 VirtIODevice *vdev = VIRTIO_DEVICE(net); 224 trace_virtio_net_announce_notify(); 225 226 net->status |= VIRTIO_NET_S_ANNOUNCE; 227 virtio_notify_config(vdev); 228 } 229 230 static void virtio_net_announce_timer(void *opaque) 231 { 232 VirtIONet *n = opaque; 233 trace_virtio_net_announce_timer(n->announce_timer.round); 234 235 n->announce_timer.round--; 236 virtio_net_announce_notify(n); 237 } 238 239 static void virtio_net_announce(NetClientState *nc) 240 { 241 VirtIONet *n = qemu_get_nic_opaque(nc); 242 VirtIODevice *vdev = VIRTIO_DEVICE(n); 243 244 /* 245 * Make sure the virtio migration announcement timer isn't running 246 * If it is, let it trigger announcement so that we do not cause 247 * confusion. 248 */ 249 if (n->announce_timer.round) { 250 return; 251 } 252 253 if (virtio_vdev_has_feature(vdev, VIRTIO_NET_F_GUEST_ANNOUNCE) && 254 virtio_vdev_has_feature(vdev, VIRTIO_NET_F_CTRL_VQ)) { 255 virtio_net_announce_notify(n); 256 } 257 } 258 259 static void virtio_net_vhost_status(VirtIONet *n, uint8_t status) 260 { 261 VirtIODevice *vdev = VIRTIO_DEVICE(n); 262 NetClientState *nc = qemu_get_queue(n->nic); 263 int queue_pairs = n->multiqueue ? n->max_queue_pairs : 1; 264 int cvq = virtio_vdev_has_feature(vdev, VIRTIO_NET_F_CTRL_VQ) ? 265 n->max_ncs - n->max_queue_pairs : 0; 266 267 if (!get_vhost_net(nc->peer)) { 268 return; 269 } 270 271 if ((virtio_net_started(n, status) && !nc->peer->link_down) == 272 !!n->vhost_started) { 273 return; 274 } 275 if (!n->vhost_started) { 276 int r, i; 277 278 if (n->needs_vnet_hdr_swap) { 279 error_report("backend does not support %s vnet headers; " 280 "falling back on userspace virtio", 281 virtio_is_big_endian(vdev) ? "BE" : "LE"); 282 return; 283 } 284 285 /* Any packets outstanding? Purge them to avoid touching rings 286 * when vhost is running. 287 */ 288 for (i = 0; i < queue_pairs; i++) { 289 NetClientState *qnc = qemu_get_subqueue(n->nic, i); 290 291 /* Purge both directions: TX and RX. */ 292 qemu_net_queue_purge(qnc->peer->incoming_queue, qnc); 293 qemu_net_queue_purge(qnc->incoming_queue, qnc->peer); 294 } 295 296 if (virtio_has_feature(vdev->guest_features, VIRTIO_NET_F_MTU)) { 297 r = vhost_net_set_mtu(get_vhost_net(nc->peer), n->net_conf.mtu); 298 if (r < 0) { 299 error_report("%uBytes MTU not supported by the backend", 300 n->net_conf.mtu); 301 302 return; 303 } 304 } 305 306 n->vhost_started = 1; 307 r = vhost_net_start(vdev, n->nic->ncs, queue_pairs, cvq); 308 if (r < 0) { 309 error_report("unable to start vhost net: %d: " 310 "falling back on userspace virtio", -r); 311 n->vhost_started = 0; 312 } 313 } else { 314 vhost_net_stop(vdev, n->nic->ncs, queue_pairs, cvq); 315 n->vhost_started = 0; 316 } 317 } 318 319 static int virtio_net_set_vnet_endian_one(VirtIODevice *vdev, 320 NetClientState *peer, 321 bool enable) 322 { 323 if (virtio_is_big_endian(vdev)) { 324 return qemu_set_vnet_be(peer, enable); 325 } else { 326 return qemu_set_vnet_le(peer, enable); 327 } 328 } 329 330 static bool virtio_net_set_vnet_endian(VirtIODevice *vdev, NetClientState *ncs, 331 int queue_pairs, bool enable) 332 { 333 int i; 334 335 for (i = 0; i < queue_pairs; i++) { 336 if (virtio_net_set_vnet_endian_one(vdev, ncs[i].peer, enable) < 0 && 337 enable) { 338 while (--i >= 0) { 339 virtio_net_set_vnet_endian_one(vdev, ncs[i].peer, false); 340 } 341 342 return true; 343 } 344 } 345 346 return false; 347 } 348 349 static void virtio_net_vnet_endian_status(VirtIONet *n, uint8_t status) 350 { 351 VirtIODevice *vdev = VIRTIO_DEVICE(n); 352 int queue_pairs = n->multiqueue ? n->max_queue_pairs : 1; 353 354 if (virtio_net_started(n, status)) { 355 /* Before using the device, we tell the network backend about the 356 * endianness to use when parsing vnet headers. If the backend 357 * can't do it, we fallback onto fixing the headers in the core 358 * virtio-net code. 359 */ 360 n->needs_vnet_hdr_swap = virtio_net_set_vnet_endian(vdev, n->nic->ncs, 361 queue_pairs, true); 362 } else if (virtio_net_started(n, vdev->status)) { 363 /* After using the device, we need to reset the network backend to 364 * the default (guest native endianness), otherwise the guest may 365 * lose network connectivity if it is rebooted into a different 366 * endianness. 367 */ 368 virtio_net_set_vnet_endian(vdev, n->nic->ncs, queue_pairs, false); 369 } 370 } 371 372 static void virtio_net_drop_tx_queue_data(VirtIODevice *vdev, VirtQueue *vq) 373 { 374 unsigned int dropped = virtqueue_drop_all(vq); 375 if (dropped) { 376 virtio_notify(vdev, vq); 377 } 378 } 379 380 static void virtio_net_set_status(struct VirtIODevice *vdev, uint8_t status) 381 { 382 VirtIONet *n = VIRTIO_NET(vdev); 383 VirtIONetQueue *q; 384 int i; 385 uint8_t queue_status; 386 387 virtio_net_vnet_endian_status(n, status); 388 virtio_net_vhost_status(n, status); 389 390 for (i = 0; i < n->max_queue_pairs; i++) { 391 NetClientState *ncs = qemu_get_subqueue(n->nic, i); 392 bool queue_started; 393 q = &n->vqs[i]; 394 395 if ((!n->multiqueue && i != 0) || i >= n->curr_queue_pairs) { 396 queue_status = 0; 397 } else { 398 queue_status = status; 399 } 400 queue_started = 401 virtio_net_started(n, queue_status) && !n->vhost_started; 402 403 if (queue_started) { 404 qemu_flush_queued_packets(ncs); 405 } 406 407 if (!q->tx_waiting) { 408 continue; 409 } 410 411 if (queue_started) { 412 if (q->tx_timer) { 413 timer_mod(q->tx_timer, 414 qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + n->tx_timeout); 415 } else { 416 qemu_bh_schedule(q->tx_bh); 417 } 418 } else { 419 if (q->tx_timer) { 420 timer_del(q->tx_timer); 421 } else { 422 qemu_bh_cancel(q->tx_bh); 423 } 424 if ((n->status & VIRTIO_NET_S_LINK_UP) == 0 && 425 (queue_status & VIRTIO_CONFIG_S_DRIVER_OK) && 426 vdev->vm_running) { 427 /* if tx is waiting we are likely have some packets in tx queue 428 * and disabled notification */ 429 q->tx_waiting = 0; 430 virtio_queue_set_notification(q->tx_vq, 1); 431 virtio_net_drop_tx_queue_data(vdev, q->tx_vq); 432 } 433 } 434 } 435 } 436 437 static void virtio_net_set_link_status(NetClientState *nc) 438 { 439 VirtIONet *n = qemu_get_nic_opaque(nc); 440 VirtIODevice *vdev = VIRTIO_DEVICE(n); 441 uint16_t old_status = n->status; 442 443 if (nc->link_down) 444 n->status &= ~VIRTIO_NET_S_LINK_UP; 445 else 446 n->status |= VIRTIO_NET_S_LINK_UP; 447 448 if (n->status != old_status) 449 virtio_notify_config(vdev); 450 451 virtio_net_set_status(vdev, vdev->status); 452 } 453 454 static void rxfilter_notify(NetClientState *nc) 455 { 456 VirtIONet *n = qemu_get_nic_opaque(nc); 457 458 if (nc->rxfilter_notify_enabled) { 459 char *path = object_get_canonical_path(OBJECT(n->qdev)); 460 qapi_event_send_nic_rx_filter_changed(n->netclient_name, path); 461 g_free(path); 462 463 /* disable event notification to avoid events flooding */ 464 nc->rxfilter_notify_enabled = 0; 465 } 466 } 467 468 static intList *get_vlan_table(VirtIONet *n) 469 { 470 intList *list; 471 int i, j; 472 473 list = NULL; 474 for (i = 0; i < MAX_VLAN >> 5; i++) { 475 for (j = 0; n->vlans[i] && j <= 0x1f; j++) { 476 if (n->vlans[i] & (1U << j)) { 477 QAPI_LIST_PREPEND(list, (i << 5) + j); 478 } 479 } 480 } 481 482 return list; 483 } 484 485 static RxFilterInfo *virtio_net_query_rxfilter(NetClientState *nc) 486 { 487 VirtIONet *n = qemu_get_nic_opaque(nc); 488 VirtIODevice *vdev = VIRTIO_DEVICE(n); 489 RxFilterInfo *info; 490 strList *str_list; 491 int i; 492 493 info = g_malloc0(sizeof(*info)); 494 info->name = g_strdup(nc->name); 495 info->promiscuous = n->promisc; 496 497 if (n->nouni) { 498 info->unicast = RX_STATE_NONE; 499 } else if (n->alluni) { 500 info->unicast = RX_STATE_ALL; 501 } else { 502 info->unicast = RX_STATE_NORMAL; 503 } 504 505 if (n->nomulti) { 506 info->multicast = RX_STATE_NONE; 507 } else if (n->allmulti) { 508 info->multicast = RX_STATE_ALL; 509 } else { 510 info->multicast = RX_STATE_NORMAL; 511 } 512 513 info->broadcast_allowed = n->nobcast; 514 info->multicast_overflow = n->mac_table.multi_overflow; 515 info->unicast_overflow = n->mac_table.uni_overflow; 516 517 info->main_mac = qemu_mac_strdup_printf(n->mac); 518 519 str_list = NULL; 520 for (i = 0; i < n->mac_table.first_multi; i++) { 521 QAPI_LIST_PREPEND(str_list, 522 qemu_mac_strdup_printf(n->mac_table.macs + i * ETH_ALEN)); 523 } 524 info->unicast_table = str_list; 525 526 str_list = NULL; 527 for (i = n->mac_table.first_multi; i < n->mac_table.in_use; i++) { 528 QAPI_LIST_PREPEND(str_list, 529 qemu_mac_strdup_printf(n->mac_table.macs + i * ETH_ALEN)); 530 } 531 info->multicast_table = str_list; 532 info->vlan_table = get_vlan_table(n); 533 534 if (!virtio_vdev_has_feature(vdev, VIRTIO_NET_F_CTRL_VLAN)) { 535 info->vlan = RX_STATE_ALL; 536 } else if (!info->vlan_table) { 537 info->vlan = RX_STATE_NONE; 538 } else { 539 info->vlan = RX_STATE_NORMAL; 540 } 541 542 /* enable event notification after query */ 543 nc->rxfilter_notify_enabled = 1; 544 545 return info; 546 } 547 548 static void virtio_net_queue_reset(VirtIODevice *vdev, uint32_t queue_index) 549 { 550 VirtIONet *n = VIRTIO_NET(vdev); 551 NetClientState *nc; 552 553 /* validate queue_index and skip for cvq */ 554 if (queue_index >= n->max_queue_pairs * 2) { 555 return; 556 } 557 558 nc = qemu_get_subqueue(n->nic, vq2q(queue_index)); 559 560 if (!nc->peer) { 561 return; 562 } 563 564 if (get_vhost_net(nc->peer) && 565 nc->peer->info->type == NET_CLIENT_DRIVER_TAP) { 566 vhost_net_virtqueue_reset(vdev, nc, queue_index); 567 } 568 569 flush_or_purge_queued_packets(nc); 570 } 571 572 static void virtio_net_queue_enable(VirtIODevice *vdev, uint32_t queue_index) 573 { 574 VirtIONet *n = VIRTIO_NET(vdev); 575 NetClientState *nc; 576 int r; 577 578 /* validate queue_index and skip for cvq */ 579 if (queue_index >= n->max_queue_pairs * 2) { 580 return; 581 } 582 583 nc = qemu_get_subqueue(n->nic, vq2q(queue_index)); 584 585 if (!nc->peer || !vdev->vhost_started) { 586 return; 587 } 588 589 if (get_vhost_net(nc->peer) && 590 nc->peer->info->type == NET_CLIENT_DRIVER_TAP) { 591 r = vhost_net_virtqueue_restart(vdev, nc, queue_index); 592 if (r < 0) { 593 error_report("unable to restart vhost net virtqueue: %d, " 594 "when resetting the queue", queue_index); 595 } 596 } 597 } 598 599 static void virtio_net_reset(VirtIODevice *vdev) 600 { 601 VirtIONet *n = VIRTIO_NET(vdev); 602 int i; 603 604 /* Reset back to compatibility mode */ 605 n->promisc = 1; 606 n->allmulti = 0; 607 n->alluni = 0; 608 n->nomulti = 0; 609 n->nouni = 0; 610 n->nobcast = 0; 611 /* multiqueue is disabled by default */ 612 n->curr_queue_pairs = 1; 613 timer_del(n->announce_timer.tm); 614 n->announce_timer.round = 0; 615 n->status &= ~VIRTIO_NET_S_ANNOUNCE; 616 617 /* Flush any MAC and VLAN filter table state */ 618 n->mac_table.in_use = 0; 619 n->mac_table.first_multi = 0; 620 n->mac_table.multi_overflow = 0; 621 n->mac_table.uni_overflow = 0; 622 memset(n->mac_table.macs, 0, MAC_TABLE_ENTRIES * ETH_ALEN); 623 memcpy(&n->mac[0], &n->nic->conf->macaddr, sizeof(n->mac)); 624 qemu_format_nic_info_str(qemu_get_queue(n->nic), n->mac); 625 memset(n->vlans, 0, MAX_VLAN >> 3); 626 627 /* Flush any async TX */ 628 for (i = 0; i < n->max_queue_pairs; i++) { 629 flush_or_purge_queued_packets(qemu_get_subqueue(n->nic, i)); 630 } 631 } 632 633 static void peer_test_vnet_hdr(VirtIONet *n) 634 { 635 NetClientState *nc = qemu_get_queue(n->nic); 636 if (!nc->peer) { 637 return; 638 } 639 640 n->has_vnet_hdr = qemu_has_vnet_hdr(nc->peer); 641 } 642 643 static int peer_has_vnet_hdr(VirtIONet *n) 644 { 645 return n->has_vnet_hdr; 646 } 647 648 static int peer_has_ufo(VirtIONet *n) 649 { 650 if (!peer_has_vnet_hdr(n)) 651 return 0; 652 653 n->has_ufo = qemu_has_ufo(qemu_get_queue(n->nic)->peer); 654 655 return n->has_ufo; 656 } 657 658 static void virtio_net_set_mrg_rx_bufs(VirtIONet *n, int mergeable_rx_bufs, 659 int version_1, int hash_report) 660 { 661 int i; 662 NetClientState *nc; 663 664 n->mergeable_rx_bufs = mergeable_rx_bufs; 665 666 if (version_1) { 667 n->guest_hdr_len = hash_report ? 668 sizeof(struct virtio_net_hdr_v1_hash) : 669 sizeof(struct virtio_net_hdr_mrg_rxbuf); 670 n->rss_data.populate_hash = !!hash_report; 671 } else { 672 n->guest_hdr_len = n->mergeable_rx_bufs ? 673 sizeof(struct virtio_net_hdr_mrg_rxbuf) : 674 sizeof(struct virtio_net_hdr); 675 } 676 677 for (i = 0; i < n->max_queue_pairs; i++) { 678 nc = qemu_get_subqueue(n->nic, i); 679 680 if (peer_has_vnet_hdr(n) && 681 qemu_has_vnet_hdr_len(nc->peer, n->guest_hdr_len)) { 682 qemu_set_vnet_hdr_len(nc->peer, n->guest_hdr_len); 683 n->host_hdr_len = n->guest_hdr_len; 684 } 685 } 686 } 687 688 static int virtio_net_max_tx_queue_size(VirtIONet *n) 689 { 690 NetClientState *peer = n->nic_conf.peers.ncs[0]; 691 692 /* 693 * Backends other than vhost-user or vhost-vdpa don't support max queue 694 * size. 695 */ 696 if (!peer) { 697 return VIRTIO_NET_TX_QUEUE_DEFAULT_SIZE; 698 } 699 700 switch(peer->info->type) { 701 case NET_CLIENT_DRIVER_VHOST_USER: 702 case NET_CLIENT_DRIVER_VHOST_VDPA: 703 return VIRTQUEUE_MAX_SIZE; 704 default: 705 return VIRTIO_NET_TX_QUEUE_DEFAULT_SIZE; 706 }; 707 } 708 709 static int peer_attach(VirtIONet *n, int index) 710 { 711 NetClientState *nc = qemu_get_subqueue(n->nic, index); 712 713 if (!nc->peer) { 714 return 0; 715 } 716 717 if (nc->peer->info->type == NET_CLIENT_DRIVER_VHOST_USER) { 718 vhost_set_vring_enable(nc->peer, 1); 719 } 720 721 if (nc->peer->info->type != NET_CLIENT_DRIVER_TAP) { 722 return 0; 723 } 724 725 if (n->max_queue_pairs == 1) { 726 return 0; 727 } 728 729 return tap_enable(nc->peer); 730 } 731 732 static int peer_detach(VirtIONet *n, int index) 733 { 734 NetClientState *nc = qemu_get_subqueue(n->nic, index); 735 736 if (!nc->peer) { 737 return 0; 738 } 739 740 if (nc->peer->info->type == NET_CLIENT_DRIVER_VHOST_USER) { 741 vhost_set_vring_enable(nc->peer, 0); 742 } 743 744 if (nc->peer->info->type != NET_CLIENT_DRIVER_TAP) { 745 return 0; 746 } 747 748 return tap_disable(nc->peer); 749 } 750 751 static void virtio_net_set_queue_pairs(VirtIONet *n) 752 { 753 int i; 754 int r; 755 756 if (n->nic->peer_deleted) { 757 return; 758 } 759 760 for (i = 0; i < n->max_queue_pairs; i++) { 761 if (i < n->curr_queue_pairs) { 762 r = peer_attach(n, i); 763 assert(!r); 764 } else { 765 r = peer_detach(n, i); 766 assert(!r); 767 } 768 } 769 } 770 771 static void virtio_net_set_multiqueue(VirtIONet *n, int multiqueue); 772 773 static uint64_t virtio_net_get_features(VirtIODevice *vdev, uint64_t features, 774 Error **errp) 775 { 776 VirtIONet *n = VIRTIO_NET(vdev); 777 NetClientState *nc = qemu_get_queue(n->nic); 778 779 /* Firstly sync all virtio-net possible supported features */ 780 features |= n->host_features; 781 782 virtio_add_feature(&features, VIRTIO_NET_F_MAC); 783 784 if (!peer_has_vnet_hdr(n)) { 785 virtio_clear_feature(&features, VIRTIO_NET_F_CSUM); 786 virtio_clear_feature(&features, VIRTIO_NET_F_HOST_TSO4); 787 virtio_clear_feature(&features, VIRTIO_NET_F_HOST_TSO6); 788 virtio_clear_feature(&features, VIRTIO_NET_F_HOST_ECN); 789 790 virtio_clear_feature(&features, VIRTIO_NET_F_GUEST_CSUM); 791 virtio_clear_feature(&features, VIRTIO_NET_F_GUEST_TSO4); 792 virtio_clear_feature(&features, VIRTIO_NET_F_GUEST_TSO6); 793 virtio_clear_feature(&features, VIRTIO_NET_F_GUEST_ECN); 794 795 virtio_clear_feature(&features, VIRTIO_NET_F_HASH_REPORT); 796 } 797 798 if (!peer_has_vnet_hdr(n) || !peer_has_ufo(n)) { 799 virtio_clear_feature(&features, VIRTIO_NET_F_GUEST_UFO); 800 virtio_clear_feature(&features, VIRTIO_NET_F_HOST_UFO); 801 } 802 803 if (!get_vhost_net(nc->peer)) { 804 virtio_add_feature(&features, VIRTIO_F_RING_RESET); 805 return features; 806 } 807 808 if (!ebpf_rss_is_loaded(&n->ebpf_rss)) { 809 virtio_clear_feature(&features, VIRTIO_NET_F_RSS); 810 } 811 features = vhost_net_get_features(get_vhost_net(nc->peer), features); 812 vdev->backend_features = features; 813 814 if (n->mtu_bypass_backend && 815 (n->host_features & 1ULL << VIRTIO_NET_F_MTU)) { 816 features |= (1ULL << VIRTIO_NET_F_MTU); 817 } 818 819 return features; 820 } 821 822 static uint64_t virtio_net_bad_features(VirtIODevice *vdev) 823 { 824 uint64_t features = 0; 825 826 /* Linux kernel 2.6.25. It understood MAC (as everyone must), 827 * but also these: */ 828 virtio_add_feature(&features, VIRTIO_NET_F_MAC); 829 virtio_add_feature(&features, VIRTIO_NET_F_CSUM); 830 virtio_add_feature(&features, VIRTIO_NET_F_HOST_TSO4); 831 virtio_add_feature(&features, VIRTIO_NET_F_HOST_TSO6); 832 virtio_add_feature(&features, VIRTIO_NET_F_HOST_ECN); 833 834 return features; 835 } 836 837 static void virtio_net_apply_guest_offloads(VirtIONet *n) 838 { 839 qemu_set_offload(qemu_get_queue(n->nic)->peer, 840 !!(n->curr_guest_offloads & (1ULL << VIRTIO_NET_F_GUEST_CSUM)), 841 !!(n->curr_guest_offloads & (1ULL << VIRTIO_NET_F_GUEST_TSO4)), 842 !!(n->curr_guest_offloads & (1ULL << VIRTIO_NET_F_GUEST_TSO6)), 843 !!(n->curr_guest_offloads & (1ULL << VIRTIO_NET_F_GUEST_ECN)), 844 !!(n->curr_guest_offloads & (1ULL << VIRTIO_NET_F_GUEST_UFO))); 845 } 846 847 static uint64_t virtio_net_guest_offloads_by_features(uint32_t features) 848 { 849 static const uint64_t guest_offloads_mask = 850 (1ULL << VIRTIO_NET_F_GUEST_CSUM) | 851 (1ULL << VIRTIO_NET_F_GUEST_TSO4) | 852 (1ULL << VIRTIO_NET_F_GUEST_TSO6) | 853 (1ULL << VIRTIO_NET_F_GUEST_ECN) | 854 (1ULL << VIRTIO_NET_F_GUEST_UFO); 855 856 return guest_offloads_mask & features; 857 } 858 859 static inline uint64_t virtio_net_supported_guest_offloads(VirtIONet *n) 860 { 861 VirtIODevice *vdev = VIRTIO_DEVICE(n); 862 return virtio_net_guest_offloads_by_features(vdev->guest_features); 863 } 864 865 typedef struct { 866 VirtIONet *n; 867 DeviceState *dev; 868 } FailoverDevice; 869 870 /** 871 * Set the failover primary device 872 * 873 * @opaque: FailoverId to setup 874 * @opts: opts for device we are handling 875 * @errp: returns an error if this function fails 876 */ 877 static int failover_set_primary(DeviceState *dev, void *opaque) 878 { 879 FailoverDevice *fdev = opaque; 880 PCIDevice *pci_dev = (PCIDevice *) 881 object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE); 882 883 if (!pci_dev) { 884 return 0; 885 } 886 887 if (!g_strcmp0(pci_dev->failover_pair_id, fdev->n->netclient_name)) { 888 fdev->dev = dev; 889 return 1; 890 } 891 892 return 0; 893 } 894 895 /** 896 * Find the primary device for this failover virtio-net 897 * 898 * @n: VirtIONet device 899 * @errp: returns an error if this function fails 900 */ 901 static DeviceState *failover_find_primary_device(VirtIONet *n) 902 { 903 FailoverDevice fdev = { 904 .n = n, 905 }; 906 907 qbus_walk_children(sysbus_get_default(), failover_set_primary, NULL, 908 NULL, NULL, &fdev); 909 return fdev.dev; 910 } 911 912 static void failover_add_primary(VirtIONet *n, Error **errp) 913 { 914 Error *err = NULL; 915 DeviceState *dev = failover_find_primary_device(n); 916 917 if (dev) { 918 return; 919 } 920 921 if (!n->primary_opts) { 922 error_setg(errp, "Primary device not found"); 923 error_append_hint(errp, "Virtio-net failover will not work. Make " 924 "sure primary device has parameter" 925 " failover_pair_id=%s\n", n->netclient_name); 926 return; 927 } 928 929 dev = qdev_device_add_from_qdict(n->primary_opts, 930 n->primary_opts_from_json, 931 &err); 932 if (err) { 933 qobject_unref(n->primary_opts); 934 n->primary_opts = NULL; 935 } else { 936 object_unref(OBJECT(dev)); 937 } 938 error_propagate(errp, err); 939 } 940 941 static void virtio_net_set_features(VirtIODevice *vdev, uint64_t features) 942 { 943 VirtIONet *n = VIRTIO_NET(vdev); 944 Error *err = NULL; 945 int i; 946 947 if (n->mtu_bypass_backend && 948 !virtio_has_feature(vdev->backend_features, VIRTIO_NET_F_MTU)) { 949 features &= ~(1ULL << VIRTIO_NET_F_MTU); 950 } 951 952 virtio_net_set_multiqueue(n, 953 virtio_has_feature(features, VIRTIO_NET_F_RSS) || 954 virtio_has_feature(features, VIRTIO_NET_F_MQ)); 955 956 virtio_net_set_mrg_rx_bufs(n, 957 virtio_has_feature(features, 958 VIRTIO_NET_F_MRG_RXBUF), 959 virtio_has_feature(features, 960 VIRTIO_F_VERSION_1), 961 virtio_has_feature(features, 962 VIRTIO_NET_F_HASH_REPORT)); 963 964 n->rsc4_enabled = virtio_has_feature(features, VIRTIO_NET_F_RSC_EXT) && 965 virtio_has_feature(features, VIRTIO_NET_F_GUEST_TSO4); 966 n->rsc6_enabled = virtio_has_feature(features, VIRTIO_NET_F_RSC_EXT) && 967 virtio_has_feature(features, VIRTIO_NET_F_GUEST_TSO6); 968 n->rss_data.redirect = virtio_has_feature(features, VIRTIO_NET_F_RSS); 969 970 if (n->has_vnet_hdr) { 971 n->curr_guest_offloads = 972 virtio_net_guest_offloads_by_features(features); 973 virtio_net_apply_guest_offloads(n); 974 } 975 976 for (i = 0; i < n->max_queue_pairs; i++) { 977 NetClientState *nc = qemu_get_subqueue(n->nic, i); 978 979 if (!get_vhost_net(nc->peer)) { 980 continue; 981 } 982 vhost_net_ack_features(get_vhost_net(nc->peer), features); 983 } 984 985 if (virtio_has_feature(features, VIRTIO_NET_F_CTRL_VLAN)) { 986 memset(n->vlans, 0, MAX_VLAN >> 3); 987 } else { 988 memset(n->vlans, 0xff, MAX_VLAN >> 3); 989 } 990 991 if (virtio_has_feature(features, VIRTIO_NET_F_STANDBY)) { 992 qapi_event_send_failover_negotiated(n->netclient_name); 993 qatomic_set(&n->failover_primary_hidden, false); 994 failover_add_primary(n, &err); 995 if (err) { 996 if (!qtest_enabled()) { 997 warn_report_err(err); 998 } else { 999 error_free(err); 1000 } 1001 } 1002 } 1003 } 1004 1005 static int virtio_net_handle_rx_mode(VirtIONet *n, uint8_t cmd, 1006 struct iovec *iov, unsigned int iov_cnt) 1007 { 1008 uint8_t on; 1009 size_t s; 1010 NetClientState *nc = qemu_get_queue(n->nic); 1011 1012 s = iov_to_buf(iov, iov_cnt, 0, &on, sizeof(on)); 1013 if (s != sizeof(on)) { 1014 return VIRTIO_NET_ERR; 1015 } 1016 1017 if (cmd == VIRTIO_NET_CTRL_RX_PROMISC) { 1018 n->promisc = on; 1019 } else if (cmd == VIRTIO_NET_CTRL_RX_ALLMULTI) { 1020 n->allmulti = on; 1021 } else if (cmd == VIRTIO_NET_CTRL_RX_ALLUNI) { 1022 n->alluni = on; 1023 } else if (cmd == VIRTIO_NET_CTRL_RX_NOMULTI) { 1024 n->nomulti = on; 1025 } else if (cmd == VIRTIO_NET_CTRL_RX_NOUNI) { 1026 n->nouni = on; 1027 } else if (cmd == VIRTIO_NET_CTRL_RX_NOBCAST) { 1028 n->nobcast = on; 1029 } else { 1030 return VIRTIO_NET_ERR; 1031 } 1032 1033 rxfilter_notify(nc); 1034 1035 return VIRTIO_NET_OK; 1036 } 1037 1038 static int virtio_net_handle_offloads(VirtIONet *n, uint8_t cmd, 1039 struct iovec *iov, unsigned int iov_cnt) 1040 { 1041 VirtIODevice *vdev = VIRTIO_DEVICE(n); 1042 uint64_t offloads; 1043 size_t s; 1044 1045 if (!virtio_vdev_has_feature(vdev, VIRTIO_NET_F_CTRL_GUEST_OFFLOADS)) { 1046 return VIRTIO_NET_ERR; 1047 } 1048 1049 s = iov_to_buf(iov, iov_cnt, 0, &offloads, sizeof(offloads)); 1050 if (s != sizeof(offloads)) { 1051 return VIRTIO_NET_ERR; 1052 } 1053 1054 if (cmd == VIRTIO_NET_CTRL_GUEST_OFFLOADS_SET) { 1055 uint64_t supported_offloads; 1056 1057 offloads = virtio_ldq_p(vdev, &offloads); 1058 1059 if (!n->has_vnet_hdr) { 1060 return VIRTIO_NET_ERR; 1061 } 1062 1063 n->rsc4_enabled = virtio_has_feature(offloads, VIRTIO_NET_F_RSC_EXT) && 1064 virtio_has_feature(offloads, VIRTIO_NET_F_GUEST_TSO4); 1065 n->rsc6_enabled = virtio_has_feature(offloads, VIRTIO_NET_F_RSC_EXT) && 1066 virtio_has_feature(offloads, VIRTIO_NET_F_GUEST_TSO6); 1067 virtio_clear_feature(&offloads, VIRTIO_NET_F_RSC_EXT); 1068 1069 supported_offloads = virtio_net_supported_guest_offloads(n); 1070 if (offloads & ~supported_offloads) { 1071 return VIRTIO_NET_ERR; 1072 } 1073 1074 n->curr_guest_offloads = offloads; 1075 virtio_net_apply_guest_offloads(n); 1076 1077 return VIRTIO_NET_OK; 1078 } else { 1079 return VIRTIO_NET_ERR; 1080 } 1081 } 1082 1083 static int virtio_net_handle_mac(VirtIONet *n, uint8_t cmd, 1084 struct iovec *iov, unsigned int iov_cnt) 1085 { 1086 VirtIODevice *vdev = VIRTIO_DEVICE(n); 1087 struct virtio_net_ctrl_mac mac_data; 1088 size_t s; 1089 NetClientState *nc = qemu_get_queue(n->nic); 1090 1091 if (cmd == VIRTIO_NET_CTRL_MAC_ADDR_SET) { 1092 if (iov_size(iov, iov_cnt) != sizeof(n->mac)) { 1093 return VIRTIO_NET_ERR; 1094 } 1095 s = iov_to_buf(iov, iov_cnt, 0, &n->mac, sizeof(n->mac)); 1096 assert(s == sizeof(n->mac)); 1097 qemu_format_nic_info_str(qemu_get_queue(n->nic), n->mac); 1098 rxfilter_notify(nc); 1099 1100 return VIRTIO_NET_OK; 1101 } 1102 1103 if (cmd != VIRTIO_NET_CTRL_MAC_TABLE_SET) { 1104 return VIRTIO_NET_ERR; 1105 } 1106 1107 int in_use = 0; 1108 int first_multi = 0; 1109 uint8_t uni_overflow = 0; 1110 uint8_t multi_overflow = 0; 1111 uint8_t *macs = g_malloc0(MAC_TABLE_ENTRIES * ETH_ALEN); 1112 1113 s = iov_to_buf(iov, iov_cnt, 0, &mac_data.entries, 1114 sizeof(mac_data.entries)); 1115 mac_data.entries = virtio_ldl_p(vdev, &mac_data.entries); 1116 if (s != sizeof(mac_data.entries)) { 1117 goto error; 1118 } 1119 iov_discard_front(&iov, &iov_cnt, s); 1120 1121 if (mac_data.entries * ETH_ALEN > iov_size(iov, iov_cnt)) { 1122 goto error; 1123 } 1124 1125 if (mac_data.entries <= MAC_TABLE_ENTRIES) { 1126 s = iov_to_buf(iov, iov_cnt, 0, macs, 1127 mac_data.entries * ETH_ALEN); 1128 if (s != mac_data.entries * ETH_ALEN) { 1129 goto error; 1130 } 1131 in_use += mac_data.entries; 1132 } else { 1133 uni_overflow = 1; 1134 } 1135 1136 iov_discard_front(&iov, &iov_cnt, mac_data.entries * ETH_ALEN); 1137 1138 first_multi = in_use; 1139 1140 s = iov_to_buf(iov, iov_cnt, 0, &mac_data.entries, 1141 sizeof(mac_data.entries)); 1142 mac_data.entries = virtio_ldl_p(vdev, &mac_data.entries); 1143 if (s != sizeof(mac_data.entries)) { 1144 goto error; 1145 } 1146 1147 iov_discard_front(&iov, &iov_cnt, s); 1148 1149 if (mac_data.entries * ETH_ALEN != iov_size(iov, iov_cnt)) { 1150 goto error; 1151 } 1152 1153 if (mac_data.entries <= MAC_TABLE_ENTRIES - in_use) { 1154 s = iov_to_buf(iov, iov_cnt, 0, &macs[in_use * ETH_ALEN], 1155 mac_data.entries * ETH_ALEN); 1156 if (s != mac_data.entries * ETH_ALEN) { 1157 goto error; 1158 } 1159 in_use += mac_data.entries; 1160 } else { 1161 multi_overflow = 1; 1162 } 1163 1164 n->mac_table.in_use = in_use; 1165 n->mac_table.first_multi = first_multi; 1166 n->mac_table.uni_overflow = uni_overflow; 1167 n->mac_table.multi_overflow = multi_overflow; 1168 memcpy(n->mac_table.macs, macs, MAC_TABLE_ENTRIES * ETH_ALEN); 1169 g_free(macs); 1170 rxfilter_notify(nc); 1171 1172 return VIRTIO_NET_OK; 1173 1174 error: 1175 g_free(macs); 1176 return VIRTIO_NET_ERR; 1177 } 1178 1179 static int virtio_net_handle_vlan_table(VirtIONet *n, uint8_t cmd, 1180 struct iovec *iov, unsigned int iov_cnt) 1181 { 1182 VirtIODevice *vdev = VIRTIO_DEVICE(n); 1183 uint16_t vid; 1184 size_t s; 1185 NetClientState *nc = qemu_get_queue(n->nic); 1186 1187 s = iov_to_buf(iov, iov_cnt, 0, &vid, sizeof(vid)); 1188 vid = virtio_lduw_p(vdev, &vid); 1189 if (s != sizeof(vid)) { 1190 return VIRTIO_NET_ERR; 1191 } 1192 1193 if (vid >= MAX_VLAN) 1194 return VIRTIO_NET_ERR; 1195 1196 if (cmd == VIRTIO_NET_CTRL_VLAN_ADD) 1197 n->vlans[vid >> 5] |= (1U << (vid & 0x1f)); 1198 else if (cmd == VIRTIO_NET_CTRL_VLAN_DEL) 1199 n->vlans[vid >> 5] &= ~(1U << (vid & 0x1f)); 1200 else 1201 return VIRTIO_NET_ERR; 1202 1203 rxfilter_notify(nc); 1204 1205 return VIRTIO_NET_OK; 1206 } 1207 1208 static int virtio_net_handle_announce(VirtIONet *n, uint8_t cmd, 1209 struct iovec *iov, unsigned int iov_cnt) 1210 { 1211 trace_virtio_net_handle_announce(n->announce_timer.round); 1212 if (cmd == VIRTIO_NET_CTRL_ANNOUNCE_ACK && 1213 n->status & VIRTIO_NET_S_ANNOUNCE) { 1214 n->status &= ~VIRTIO_NET_S_ANNOUNCE; 1215 if (n->announce_timer.round) { 1216 qemu_announce_timer_step(&n->announce_timer); 1217 } 1218 return VIRTIO_NET_OK; 1219 } else { 1220 return VIRTIO_NET_ERR; 1221 } 1222 } 1223 1224 static void virtio_net_detach_epbf_rss(VirtIONet *n); 1225 1226 static void virtio_net_disable_rss(VirtIONet *n) 1227 { 1228 if (n->rss_data.enabled) { 1229 trace_virtio_net_rss_disable(); 1230 } 1231 n->rss_data.enabled = false; 1232 1233 virtio_net_detach_epbf_rss(n); 1234 } 1235 1236 static bool virtio_net_attach_ebpf_to_backend(NICState *nic, int prog_fd) 1237 { 1238 NetClientState *nc = qemu_get_peer(qemu_get_queue(nic), 0); 1239 if (nc == NULL || nc->info->set_steering_ebpf == NULL) { 1240 return false; 1241 } 1242 1243 return nc->info->set_steering_ebpf(nc, prog_fd); 1244 } 1245 1246 static void rss_data_to_rss_config(struct VirtioNetRssData *data, 1247 struct EBPFRSSConfig *config) 1248 { 1249 config->redirect = data->redirect; 1250 config->populate_hash = data->populate_hash; 1251 config->hash_types = data->hash_types; 1252 config->indirections_len = data->indirections_len; 1253 config->default_queue = data->default_queue; 1254 } 1255 1256 static bool virtio_net_attach_epbf_rss(VirtIONet *n) 1257 { 1258 struct EBPFRSSConfig config = {}; 1259 1260 if (!ebpf_rss_is_loaded(&n->ebpf_rss)) { 1261 return false; 1262 } 1263 1264 rss_data_to_rss_config(&n->rss_data, &config); 1265 1266 if (!ebpf_rss_set_all(&n->ebpf_rss, &config, 1267 n->rss_data.indirections_table, n->rss_data.key)) { 1268 return false; 1269 } 1270 1271 if (!virtio_net_attach_ebpf_to_backend(n->nic, n->ebpf_rss.program_fd)) { 1272 return false; 1273 } 1274 1275 return true; 1276 } 1277 1278 static void virtio_net_detach_epbf_rss(VirtIONet *n) 1279 { 1280 virtio_net_attach_ebpf_to_backend(n->nic, -1); 1281 } 1282 1283 static bool virtio_net_load_ebpf(VirtIONet *n) 1284 { 1285 if (!virtio_net_attach_ebpf_to_backend(n->nic, -1)) { 1286 /* backend does't support steering ebpf */ 1287 return false; 1288 } 1289 1290 return ebpf_rss_load(&n->ebpf_rss); 1291 } 1292 1293 static void virtio_net_unload_ebpf(VirtIONet *n) 1294 { 1295 virtio_net_attach_ebpf_to_backend(n->nic, -1); 1296 ebpf_rss_unload(&n->ebpf_rss); 1297 } 1298 1299 static uint16_t virtio_net_handle_rss(VirtIONet *n, 1300 struct iovec *iov, 1301 unsigned int iov_cnt, 1302 bool do_rss) 1303 { 1304 VirtIODevice *vdev = VIRTIO_DEVICE(n); 1305 struct virtio_net_rss_config cfg; 1306 size_t s, offset = 0, size_get; 1307 uint16_t queue_pairs, i; 1308 struct { 1309 uint16_t us; 1310 uint8_t b; 1311 } QEMU_PACKED temp; 1312 const char *err_msg = ""; 1313 uint32_t err_value = 0; 1314 1315 if (do_rss && !virtio_vdev_has_feature(vdev, VIRTIO_NET_F_RSS)) { 1316 err_msg = "RSS is not negotiated"; 1317 goto error; 1318 } 1319 if (!do_rss && !virtio_vdev_has_feature(vdev, VIRTIO_NET_F_HASH_REPORT)) { 1320 err_msg = "Hash report is not negotiated"; 1321 goto error; 1322 } 1323 size_get = offsetof(struct virtio_net_rss_config, indirection_table); 1324 s = iov_to_buf(iov, iov_cnt, offset, &cfg, size_get); 1325 if (s != size_get) { 1326 err_msg = "Short command buffer"; 1327 err_value = (uint32_t)s; 1328 goto error; 1329 } 1330 n->rss_data.hash_types = virtio_ldl_p(vdev, &cfg.hash_types); 1331 n->rss_data.indirections_len = 1332 virtio_lduw_p(vdev, &cfg.indirection_table_mask); 1333 n->rss_data.indirections_len++; 1334 if (!do_rss) { 1335 n->rss_data.indirections_len = 1; 1336 } 1337 if (!is_power_of_2(n->rss_data.indirections_len)) { 1338 err_msg = "Invalid size of indirection table"; 1339 err_value = n->rss_data.indirections_len; 1340 goto error; 1341 } 1342 if (n->rss_data.indirections_len > VIRTIO_NET_RSS_MAX_TABLE_LEN) { 1343 err_msg = "Too large indirection table"; 1344 err_value = n->rss_data.indirections_len; 1345 goto error; 1346 } 1347 n->rss_data.default_queue = do_rss ? 1348 virtio_lduw_p(vdev, &cfg.unclassified_queue) : 0; 1349 if (n->rss_data.default_queue >= n->max_queue_pairs) { 1350 err_msg = "Invalid default queue"; 1351 err_value = n->rss_data.default_queue; 1352 goto error; 1353 } 1354 offset += size_get; 1355 size_get = sizeof(uint16_t) * n->rss_data.indirections_len; 1356 g_free(n->rss_data.indirections_table); 1357 n->rss_data.indirections_table = g_malloc(size_get); 1358 if (!n->rss_data.indirections_table) { 1359 err_msg = "Can't allocate indirections table"; 1360 err_value = n->rss_data.indirections_len; 1361 goto error; 1362 } 1363 s = iov_to_buf(iov, iov_cnt, offset, 1364 n->rss_data.indirections_table, size_get); 1365 if (s != size_get) { 1366 err_msg = "Short indirection table buffer"; 1367 err_value = (uint32_t)s; 1368 goto error; 1369 } 1370 for (i = 0; i < n->rss_data.indirections_len; ++i) { 1371 uint16_t val = n->rss_data.indirections_table[i]; 1372 n->rss_data.indirections_table[i] = virtio_lduw_p(vdev, &val); 1373 } 1374 offset += size_get; 1375 size_get = sizeof(temp); 1376 s = iov_to_buf(iov, iov_cnt, offset, &temp, size_get); 1377 if (s != size_get) { 1378 err_msg = "Can't get queue_pairs"; 1379 err_value = (uint32_t)s; 1380 goto error; 1381 } 1382 queue_pairs = do_rss ? virtio_lduw_p(vdev, &temp.us) : n->curr_queue_pairs; 1383 if (queue_pairs == 0 || queue_pairs > n->max_queue_pairs) { 1384 err_msg = "Invalid number of queue_pairs"; 1385 err_value = queue_pairs; 1386 goto error; 1387 } 1388 if (temp.b > VIRTIO_NET_RSS_MAX_KEY_SIZE) { 1389 err_msg = "Invalid key size"; 1390 err_value = temp.b; 1391 goto error; 1392 } 1393 if (!temp.b && n->rss_data.hash_types) { 1394 err_msg = "No key provided"; 1395 err_value = 0; 1396 goto error; 1397 } 1398 if (!temp.b && !n->rss_data.hash_types) { 1399 virtio_net_disable_rss(n); 1400 return queue_pairs; 1401 } 1402 offset += size_get; 1403 size_get = temp.b; 1404 s = iov_to_buf(iov, iov_cnt, offset, n->rss_data.key, size_get); 1405 if (s != size_get) { 1406 err_msg = "Can get key buffer"; 1407 err_value = (uint32_t)s; 1408 goto error; 1409 } 1410 n->rss_data.enabled = true; 1411 1412 if (!n->rss_data.populate_hash) { 1413 if (!virtio_net_attach_epbf_rss(n)) { 1414 /* EBPF must be loaded for vhost */ 1415 if (get_vhost_net(qemu_get_queue(n->nic)->peer)) { 1416 warn_report("Can't load eBPF RSS for vhost"); 1417 goto error; 1418 } 1419 /* fallback to software RSS */ 1420 warn_report("Can't load eBPF RSS - fallback to software RSS"); 1421 n->rss_data.enabled_software_rss = true; 1422 } 1423 } else { 1424 /* use software RSS for hash populating */ 1425 /* and detach eBPF if was loaded before */ 1426 virtio_net_detach_epbf_rss(n); 1427 n->rss_data.enabled_software_rss = true; 1428 } 1429 1430 trace_virtio_net_rss_enable(n->rss_data.hash_types, 1431 n->rss_data.indirections_len, 1432 temp.b); 1433 return queue_pairs; 1434 error: 1435 trace_virtio_net_rss_error(err_msg, err_value); 1436 virtio_net_disable_rss(n); 1437 return 0; 1438 } 1439 1440 static int virtio_net_handle_mq(VirtIONet *n, uint8_t cmd, 1441 struct iovec *iov, unsigned int iov_cnt) 1442 { 1443 VirtIODevice *vdev = VIRTIO_DEVICE(n); 1444 uint16_t queue_pairs; 1445 NetClientState *nc = qemu_get_queue(n->nic); 1446 1447 virtio_net_disable_rss(n); 1448 if (cmd == VIRTIO_NET_CTRL_MQ_HASH_CONFIG) { 1449 queue_pairs = virtio_net_handle_rss(n, iov, iov_cnt, false); 1450 return queue_pairs ? VIRTIO_NET_OK : VIRTIO_NET_ERR; 1451 } 1452 if (cmd == VIRTIO_NET_CTRL_MQ_RSS_CONFIG) { 1453 queue_pairs = virtio_net_handle_rss(n, iov, iov_cnt, true); 1454 } else if (cmd == VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET) { 1455 struct virtio_net_ctrl_mq mq; 1456 size_t s; 1457 if (!virtio_vdev_has_feature(vdev, VIRTIO_NET_F_MQ)) { 1458 return VIRTIO_NET_ERR; 1459 } 1460 s = iov_to_buf(iov, iov_cnt, 0, &mq, sizeof(mq)); 1461 if (s != sizeof(mq)) { 1462 return VIRTIO_NET_ERR; 1463 } 1464 queue_pairs = virtio_lduw_p(vdev, &mq.virtqueue_pairs); 1465 1466 } else { 1467 return VIRTIO_NET_ERR; 1468 } 1469 1470 if (queue_pairs < VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MIN || 1471 queue_pairs > VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MAX || 1472 queue_pairs > n->max_queue_pairs || 1473 !n->multiqueue) { 1474 return VIRTIO_NET_ERR; 1475 } 1476 1477 n->curr_queue_pairs = queue_pairs; 1478 if (nc->peer && nc->peer->info->type == NET_CLIENT_DRIVER_VHOST_VDPA) { 1479 /* 1480 * Avoid updating the backend for a vdpa device: We're only interested 1481 * in updating the device model queues. 1482 */ 1483 return VIRTIO_NET_OK; 1484 } 1485 /* stop the backend before changing the number of queue_pairs to avoid handling a 1486 * disabled queue */ 1487 virtio_net_set_status(vdev, vdev->status); 1488 virtio_net_set_queue_pairs(n); 1489 1490 return VIRTIO_NET_OK; 1491 } 1492 1493 size_t virtio_net_handle_ctrl_iov(VirtIODevice *vdev, 1494 const struct iovec *in_sg, unsigned in_num, 1495 const struct iovec *out_sg, 1496 unsigned out_num) 1497 { 1498 VirtIONet *n = VIRTIO_NET(vdev); 1499 struct virtio_net_ctrl_hdr ctrl; 1500 virtio_net_ctrl_ack status = VIRTIO_NET_ERR; 1501 size_t s; 1502 struct iovec *iov, *iov2; 1503 1504 if (iov_size(in_sg, in_num) < sizeof(status) || 1505 iov_size(out_sg, out_num) < sizeof(ctrl)) { 1506 virtio_error(vdev, "virtio-net ctrl missing headers"); 1507 return 0; 1508 } 1509 1510 iov2 = iov = g_memdup2(out_sg, sizeof(struct iovec) * out_num); 1511 s = iov_to_buf(iov, out_num, 0, &ctrl, sizeof(ctrl)); 1512 iov_discard_front(&iov, &out_num, sizeof(ctrl)); 1513 if (s != sizeof(ctrl)) { 1514 status = VIRTIO_NET_ERR; 1515 } else if (ctrl.class == VIRTIO_NET_CTRL_RX) { 1516 status = virtio_net_handle_rx_mode(n, ctrl.cmd, iov, out_num); 1517 } else if (ctrl.class == VIRTIO_NET_CTRL_MAC) { 1518 status = virtio_net_handle_mac(n, ctrl.cmd, iov, out_num); 1519 } else if (ctrl.class == VIRTIO_NET_CTRL_VLAN) { 1520 status = virtio_net_handle_vlan_table(n, ctrl.cmd, iov, out_num); 1521 } else if (ctrl.class == VIRTIO_NET_CTRL_ANNOUNCE) { 1522 status = virtio_net_handle_announce(n, ctrl.cmd, iov, out_num); 1523 } else if (ctrl.class == VIRTIO_NET_CTRL_MQ) { 1524 status = virtio_net_handle_mq(n, ctrl.cmd, iov, out_num); 1525 } else if (ctrl.class == VIRTIO_NET_CTRL_GUEST_OFFLOADS) { 1526 status = virtio_net_handle_offloads(n, ctrl.cmd, iov, out_num); 1527 } 1528 1529 s = iov_from_buf(in_sg, in_num, 0, &status, sizeof(status)); 1530 assert(s == sizeof(status)); 1531 1532 g_free(iov2); 1533 return sizeof(status); 1534 } 1535 1536 static void virtio_net_handle_ctrl(VirtIODevice *vdev, VirtQueue *vq) 1537 { 1538 VirtQueueElement *elem; 1539 1540 for (;;) { 1541 size_t written; 1542 elem = virtqueue_pop(vq, sizeof(VirtQueueElement)); 1543 if (!elem) { 1544 break; 1545 } 1546 1547 written = virtio_net_handle_ctrl_iov(vdev, elem->in_sg, elem->in_num, 1548 elem->out_sg, elem->out_num); 1549 if (written > 0) { 1550 virtqueue_push(vq, elem, written); 1551 virtio_notify(vdev, vq); 1552 g_free(elem); 1553 } else { 1554 virtqueue_detach_element(vq, elem, 0); 1555 g_free(elem); 1556 break; 1557 } 1558 } 1559 } 1560 1561 /* RX */ 1562 1563 static void virtio_net_handle_rx(VirtIODevice *vdev, VirtQueue *vq) 1564 { 1565 VirtIONet *n = VIRTIO_NET(vdev); 1566 int queue_index = vq2q(virtio_get_queue_index(vq)); 1567 1568 qemu_flush_queued_packets(qemu_get_subqueue(n->nic, queue_index)); 1569 } 1570 1571 static bool virtio_net_can_receive(NetClientState *nc) 1572 { 1573 VirtIONet *n = qemu_get_nic_opaque(nc); 1574 VirtIODevice *vdev = VIRTIO_DEVICE(n); 1575 VirtIONetQueue *q = virtio_net_get_subqueue(nc); 1576 1577 if (!vdev->vm_running) { 1578 return false; 1579 } 1580 1581 if (nc->queue_index >= n->curr_queue_pairs) { 1582 return false; 1583 } 1584 1585 if (!virtio_queue_ready(q->rx_vq) || 1586 !(vdev->status & VIRTIO_CONFIG_S_DRIVER_OK)) { 1587 return false; 1588 } 1589 1590 return true; 1591 } 1592 1593 static int virtio_net_has_buffers(VirtIONetQueue *q, int bufsize) 1594 { 1595 VirtIONet *n = q->n; 1596 if (virtio_queue_empty(q->rx_vq) || 1597 (n->mergeable_rx_bufs && 1598 !virtqueue_avail_bytes(q->rx_vq, bufsize, 0))) { 1599 virtio_queue_set_notification(q->rx_vq, 1); 1600 1601 /* To avoid a race condition where the guest has made some buffers 1602 * available after the above check but before notification was 1603 * enabled, check for available buffers again. 1604 */ 1605 if (virtio_queue_empty(q->rx_vq) || 1606 (n->mergeable_rx_bufs && 1607 !virtqueue_avail_bytes(q->rx_vq, bufsize, 0))) { 1608 return 0; 1609 } 1610 } 1611 1612 virtio_queue_set_notification(q->rx_vq, 0); 1613 return 1; 1614 } 1615 1616 static void virtio_net_hdr_swap(VirtIODevice *vdev, struct virtio_net_hdr *hdr) 1617 { 1618 virtio_tswap16s(vdev, &hdr->hdr_len); 1619 virtio_tswap16s(vdev, &hdr->gso_size); 1620 virtio_tswap16s(vdev, &hdr->csum_start); 1621 virtio_tswap16s(vdev, &hdr->csum_offset); 1622 } 1623 1624 /* dhclient uses AF_PACKET but doesn't pass auxdata to the kernel so 1625 * it never finds out that the packets don't have valid checksums. This 1626 * causes dhclient to get upset. Fedora's carried a patch for ages to 1627 * fix this with Xen but it hasn't appeared in an upstream release of 1628 * dhclient yet. 1629 * 1630 * To avoid breaking existing guests, we catch udp packets and add 1631 * checksums. This is terrible but it's better than hacking the guest 1632 * kernels. 1633 * 1634 * N.B. if we introduce a zero-copy API, this operation is no longer free so 1635 * we should provide a mechanism to disable it to avoid polluting the host 1636 * cache. 1637 */ 1638 static void work_around_broken_dhclient(struct virtio_net_hdr *hdr, 1639 uint8_t *buf, size_t size) 1640 { 1641 if ((hdr->flags & VIRTIO_NET_HDR_F_NEEDS_CSUM) && /* missing csum */ 1642 (size > 27 && size < 1500) && /* normal sized MTU */ 1643 (buf[12] == 0x08 && buf[13] == 0x00) && /* ethertype == IPv4 */ 1644 (buf[23] == 17) && /* ip.protocol == UDP */ 1645 (buf[34] == 0 && buf[35] == 67)) { /* udp.srcport == bootps */ 1646 net_checksum_calculate(buf, size, CSUM_UDP); 1647 hdr->flags &= ~VIRTIO_NET_HDR_F_NEEDS_CSUM; 1648 } 1649 } 1650 1651 static void receive_header(VirtIONet *n, const struct iovec *iov, int iov_cnt, 1652 const void *buf, size_t size) 1653 { 1654 if (n->has_vnet_hdr) { 1655 /* FIXME this cast is evil */ 1656 void *wbuf = (void *)buf; 1657 work_around_broken_dhclient(wbuf, wbuf + n->host_hdr_len, 1658 size - n->host_hdr_len); 1659 1660 if (n->needs_vnet_hdr_swap) { 1661 virtio_net_hdr_swap(VIRTIO_DEVICE(n), wbuf); 1662 } 1663 iov_from_buf(iov, iov_cnt, 0, buf, sizeof(struct virtio_net_hdr)); 1664 } else { 1665 struct virtio_net_hdr hdr = { 1666 .flags = 0, 1667 .gso_type = VIRTIO_NET_HDR_GSO_NONE 1668 }; 1669 iov_from_buf(iov, iov_cnt, 0, &hdr, sizeof hdr); 1670 } 1671 } 1672 1673 static int receive_filter(VirtIONet *n, const uint8_t *buf, int size) 1674 { 1675 static const uint8_t bcast[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; 1676 static const uint8_t vlan[] = {0x81, 0x00}; 1677 uint8_t *ptr = (uint8_t *)buf; 1678 int i; 1679 1680 if (n->promisc) 1681 return 1; 1682 1683 ptr += n->host_hdr_len; 1684 1685 if (!memcmp(&ptr[12], vlan, sizeof(vlan))) { 1686 int vid = lduw_be_p(ptr + 14) & 0xfff; 1687 if (!(n->vlans[vid >> 5] & (1U << (vid & 0x1f)))) 1688 return 0; 1689 } 1690 1691 if (ptr[0] & 1) { // multicast 1692 if (!memcmp(ptr, bcast, sizeof(bcast))) { 1693 return !n->nobcast; 1694 } else if (n->nomulti) { 1695 return 0; 1696 } else if (n->allmulti || n->mac_table.multi_overflow) { 1697 return 1; 1698 } 1699 1700 for (i = n->mac_table.first_multi; i < n->mac_table.in_use; i++) { 1701 if (!memcmp(ptr, &n->mac_table.macs[i * ETH_ALEN], ETH_ALEN)) { 1702 return 1; 1703 } 1704 } 1705 } else { // unicast 1706 if (n->nouni) { 1707 return 0; 1708 } else if (n->alluni || n->mac_table.uni_overflow) { 1709 return 1; 1710 } else if (!memcmp(ptr, n->mac, ETH_ALEN)) { 1711 return 1; 1712 } 1713 1714 for (i = 0; i < n->mac_table.first_multi; i++) { 1715 if (!memcmp(ptr, &n->mac_table.macs[i * ETH_ALEN], ETH_ALEN)) { 1716 return 1; 1717 } 1718 } 1719 } 1720 1721 return 0; 1722 } 1723 1724 static uint8_t virtio_net_get_hash_type(bool isip4, 1725 bool isip6, 1726 bool isudp, 1727 bool istcp, 1728 uint32_t types) 1729 { 1730 if (isip4) { 1731 if (istcp && (types & VIRTIO_NET_RSS_HASH_TYPE_TCPv4)) { 1732 return NetPktRssIpV4Tcp; 1733 } 1734 if (isudp && (types & VIRTIO_NET_RSS_HASH_TYPE_UDPv4)) { 1735 return NetPktRssIpV4Udp; 1736 } 1737 if (types & VIRTIO_NET_RSS_HASH_TYPE_IPv4) { 1738 return NetPktRssIpV4; 1739 } 1740 } else if (isip6) { 1741 uint32_t mask = VIRTIO_NET_RSS_HASH_TYPE_TCP_EX | 1742 VIRTIO_NET_RSS_HASH_TYPE_TCPv6; 1743 1744 if (istcp && (types & mask)) { 1745 return (types & VIRTIO_NET_RSS_HASH_TYPE_TCP_EX) ? 1746 NetPktRssIpV6TcpEx : NetPktRssIpV6Tcp; 1747 } 1748 mask = VIRTIO_NET_RSS_HASH_TYPE_UDP_EX | VIRTIO_NET_RSS_HASH_TYPE_UDPv6; 1749 if (isudp && (types & mask)) { 1750 return (types & VIRTIO_NET_RSS_HASH_TYPE_UDP_EX) ? 1751 NetPktRssIpV6UdpEx : NetPktRssIpV6Udp; 1752 } 1753 mask = VIRTIO_NET_RSS_HASH_TYPE_IP_EX | VIRTIO_NET_RSS_HASH_TYPE_IPv6; 1754 if (types & mask) { 1755 return (types & VIRTIO_NET_RSS_HASH_TYPE_IP_EX) ? 1756 NetPktRssIpV6Ex : NetPktRssIpV6; 1757 } 1758 } 1759 return 0xff; 1760 } 1761 1762 static void virtio_set_packet_hash(const uint8_t *buf, uint8_t report, 1763 uint32_t hash) 1764 { 1765 struct virtio_net_hdr_v1_hash *hdr = (void *)buf; 1766 hdr->hash_value = hash; 1767 hdr->hash_report = report; 1768 } 1769 1770 static int virtio_net_process_rss(NetClientState *nc, const uint8_t *buf, 1771 size_t size) 1772 { 1773 VirtIONet *n = qemu_get_nic_opaque(nc); 1774 unsigned int index = nc->queue_index, new_index = index; 1775 struct NetRxPkt *pkt = n->rx_pkt; 1776 uint8_t net_hash_type; 1777 uint32_t hash; 1778 bool isip4, isip6, isudp, istcp; 1779 static const uint8_t reports[NetPktRssIpV6UdpEx + 1] = { 1780 VIRTIO_NET_HASH_REPORT_IPv4, 1781 VIRTIO_NET_HASH_REPORT_TCPv4, 1782 VIRTIO_NET_HASH_REPORT_TCPv6, 1783 VIRTIO_NET_HASH_REPORT_IPv6, 1784 VIRTIO_NET_HASH_REPORT_IPv6_EX, 1785 VIRTIO_NET_HASH_REPORT_TCPv6_EX, 1786 VIRTIO_NET_HASH_REPORT_UDPv4, 1787 VIRTIO_NET_HASH_REPORT_UDPv6, 1788 VIRTIO_NET_HASH_REPORT_UDPv6_EX 1789 }; 1790 1791 net_rx_pkt_set_protocols(pkt, buf + n->host_hdr_len, 1792 size - n->host_hdr_len); 1793 net_rx_pkt_get_protocols(pkt, &isip4, &isip6, &isudp, &istcp); 1794 if (isip4 && (net_rx_pkt_get_ip4_info(pkt)->fragment)) { 1795 istcp = isudp = false; 1796 } 1797 if (isip6 && (net_rx_pkt_get_ip6_info(pkt)->fragment)) { 1798 istcp = isudp = false; 1799 } 1800 net_hash_type = virtio_net_get_hash_type(isip4, isip6, isudp, istcp, 1801 n->rss_data.hash_types); 1802 if (net_hash_type > NetPktRssIpV6UdpEx) { 1803 if (n->rss_data.populate_hash) { 1804 virtio_set_packet_hash(buf, VIRTIO_NET_HASH_REPORT_NONE, 0); 1805 } 1806 return n->rss_data.redirect ? n->rss_data.default_queue : -1; 1807 } 1808 1809 hash = net_rx_pkt_calc_rss_hash(pkt, net_hash_type, n->rss_data.key); 1810 1811 if (n->rss_data.populate_hash) { 1812 virtio_set_packet_hash(buf, reports[net_hash_type], hash); 1813 } 1814 1815 if (n->rss_data.redirect) { 1816 new_index = hash & (n->rss_data.indirections_len - 1); 1817 new_index = n->rss_data.indirections_table[new_index]; 1818 } 1819 1820 return (index == new_index) ? -1 : new_index; 1821 } 1822 1823 static ssize_t virtio_net_receive_rcu(NetClientState *nc, const uint8_t *buf, 1824 size_t size, bool no_rss) 1825 { 1826 VirtIONet *n = qemu_get_nic_opaque(nc); 1827 VirtIONetQueue *q = virtio_net_get_subqueue(nc); 1828 VirtIODevice *vdev = VIRTIO_DEVICE(n); 1829 VirtQueueElement *elems[VIRTQUEUE_MAX_SIZE]; 1830 size_t lens[VIRTQUEUE_MAX_SIZE]; 1831 struct iovec mhdr_sg[VIRTQUEUE_MAX_SIZE]; 1832 struct virtio_net_hdr_mrg_rxbuf mhdr; 1833 unsigned mhdr_cnt = 0; 1834 size_t offset, i, guest_offset, j; 1835 ssize_t err; 1836 1837 if (!virtio_net_can_receive(nc)) { 1838 return -1; 1839 } 1840 1841 if (!no_rss && n->rss_data.enabled && n->rss_data.enabled_software_rss) { 1842 int index = virtio_net_process_rss(nc, buf, size); 1843 if (index >= 0) { 1844 NetClientState *nc2 = qemu_get_subqueue(n->nic, index); 1845 return virtio_net_receive_rcu(nc2, buf, size, true); 1846 } 1847 } 1848 1849 /* hdr_len refers to the header we supply to the guest */ 1850 if (!virtio_net_has_buffers(q, size + n->guest_hdr_len - n->host_hdr_len)) { 1851 return 0; 1852 } 1853 1854 if (!receive_filter(n, buf, size)) 1855 return size; 1856 1857 offset = i = 0; 1858 1859 while (offset < size) { 1860 VirtQueueElement *elem; 1861 int len, total; 1862 const struct iovec *sg; 1863 1864 total = 0; 1865 1866 if (i == VIRTQUEUE_MAX_SIZE) { 1867 virtio_error(vdev, "virtio-net unexpected long buffer chain"); 1868 err = size; 1869 goto err; 1870 } 1871 1872 elem = virtqueue_pop(q->rx_vq, sizeof(VirtQueueElement)); 1873 if (!elem) { 1874 if (i) { 1875 virtio_error(vdev, "virtio-net unexpected empty queue: " 1876 "i %zd mergeable %d offset %zd, size %zd, " 1877 "guest hdr len %zd, host hdr len %zd " 1878 "guest features 0x%" PRIx64, 1879 i, n->mergeable_rx_bufs, offset, size, 1880 n->guest_hdr_len, n->host_hdr_len, 1881 vdev->guest_features); 1882 } 1883 err = -1; 1884 goto err; 1885 } 1886 1887 if (elem->in_num < 1) { 1888 virtio_error(vdev, 1889 "virtio-net receive queue contains no in buffers"); 1890 virtqueue_detach_element(q->rx_vq, elem, 0); 1891 g_free(elem); 1892 err = -1; 1893 goto err; 1894 } 1895 1896 sg = elem->in_sg; 1897 if (i == 0) { 1898 assert(offset == 0); 1899 if (n->mergeable_rx_bufs) { 1900 mhdr_cnt = iov_copy(mhdr_sg, ARRAY_SIZE(mhdr_sg), 1901 sg, elem->in_num, 1902 offsetof(typeof(mhdr), num_buffers), 1903 sizeof(mhdr.num_buffers)); 1904 } 1905 1906 receive_header(n, sg, elem->in_num, buf, size); 1907 if (n->rss_data.populate_hash) { 1908 offset = sizeof(mhdr); 1909 iov_from_buf(sg, elem->in_num, offset, 1910 buf + offset, n->host_hdr_len - sizeof(mhdr)); 1911 } 1912 offset = n->host_hdr_len; 1913 total += n->guest_hdr_len; 1914 guest_offset = n->guest_hdr_len; 1915 } else { 1916 guest_offset = 0; 1917 } 1918 1919 /* copy in packet. ugh */ 1920 len = iov_from_buf(sg, elem->in_num, guest_offset, 1921 buf + offset, size - offset); 1922 total += len; 1923 offset += len; 1924 /* If buffers can't be merged, at this point we 1925 * must have consumed the complete packet. 1926 * Otherwise, drop it. */ 1927 if (!n->mergeable_rx_bufs && offset < size) { 1928 virtqueue_unpop(q->rx_vq, elem, total); 1929 g_free(elem); 1930 err = size; 1931 goto err; 1932 } 1933 1934 elems[i] = elem; 1935 lens[i] = total; 1936 i++; 1937 } 1938 1939 if (mhdr_cnt) { 1940 virtio_stw_p(vdev, &mhdr.num_buffers, i); 1941 iov_from_buf(mhdr_sg, mhdr_cnt, 1942 0, 1943 &mhdr.num_buffers, sizeof mhdr.num_buffers); 1944 } 1945 1946 for (j = 0; j < i; j++) { 1947 /* signal other side */ 1948 virtqueue_fill(q->rx_vq, elems[j], lens[j], j); 1949 g_free(elems[j]); 1950 } 1951 1952 virtqueue_flush(q->rx_vq, i); 1953 virtio_notify(vdev, q->rx_vq); 1954 1955 return size; 1956 1957 err: 1958 for (j = 0; j < i; j++) { 1959 virtqueue_detach_element(q->rx_vq, elems[j], lens[j]); 1960 g_free(elems[j]); 1961 } 1962 1963 return err; 1964 } 1965 1966 static ssize_t virtio_net_do_receive(NetClientState *nc, const uint8_t *buf, 1967 size_t size) 1968 { 1969 RCU_READ_LOCK_GUARD(); 1970 1971 return virtio_net_receive_rcu(nc, buf, size, false); 1972 } 1973 1974 static void virtio_net_rsc_extract_unit4(VirtioNetRscChain *chain, 1975 const uint8_t *buf, 1976 VirtioNetRscUnit *unit) 1977 { 1978 uint16_t ip_hdrlen; 1979 struct ip_header *ip; 1980 1981 ip = (struct ip_header *)(buf + chain->n->guest_hdr_len 1982 + sizeof(struct eth_header)); 1983 unit->ip = (void *)ip; 1984 ip_hdrlen = (ip->ip_ver_len & 0xF) << 2; 1985 unit->ip_plen = &ip->ip_len; 1986 unit->tcp = (struct tcp_header *)(((uint8_t *)unit->ip) + ip_hdrlen); 1987 unit->tcp_hdrlen = (htons(unit->tcp->th_offset_flags) & 0xF000) >> 10; 1988 unit->payload = htons(*unit->ip_plen) - ip_hdrlen - unit->tcp_hdrlen; 1989 } 1990 1991 static void virtio_net_rsc_extract_unit6(VirtioNetRscChain *chain, 1992 const uint8_t *buf, 1993 VirtioNetRscUnit *unit) 1994 { 1995 struct ip6_header *ip6; 1996 1997 ip6 = (struct ip6_header *)(buf + chain->n->guest_hdr_len 1998 + sizeof(struct eth_header)); 1999 unit->ip = ip6; 2000 unit->ip_plen = &(ip6->ip6_ctlun.ip6_un1.ip6_un1_plen); 2001 unit->tcp = (struct tcp_header *)(((uint8_t *)unit->ip) 2002 + sizeof(struct ip6_header)); 2003 unit->tcp_hdrlen = (htons(unit->tcp->th_offset_flags) & 0xF000) >> 10; 2004 2005 /* There is a difference between payload lenght in ipv4 and v6, 2006 ip header is excluded in ipv6 */ 2007 unit->payload = htons(*unit->ip_plen) - unit->tcp_hdrlen; 2008 } 2009 2010 static size_t virtio_net_rsc_drain_seg(VirtioNetRscChain *chain, 2011 VirtioNetRscSeg *seg) 2012 { 2013 int ret; 2014 struct virtio_net_hdr_v1 *h; 2015 2016 h = (struct virtio_net_hdr_v1 *)seg->buf; 2017 h->flags = 0; 2018 h->gso_type = VIRTIO_NET_HDR_GSO_NONE; 2019 2020 if (seg->is_coalesced) { 2021 h->rsc.segments = seg->packets; 2022 h->rsc.dup_acks = seg->dup_ack; 2023 h->flags = VIRTIO_NET_HDR_F_RSC_INFO; 2024 if (chain->proto == ETH_P_IP) { 2025 h->gso_type = VIRTIO_NET_HDR_GSO_TCPV4; 2026 } else { 2027 h->gso_type = VIRTIO_NET_HDR_GSO_TCPV6; 2028 } 2029 } 2030 2031 ret = virtio_net_do_receive(seg->nc, seg->buf, seg->size); 2032 QTAILQ_REMOVE(&chain->buffers, seg, next); 2033 g_free(seg->buf); 2034 g_free(seg); 2035 2036 return ret; 2037 } 2038 2039 static void virtio_net_rsc_purge(void *opq) 2040 { 2041 VirtioNetRscSeg *seg, *rn; 2042 VirtioNetRscChain *chain = (VirtioNetRscChain *)opq; 2043 2044 QTAILQ_FOREACH_SAFE(seg, &chain->buffers, next, rn) { 2045 if (virtio_net_rsc_drain_seg(chain, seg) == 0) { 2046 chain->stat.purge_failed++; 2047 continue; 2048 } 2049 } 2050 2051 chain->stat.timer++; 2052 if (!QTAILQ_EMPTY(&chain->buffers)) { 2053 timer_mod(chain->drain_timer, 2054 qemu_clock_get_ns(QEMU_CLOCK_HOST) + chain->n->rsc_timeout); 2055 } 2056 } 2057 2058 static void virtio_net_rsc_cleanup(VirtIONet *n) 2059 { 2060 VirtioNetRscChain *chain, *rn_chain; 2061 VirtioNetRscSeg *seg, *rn_seg; 2062 2063 QTAILQ_FOREACH_SAFE(chain, &n->rsc_chains, next, rn_chain) { 2064 QTAILQ_FOREACH_SAFE(seg, &chain->buffers, next, rn_seg) { 2065 QTAILQ_REMOVE(&chain->buffers, seg, next); 2066 g_free(seg->buf); 2067 g_free(seg); 2068 } 2069 2070 timer_free(chain->drain_timer); 2071 QTAILQ_REMOVE(&n->rsc_chains, chain, next); 2072 g_free(chain); 2073 } 2074 } 2075 2076 static void virtio_net_rsc_cache_buf(VirtioNetRscChain *chain, 2077 NetClientState *nc, 2078 const uint8_t *buf, size_t size) 2079 { 2080 uint16_t hdr_len; 2081 VirtioNetRscSeg *seg; 2082 2083 hdr_len = chain->n->guest_hdr_len; 2084 seg = g_new(VirtioNetRscSeg, 1); 2085 seg->buf = g_malloc(hdr_len + sizeof(struct eth_header) 2086 + sizeof(struct ip6_header) + VIRTIO_NET_MAX_TCP_PAYLOAD); 2087 memcpy(seg->buf, buf, size); 2088 seg->size = size; 2089 seg->packets = 1; 2090 seg->dup_ack = 0; 2091 seg->is_coalesced = 0; 2092 seg->nc = nc; 2093 2094 QTAILQ_INSERT_TAIL(&chain->buffers, seg, next); 2095 chain->stat.cache++; 2096 2097 switch (chain->proto) { 2098 case ETH_P_IP: 2099 virtio_net_rsc_extract_unit4(chain, seg->buf, &seg->unit); 2100 break; 2101 case ETH_P_IPV6: 2102 virtio_net_rsc_extract_unit6(chain, seg->buf, &seg->unit); 2103 break; 2104 default: 2105 g_assert_not_reached(); 2106 } 2107 } 2108 2109 static int32_t virtio_net_rsc_handle_ack(VirtioNetRscChain *chain, 2110 VirtioNetRscSeg *seg, 2111 const uint8_t *buf, 2112 struct tcp_header *n_tcp, 2113 struct tcp_header *o_tcp) 2114 { 2115 uint32_t nack, oack; 2116 uint16_t nwin, owin; 2117 2118 nack = htonl(n_tcp->th_ack); 2119 nwin = htons(n_tcp->th_win); 2120 oack = htonl(o_tcp->th_ack); 2121 owin = htons(o_tcp->th_win); 2122 2123 if ((nack - oack) >= VIRTIO_NET_MAX_TCP_PAYLOAD) { 2124 chain->stat.ack_out_of_win++; 2125 return RSC_FINAL; 2126 } else if (nack == oack) { 2127 /* duplicated ack or window probe */ 2128 if (nwin == owin) { 2129 /* duplicated ack, add dup ack count due to whql test up to 1 */ 2130 chain->stat.dup_ack++; 2131 return RSC_FINAL; 2132 } else { 2133 /* Coalesce window update */ 2134 o_tcp->th_win = n_tcp->th_win; 2135 chain->stat.win_update++; 2136 return RSC_COALESCE; 2137 } 2138 } else { 2139 /* pure ack, go to 'C', finalize*/ 2140 chain->stat.pure_ack++; 2141 return RSC_FINAL; 2142 } 2143 } 2144 2145 static int32_t virtio_net_rsc_coalesce_data(VirtioNetRscChain *chain, 2146 VirtioNetRscSeg *seg, 2147 const uint8_t *buf, 2148 VirtioNetRscUnit *n_unit) 2149 { 2150 void *data; 2151 uint16_t o_ip_len; 2152 uint32_t nseq, oseq; 2153 VirtioNetRscUnit *o_unit; 2154 2155 o_unit = &seg->unit; 2156 o_ip_len = htons(*o_unit->ip_plen); 2157 nseq = htonl(n_unit->tcp->th_seq); 2158 oseq = htonl(o_unit->tcp->th_seq); 2159 2160 /* out of order or retransmitted. */ 2161 if ((nseq - oseq) > VIRTIO_NET_MAX_TCP_PAYLOAD) { 2162 chain->stat.data_out_of_win++; 2163 return RSC_FINAL; 2164 } 2165 2166 data = ((uint8_t *)n_unit->tcp) + n_unit->tcp_hdrlen; 2167 if (nseq == oseq) { 2168 if ((o_unit->payload == 0) && n_unit->payload) { 2169 /* From no payload to payload, normal case, not a dup ack or etc */ 2170 chain->stat.data_after_pure_ack++; 2171 goto coalesce; 2172 } else { 2173 return virtio_net_rsc_handle_ack(chain, seg, buf, 2174 n_unit->tcp, o_unit->tcp); 2175 } 2176 } else if ((nseq - oseq) != o_unit->payload) { 2177 /* Not a consistent packet, out of order */ 2178 chain->stat.data_out_of_order++; 2179 return RSC_FINAL; 2180 } else { 2181 coalesce: 2182 if ((o_ip_len + n_unit->payload) > chain->max_payload) { 2183 chain->stat.over_size++; 2184 return RSC_FINAL; 2185 } 2186 2187 /* Here comes the right data, the payload length in v4/v6 is different, 2188 so use the field value to update and record the new data len */ 2189 o_unit->payload += n_unit->payload; /* update new data len */ 2190 2191 /* update field in ip header */ 2192 *o_unit->ip_plen = htons(o_ip_len + n_unit->payload); 2193 2194 /* Bring 'PUSH' big, the whql test guide says 'PUSH' can be coalesced 2195 for windows guest, while this may change the behavior for linux 2196 guest (only if it uses RSC feature). */ 2197 o_unit->tcp->th_offset_flags = n_unit->tcp->th_offset_flags; 2198 2199 o_unit->tcp->th_ack = n_unit->tcp->th_ack; 2200 o_unit->tcp->th_win = n_unit->tcp->th_win; 2201 2202 memmove(seg->buf + seg->size, data, n_unit->payload); 2203 seg->size += n_unit->payload; 2204 seg->packets++; 2205 chain->stat.coalesced++; 2206 return RSC_COALESCE; 2207 } 2208 } 2209 2210 static int32_t virtio_net_rsc_coalesce4(VirtioNetRscChain *chain, 2211 VirtioNetRscSeg *seg, 2212 const uint8_t *buf, size_t size, 2213 VirtioNetRscUnit *unit) 2214 { 2215 struct ip_header *ip1, *ip2; 2216 2217 ip1 = (struct ip_header *)(unit->ip); 2218 ip2 = (struct ip_header *)(seg->unit.ip); 2219 if ((ip1->ip_src ^ ip2->ip_src) || (ip1->ip_dst ^ ip2->ip_dst) 2220 || (unit->tcp->th_sport ^ seg->unit.tcp->th_sport) 2221 || (unit->tcp->th_dport ^ seg->unit.tcp->th_dport)) { 2222 chain->stat.no_match++; 2223 return RSC_NO_MATCH; 2224 } 2225 2226 return virtio_net_rsc_coalesce_data(chain, seg, buf, unit); 2227 } 2228 2229 static int32_t virtio_net_rsc_coalesce6(VirtioNetRscChain *chain, 2230 VirtioNetRscSeg *seg, 2231 const uint8_t *buf, size_t size, 2232 VirtioNetRscUnit *unit) 2233 { 2234 struct ip6_header *ip1, *ip2; 2235 2236 ip1 = (struct ip6_header *)(unit->ip); 2237 ip2 = (struct ip6_header *)(seg->unit.ip); 2238 if (memcmp(&ip1->ip6_src, &ip2->ip6_src, sizeof(struct in6_address)) 2239 || memcmp(&ip1->ip6_dst, &ip2->ip6_dst, sizeof(struct in6_address)) 2240 || (unit->tcp->th_sport ^ seg->unit.tcp->th_sport) 2241 || (unit->tcp->th_dport ^ seg->unit.tcp->th_dport)) { 2242 chain->stat.no_match++; 2243 return RSC_NO_MATCH; 2244 } 2245 2246 return virtio_net_rsc_coalesce_data(chain, seg, buf, unit); 2247 } 2248 2249 /* Packets with 'SYN' should bypass, other flag should be sent after drain 2250 * to prevent out of order */ 2251 static int virtio_net_rsc_tcp_ctrl_check(VirtioNetRscChain *chain, 2252 struct tcp_header *tcp) 2253 { 2254 uint16_t tcp_hdr; 2255 uint16_t tcp_flag; 2256 2257 tcp_flag = htons(tcp->th_offset_flags); 2258 tcp_hdr = (tcp_flag & VIRTIO_NET_TCP_HDR_LENGTH) >> 10; 2259 tcp_flag &= VIRTIO_NET_TCP_FLAG; 2260 if (tcp_flag & TH_SYN) { 2261 chain->stat.tcp_syn++; 2262 return RSC_BYPASS; 2263 } 2264 2265 if (tcp_flag & (TH_FIN | TH_URG | TH_RST | TH_ECE | TH_CWR)) { 2266 chain->stat.tcp_ctrl_drain++; 2267 return RSC_FINAL; 2268 } 2269 2270 if (tcp_hdr > sizeof(struct tcp_header)) { 2271 chain->stat.tcp_all_opt++; 2272 return RSC_FINAL; 2273 } 2274 2275 return RSC_CANDIDATE; 2276 } 2277 2278 static size_t virtio_net_rsc_do_coalesce(VirtioNetRscChain *chain, 2279 NetClientState *nc, 2280 const uint8_t *buf, size_t size, 2281 VirtioNetRscUnit *unit) 2282 { 2283 int ret; 2284 VirtioNetRscSeg *seg, *nseg; 2285 2286 if (QTAILQ_EMPTY(&chain->buffers)) { 2287 chain->stat.empty_cache++; 2288 virtio_net_rsc_cache_buf(chain, nc, buf, size); 2289 timer_mod(chain->drain_timer, 2290 qemu_clock_get_ns(QEMU_CLOCK_HOST) + chain->n->rsc_timeout); 2291 return size; 2292 } 2293 2294 QTAILQ_FOREACH_SAFE(seg, &chain->buffers, next, nseg) { 2295 if (chain->proto == ETH_P_IP) { 2296 ret = virtio_net_rsc_coalesce4(chain, seg, buf, size, unit); 2297 } else { 2298 ret = virtio_net_rsc_coalesce6(chain, seg, buf, size, unit); 2299 } 2300 2301 if (ret == RSC_FINAL) { 2302 if (virtio_net_rsc_drain_seg(chain, seg) == 0) { 2303 /* Send failed */ 2304 chain->stat.final_failed++; 2305 return 0; 2306 } 2307 2308 /* Send current packet */ 2309 return virtio_net_do_receive(nc, buf, size); 2310 } else if (ret == RSC_NO_MATCH) { 2311 continue; 2312 } else { 2313 /* Coalesced, mark coalesced flag to tell calc cksum for ipv4 */ 2314 seg->is_coalesced = 1; 2315 return size; 2316 } 2317 } 2318 2319 chain->stat.no_match_cache++; 2320 virtio_net_rsc_cache_buf(chain, nc, buf, size); 2321 return size; 2322 } 2323 2324 /* Drain a connection data, this is to avoid out of order segments */ 2325 static size_t virtio_net_rsc_drain_flow(VirtioNetRscChain *chain, 2326 NetClientState *nc, 2327 const uint8_t *buf, size_t size, 2328 uint16_t ip_start, uint16_t ip_size, 2329 uint16_t tcp_port) 2330 { 2331 VirtioNetRscSeg *seg, *nseg; 2332 uint32_t ppair1, ppair2; 2333 2334 ppair1 = *(uint32_t *)(buf + tcp_port); 2335 QTAILQ_FOREACH_SAFE(seg, &chain->buffers, next, nseg) { 2336 ppair2 = *(uint32_t *)(seg->buf + tcp_port); 2337 if (memcmp(buf + ip_start, seg->buf + ip_start, ip_size) 2338 || (ppair1 != ppair2)) { 2339 continue; 2340 } 2341 if (virtio_net_rsc_drain_seg(chain, seg) == 0) { 2342 chain->stat.drain_failed++; 2343 } 2344 2345 break; 2346 } 2347 2348 return virtio_net_do_receive(nc, buf, size); 2349 } 2350 2351 static int32_t virtio_net_rsc_sanity_check4(VirtioNetRscChain *chain, 2352 struct ip_header *ip, 2353 const uint8_t *buf, size_t size) 2354 { 2355 uint16_t ip_len; 2356 2357 /* Not an ipv4 packet */ 2358 if (((ip->ip_ver_len & 0xF0) >> 4) != IP_HEADER_VERSION_4) { 2359 chain->stat.ip_option++; 2360 return RSC_BYPASS; 2361 } 2362 2363 /* Don't handle packets with ip option */ 2364 if ((ip->ip_ver_len & 0xF) != VIRTIO_NET_IP4_HEADER_LENGTH) { 2365 chain->stat.ip_option++; 2366 return RSC_BYPASS; 2367 } 2368 2369 if (ip->ip_p != IPPROTO_TCP) { 2370 chain->stat.bypass_not_tcp++; 2371 return RSC_BYPASS; 2372 } 2373 2374 /* Don't handle packets with ip fragment */ 2375 if (!(htons(ip->ip_off) & IP_DF)) { 2376 chain->stat.ip_frag++; 2377 return RSC_BYPASS; 2378 } 2379 2380 /* Don't handle packets with ecn flag */ 2381 if (IPTOS_ECN(ip->ip_tos)) { 2382 chain->stat.ip_ecn++; 2383 return RSC_BYPASS; 2384 } 2385 2386 ip_len = htons(ip->ip_len); 2387 if (ip_len < (sizeof(struct ip_header) + sizeof(struct tcp_header)) 2388 || ip_len > (size - chain->n->guest_hdr_len - 2389 sizeof(struct eth_header))) { 2390 chain->stat.ip_hacked++; 2391 return RSC_BYPASS; 2392 } 2393 2394 return RSC_CANDIDATE; 2395 } 2396 2397 static size_t virtio_net_rsc_receive4(VirtioNetRscChain *chain, 2398 NetClientState *nc, 2399 const uint8_t *buf, size_t size) 2400 { 2401 int32_t ret; 2402 uint16_t hdr_len; 2403 VirtioNetRscUnit unit; 2404 2405 hdr_len = ((VirtIONet *)(chain->n))->guest_hdr_len; 2406 2407 if (size < (hdr_len + sizeof(struct eth_header) + sizeof(struct ip_header) 2408 + sizeof(struct tcp_header))) { 2409 chain->stat.bypass_not_tcp++; 2410 return virtio_net_do_receive(nc, buf, size); 2411 } 2412 2413 virtio_net_rsc_extract_unit4(chain, buf, &unit); 2414 if (virtio_net_rsc_sanity_check4(chain, unit.ip, buf, size) 2415 != RSC_CANDIDATE) { 2416 return virtio_net_do_receive(nc, buf, size); 2417 } 2418 2419 ret = virtio_net_rsc_tcp_ctrl_check(chain, unit.tcp); 2420 if (ret == RSC_BYPASS) { 2421 return virtio_net_do_receive(nc, buf, size); 2422 } else if (ret == RSC_FINAL) { 2423 return virtio_net_rsc_drain_flow(chain, nc, buf, size, 2424 ((hdr_len + sizeof(struct eth_header)) + 12), 2425 VIRTIO_NET_IP4_ADDR_SIZE, 2426 hdr_len + sizeof(struct eth_header) + sizeof(struct ip_header)); 2427 } 2428 2429 return virtio_net_rsc_do_coalesce(chain, nc, buf, size, &unit); 2430 } 2431 2432 static int32_t virtio_net_rsc_sanity_check6(VirtioNetRscChain *chain, 2433 struct ip6_header *ip6, 2434 const uint8_t *buf, size_t size) 2435 { 2436 uint16_t ip_len; 2437 2438 if (((ip6->ip6_ctlun.ip6_un1.ip6_un1_flow & 0xF0) >> 4) 2439 != IP_HEADER_VERSION_6) { 2440 return RSC_BYPASS; 2441 } 2442 2443 /* Both option and protocol is checked in this */ 2444 if (ip6->ip6_ctlun.ip6_un1.ip6_un1_nxt != IPPROTO_TCP) { 2445 chain->stat.bypass_not_tcp++; 2446 return RSC_BYPASS; 2447 } 2448 2449 ip_len = htons(ip6->ip6_ctlun.ip6_un1.ip6_un1_plen); 2450 if (ip_len < sizeof(struct tcp_header) || 2451 ip_len > (size - chain->n->guest_hdr_len - sizeof(struct eth_header) 2452 - sizeof(struct ip6_header))) { 2453 chain->stat.ip_hacked++; 2454 return RSC_BYPASS; 2455 } 2456 2457 /* Don't handle packets with ecn flag */ 2458 if (IP6_ECN(ip6->ip6_ctlun.ip6_un3.ip6_un3_ecn)) { 2459 chain->stat.ip_ecn++; 2460 return RSC_BYPASS; 2461 } 2462 2463 return RSC_CANDIDATE; 2464 } 2465 2466 static size_t virtio_net_rsc_receive6(void *opq, NetClientState *nc, 2467 const uint8_t *buf, size_t size) 2468 { 2469 int32_t ret; 2470 uint16_t hdr_len; 2471 VirtioNetRscChain *chain; 2472 VirtioNetRscUnit unit; 2473 2474 chain = opq; 2475 hdr_len = ((VirtIONet *)(chain->n))->guest_hdr_len; 2476 2477 if (size < (hdr_len + sizeof(struct eth_header) + sizeof(struct ip6_header) 2478 + sizeof(tcp_header))) { 2479 return virtio_net_do_receive(nc, buf, size); 2480 } 2481 2482 virtio_net_rsc_extract_unit6(chain, buf, &unit); 2483 if (RSC_CANDIDATE != virtio_net_rsc_sanity_check6(chain, 2484 unit.ip, buf, size)) { 2485 return virtio_net_do_receive(nc, buf, size); 2486 } 2487 2488 ret = virtio_net_rsc_tcp_ctrl_check(chain, unit.tcp); 2489 if (ret == RSC_BYPASS) { 2490 return virtio_net_do_receive(nc, buf, size); 2491 } else if (ret == RSC_FINAL) { 2492 return virtio_net_rsc_drain_flow(chain, nc, buf, size, 2493 ((hdr_len + sizeof(struct eth_header)) + 8), 2494 VIRTIO_NET_IP6_ADDR_SIZE, 2495 hdr_len + sizeof(struct eth_header) 2496 + sizeof(struct ip6_header)); 2497 } 2498 2499 return virtio_net_rsc_do_coalesce(chain, nc, buf, size, &unit); 2500 } 2501 2502 static VirtioNetRscChain *virtio_net_rsc_lookup_chain(VirtIONet *n, 2503 NetClientState *nc, 2504 uint16_t proto) 2505 { 2506 VirtioNetRscChain *chain; 2507 2508 if ((proto != (uint16_t)ETH_P_IP) && (proto != (uint16_t)ETH_P_IPV6)) { 2509 return NULL; 2510 } 2511 2512 QTAILQ_FOREACH(chain, &n->rsc_chains, next) { 2513 if (chain->proto == proto) { 2514 return chain; 2515 } 2516 } 2517 2518 chain = g_malloc(sizeof(*chain)); 2519 chain->n = n; 2520 chain->proto = proto; 2521 if (proto == (uint16_t)ETH_P_IP) { 2522 chain->max_payload = VIRTIO_NET_MAX_IP4_PAYLOAD; 2523 chain->gso_type = VIRTIO_NET_HDR_GSO_TCPV4; 2524 } else { 2525 chain->max_payload = VIRTIO_NET_MAX_IP6_PAYLOAD; 2526 chain->gso_type = VIRTIO_NET_HDR_GSO_TCPV6; 2527 } 2528 chain->drain_timer = timer_new_ns(QEMU_CLOCK_HOST, 2529 virtio_net_rsc_purge, chain); 2530 memset(&chain->stat, 0, sizeof(chain->stat)); 2531 2532 QTAILQ_INIT(&chain->buffers); 2533 QTAILQ_INSERT_TAIL(&n->rsc_chains, chain, next); 2534 2535 return chain; 2536 } 2537 2538 static ssize_t virtio_net_rsc_receive(NetClientState *nc, 2539 const uint8_t *buf, 2540 size_t size) 2541 { 2542 uint16_t proto; 2543 VirtioNetRscChain *chain; 2544 struct eth_header *eth; 2545 VirtIONet *n; 2546 2547 n = qemu_get_nic_opaque(nc); 2548 if (size < (n->host_hdr_len + sizeof(struct eth_header))) { 2549 return virtio_net_do_receive(nc, buf, size); 2550 } 2551 2552 eth = (struct eth_header *)(buf + n->guest_hdr_len); 2553 proto = htons(eth->h_proto); 2554 2555 chain = virtio_net_rsc_lookup_chain(n, nc, proto); 2556 if (chain) { 2557 chain->stat.received++; 2558 if (proto == (uint16_t)ETH_P_IP && n->rsc4_enabled) { 2559 return virtio_net_rsc_receive4(chain, nc, buf, size); 2560 } else if (proto == (uint16_t)ETH_P_IPV6 && n->rsc6_enabled) { 2561 return virtio_net_rsc_receive6(chain, nc, buf, size); 2562 } 2563 } 2564 return virtio_net_do_receive(nc, buf, size); 2565 } 2566 2567 static ssize_t virtio_net_receive(NetClientState *nc, const uint8_t *buf, 2568 size_t size) 2569 { 2570 VirtIONet *n = qemu_get_nic_opaque(nc); 2571 if ((n->rsc4_enabled || n->rsc6_enabled)) { 2572 return virtio_net_rsc_receive(nc, buf, size); 2573 } else { 2574 return virtio_net_do_receive(nc, buf, size); 2575 } 2576 } 2577 2578 static int32_t virtio_net_flush_tx(VirtIONetQueue *q); 2579 2580 static void virtio_net_tx_complete(NetClientState *nc, ssize_t len) 2581 { 2582 VirtIONet *n = qemu_get_nic_opaque(nc); 2583 VirtIONetQueue *q = virtio_net_get_subqueue(nc); 2584 VirtIODevice *vdev = VIRTIO_DEVICE(n); 2585 int ret; 2586 2587 virtqueue_push(q->tx_vq, q->async_tx.elem, 0); 2588 virtio_notify(vdev, q->tx_vq); 2589 2590 g_free(q->async_tx.elem); 2591 q->async_tx.elem = NULL; 2592 2593 virtio_queue_set_notification(q->tx_vq, 1); 2594 ret = virtio_net_flush_tx(q); 2595 if (ret >= n->tx_burst) { 2596 /* 2597 * the flush has been stopped by tx_burst 2598 * we will not receive notification for the 2599 * remainining part, so re-schedule 2600 */ 2601 virtio_queue_set_notification(q->tx_vq, 0); 2602 if (q->tx_bh) { 2603 qemu_bh_schedule(q->tx_bh); 2604 } else { 2605 timer_mod(q->tx_timer, 2606 qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + n->tx_timeout); 2607 } 2608 q->tx_waiting = 1; 2609 } 2610 } 2611 2612 /* TX */ 2613 static int32_t virtio_net_flush_tx(VirtIONetQueue *q) 2614 { 2615 VirtIONet *n = q->n; 2616 VirtIODevice *vdev = VIRTIO_DEVICE(n); 2617 VirtQueueElement *elem; 2618 int32_t num_packets = 0; 2619 int queue_index = vq2q(virtio_get_queue_index(q->tx_vq)); 2620 if (!(vdev->status & VIRTIO_CONFIG_S_DRIVER_OK)) { 2621 return num_packets; 2622 } 2623 2624 if (q->async_tx.elem) { 2625 virtio_queue_set_notification(q->tx_vq, 0); 2626 return num_packets; 2627 } 2628 2629 for (;;) { 2630 ssize_t ret; 2631 unsigned int out_num; 2632 struct iovec sg[VIRTQUEUE_MAX_SIZE], sg2[VIRTQUEUE_MAX_SIZE + 1], *out_sg; 2633 struct virtio_net_hdr_mrg_rxbuf mhdr; 2634 2635 elem = virtqueue_pop(q->tx_vq, sizeof(VirtQueueElement)); 2636 if (!elem) { 2637 break; 2638 } 2639 2640 out_num = elem->out_num; 2641 out_sg = elem->out_sg; 2642 if (out_num < 1) { 2643 virtio_error(vdev, "virtio-net header not in first element"); 2644 virtqueue_detach_element(q->tx_vq, elem, 0); 2645 g_free(elem); 2646 return -EINVAL; 2647 } 2648 2649 if (n->has_vnet_hdr) { 2650 if (iov_to_buf(out_sg, out_num, 0, &mhdr, n->guest_hdr_len) < 2651 n->guest_hdr_len) { 2652 virtio_error(vdev, "virtio-net header incorrect"); 2653 virtqueue_detach_element(q->tx_vq, elem, 0); 2654 g_free(elem); 2655 return -EINVAL; 2656 } 2657 if (n->needs_vnet_hdr_swap) { 2658 virtio_net_hdr_swap(vdev, (void *) &mhdr); 2659 sg2[0].iov_base = &mhdr; 2660 sg2[0].iov_len = n->guest_hdr_len; 2661 out_num = iov_copy(&sg2[1], ARRAY_SIZE(sg2) - 1, 2662 out_sg, out_num, 2663 n->guest_hdr_len, -1); 2664 if (out_num == VIRTQUEUE_MAX_SIZE) { 2665 goto drop; 2666 } 2667 out_num += 1; 2668 out_sg = sg2; 2669 } 2670 } 2671 /* 2672 * If host wants to see the guest header as is, we can 2673 * pass it on unchanged. Otherwise, copy just the parts 2674 * that host is interested in. 2675 */ 2676 assert(n->host_hdr_len <= n->guest_hdr_len); 2677 if (n->host_hdr_len != n->guest_hdr_len) { 2678 unsigned sg_num = iov_copy(sg, ARRAY_SIZE(sg), 2679 out_sg, out_num, 2680 0, n->host_hdr_len); 2681 sg_num += iov_copy(sg + sg_num, ARRAY_SIZE(sg) - sg_num, 2682 out_sg, out_num, 2683 n->guest_hdr_len, -1); 2684 out_num = sg_num; 2685 out_sg = sg; 2686 } 2687 2688 ret = qemu_sendv_packet_async(qemu_get_subqueue(n->nic, queue_index), 2689 out_sg, out_num, virtio_net_tx_complete); 2690 if (ret == 0) { 2691 virtio_queue_set_notification(q->tx_vq, 0); 2692 q->async_tx.elem = elem; 2693 return -EBUSY; 2694 } 2695 2696 drop: 2697 virtqueue_push(q->tx_vq, elem, 0); 2698 virtio_notify(vdev, q->tx_vq); 2699 g_free(elem); 2700 2701 if (++num_packets >= n->tx_burst) { 2702 break; 2703 } 2704 } 2705 return num_packets; 2706 } 2707 2708 static void virtio_net_tx_timer(void *opaque); 2709 2710 static void virtio_net_handle_tx_timer(VirtIODevice *vdev, VirtQueue *vq) 2711 { 2712 VirtIONet *n = VIRTIO_NET(vdev); 2713 VirtIONetQueue *q = &n->vqs[vq2q(virtio_get_queue_index(vq))]; 2714 2715 if (unlikely((n->status & VIRTIO_NET_S_LINK_UP) == 0)) { 2716 virtio_net_drop_tx_queue_data(vdev, vq); 2717 return; 2718 } 2719 2720 /* This happens when device was stopped but VCPU wasn't. */ 2721 if (!vdev->vm_running) { 2722 q->tx_waiting = 1; 2723 return; 2724 } 2725 2726 if (q->tx_waiting) { 2727 /* We already have queued packets, immediately flush */ 2728 timer_del(q->tx_timer); 2729 virtio_net_tx_timer(q); 2730 } else { 2731 /* re-arm timer to flush it (and more) on next tick */ 2732 timer_mod(q->tx_timer, 2733 qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + n->tx_timeout); 2734 q->tx_waiting = 1; 2735 virtio_queue_set_notification(vq, 0); 2736 } 2737 } 2738 2739 static void virtio_net_handle_tx_bh(VirtIODevice *vdev, VirtQueue *vq) 2740 { 2741 VirtIONet *n = VIRTIO_NET(vdev); 2742 VirtIONetQueue *q = &n->vqs[vq2q(virtio_get_queue_index(vq))]; 2743 2744 if (unlikely((n->status & VIRTIO_NET_S_LINK_UP) == 0)) { 2745 virtio_net_drop_tx_queue_data(vdev, vq); 2746 return; 2747 } 2748 2749 if (unlikely(q->tx_waiting)) { 2750 return; 2751 } 2752 q->tx_waiting = 1; 2753 /* This happens when device was stopped but VCPU wasn't. */ 2754 if (!vdev->vm_running) { 2755 return; 2756 } 2757 virtio_queue_set_notification(vq, 0); 2758 qemu_bh_schedule(q->tx_bh); 2759 } 2760 2761 static void virtio_net_tx_timer(void *opaque) 2762 { 2763 VirtIONetQueue *q = opaque; 2764 VirtIONet *n = q->n; 2765 VirtIODevice *vdev = VIRTIO_DEVICE(n); 2766 int ret; 2767 2768 /* This happens when device was stopped but BH wasn't. */ 2769 if (!vdev->vm_running) { 2770 /* Make sure tx waiting is set, so we'll run when restarted. */ 2771 assert(q->tx_waiting); 2772 return; 2773 } 2774 2775 q->tx_waiting = 0; 2776 2777 /* Just in case the driver is not ready on more */ 2778 if (!(vdev->status & VIRTIO_CONFIG_S_DRIVER_OK)) { 2779 return; 2780 } 2781 2782 ret = virtio_net_flush_tx(q); 2783 if (ret == -EBUSY || ret == -EINVAL) { 2784 return; 2785 } 2786 /* 2787 * If we flush a full burst of packets, assume there are 2788 * more coming and immediately rearm 2789 */ 2790 if (ret >= n->tx_burst) { 2791 q->tx_waiting = 1; 2792 timer_mod(q->tx_timer, 2793 qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + n->tx_timeout); 2794 return; 2795 } 2796 /* 2797 * If less than a full burst, re-enable notification and flush 2798 * anything that may have come in while we weren't looking. If 2799 * we find something, assume the guest is still active and rearm 2800 */ 2801 virtio_queue_set_notification(q->tx_vq, 1); 2802 ret = virtio_net_flush_tx(q); 2803 if (ret > 0) { 2804 virtio_queue_set_notification(q->tx_vq, 0); 2805 q->tx_waiting = 1; 2806 timer_mod(q->tx_timer, 2807 qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + n->tx_timeout); 2808 } 2809 } 2810 2811 static void virtio_net_tx_bh(void *opaque) 2812 { 2813 VirtIONetQueue *q = opaque; 2814 VirtIONet *n = q->n; 2815 VirtIODevice *vdev = VIRTIO_DEVICE(n); 2816 int32_t ret; 2817 2818 /* This happens when device was stopped but BH wasn't. */ 2819 if (!vdev->vm_running) { 2820 /* Make sure tx waiting is set, so we'll run when restarted. */ 2821 assert(q->tx_waiting); 2822 return; 2823 } 2824 2825 q->tx_waiting = 0; 2826 2827 /* Just in case the driver is not ready on more */ 2828 if (unlikely(!(vdev->status & VIRTIO_CONFIG_S_DRIVER_OK))) { 2829 return; 2830 } 2831 2832 ret = virtio_net_flush_tx(q); 2833 if (ret == -EBUSY || ret == -EINVAL) { 2834 return; /* Notification re-enable handled by tx_complete or device 2835 * broken */ 2836 } 2837 2838 /* If we flush a full burst of packets, assume there are 2839 * more coming and immediately reschedule */ 2840 if (ret >= n->tx_burst) { 2841 qemu_bh_schedule(q->tx_bh); 2842 q->tx_waiting = 1; 2843 return; 2844 } 2845 2846 /* If less than a full burst, re-enable notification and flush 2847 * anything that may have come in while we weren't looking. If 2848 * we find something, assume the guest is still active and reschedule */ 2849 virtio_queue_set_notification(q->tx_vq, 1); 2850 ret = virtio_net_flush_tx(q); 2851 if (ret == -EINVAL) { 2852 return; 2853 } else if (ret > 0) { 2854 virtio_queue_set_notification(q->tx_vq, 0); 2855 qemu_bh_schedule(q->tx_bh); 2856 q->tx_waiting = 1; 2857 } 2858 } 2859 2860 static void virtio_net_add_queue(VirtIONet *n, int index) 2861 { 2862 VirtIODevice *vdev = VIRTIO_DEVICE(n); 2863 2864 n->vqs[index].rx_vq = virtio_add_queue(vdev, n->net_conf.rx_queue_size, 2865 virtio_net_handle_rx); 2866 2867 if (n->net_conf.tx && !strcmp(n->net_conf.tx, "timer")) { 2868 n->vqs[index].tx_vq = 2869 virtio_add_queue(vdev, n->net_conf.tx_queue_size, 2870 virtio_net_handle_tx_timer); 2871 n->vqs[index].tx_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, 2872 virtio_net_tx_timer, 2873 &n->vqs[index]); 2874 } else { 2875 n->vqs[index].tx_vq = 2876 virtio_add_queue(vdev, n->net_conf.tx_queue_size, 2877 virtio_net_handle_tx_bh); 2878 n->vqs[index].tx_bh = qemu_bh_new(virtio_net_tx_bh, &n->vqs[index]); 2879 } 2880 2881 n->vqs[index].tx_waiting = 0; 2882 n->vqs[index].n = n; 2883 } 2884 2885 static void virtio_net_del_queue(VirtIONet *n, int index) 2886 { 2887 VirtIODevice *vdev = VIRTIO_DEVICE(n); 2888 VirtIONetQueue *q = &n->vqs[index]; 2889 NetClientState *nc = qemu_get_subqueue(n->nic, index); 2890 2891 qemu_purge_queued_packets(nc); 2892 2893 virtio_del_queue(vdev, index * 2); 2894 if (q->tx_timer) { 2895 timer_free(q->tx_timer); 2896 q->tx_timer = NULL; 2897 } else { 2898 qemu_bh_delete(q->tx_bh); 2899 q->tx_bh = NULL; 2900 } 2901 q->tx_waiting = 0; 2902 virtio_del_queue(vdev, index * 2 + 1); 2903 } 2904 2905 static void virtio_net_change_num_queue_pairs(VirtIONet *n, int new_max_queue_pairs) 2906 { 2907 VirtIODevice *vdev = VIRTIO_DEVICE(n); 2908 int old_num_queues = virtio_get_num_queues(vdev); 2909 int new_num_queues = new_max_queue_pairs * 2 + 1; 2910 int i; 2911 2912 assert(old_num_queues >= 3); 2913 assert(old_num_queues % 2 == 1); 2914 2915 if (old_num_queues == new_num_queues) { 2916 return; 2917 } 2918 2919 /* 2920 * We always need to remove and add ctrl vq if 2921 * old_num_queues != new_num_queues. Remove ctrl_vq first, 2922 * and then we only enter one of the following two loops. 2923 */ 2924 virtio_del_queue(vdev, old_num_queues - 1); 2925 2926 for (i = new_num_queues - 1; i < old_num_queues - 1; i += 2) { 2927 /* new_num_queues < old_num_queues */ 2928 virtio_net_del_queue(n, i / 2); 2929 } 2930 2931 for (i = old_num_queues - 1; i < new_num_queues - 1; i += 2) { 2932 /* new_num_queues > old_num_queues */ 2933 virtio_net_add_queue(n, i / 2); 2934 } 2935 2936 /* add ctrl_vq last */ 2937 n->ctrl_vq = virtio_add_queue(vdev, 64, virtio_net_handle_ctrl); 2938 } 2939 2940 static void virtio_net_set_multiqueue(VirtIONet *n, int multiqueue) 2941 { 2942 int max = multiqueue ? n->max_queue_pairs : 1; 2943 2944 n->multiqueue = multiqueue; 2945 virtio_net_change_num_queue_pairs(n, max); 2946 2947 virtio_net_set_queue_pairs(n); 2948 } 2949 2950 static int virtio_net_post_load_device(void *opaque, int version_id) 2951 { 2952 VirtIONet *n = opaque; 2953 VirtIODevice *vdev = VIRTIO_DEVICE(n); 2954 int i, link_down; 2955 2956 trace_virtio_net_post_load_device(); 2957 virtio_net_set_mrg_rx_bufs(n, n->mergeable_rx_bufs, 2958 virtio_vdev_has_feature(vdev, 2959 VIRTIO_F_VERSION_1), 2960 virtio_vdev_has_feature(vdev, 2961 VIRTIO_NET_F_HASH_REPORT)); 2962 2963 /* MAC_TABLE_ENTRIES may be different from the saved image */ 2964 if (n->mac_table.in_use > MAC_TABLE_ENTRIES) { 2965 n->mac_table.in_use = 0; 2966 } 2967 2968 if (!virtio_vdev_has_feature(vdev, VIRTIO_NET_F_CTRL_GUEST_OFFLOADS)) { 2969 n->curr_guest_offloads = virtio_net_supported_guest_offloads(n); 2970 } 2971 2972 /* 2973 * curr_guest_offloads will be later overwritten by the 2974 * virtio_set_features_nocheck call done from the virtio_load. 2975 * Here we make sure it is preserved and restored accordingly 2976 * in the virtio_net_post_load_virtio callback. 2977 */ 2978 n->saved_guest_offloads = n->curr_guest_offloads; 2979 2980 virtio_net_set_queue_pairs(n); 2981 2982 /* Find the first multicast entry in the saved MAC filter */ 2983 for (i = 0; i < n->mac_table.in_use; i++) { 2984 if (n->mac_table.macs[i * ETH_ALEN] & 1) { 2985 break; 2986 } 2987 } 2988 n->mac_table.first_multi = i; 2989 2990 /* nc.link_down can't be migrated, so infer link_down according 2991 * to link status bit in n->status */ 2992 link_down = (n->status & VIRTIO_NET_S_LINK_UP) == 0; 2993 for (i = 0; i < n->max_queue_pairs; i++) { 2994 qemu_get_subqueue(n->nic, i)->link_down = link_down; 2995 } 2996 2997 if (virtio_vdev_has_feature(vdev, VIRTIO_NET_F_GUEST_ANNOUNCE) && 2998 virtio_vdev_has_feature(vdev, VIRTIO_NET_F_CTRL_VQ)) { 2999 qemu_announce_timer_reset(&n->announce_timer, migrate_announce_params(), 3000 QEMU_CLOCK_VIRTUAL, 3001 virtio_net_announce_timer, n); 3002 if (n->announce_timer.round) { 3003 timer_mod(n->announce_timer.tm, 3004 qemu_clock_get_ms(n->announce_timer.type)); 3005 } else { 3006 qemu_announce_timer_del(&n->announce_timer, false); 3007 } 3008 } 3009 3010 if (n->rss_data.enabled) { 3011 n->rss_data.enabled_software_rss = n->rss_data.populate_hash; 3012 if (!n->rss_data.populate_hash) { 3013 if (!virtio_net_attach_epbf_rss(n)) { 3014 if (get_vhost_net(qemu_get_queue(n->nic)->peer)) { 3015 warn_report("Can't post-load eBPF RSS for vhost"); 3016 } else { 3017 warn_report("Can't post-load eBPF RSS - " 3018 "fallback to software RSS"); 3019 n->rss_data.enabled_software_rss = true; 3020 } 3021 } 3022 } 3023 3024 trace_virtio_net_rss_enable(n->rss_data.hash_types, 3025 n->rss_data.indirections_len, 3026 sizeof(n->rss_data.key)); 3027 } else { 3028 trace_virtio_net_rss_disable(); 3029 } 3030 return 0; 3031 } 3032 3033 static int virtio_net_post_load_virtio(VirtIODevice *vdev) 3034 { 3035 VirtIONet *n = VIRTIO_NET(vdev); 3036 /* 3037 * The actual needed state is now in saved_guest_offloads, 3038 * see virtio_net_post_load_device for detail. 3039 * Restore it back and apply the desired offloads. 3040 */ 3041 n->curr_guest_offloads = n->saved_guest_offloads; 3042 if (peer_has_vnet_hdr(n)) { 3043 virtio_net_apply_guest_offloads(n); 3044 } 3045 3046 return 0; 3047 } 3048 3049 /* tx_waiting field of a VirtIONetQueue */ 3050 static const VMStateDescription vmstate_virtio_net_queue_tx_waiting = { 3051 .name = "virtio-net-queue-tx_waiting", 3052 .fields = (VMStateField[]) { 3053 VMSTATE_UINT32(tx_waiting, VirtIONetQueue), 3054 VMSTATE_END_OF_LIST() 3055 }, 3056 }; 3057 3058 static bool max_queue_pairs_gt_1(void *opaque, int version_id) 3059 { 3060 return VIRTIO_NET(opaque)->max_queue_pairs > 1; 3061 } 3062 3063 static bool has_ctrl_guest_offloads(void *opaque, int version_id) 3064 { 3065 return virtio_vdev_has_feature(VIRTIO_DEVICE(opaque), 3066 VIRTIO_NET_F_CTRL_GUEST_OFFLOADS); 3067 } 3068 3069 static bool mac_table_fits(void *opaque, int version_id) 3070 { 3071 return VIRTIO_NET(opaque)->mac_table.in_use <= MAC_TABLE_ENTRIES; 3072 } 3073 3074 static bool mac_table_doesnt_fit(void *opaque, int version_id) 3075 { 3076 return !mac_table_fits(opaque, version_id); 3077 } 3078 3079 /* This temporary type is shared by all the WITH_TMP methods 3080 * although only some fields are used by each. 3081 */ 3082 struct VirtIONetMigTmp { 3083 VirtIONet *parent; 3084 VirtIONetQueue *vqs_1; 3085 uint16_t curr_queue_pairs_1; 3086 uint8_t has_ufo; 3087 uint32_t has_vnet_hdr; 3088 }; 3089 3090 /* The 2nd and subsequent tx_waiting flags are loaded later than 3091 * the 1st entry in the queue_pairs and only if there's more than one 3092 * entry. We use the tmp mechanism to calculate a temporary 3093 * pointer and count and also validate the count. 3094 */ 3095 3096 static int virtio_net_tx_waiting_pre_save(void *opaque) 3097 { 3098 struct VirtIONetMigTmp *tmp = opaque; 3099 3100 tmp->vqs_1 = tmp->parent->vqs + 1; 3101 tmp->curr_queue_pairs_1 = tmp->parent->curr_queue_pairs - 1; 3102 if (tmp->parent->curr_queue_pairs == 0) { 3103 tmp->curr_queue_pairs_1 = 0; 3104 } 3105 3106 return 0; 3107 } 3108 3109 static int virtio_net_tx_waiting_pre_load(void *opaque) 3110 { 3111 struct VirtIONetMigTmp *tmp = opaque; 3112 3113 /* Reuse the pointer setup from save */ 3114 virtio_net_tx_waiting_pre_save(opaque); 3115 3116 if (tmp->parent->curr_queue_pairs > tmp->parent->max_queue_pairs) { 3117 error_report("virtio-net: curr_queue_pairs %x > max_queue_pairs %x", 3118 tmp->parent->curr_queue_pairs, tmp->parent->max_queue_pairs); 3119 3120 return -EINVAL; 3121 } 3122 3123 return 0; /* all good */ 3124 } 3125 3126 static const VMStateDescription vmstate_virtio_net_tx_waiting = { 3127 .name = "virtio-net-tx_waiting", 3128 .pre_load = virtio_net_tx_waiting_pre_load, 3129 .pre_save = virtio_net_tx_waiting_pre_save, 3130 .fields = (VMStateField[]) { 3131 VMSTATE_STRUCT_VARRAY_POINTER_UINT16(vqs_1, struct VirtIONetMigTmp, 3132 curr_queue_pairs_1, 3133 vmstate_virtio_net_queue_tx_waiting, 3134 struct VirtIONetQueue), 3135 VMSTATE_END_OF_LIST() 3136 }, 3137 }; 3138 3139 /* the 'has_ufo' flag is just tested; if the incoming stream has the 3140 * flag set we need to check that we have it 3141 */ 3142 static int virtio_net_ufo_post_load(void *opaque, int version_id) 3143 { 3144 struct VirtIONetMigTmp *tmp = opaque; 3145 3146 if (tmp->has_ufo && !peer_has_ufo(tmp->parent)) { 3147 error_report("virtio-net: saved image requires TUN_F_UFO support"); 3148 return -EINVAL; 3149 } 3150 3151 return 0; 3152 } 3153 3154 static int virtio_net_ufo_pre_save(void *opaque) 3155 { 3156 struct VirtIONetMigTmp *tmp = opaque; 3157 3158 tmp->has_ufo = tmp->parent->has_ufo; 3159 3160 return 0; 3161 } 3162 3163 static const VMStateDescription vmstate_virtio_net_has_ufo = { 3164 .name = "virtio-net-ufo", 3165 .post_load = virtio_net_ufo_post_load, 3166 .pre_save = virtio_net_ufo_pre_save, 3167 .fields = (VMStateField[]) { 3168 VMSTATE_UINT8(has_ufo, struct VirtIONetMigTmp), 3169 VMSTATE_END_OF_LIST() 3170 }, 3171 }; 3172 3173 /* the 'has_vnet_hdr' flag is just tested; if the incoming stream has the 3174 * flag set we need to check that we have it 3175 */ 3176 static int virtio_net_vnet_post_load(void *opaque, int version_id) 3177 { 3178 struct VirtIONetMigTmp *tmp = opaque; 3179 3180 if (tmp->has_vnet_hdr && !peer_has_vnet_hdr(tmp->parent)) { 3181 error_report("virtio-net: saved image requires vnet_hdr=on"); 3182 return -EINVAL; 3183 } 3184 3185 return 0; 3186 } 3187 3188 static int virtio_net_vnet_pre_save(void *opaque) 3189 { 3190 struct VirtIONetMigTmp *tmp = opaque; 3191 3192 tmp->has_vnet_hdr = tmp->parent->has_vnet_hdr; 3193 3194 return 0; 3195 } 3196 3197 static const VMStateDescription vmstate_virtio_net_has_vnet = { 3198 .name = "virtio-net-vnet", 3199 .post_load = virtio_net_vnet_post_load, 3200 .pre_save = virtio_net_vnet_pre_save, 3201 .fields = (VMStateField[]) { 3202 VMSTATE_UINT32(has_vnet_hdr, struct VirtIONetMigTmp), 3203 VMSTATE_END_OF_LIST() 3204 }, 3205 }; 3206 3207 static bool virtio_net_rss_needed(void *opaque) 3208 { 3209 return VIRTIO_NET(opaque)->rss_data.enabled; 3210 } 3211 3212 static const VMStateDescription vmstate_virtio_net_rss = { 3213 .name = "virtio-net-device/rss", 3214 .version_id = 1, 3215 .minimum_version_id = 1, 3216 .needed = virtio_net_rss_needed, 3217 .fields = (VMStateField[]) { 3218 VMSTATE_BOOL(rss_data.enabled, VirtIONet), 3219 VMSTATE_BOOL(rss_data.redirect, VirtIONet), 3220 VMSTATE_BOOL(rss_data.populate_hash, VirtIONet), 3221 VMSTATE_UINT32(rss_data.hash_types, VirtIONet), 3222 VMSTATE_UINT16(rss_data.indirections_len, VirtIONet), 3223 VMSTATE_UINT16(rss_data.default_queue, VirtIONet), 3224 VMSTATE_UINT8_ARRAY(rss_data.key, VirtIONet, 3225 VIRTIO_NET_RSS_MAX_KEY_SIZE), 3226 VMSTATE_VARRAY_UINT16_ALLOC(rss_data.indirections_table, VirtIONet, 3227 rss_data.indirections_len, 0, 3228 vmstate_info_uint16, uint16_t), 3229 VMSTATE_END_OF_LIST() 3230 }, 3231 }; 3232 3233 static const VMStateDescription vmstate_virtio_net_device = { 3234 .name = "virtio-net-device", 3235 .version_id = VIRTIO_NET_VM_VERSION, 3236 .minimum_version_id = VIRTIO_NET_VM_VERSION, 3237 .post_load = virtio_net_post_load_device, 3238 .fields = (VMStateField[]) { 3239 VMSTATE_UINT8_ARRAY(mac, VirtIONet, ETH_ALEN), 3240 VMSTATE_STRUCT_POINTER(vqs, VirtIONet, 3241 vmstate_virtio_net_queue_tx_waiting, 3242 VirtIONetQueue), 3243 VMSTATE_UINT32(mergeable_rx_bufs, VirtIONet), 3244 VMSTATE_UINT16(status, VirtIONet), 3245 VMSTATE_UINT8(promisc, VirtIONet), 3246 VMSTATE_UINT8(allmulti, VirtIONet), 3247 VMSTATE_UINT32(mac_table.in_use, VirtIONet), 3248 3249 /* Guarded pair: If it fits we load it, else we throw it away 3250 * - can happen if source has a larger MAC table.; post-load 3251 * sets flags in this case. 3252 */ 3253 VMSTATE_VBUFFER_MULTIPLY(mac_table.macs, VirtIONet, 3254 0, mac_table_fits, mac_table.in_use, 3255 ETH_ALEN), 3256 VMSTATE_UNUSED_VARRAY_UINT32(VirtIONet, mac_table_doesnt_fit, 0, 3257 mac_table.in_use, ETH_ALEN), 3258 3259 /* Note: This is an array of uint32's that's always been saved as a 3260 * buffer; hold onto your endiannesses; it's actually used as a bitmap 3261 * but based on the uint. 3262 */ 3263 VMSTATE_BUFFER_POINTER_UNSAFE(vlans, VirtIONet, 0, MAX_VLAN >> 3), 3264 VMSTATE_WITH_TMP(VirtIONet, struct VirtIONetMigTmp, 3265 vmstate_virtio_net_has_vnet), 3266 VMSTATE_UINT8(mac_table.multi_overflow, VirtIONet), 3267 VMSTATE_UINT8(mac_table.uni_overflow, VirtIONet), 3268 VMSTATE_UINT8(alluni, VirtIONet), 3269 VMSTATE_UINT8(nomulti, VirtIONet), 3270 VMSTATE_UINT8(nouni, VirtIONet), 3271 VMSTATE_UINT8(nobcast, VirtIONet), 3272 VMSTATE_WITH_TMP(VirtIONet, struct VirtIONetMigTmp, 3273 vmstate_virtio_net_has_ufo), 3274 VMSTATE_SINGLE_TEST(max_queue_pairs, VirtIONet, max_queue_pairs_gt_1, 0, 3275 vmstate_info_uint16_equal, uint16_t), 3276 VMSTATE_UINT16_TEST(curr_queue_pairs, VirtIONet, max_queue_pairs_gt_1), 3277 VMSTATE_WITH_TMP(VirtIONet, struct VirtIONetMigTmp, 3278 vmstate_virtio_net_tx_waiting), 3279 VMSTATE_UINT64_TEST(curr_guest_offloads, VirtIONet, 3280 has_ctrl_guest_offloads), 3281 VMSTATE_END_OF_LIST() 3282 }, 3283 .subsections = (const VMStateDescription * []) { 3284 &vmstate_virtio_net_rss, 3285 NULL 3286 } 3287 }; 3288 3289 static NetClientInfo net_virtio_info = { 3290 .type = NET_CLIENT_DRIVER_NIC, 3291 .size = sizeof(NICState), 3292 .can_receive = virtio_net_can_receive, 3293 .receive = virtio_net_receive, 3294 .link_status_changed = virtio_net_set_link_status, 3295 .query_rx_filter = virtio_net_query_rxfilter, 3296 .announce = virtio_net_announce, 3297 }; 3298 3299 static bool virtio_net_guest_notifier_pending(VirtIODevice *vdev, int idx) 3300 { 3301 VirtIONet *n = VIRTIO_NET(vdev); 3302 NetClientState *nc; 3303 assert(n->vhost_started); 3304 if (!virtio_vdev_has_feature(vdev, VIRTIO_NET_F_MQ) && idx == 2) { 3305 /* Must guard against invalid features and bogus queue index 3306 * from being set by malicious guest, or penetrated through 3307 * buggy migration stream. 3308 */ 3309 if (!virtio_vdev_has_feature(vdev, VIRTIO_NET_F_CTRL_VQ)) { 3310 qemu_log_mask(LOG_GUEST_ERROR, 3311 "%s: bogus vq index ignored\n", __func__); 3312 return false; 3313 } 3314 nc = qemu_get_subqueue(n->nic, n->max_queue_pairs); 3315 } else { 3316 nc = qemu_get_subqueue(n->nic, vq2q(idx)); 3317 } 3318 return vhost_net_virtqueue_pending(get_vhost_net(nc->peer), idx); 3319 } 3320 3321 static void virtio_net_guest_notifier_mask(VirtIODevice *vdev, int idx, 3322 bool mask) 3323 { 3324 VirtIONet *n = VIRTIO_NET(vdev); 3325 NetClientState *nc; 3326 assert(n->vhost_started); 3327 if (!virtio_vdev_has_feature(vdev, VIRTIO_NET_F_MQ) && idx == 2) { 3328 /* Must guard against invalid features and bogus queue index 3329 * from being set by malicious guest, or penetrated through 3330 * buggy migration stream. 3331 */ 3332 if (!virtio_vdev_has_feature(vdev, VIRTIO_NET_F_CTRL_VQ)) { 3333 qemu_log_mask(LOG_GUEST_ERROR, 3334 "%s: bogus vq index ignored\n", __func__); 3335 return; 3336 } 3337 nc = qemu_get_subqueue(n->nic, n->max_queue_pairs); 3338 } else { 3339 nc = qemu_get_subqueue(n->nic, vq2q(idx)); 3340 } 3341 vhost_net_virtqueue_mask(get_vhost_net(nc->peer), 3342 vdev, idx, mask); 3343 } 3344 3345 static void virtio_net_set_config_size(VirtIONet *n, uint64_t host_features) 3346 { 3347 virtio_add_feature(&host_features, VIRTIO_NET_F_MAC); 3348 3349 n->config_size = virtio_get_config_size(&cfg_size_params, host_features); 3350 } 3351 3352 void virtio_net_set_netclient_name(VirtIONet *n, const char *name, 3353 const char *type) 3354 { 3355 /* 3356 * The name can be NULL, the netclient name will be type.x. 3357 */ 3358 assert(type != NULL); 3359 3360 g_free(n->netclient_name); 3361 g_free(n->netclient_type); 3362 n->netclient_name = g_strdup(name); 3363 n->netclient_type = g_strdup(type); 3364 } 3365 3366 static bool failover_unplug_primary(VirtIONet *n, DeviceState *dev) 3367 { 3368 HotplugHandler *hotplug_ctrl; 3369 PCIDevice *pci_dev; 3370 Error *err = NULL; 3371 3372 hotplug_ctrl = qdev_get_hotplug_handler(dev); 3373 if (hotplug_ctrl) { 3374 pci_dev = PCI_DEVICE(dev); 3375 pci_dev->partially_hotplugged = true; 3376 hotplug_handler_unplug_request(hotplug_ctrl, dev, &err); 3377 if (err) { 3378 error_report_err(err); 3379 return false; 3380 } 3381 } else { 3382 return false; 3383 } 3384 return true; 3385 } 3386 3387 static bool failover_replug_primary(VirtIONet *n, DeviceState *dev, 3388 Error **errp) 3389 { 3390 Error *err = NULL; 3391 HotplugHandler *hotplug_ctrl; 3392 PCIDevice *pdev = PCI_DEVICE(dev); 3393 BusState *primary_bus; 3394 3395 if (!pdev->partially_hotplugged) { 3396 return true; 3397 } 3398 primary_bus = dev->parent_bus; 3399 if (!primary_bus) { 3400 error_setg(errp, "virtio_net: couldn't find primary bus"); 3401 return false; 3402 } 3403 qdev_set_parent_bus(dev, primary_bus, &error_abort); 3404 qatomic_set(&n->failover_primary_hidden, false); 3405 hotplug_ctrl = qdev_get_hotplug_handler(dev); 3406 if (hotplug_ctrl) { 3407 hotplug_handler_pre_plug(hotplug_ctrl, dev, &err); 3408 if (err) { 3409 goto out; 3410 } 3411 hotplug_handler_plug(hotplug_ctrl, dev, &err); 3412 } 3413 pdev->partially_hotplugged = false; 3414 3415 out: 3416 error_propagate(errp, err); 3417 return !err; 3418 } 3419 3420 static void virtio_net_handle_migration_primary(VirtIONet *n, MigrationState *s) 3421 { 3422 bool should_be_hidden; 3423 Error *err = NULL; 3424 DeviceState *dev = failover_find_primary_device(n); 3425 3426 if (!dev) { 3427 return; 3428 } 3429 3430 should_be_hidden = qatomic_read(&n->failover_primary_hidden); 3431 3432 if (migration_in_setup(s) && !should_be_hidden) { 3433 if (failover_unplug_primary(n, dev)) { 3434 vmstate_unregister(VMSTATE_IF(dev), qdev_get_vmsd(dev), dev); 3435 qapi_event_send_unplug_primary(dev->id); 3436 qatomic_set(&n->failover_primary_hidden, true); 3437 } else { 3438 warn_report("couldn't unplug primary device"); 3439 } 3440 } else if (migration_has_failed(s)) { 3441 /* We already unplugged the device let's plug it back */ 3442 if (!failover_replug_primary(n, dev, &err)) { 3443 if (err) { 3444 error_report_err(err); 3445 } 3446 } 3447 } 3448 } 3449 3450 static void virtio_net_migration_state_notifier(Notifier *notifier, void *data) 3451 { 3452 MigrationState *s = data; 3453 VirtIONet *n = container_of(notifier, VirtIONet, migration_state); 3454 virtio_net_handle_migration_primary(n, s); 3455 } 3456 3457 static bool failover_hide_primary_device(DeviceListener *listener, 3458 const QDict *device_opts, 3459 bool from_json, 3460 Error **errp) 3461 { 3462 VirtIONet *n = container_of(listener, VirtIONet, primary_listener); 3463 const char *standby_id; 3464 3465 if (!device_opts) { 3466 return false; 3467 } 3468 3469 if (!qdict_haskey(device_opts, "failover_pair_id")) { 3470 return false; 3471 } 3472 3473 if (!qdict_haskey(device_opts, "id")) { 3474 error_setg(errp, "Device with failover_pair_id needs to have id"); 3475 return false; 3476 } 3477 3478 standby_id = qdict_get_str(device_opts, "failover_pair_id"); 3479 if (g_strcmp0(standby_id, n->netclient_name) != 0) { 3480 return false; 3481 } 3482 3483 /* 3484 * The hide helper can be called several times for a given device. 3485 * Check there is only one primary for a virtio-net device but 3486 * don't duplicate the qdict several times if it's called for the same 3487 * device. 3488 */ 3489 if (n->primary_opts) { 3490 const char *old, *new; 3491 /* devices with failover_pair_id always have an id */ 3492 old = qdict_get_str(n->primary_opts, "id"); 3493 new = qdict_get_str(device_opts, "id"); 3494 if (strcmp(old, new) != 0) { 3495 error_setg(errp, "Cannot attach more than one primary device to " 3496 "'%s': '%s' and '%s'", n->netclient_name, old, new); 3497 return false; 3498 } 3499 } else { 3500 n->primary_opts = qdict_clone_shallow(device_opts); 3501 n->primary_opts_from_json = from_json; 3502 } 3503 3504 /* failover_primary_hidden is set during feature negotiation */ 3505 return qatomic_read(&n->failover_primary_hidden); 3506 } 3507 3508 static void virtio_net_device_realize(DeviceState *dev, Error **errp) 3509 { 3510 VirtIODevice *vdev = VIRTIO_DEVICE(dev); 3511 VirtIONet *n = VIRTIO_NET(dev); 3512 NetClientState *nc; 3513 int i; 3514 3515 if (n->net_conf.mtu) { 3516 n->host_features |= (1ULL << VIRTIO_NET_F_MTU); 3517 } 3518 3519 if (n->net_conf.duplex_str) { 3520 if (strncmp(n->net_conf.duplex_str, "half", 5) == 0) { 3521 n->net_conf.duplex = DUPLEX_HALF; 3522 } else if (strncmp(n->net_conf.duplex_str, "full", 5) == 0) { 3523 n->net_conf.duplex = DUPLEX_FULL; 3524 } else { 3525 error_setg(errp, "'duplex' must be 'half' or 'full'"); 3526 return; 3527 } 3528 n->host_features |= (1ULL << VIRTIO_NET_F_SPEED_DUPLEX); 3529 } else { 3530 n->net_conf.duplex = DUPLEX_UNKNOWN; 3531 } 3532 3533 if (n->net_conf.speed < SPEED_UNKNOWN) { 3534 error_setg(errp, "'speed' must be between 0 and INT_MAX"); 3535 return; 3536 } 3537 if (n->net_conf.speed >= 0) { 3538 n->host_features |= (1ULL << VIRTIO_NET_F_SPEED_DUPLEX); 3539 } 3540 3541 if (n->failover) { 3542 n->primary_listener.hide_device = failover_hide_primary_device; 3543 qatomic_set(&n->failover_primary_hidden, true); 3544 device_listener_register(&n->primary_listener); 3545 n->migration_state.notify = virtio_net_migration_state_notifier; 3546 add_migration_state_change_notifier(&n->migration_state); 3547 n->host_features |= (1ULL << VIRTIO_NET_F_STANDBY); 3548 } 3549 3550 virtio_net_set_config_size(n, n->host_features); 3551 virtio_init(vdev, VIRTIO_ID_NET, n->config_size); 3552 3553 /* 3554 * We set a lower limit on RX queue size to what it always was. 3555 * Guests that want a smaller ring can always resize it without 3556 * help from us (using virtio 1 and up). 3557 */ 3558 if (n->net_conf.rx_queue_size < VIRTIO_NET_RX_QUEUE_MIN_SIZE || 3559 n->net_conf.rx_queue_size > VIRTQUEUE_MAX_SIZE || 3560 !is_power_of_2(n->net_conf.rx_queue_size)) { 3561 error_setg(errp, "Invalid rx_queue_size (= %" PRIu16 "), " 3562 "must be a power of 2 between %d and %d.", 3563 n->net_conf.rx_queue_size, VIRTIO_NET_RX_QUEUE_MIN_SIZE, 3564 VIRTQUEUE_MAX_SIZE); 3565 virtio_cleanup(vdev); 3566 return; 3567 } 3568 3569 if (n->net_conf.tx_queue_size < VIRTIO_NET_TX_QUEUE_MIN_SIZE || 3570 n->net_conf.tx_queue_size > VIRTQUEUE_MAX_SIZE || 3571 !is_power_of_2(n->net_conf.tx_queue_size)) { 3572 error_setg(errp, "Invalid tx_queue_size (= %" PRIu16 "), " 3573 "must be a power of 2 between %d and %d", 3574 n->net_conf.tx_queue_size, VIRTIO_NET_TX_QUEUE_MIN_SIZE, 3575 VIRTQUEUE_MAX_SIZE); 3576 virtio_cleanup(vdev); 3577 return; 3578 } 3579 3580 n->max_ncs = MAX(n->nic_conf.peers.queues, 1); 3581 3582 /* 3583 * Figure out the datapath queue pairs since the backend could 3584 * provide control queue via peers as well. 3585 */ 3586 if (n->nic_conf.peers.queues) { 3587 for (i = 0; i < n->max_ncs; i++) { 3588 if (n->nic_conf.peers.ncs[i]->is_datapath) { 3589 ++n->max_queue_pairs; 3590 } 3591 } 3592 } 3593 n->max_queue_pairs = MAX(n->max_queue_pairs, 1); 3594 3595 if (n->max_queue_pairs * 2 + 1 > VIRTIO_QUEUE_MAX) { 3596 error_setg(errp, "Invalid number of queue pairs (= %" PRIu32 "), " 3597 "must be a positive integer less than %d.", 3598 n->max_queue_pairs, (VIRTIO_QUEUE_MAX - 1) / 2); 3599 virtio_cleanup(vdev); 3600 return; 3601 } 3602 n->vqs = g_new0(VirtIONetQueue, n->max_queue_pairs); 3603 n->curr_queue_pairs = 1; 3604 n->tx_timeout = n->net_conf.txtimer; 3605 3606 if (n->net_conf.tx && strcmp(n->net_conf.tx, "timer") 3607 && strcmp(n->net_conf.tx, "bh")) { 3608 warn_report("virtio-net: " 3609 "Unknown option tx=%s, valid options: \"timer\" \"bh\"", 3610 n->net_conf.tx); 3611 error_printf("Defaulting to \"bh\""); 3612 } 3613 3614 n->net_conf.tx_queue_size = MIN(virtio_net_max_tx_queue_size(n), 3615 n->net_conf.tx_queue_size); 3616 3617 for (i = 0; i < n->max_queue_pairs; i++) { 3618 virtio_net_add_queue(n, i); 3619 } 3620 3621 n->ctrl_vq = virtio_add_queue(vdev, 64, virtio_net_handle_ctrl); 3622 qemu_macaddr_default_if_unset(&n->nic_conf.macaddr); 3623 memcpy(&n->mac[0], &n->nic_conf.macaddr, sizeof(n->mac)); 3624 n->status = VIRTIO_NET_S_LINK_UP; 3625 qemu_announce_timer_reset(&n->announce_timer, migrate_announce_params(), 3626 QEMU_CLOCK_VIRTUAL, 3627 virtio_net_announce_timer, n); 3628 n->announce_timer.round = 0; 3629 3630 if (n->netclient_type) { 3631 /* 3632 * Happen when virtio_net_set_netclient_name has been called. 3633 */ 3634 n->nic = qemu_new_nic(&net_virtio_info, &n->nic_conf, 3635 n->netclient_type, n->netclient_name, n); 3636 } else { 3637 n->nic = qemu_new_nic(&net_virtio_info, &n->nic_conf, 3638 object_get_typename(OBJECT(dev)), dev->id, n); 3639 } 3640 3641 for (i = 0; i < n->max_queue_pairs; i++) { 3642 n->nic->ncs[i].do_not_pad = true; 3643 } 3644 3645 peer_test_vnet_hdr(n); 3646 if (peer_has_vnet_hdr(n)) { 3647 for (i = 0; i < n->max_queue_pairs; i++) { 3648 qemu_using_vnet_hdr(qemu_get_subqueue(n->nic, i)->peer, true); 3649 } 3650 n->host_hdr_len = sizeof(struct virtio_net_hdr); 3651 } else { 3652 n->host_hdr_len = 0; 3653 } 3654 3655 qemu_format_nic_info_str(qemu_get_queue(n->nic), n->nic_conf.macaddr.a); 3656 3657 n->vqs[0].tx_waiting = 0; 3658 n->tx_burst = n->net_conf.txburst; 3659 virtio_net_set_mrg_rx_bufs(n, 0, 0, 0); 3660 n->promisc = 1; /* for compatibility */ 3661 3662 n->mac_table.macs = g_malloc0(MAC_TABLE_ENTRIES * ETH_ALEN); 3663 3664 n->vlans = g_malloc0(MAX_VLAN >> 3); 3665 3666 nc = qemu_get_queue(n->nic); 3667 nc->rxfilter_notify_enabled = 1; 3668 3669 if (nc->peer && nc->peer->info->type == NET_CLIENT_DRIVER_VHOST_VDPA) { 3670 struct virtio_net_config netcfg = {}; 3671 memcpy(&netcfg.mac, &n->nic_conf.macaddr, ETH_ALEN); 3672 vhost_net_set_config(get_vhost_net(nc->peer), 3673 (uint8_t *)&netcfg, 0, ETH_ALEN, VHOST_SET_CONFIG_TYPE_MASTER); 3674 } 3675 QTAILQ_INIT(&n->rsc_chains); 3676 n->qdev = dev; 3677 3678 net_rx_pkt_init(&n->rx_pkt, false); 3679 3680 if (virtio_has_feature(n->host_features, VIRTIO_NET_F_RSS)) { 3681 virtio_net_load_ebpf(n); 3682 } 3683 } 3684 3685 static void virtio_net_device_unrealize(DeviceState *dev) 3686 { 3687 VirtIODevice *vdev = VIRTIO_DEVICE(dev); 3688 VirtIONet *n = VIRTIO_NET(dev); 3689 int i, max_queue_pairs; 3690 3691 if (virtio_has_feature(n->host_features, VIRTIO_NET_F_RSS)) { 3692 virtio_net_unload_ebpf(n); 3693 } 3694 3695 /* This will stop vhost backend if appropriate. */ 3696 virtio_net_set_status(vdev, 0); 3697 3698 g_free(n->netclient_name); 3699 n->netclient_name = NULL; 3700 g_free(n->netclient_type); 3701 n->netclient_type = NULL; 3702 3703 g_free(n->mac_table.macs); 3704 g_free(n->vlans); 3705 3706 if (n->failover) { 3707 qobject_unref(n->primary_opts); 3708 device_listener_unregister(&n->primary_listener); 3709 remove_migration_state_change_notifier(&n->migration_state); 3710 } else { 3711 assert(n->primary_opts == NULL); 3712 } 3713 3714 max_queue_pairs = n->multiqueue ? n->max_queue_pairs : 1; 3715 for (i = 0; i < max_queue_pairs; i++) { 3716 virtio_net_del_queue(n, i); 3717 } 3718 /* delete also control vq */ 3719 virtio_del_queue(vdev, max_queue_pairs * 2); 3720 qemu_announce_timer_del(&n->announce_timer, false); 3721 g_free(n->vqs); 3722 qemu_del_nic(n->nic); 3723 virtio_net_rsc_cleanup(n); 3724 g_free(n->rss_data.indirections_table); 3725 net_rx_pkt_uninit(n->rx_pkt); 3726 virtio_cleanup(vdev); 3727 } 3728 3729 static void virtio_net_instance_init(Object *obj) 3730 { 3731 VirtIONet *n = VIRTIO_NET(obj); 3732 3733 /* 3734 * The default config_size is sizeof(struct virtio_net_config). 3735 * Can be overriden with virtio_net_set_config_size. 3736 */ 3737 n->config_size = sizeof(struct virtio_net_config); 3738 device_add_bootindex_property(obj, &n->nic_conf.bootindex, 3739 "bootindex", "/ethernet-phy@0", 3740 DEVICE(n)); 3741 3742 ebpf_rss_init(&n->ebpf_rss); 3743 } 3744 3745 static int virtio_net_pre_save(void *opaque) 3746 { 3747 VirtIONet *n = opaque; 3748 3749 /* At this point, backend must be stopped, otherwise 3750 * it might keep writing to memory. */ 3751 assert(!n->vhost_started); 3752 3753 return 0; 3754 } 3755 3756 static bool primary_unplug_pending(void *opaque) 3757 { 3758 DeviceState *dev = opaque; 3759 DeviceState *primary; 3760 VirtIODevice *vdev = VIRTIO_DEVICE(dev); 3761 VirtIONet *n = VIRTIO_NET(vdev); 3762 3763 if (!virtio_vdev_has_feature(vdev, VIRTIO_NET_F_STANDBY)) { 3764 return false; 3765 } 3766 primary = failover_find_primary_device(n); 3767 return primary ? primary->pending_deleted_event : false; 3768 } 3769 3770 static bool dev_unplug_pending(void *opaque) 3771 { 3772 DeviceState *dev = opaque; 3773 VirtioDeviceClass *vdc = VIRTIO_DEVICE_GET_CLASS(dev); 3774 3775 return vdc->primary_unplug_pending(dev); 3776 } 3777 3778 static struct vhost_dev *virtio_net_get_vhost(VirtIODevice *vdev) 3779 { 3780 VirtIONet *n = VIRTIO_NET(vdev); 3781 NetClientState *nc = qemu_get_queue(n->nic); 3782 struct vhost_net *net = get_vhost_net(nc->peer); 3783 return &net->dev; 3784 } 3785 3786 static const VMStateDescription vmstate_virtio_net = { 3787 .name = "virtio-net", 3788 .minimum_version_id = VIRTIO_NET_VM_VERSION, 3789 .version_id = VIRTIO_NET_VM_VERSION, 3790 .fields = (VMStateField[]) { 3791 VMSTATE_VIRTIO_DEVICE, 3792 VMSTATE_END_OF_LIST() 3793 }, 3794 .pre_save = virtio_net_pre_save, 3795 .dev_unplug_pending = dev_unplug_pending, 3796 }; 3797 3798 static Property virtio_net_properties[] = { 3799 DEFINE_PROP_BIT64("csum", VirtIONet, host_features, 3800 VIRTIO_NET_F_CSUM, true), 3801 DEFINE_PROP_BIT64("guest_csum", VirtIONet, host_features, 3802 VIRTIO_NET_F_GUEST_CSUM, true), 3803 DEFINE_PROP_BIT64("gso", VirtIONet, host_features, VIRTIO_NET_F_GSO, true), 3804 DEFINE_PROP_BIT64("guest_tso4", VirtIONet, host_features, 3805 VIRTIO_NET_F_GUEST_TSO4, true), 3806 DEFINE_PROP_BIT64("guest_tso6", VirtIONet, host_features, 3807 VIRTIO_NET_F_GUEST_TSO6, true), 3808 DEFINE_PROP_BIT64("guest_ecn", VirtIONet, host_features, 3809 VIRTIO_NET_F_GUEST_ECN, true), 3810 DEFINE_PROP_BIT64("guest_ufo", VirtIONet, host_features, 3811 VIRTIO_NET_F_GUEST_UFO, true), 3812 DEFINE_PROP_BIT64("guest_announce", VirtIONet, host_features, 3813 VIRTIO_NET_F_GUEST_ANNOUNCE, true), 3814 DEFINE_PROP_BIT64("host_tso4", VirtIONet, host_features, 3815 VIRTIO_NET_F_HOST_TSO4, true), 3816 DEFINE_PROP_BIT64("host_tso6", VirtIONet, host_features, 3817 VIRTIO_NET_F_HOST_TSO6, true), 3818 DEFINE_PROP_BIT64("host_ecn", VirtIONet, host_features, 3819 VIRTIO_NET_F_HOST_ECN, true), 3820 DEFINE_PROP_BIT64("host_ufo", VirtIONet, host_features, 3821 VIRTIO_NET_F_HOST_UFO, true), 3822 DEFINE_PROP_BIT64("mrg_rxbuf", VirtIONet, host_features, 3823 VIRTIO_NET_F_MRG_RXBUF, true), 3824 DEFINE_PROP_BIT64("status", VirtIONet, host_features, 3825 VIRTIO_NET_F_STATUS, true), 3826 DEFINE_PROP_BIT64("ctrl_vq", VirtIONet, host_features, 3827 VIRTIO_NET_F_CTRL_VQ, true), 3828 DEFINE_PROP_BIT64("ctrl_rx", VirtIONet, host_features, 3829 VIRTIO_NET_F_CTRL_RX, true), 3830 DEFINE_PROP_BIT64("ctrl_vlan", VirtIONet, host_features, 3831 VIRTIO_NET_F_CTRL_VLAN, true), 3832 DEFINE_PROP_BIT64("ctrl_rx_extra", VirtIONet, host_features, 3833 VIRTIO_NET_F_CTRL_RX_EXTRA, true), 3834 DEFINE_PROP_BIT64("ctrl_mac_addr", VirtIONet, host_features, 3835 VIRTIO_NET_F_CTRL_MAC_ADDR, true), 3836 DEFINE_PROP_BIT64("ctrl_guest_offloads", VirtIONet, host_features, 3837 VIRTIO_NET_F_CTRL_GUEST_OFFLOADS, true), 3838 DEFINE_PROP_BIT64("mq", VirtIONet, host_features, VIRTIO_NET_F_MQ, false), 3839 DEFINE_PROP_BIT64("rss", VirtIONet, host_features, 3840 VIRTIO_NET_F_RSS, false), 3841 DEFINE_PROP_BIT64("hash", VirtIONet, host_features, 3842 VIRTIO_NET_F_HASH_REPORT, false), 3843 DEFINE_PROP_BIT64("guest_rsc_ext", VirtIONet, host_features, 3844 VIRTIO_NET_F_RSC_EXT, false), 3845 DEFINE_PROP_UINT32("rsc_interval", VirtIONet, rsc_timeout, 3846 VIRTIO_NET_RSC_DEFAULT_INTERVAL), 3847 DEFINE_NIC_PROPERTIES(VirtIONet, nic_conf), 3848 DEFINE_PROP_UINT32("x-txtimer", VirtIONet, net_conf.txtimer, 3849 TX_TIMER_INTERVAL), 3850 DEFINE_PROP_INT32("x-txburst", VirtIONet, net_conf.txburst, TX_BURST), 3851 DEFINE_PROP_STRING("tx", VirtIONet, net_conf.tx), 3852 DEFINE_PROP_UINT16("rx_queue_size", VirtIONet, net_conf.rx_queue_size, 3853 VIRTIO_NET_RX_QUEUE_DEFAULT_SIZE), 3854 DEFINE_PROP_UINT16("tx_queue_size", VirtIONet, net_conf.tx_queue_size, 3855 VIRTIO_NET_TX_QUEUE_DEFAULT_SIZE), 3856 DEFINE_PROP_UINT16("host_mtu", VirtIONet, net_conf.mtu, 0), 3857 DEFINE_PROP_BOOL("x-mtu-bypass-backend", VirtIONet, mtu_bypass_backend, 3858 true), 3859 DEFINE_PROP_INT32("speed", VirtIONet, net_conf.speed, SPEED_UNKNOWN), 3860 DEFINE_PROP_STRING("duplex", VirtIONet, net_conf.duplex_str), 3861 DEFINE_PROP_BOOL("failover", VirtIONet, failover, false), 3862 DEFINE_PROP_END_OF_LIST(), 3863 }; 3864 3865 static void virtio_net_class_init(ObjectClass *klass, void *data) 3866 { 3867 DeviceClass *dc = DEVICE_CLASS(klass); 3868 VirtioDeviceClass *vdc = VIRTIO_DEVICE_CLASS(klass); 3869 3870 device_class_set_props(dc, virtio_net_properties); 3871 dc->vmsd = &vmstate_virtio_net; 3872 set_bit(DEVICE_CATEGORY_NETWORK, dc->categories); 3873 vdc->realize = virtio_net_device_realize; 3874 vdc->unrealize = virtio_net_device_unrealize; 3875 vdc->get_config = virtio_net_get_config; 3876 vdc->set_config = virtio_net_set_config; 3877 vdc->get_features = virtio_net_get_features; 3878 vdc->set_features = virtio_net_set_features; 3879 vdc->bad_features = virtio_net_bad_features; 3880 vdc->reset = virtio_net_reset; 3881 vdc->queue_reset = virtio_net_queue_reset; 3882 vdc->queue_enable = virtio_net_queue_enable; 3883 vdc->set_status = virtio_net_set_status; 3884 vdc->guest_notifier_mask = virtio_net_guest_notifier_mask; 3885 vdc->guest_notifier_pending = virtio_net_guest_notifier_pending; 3886 vdc->legacy_features |= (0x1 << VIRTIO_NET_F_GSO); 3887 vdc->post_load = virtio_net_post_load_virtio; 3888 vdc->vmsd = &vmstate_virtio_net_device; 3889 vdc->primary_unplug_pending = primary_unplug_pending; 3890 vdc->get_vhost = virtio_net_get_vhost; 3891 } 3892 3893 static const TypeInfo virtio_net_info = { 3894 .name = TYPE_VIRTIO_NET, 3895 .parent = TYPE_VIRTIO_DEVICE, 3896 .instance_size = sizeof(VirtIONet), 3897 .instance_init = virtio_net_instance_init, 3898 .class_init = virtio_net_class_init, 3899 }; 3900 3901 static void virtio_register_types(void) 3902 { 3903 type_register_static(&virtio_net_info); 3904 } 3905 3906 type_init(virtio_register_types) 3907