Lines Matching refs:n

115     VirtIONet *n = qemu_get_nic_opaque(nc);  in virtio_net_get_subqueue()  local
117 return &n->vqs[nc->queue_index]; in virtio_net_get_subqueue()
141 VirtIONet *n = VIRTIO_NET(vdev); in virtio_net_get_config() local
143 NetClientState *nc = qemu_get_queue(n->nic); in virtio_net_get_config()
148 virtio_stw_p(vdev, &netcfg.status, n->status); in virtio_net_get_config()
149 virtio_stw_p(vdev, &netcfg.max_virtqueue_pairs, n->max_queue_pairs); in virtio_net_get_config()
150 virtio_stw_p(vdev, &netcfg.mtu, n->net_conf.mtu); in virtio_net_get_config()
151 memcpy(netcfg.mac, n->mac, ETH_ALEN); in virtio_net_get_config()
152 virtio_stl_p(vdev, &netcfg.speed, n->net_conf.speed); in virtio_net_get_config()
153 netcfg.duplex = n->net_conf.duplex; in virtio_net_get_config()
160 memcpy(config, &netcfg, n->config_size); in virtio_net_get_config()
168 n->config_size); in virtio_net_get_config()
181 memcpy(netcfg.mac, n->mac, ETH_ALEN); in virtio_net_get_config()
185 n->status & VIRTIO_NET_S_ANNOUNCE); in virtio_net_get_config()
186 memcpy(config, &netcfg, n->config_size); in virtio_net_get_config()
192 VirtIONet *n = VIRTIO_NET(vdev); in virtio_net_set_config() local
194 NetClientState *nc = qemu_get_queue(n->nic); in virtio_net_set_config()
196 memcpy(&netcfg, config, n->config_size); in virtio_net_set_config()
200 memcmp(netcfg.mac, n->mac, ETH_ALEN)) { in virtio_net_set_config()
201 memcpy(n->mac, netcfg.mac, ETH_ALEN); in virtio_net_set_config()
202 qemu_format_nic_info_str(qemu_get_queue(n->nic), n->mac); in virtio_net_set_config()
211 (uint8_t *)&netcfg, 0, n->config_size, in virtio_net_set_config()
216 static bool virtio_net_started(VirtIONet *n, uint8_t status) in virtio_net_started() argument
218 VirtIODevice *vdev = VIRTIO_DEVICE(n); in virtio_net_started()
220 (n->status & VIRTIO_NET_S_LINK_UP) && vdev->vm_running; in virtio_net_started()
234 VirtIONet *n = opaque; in virtio_net_announce_timer() local
235 trace_virtio_net_announce_timer(n->announce_timer.round); in virtio_net_announce_timer()
237 n->announce_timer.round--; in virtio_net_announce_timer()
238 virtio_net_announce_notify(n); in virtio_net_announce_timer()
243 VirtIONet *n = qemu_get_nic_opaque(nc); in virtio_net_announce() local
244 VirtIODevice *vdev = VIRTIO_DEVICE(n); in virtio_net_announce()
251 if (n->announce_timer.round) { in virtio_net_announce()
257 virtio_net_announce_notify(n); in virtio_net_announce()
261 static void virtio_net_vhost_status(VirtIONet *n, uint8_t status) in virtio_net_vhost_status() argument
263 VirtIODevice *vdev = VIRTIO_DEVICE(n); in virtio_net_vhost_status()
264 NetClientState *nc = qemu_get_queue(n->nic); in virtio_net_vhost_status()
265 int queue_pairs = n->multiqueue ? n->max_queue_pairs : 1; in virtio_net_vhost_status()
267 n->max_ncs - n->max_queue_pairs : 0; in virtio_net_vhost_status()
273 if ((virtio_net_started(n, status) && !nc->peer->link_down) == in virtio_net_vhost_status()
274 !!n->vhost_started) { in virtio_net_vhost_status()
277 if (!n->vhost_started) { in virtio_net_vhost_status()
280 if (n->needs_vnet_hdr_swap) { in virtio_net_vhost_status()
291 NetClientState *qnc = qemu_get_subqueue(n->nic, i); in virtio_net_vhost_status()
299 r = vhost_net_set_mtu(get_vhost_net(nc->peer), n->net_conf.mtu); in virtio_net_vhost_status()
302 n->net_conf.mtu); in virtio_net_vhost_status()
308 n->vhost_started = 1; in virtio_net_vhost_status()
309 r = vhost_net_start(vdev, n->nic->ncs, queue_pairs, cvq); in virtio_net_vhost_status()
313 n->vhost_started = 0; in virtio_net_vhost_status()
316 vhost_net_stop(vdev, n->nic->ncs, queue_pairs, cvq); in virtio_net_vhost_status()
317 n->vhost_started = 0; in virtio_net_vhost_status()
351 static void virtio_net_vnet_endian_status(VirtIONet *n, uint8_t status) in virtio_net_vnet_endian_status() argument
353 VirtIODevice *vdev = VIRTIO_DEVICE(n); in virtio_net_vnet_endian_status()
354 int queue_pairs = n->multiqueue ? n->max_queue_pairs : 1; in virtio_net_vnet_endian_status()
356 if (virtio_net_started(n, status)) { in virtio_net_vnet_endian_status()
362 n->needs_vnet_hdr_swap = virtio_net_set_vnet_endian(vdev, n->nic->ncs, in virtio_net_vnet_endian_status()
364 } else if (virtio_net_started(n, vdev->status)) { in virtio_net_vnet_endian_status()
370 virtio_net_set_vnet_endian(vdev, n->nic->ncs, queue_pairs, false); in virtio_net_vnet_endian_status()
384 VirtIONet *n = VIRTIO_NET(vdev); in virtio_net_set_status() local
389 virtio_net_vnet_endian_status(n, status); in virtio_net_set_status()
390 virtio_net_vhost_status(n, status); in virtio_net_set_status()
392 for (i = 0; i < n->max_queue_pairs; i++) { in virtio_net_set_status()
393 NetClientState *ncs = qemu_get_subqueue(n->nic, i); in virtio_net_set_status()
395 q = &n->vqs[i]; in virtio_net_set_status()
397 if ((!n->multiqueue && i != 0) || i >= n->curr_queue_pairs) { in virtio_net_set_status()
403 virtio_net_started(n, queue_status) && !n->vhost_started; in virtio_net_set_status()
416 qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + n->tx_timeout); in virtio_net_set_status()
426 if ((n->status & VIRTIO_NET_S_LINK_UP) == 0 && in virtio_net_set_status()
441 VirtIONet *n = qemu_get_nic_opaque(nc); in virtio_net_set_link_status() local
442 VirtIODevice *vdev = VIRTIO_DEVICE(n); in virtio_net_set_link_status()
443 uint16_t old_status = n->status; in virtio_net_set_link_status()
446 n->status &= ~VIRTIO_NET_S_LINK_UP; in virtio_net_set_link_status()
448 n->status |= VIRTIO_NET_S_LINK_UP; in virtio_net_set_link_status()
450 if (n->status != old_status) in virtio_net_set_link_status()
458 VirtIONet *n = qemu_get_nic_opaque(nc); in rxfilter_notify() local
461 char *path = object_get_canonical_path(OBJECT(n->qdev)); in rxfilter_notify()
462 qapi_event_send_nic_rx_filter_changed(n->netclient_name, path); in rxfilter_notify()
470 static intList *get_vlan_table(VirtIONet *n) in get_vlan_table() argument
477 for (j = 0; n->vlans[i] && j <= 0x1f; j++) { in get_vlan_table()
478 if (n->vlans[i] & (1U << j)) { in get_vlan_table()
489 VirtIONet *n = qemu_get_nic_opaque(nc); in virtio_net_query_rxfilter() local
490 VirtIODevice *vdev = VIRTIO_DEVICE(n); in virtio_net_query_rxfilter()
497 info->promiscuous = n->promisc; in virtio_net_query_rxfilter()
499 if (n->nouni) { in virtio_net_query_rxfilter()
501 } else if (n->alluni) { in virtio_net_query_rxfilter()
507 if (n->nomulti) { in virtio_net_query_rxfilter()
509 } else if (n->allmulti) { in virtio_net_query_rxfilter()
515 info->broadcast_allowed = n->nobcast; in virtio_net_query_rxfilter()
516 info->multicast_overflow = n->mac_table.multi_overflow; in virtio_net_query_rxfilter()
517 info->unicast_overflow = n->mac_table.uni_overflow; in virtio_net_query_rxfilter()
519 info->main_mac = qemu_mac_strdup_printf(n->mac); in virtio_net_query_rxfilter()
522 for (i = 0; i < n->mac_table.first_multi; i++) { in virtio_net_query_rxfilter()
524 qemu_mac_strdup_printf(n->mac_table.macs + i * ETH_ALEN)); in virtio_net_query_rxfilter()
529 for (i = n->mac_table.first_multi; i < n->mac_table.in_use; i++) { in virtio_net_query_rxfilter()
531 qemu_mac_strdup_printf(n->mac_table.macs + i * ETH_ALEN)); in virtio_net_query_rxfilter()
534 info->vlan_table = get_vlan_table(n); in virtio_net_query_rxfilter()
552 VirtIONet *n = VIRTIO_NET(vdev); in virtio_net_queue_reset() local
556 if (queue_index >= n->max_queue_pairs * 2) { in virtio_net_queue_reset()
560 nc = qemu_get_subqueue(n->nic, vq2q(queue_index)); in virtio_net_queue_reset()
576 VirtIONet *n = VIRTIO_NET(vdev); in virtio_net_queue_enable() local
581 if (queue_index >= n->max_queue_pairs * 2) { in virtio_net_queue_enable()
585 nc = qemu_get_subqueue(n->nic, vq2q(queue_index)); in virtio_net_queue_enable()
603 VirtIONet *n = VIRTIO_NET(vdev); in virtio_net_reset() local
607 n->promisc = 1; in virtio_net_reset()
608 n->allmulti = 0; in virtio_net_reset()
609 n->alluni = 0; in virtio_net_reset()
610 n->nomulti = 0; in virtio_net_reset()
611 n->nouni = 0; in virtio_net_reset()
612 n->nobcast = 0; in virtio_net_reset()
614 n->curr_queue_pairs = 1; in virtio_net_reset()
615 timer_del(n->announce_timer.tm); in virtio_net_reset()
616 n->announce_timer.round = 0; in virtio_net_reset()
617 n->status &= ~VIRTIO_NET_S_ANNOUNCE; in virtio_net_reset()
620 n->mac_table.in_use = 0; in virtio_net_reset()
621 n->mac_table.first_multi = 0; in virtio_net_reset()
622 n->mac_table.multi_overflow = 0; in virtio_net_reset()
623 n->mac_table.uni_overflow = 0; in virtio_net_reset()
624 memset(n->mac_table.macs, 0, MAC_TABLE_ENTRIES * ETH_ALEN); in virtio_net_reset()
625 memcpy(&n->mac[0], &n->nic->conf->macaddr, sizeof(n->mac)); in virtio_net_reset()
626 qemu_format_nic_info_str(qemu_get_queue(n->nic), n->mac); in virtio_net_reset()
627 memset(n->vlans, 0, MAX_VLAN >> 3); in virtio_net_reset()
630 for (i = 0; i < n->max_queue_pairs; i++) { in virtio_net_reset()
631 flush_or_purge_queued_packets(qemu_get_subqueue(n->nic, i)); in virtio_net_reset()
635 static void peer_test_vnet_hdr(VirtIONet *n) in peer_test_vnet_hdr() argument
637 NetClientState *nc = qemu_get_queue(n->nic); in peer_test_vnet_hdr()
642 n->has_vnet_hdr = qemu_has_vnet_hdr(nc->peer); in peer_test_vnet_hdr()
645 static int peer_has_vnet_hdr(VirtIONet *n) in peer_has_vnet_hdr() argument
647 return n->has_vnet_hdr; in peer_has_vnet_hdr()
650 static int peer_has_ufo(VirtIONet *n) in peer_has_ufo() argument
652 if (!peer_has_vnet_hdr(n)) in peer_has_ufo()
655 n->has_ufo = qemu_has_ufo(qemu_get_queue(n->nic)->peer); in peer_has_ufo()
657 return n->has_ufo; in peer_has_ufo()
660 static int peer_has_uso(VirtIONet *n) in peer_has_uso() argument
662 if (!peer_has_vnet_hdr(n)) { in peer_has_uso()
666 return qemu_has_uso(qemu_get_queue(n->nic)->peer); in peer_has_uso()
669 static void virtio_net_set_mrg_rx_bufs(VirtIONet *n, int mergeable_rx_bufs, in virtio_net_set_mrg_rx_bufs() argument
675 n->mergeable_rx_bufs = mergeable_rx_bufs; in virtio_net_set_mrg_rx_bufs()
683 n->guest_hdr_len = hash_report ? in virtio_net_set_mrg_rx_bufs()
686 n->rss_data.populate_hash = !!hash_report; in virtio_net_set_mrg_rx_bufs()
688 n->guest_hdr_len = n->mergeable_rx_bufs ? in virtio_net_set_mrg_rx_bufs()
693 for (i = 0; i < n->max_queue_pairs; i++) { in virtio_net_set_mrg_rx_bufs()
694 nc = qemu_get_subqueue(n->nic, i); in virtio_net_set_mrg_rx_bufs()
696 if (peer_has_vnet_hdr(n) && in virtio_net_set_mrg_rx_bufs()
697 qemu_has_vnet_hdr_len(nc->peer, n->guest_hdr_len)) { in virtio_net_set_mrg_rx_bufs()
698 qemu_set_vnet_hdr_len(nc->peer, n->guest_hdr_len); in virtio_net_set_mrg_rx_bufs()
699 n->host_hdr_len = n->guest_hdr_len; in virtio_net_set_mrg_rx_bufs()
704 static int virtio_net_max_tx_queue_size(VirtIONet *n) in virtio_net_max_tx_queue_size() argument
706 NetClientState *peer = n->nic_conf.peers.ncs[0]; in virtio_net_max_tx_queue_size()
725 static int peer_attach(VirtIONet *n, int index) in peer_attach() argument
727 NetClientState *nc = qemu_get_subqueue(n->nic, index); in peer_attach()
741 if (n->max_queue_pairs == 1) { in peer_attach()
748 static int peer_detach(VirtIONet *n, int index) in peer_detach() argument
750 NetClientState *nc = qemu_get_subqueue(n->nic, index); in peer_detach()
767 static void virtio_net_set_queue_pairs(VirtIONet *n) in virtio_net_set_queue_pairs() argument
772 if (n->nic->peer_deleted) { in virtio_net_set_queue_pairs()
776 for (i = 0; i < n->max_queue_pairs; i++) { in virtio_net_set_queue_pairs()
777 if (i < n->curr_queue_pairs) { in virtio_net_set_queue_pairs()
778 r = peer_attach(n, i); in virtio_net_set_queue_pairs()
781 r = peer_detach(n, i); in virtio_net_set_queue_pairs()
787 static void virtio_net_set_multiqueue(VirtIONet *n, int multiqueue);
792 VirtIONet *n = VIRTIO_NET(vdev); in virtio_net_get_features() local
793 NetClientState *nc = qemu_get_queue(n->nic); in virtio_net_get_features()
796 features |= n->host_features; in virtio_net_get_features()
800 if (!peer_has_vnet_hdr(n)) { in virtio_net_get_features()
818 if (!peer_has_vnet_hdr(n) || !peer_has_ufo(n)) { in virtio_net_get_features()
823 if (!peer_has_uso(n)) { in virtio_net_get_features()
833 if (!ebpf_rss_is_loaded(&n->ebpf_rss)) { in virtio_net_get_features()
839 if (n->mtu_bypass_backend && in virtio_net_get_features()
840 (n->host_features & 1ULL << VIRTIO_NET_F_MTU)) { in virtio_net_get_features()
877 static void virtio_net_apply_guest_offloads(VirtIONet *n) in virtio_net_apply_guest_offloads() argument
879 qemu_set_offload(qemu_get_queue(n->nic)->peer, in virtio_net_apply_guest_offloads()
880 !!(n->curr_guest_offloads & (1ULL << VIRTIO_NET_F_GUEST_CSUM)), in virtio_net_apply_guest_offloads()
881 !!(n->curr_guest_offloads & (1ULL << VIRTIO_NET_F_GUEST_TSO4)), in virtio_net_apply_guest_offloads()
882 !!(n->curr_guest_offloads & (1ULL << VIRTIO_NET_F_GUEST_TSO6)), in virtio_net_apply_guest_offloads()
883 !!(n->curr_guest_offloads & (1ULL << VIRTIO_NET_F_GUEST_ECN)), in virtio_net_apply_guest_offloads()
884 !!(n->curr_guest_offloads & (1ULL << VIRTIO_NET_F_GUEST_UFO)), in virtio_net_apply_guest_offloads()
885 !!(n->curr_guest_offloads & (1ULL << VIRTIO_NET_F_GUEST_USO4)), in virtio_net_apply_guest_offloads()
886 !!(n->curr_guest_offloads & (1ULL << VIRTIO_NET_F_GUEST_USO6))); in virtio_net_apply_guest_offloads()
903 uint64_t virtio_net_supported_guest_offloads(const VirtIONet *n) in virtio_net_supported_guest_offloads() argument
905 VirtIODevice *vdev = VIRTIO_DEVICE(n); in virtio_net_supported_guest_offloads()
910 VirtIONet *n; member
931 if (!g_strcmp0(pci_dev->failover_pair_id, fdev->n->netclient_name)) { in failover_set_primary()
945 static DeviceState *failover_find_primary_device(VirtIONet *n) in failover_find_primary_device() argument
948 .n = n, in failover_find_primary_device()
956 static void failover_add_primary(VirtIONet *n, Error **errp) in failover_add_primary() argument
959 DeviceState *dev = failover_find_primary_device(n); in failover_add_primary()
965 if (!n->primary_opts) { in failover_add_primary()
969 " failover_pair_id=%s\n", n->netclient_name); in failover_add_primary()
973 dev = qdev_device_add_from_qdict(n->primary_opts, in failover_add_primary()
974 n->primary_opts_from_json, in failover_add_primary()
977 qobject_unref(n->primary_opts); in failover_add_primary()
978 n->primary_opts = NULL; in failover_add_primary()
987 VirtIONet *n = VIRTIO_NET(vdev); in virtio_net_set_features() local
991 if (n->mtu_bypass_backend && in virtio_net_set_features()
996 virtio_net_set_multiqueue(n, in virtio_net_set_features()
1000 virtio_net_set_mrg_rx_bufs(n, in virtio_net_set_features()
1008 n->rsc4_enabled = virtio_has_feature(features, VIRTIO_NET_F_RSC_EXT) && in virtio_net_set_features()
1010 n->rsc6_enabled = virtio_has_feature(features, VIRTIO_NET_F_RSC_EXT) && in virtio_net_set_features()
1012 n->rss_data.redirect = virtio_has_feature(features, VIRTIO_NET_F_RSS); in virtio_net_set_features()
1014 if (n->has_vnet_hdr) { in virtio_net_set_features()
1015 n->curr_guest_offloads = in virtio_net_set_features()
1017 virtio_net_apply_guest_offloads(n); in virtio_net_set_features()
1020 for (i = 0; i < n->max_queue_pairs; i++) { in virtio_net_set_features()
1021 NetClientState *nc = qemu_get_subqueue(n->nic, i); in virtio_net_set_features()
1036 memset(n->vlans, 0xff, MAX_VLAN >> 3); in virtio_net_set_features()
1040 qapi_event_send_failover_negotiated(n->netclient_name); in virtio_net_set_features()
1041 qatomic_set(&n->failover_primary_hidden, false); in virtio_net_set_features()
1042 failover_add_primary(n, &err); in virtio_net_set_features()
1053 static int virtio_net_handle_rx_mode(VirtIONet *n, uint8_t cmd, in virtio_net_handle_rx_mode() argument
1058 NetClientState *nc = qemu_get_queue(n->nic); in virtio_net_handle_rx_mode()
1066 n->promisc = on; in virtio_net_handle_rx_mode()
1068 n->allmulti = on; in virtio_net_handle_rx_mode()
1070 n->alluni = on; in virtio_net_handle_rx_mode()
1072 n->nomulti = on; in virtio_net_handle_rx_mode()
1074 n->nouni = on; in virtio_net_handle_rx_mode()
1076 n->nobcast = on; in virtio_net_handle_rx_mode()
1086 static int virtio_net_handle_offloads(VirtIONet *n, uint8_t cmd, in virtio_net_handle_offloads() argument
1089 VirtIODevice *vdev = VIRTIO_DEVICE(n); in virtio_net_handle_offloads()
1107 if (!n->has_vnet_hdr) { in virtio_net_handle_offloads()
1111 n->rsc4_enabled = virtio_has_feature(offloads, VIRTIO_NET_F_RSC_EXT) && in virtio_net_handle_offloads()
1113 n->rsc6_enabled = virtio_has_feature(offloads, VIRTIO_NET_F_RSC_EXT) && in virtio_net_handle_offloads()
1117 supported_offloads = virtio_net_supported_guest_offloads(n); in virtio_net_handle_offloads()
1122 n->curr_guest_offloads = offloads; in virtio_net_handle_offloads()
1123 virtio_net_apply_guest_offloads(n); in virtio_net_handle_offloads()
1131 static int virtio_net_handle_mac(VirtIONet *n, uint8_t cmd, in virtio_net_handle_mac() argument
1134 VirtIODevice *vdev = VIRTIO_DEVICE(n); in virtio_net_handle_mac()
1137 NetClientState *nc = qemu_get_queue(n->nic); in virtio_net_handle_mac()
1140 if (iov_size(iov, iov_cnt) != sizeof(n->mac)) { in virtio_net_handle_mac()
1143 s = iov_to_buf(iov, iov_cnt, 0, &n->mac, sizeof(n->mac)); in virtio_net_handle_mac()
1144 assert(s == sizeof(n->mac)); in virtio_net_handle_mac()
1145 qemu_format_nic_info_str(qemu_get_queue(n->nic), n->mac); in virtio_net_handle_mac()
1212 n->mac_table.in_use = in_use; in virtio_net_handle_mac()
1213 n->mac_table.first_multi = first_multi; in virtio_net_handle_mac()
1214 n->mac_table.uni_overflow = uni_overflow; in virtio_net_handle_mac()
1215 n->mac_table.multi_overflow = multi_overflow; in virtio_net_handle_mac()
1216 memcpy(n->mac_table.macs, macs, MAC_TABLE_ENTRIES * ETH_ALEN); in virtio_net_handle_mac()
1227 static int virtio_net_handle_vlan_table(VirtIONet *n, uint8_t cmd, in virtio_net_handle_vlan_table() argument
1230 VirtIODevice *vdev = VIRTIO_DEVICE(n); in virtio_net_handle_vlan_table()
1233 NetClientState *nc = qemu_get_queue(n->nic); in virtio_net_handle_vlan_table()
1245 n->vlans[vid >> 5] |= (1U << (vid & 0x1f)); in virtio_net_handle_vlan_table()
1247 n->vlans[vid >> 5] &= ~(1U << (vid & 0x1f)); in virtio_net_handle_vlan_table()
1256 static int virtio_net_handle_announce(VirtIONet *n, uint8_t cmd, in virtio_net_handle_announce() argument
1259 trace_virtio_net_handle_announce(n->announce_timer.round); in virtio_net_handle_announce()
1261 n->status & VIRTIO_NET_S_ANNOUNCE) { in virtio_net_handle_announce()
1262 n->status &= ~VIRTIO_NET_S_ANNOUNCE; in virtio_net_handle_announce()
1263 if (n->announce_timer.round) { in virtio_net_handle_announce()
1264 qemu_announce_timer_step(&n->announce_timer); in virtio_net_handle_announce()
1272 static void virtio_net_detach_epbf_rss(VirtIONet *n);
1274 static void virtio_net_disable_rss(VirtIONet *n) in virtio_net_disable_rss() argument
1276 if (n->rss_data.enabled) { in virtio_net_disable_rss()
1279 n->rss_data.enabled = false; in virtio_net_disable_rss()
1281 virtio_net_detach_epbf_rss(n); in virtio_net_disable_rss()
1304 static bool virtio_net_attach_epbf_rss(VirtIONet *n) in virtio_net_attach_epbf_rss() argument
1308 if (!ebpf_rss_is_loaded(&n->ebpf_rss)) { in virtio_net_attach_epbf_rss()
1312 rss_data_to_rss_config(&n->rss_data, &config); in virtio_net_attach_epbf_rss()
1314 if (!ebpf_rss_set_all(&n->ebpf_rss, &config, in virtio_net_attach_epbf_rss()
1315 n->rss_data.indirections_table, n->rss_data.key)) { in virtio_net_attach_epbf_rss()
1319 if (!virtio_net_attach_ebpf_to_backend(n->nic, n->ebpf_rss.program_fd)) { in virtio_net_attach_epbf_rss()
1326 static void virtio_net_detach_epbf_rss(VirtIONet *n) in virtio_net_detach_epbf_rss() argument
1328 virtio_net_attach_ebpf_to_backend(n->nic, -1); in virtio_net_detach_epbf_rss()
1331 static bool virtio_net_load_ebpf(VirtIONet *n) in virtio_net_load_ebpf() argument
1333 if (!virtio_net_attach_ebpf_to_backend(n->nic, -1)) { in virtio_net_load_ebpf()
1338 return ebpf_rss_load(&n->ebpf_rss); in virtio_net_load_ebpf()
1341 static void virtio_net_unload_ebpf(VirtIONet *n) in virtio_net_unload_ebpf() argument
1343 virtio_net_attach_ebpf_to_backend(n->nic, -1); in virtio_net_unload_ebpf()
1344 ebpf_rss_unload(&n->ebpf_rss); in virtio_net_unload_ebpf()
1347 static uint16_t virtio_net_handle_rss(VirtIONet *n, in virtio_net_handle_rss() argument
1352 VirtIODevice *vdev = VIRTIO_DEVICE(n); in virtio_net_handle_rss()
1378 n->rss_data.hash_types = virtio_ldl_p(vdev, &cfg.hash_types); in virtio_net_handle_rss()
1379 n->rss_data.indirections_len = in virtio_net_handle_rss()
1381 n->rss_data.indirections_len++; in virtio_net_handle_rss()
1383 n->rss_data.indirections_len = 1; in virtio_net_handle_rss()
1385 if (!is_power_of_2(n->rss_data.indirections_len)) { in virtio_net_handle_rss()
1387 err_value = n->rss_data.indirections_len; in virtio_net_handle_rss()
1390 if (n->rss_data.indirections_len > VIRTIO_NET_RSS_MAX_TABLE_LEN) { in virtio_net_handle_rss()
1392 err_value = n->rss_data.indirections_len; in virtio_net_handle_rss()
1395 n->rss_data.default_queue = do_rss ? in virtio_net_handle_rss()
1397 if (n->rss_data.default_queue >= n->max_queue_pairs) { in virtio_net_handle_rss()
1399 err_value = n->rss_data.default_queue; in virtio_net_handle_rss()
1403 size_get = sizeof(uint16_t) * n->rss_data.indirections_len; in virtio_net_handle_rss()
1404 g_free(n->rss_data.indirections_table); in virtio_net_handle_rss()
1405 n->rss_data.indirections_table = g_malloc(size_get); in virtio_net_handle_rss()
1406 if (!n->rss_data.indirections_table) { in virtio_net_handle_rss()
1408 err_value = n->rss_data.indirections_len; in virtio_net_handle_rss()
1412 n->rss_data.indirections_table, size_get); in virtio_net_handle_rss()
1418 for (i = 0; i < n->rss_data.indirections_len; ++i) { in virtio_net_handle_rss()
1419 uint16_t val = n->rss_data.indirections_table[i]; in virtio_net_handle_rss()
1420 n->rss_data.indirections_table[i] = virtio_lduw_p(vdev, &val); in virtio_net_handle_rss()
1430 queue_pairs = do_rss ? virtio_lduw_p(vdev, &temp.us) : n->curr_queue_pairs; in virtio_net_handle_rss()
1431 if (queue_pairs == 0 || queue_pairs > n->max_queue_pairs) { in virtio_net_handle_rss()
1441 if (!temp.b && n->rss_data.hash_types) { in virtio_net_handle_rss()
1446 if (!temp.b && !n->rss_data.hash_types) { in virtio_net_handle_rss()
1447 virtio_net_disable_rss(n); in virtio_net_handle_rss()
1452 s = iov_to_buf(iov, iov_cnt, offset, n->rss_data.key, size_get); in virtio_net_handle_rss()
1458 n->rss_data.enabled = true; in virtio_net_handle_rss()
1460 if (!n->rss_data.populate_hash) { in virtio_net_handle_rss()
1461 if (!virtio_net_attach_epbf_rss(n)) { in virtio_net_handle_rss()
1463 if (get_vhost_net(qemu_get_queue(n->nic)->peer)) { in virtio_net_handle_rss()
1469 n->rss_data.enabled_software_rss = true; in virtio_net_handle_rss()
1474 virtio_net_detach_epbf_rss(n); in virtio_net_handle_rss()
1475 n->rss_data.enabled_software_rss = true; in virtio_net_handle_rss()
1478 trace_virtio_net_rss_enable(n->rss_data.hash_types, in virtio_net_handle_rss()
1479 n->rss_data.indirections_len, in virtio_net_handle_rss()
1484 virtio_net_disable_rss(n); in virtio_net_handle_rss()
1488 static int virtio_net_handle_mq(VirtIONet *n, uint8_t cmd, in virtio_net_handle_mq() argument
1491 VirtIODevice *vdev = VIRTIO_DEVICE(n); in virtio_net_handle_mq()
1493 NetClientState *nc = qemu_get_queue(n->nic); in virtio_net_handle_mq()
1495 virtio_net_disable_rss(n); in virtio_net_handle_mq()
1497 queue_pairs = virtio_net_handle_rss(n, iov, iov_cnt, false); in virtio_net_handle_mq()
1501 queue_pairs = virtio_net_handle_rss(n, iov, iov_cnt, true); in virtio_net_handle_mq()
1520 queue_pairs > n->max_queue_pairs || in virtio_net_handle_mq()
1521 !n->multiqueue) { in virtio_net_handle_mq()
1525 n->curr_queue_pairs = queue_pairs; in virtio_net_handle_mq()
1536 virtio_net_set_queue_pairs(n); in virtio_net_handle_mq()
1546 VirtIONet *n = VIRTIO_NET(vdev); in virtio_net_handle_ctrl_iov() local
1564 status = virtio_net_handle_rx_mode(n, ctrl.cmd, iov, out_num); in virtio_net_handle_ctrl_iov()
1566 status = virtio_net_handle_mac(n, ctrl.cmd, iov, out_num); in virtio_net_handle_ctrl_iov()
1568 status = virtio_net_handle_vlan_table(n, ctrl.cmd, iov, out_num); in virtio_net_handle_ctrl_iov()
1570 status = virtio_net_handle_announce(n, ctrl.cmd, iov, out_num); in virtio_net_handle_ctrl_iov()
1572 status = virtio_net_handle_mq(n, ctrl.cmd, iov, out_num); in virtio_net_handle_ctrl_iov()
1574 status = virtio_net_handle_offloads(n, ctrl.cmd, iov, out_num); in virtio_net_handle_ctrl_iov()
1613 VirtIONet *n = VIRTIO_NET(vdev); in virtio_net_handle_rx() local
1616 qemu_flush_queued_packets(qemu_get_subqueue(n->nic, queue_index)); in virtio_net_handle_rx()
1621 VirtIONet *n = qemu_get_nic_opaque(nc); in virtio_net_can_receive() local
1622 VirtIODevice *vdev = VIRTIO_DEVICE(n); in virtio_net_can_receive()
1629 if (nc->queue_index >= n->curr_queue_pairs) { in virtio_net_can_receive()
1643 VirtIONet *n = q->n; in virtio_net_has_buffers() local
1645 (n->mergeable_rx_bufs && in virtio_net_has_buffers()
1654 (n->mergeable_rx_bufs && in virtio_net_has_buffers()
1699 static void receive_header(VirtIONet *n, const struct iovec *iov, int iov_cnt, in receive_header() argument
1702 if (n->has_vnet_hdr) { in receive_header()
1705 work_around_broken_dhclient(wbuf, wbuf + n->host_hdr_len, in receive_header()
1706 size - n->host_hdr_len); in receive_header()
1708 if (n->needs_vnet_hdr_swap) { in receive_header()
1709 virtio_net_hdr_swap(VIRTIO_DEVICE(n), wbuf); in receive_header()
1721 static int receive_filter(VirtIONet *n, const uint8_t *buf, int size) in receive_filter() argument
1728 if (n->promisc) in receive_filter()
1731 ptr += n->host_hdr_len; in receive_filter()
1735 if (!(n->vlans[vid >> 5] & (1U << (vid & 0x1f)))) in receive_filter()
1741 return !n->nobcast; in receive_filter()
1742 } else if (n->nomulti) { in receive_filter()
1744 } else if (n->allmulti || n->mac_table.multi_overflow) { in receive_filter()
1748 for (i = n->mac_table.first_multi; i < n->mac_table.in_use; i++) { in receive_filter()
1749 if (!memcmp(ptr, &n->mac_table.macs[i * ETH_ALEN], ETH_ALEN)) { in receive_filter()
1754 if (n->nouni) { in receive_filter()
1756 } else if (n->alluni || n->mac_table.uni_overflow) { in receive_filter()
1758 } else if (!memcmp(ptr, n->mac, ETH_ALEN)) { in receive_filter()
1762 for (i = 0; i < n->mac_table.first_multi; i++) { in receive_filter()
1763 if (!memcmp(ptr, &n->mac_table.macs[i * ETH_ALEN], ETH_ALEN)) { in receive_filter()
1843 VirtIONet *n = qemu_get_nic_opaque(nc); in virtio_net_process_rss() local
1845 struct NetRxPkt *pkt = n->rx_pkt; in virtio_net_process_rss()
1866 net_rx_pkt_set_protocols(pkt, &iov, 1, n->host_hdr_len); in virtio_net_process_rss()
1869 n->rss_data.hash_types); in virtio_net_process_rss()
1871 if (n->rss_data.populate_hash) { in virtio_net_process_rss()
1874 return n->rss_data.redirect ? n->rss_data.default_queue : -1; in virtio_net_process_rss()
1877 hash = net_rx_pkt_calc_rss_hash(pkt, net_hash_type, n->rss_data.key); in virtio_net_process_rss()
1879 if (n->rss_data.populate_hash) { in virtio_net_process_rss()
1883 if (n->rss_data.redirect) { in virtio_net_process_rss()
1884 new_index = hash & (n->rss_data.indirections_len - 1); in virtio_net_process_rss()
1885 new_index = n->rss_data.indirections_table[new_index]; in virtio_net_process_rss()
1894 VirtIONet *n = qemu_get_nic_opaque(nc); in virtio_net_receive_rcu() local
1896 VirtIODevice *vdev = VIRTIO_DEVICE(n); in virtio_net_receive_rcu()
1909 if (!no_rss && n->rss_data.enabled && n->rss_data.enabled_software_rss) { in virtio_net_receive_rcu()
1912 NetClientState *nc2 = qemu_get_subqueue(n->nic, index); in virtio_net_receive_rcu()
1918 if (!virtio_net_has_buffers(q, size + n->guest_hdr_len - n->host_hdr_len)) { in virtio_net_receive_rcu()
1922 if (!receive_filter(n, buf, size)) in virtio_net_receive_rcu()
1947 i, n->mergeable_rx_bufs, offset, size, in virtio_net_receive_rcu()
1948 n->guest_hdr_len, n->host_hdr_len, in virtio_net_receive_rcu()
1967 if (n->mergeable_rx_bufs) { in virtio_net_receive_rcu()
1974 receive_header(n, sg, elem->in_num, buf, size); in virtio_net_receive_rcu()
1975 if (n->rss_data.populate_hash) { in virtio_net_receive_rcu()
1978 buf + offset, n->host_hdr_len - sizeof(mhdr)); in virtio_net_receive_rcu()
1980 offset = n->host_hdr_len; in virtio_net_receive_rcu()
1981 total += n->guest_hdr_len; in virtio_net_receive_rcu()
1982 guest_offset = n->guest_hdr_len; in virtio_net_receive_rcu()
1995 if (!n->mergeable_rx_bufs && offset < size) { in virtio_net_receive_rcu()
2049 ip = (struct ip_header *)(buf + chain->n->guest_hdr_len in virtio_net_rsc_extract_unit4()
2065 ip6 = (struct ip6_header *)(buf + chain->n->guest_hdr_len in virtio_net_rsc_extract_unit6()
2122 qemu_clock_get_ns(QEMU_CLOCK_HOST) + chain->n->rsc_timeout); in virtio_net_rsc_purge()
2126 static void virtio_net_rsc_cleanup(VirtIONet *n) in virtio_net_rsc_cleanup() argument
2131 QTAILQ_FOREACH_SAFE(chain, &n->rsc_chains, next, rn_chain) { in virtio_net_rsc_cleanup()
2139 QTAILQ_REMOVE(&n->rsc_chains, chain, next); in virtio_net_rsc_cleanup()
2151 hdr_len = chain->n->guest_hdr_len; in virtio_net_rsc_cache_buf()
2358 qemu_clock_get_ns(QEMU_CLOCK_HOST) + chain->n->rsc_timeout); in virtio_net_rsc_do_coalesce()
2456 || ip_len > (size - chain->n->guest_hdr_len - in virtio_net_rsc_sanity_check4()
2473 hdr_len = ((VirtIONet *)(chain->n))->guest_hdr_len; in virtio_net_rsc_receive4()
2519 ip_len > (size - chain->n->guest_hdr_len - sizeof(struct eth_header) in virtio_net_rsc_sanity_check6()
2543 hdr_len = ((VirtIONet *)(chain->n))->guest_hdr_len; in virtio_net_rsc_receive6()
2570 static VirtioNetRscChain *virtio_net_rsc_lookup_chain(VirtIONet *n, in virtio_net_rsc_lookup_chain() argument
2580 QTAILQ_FOREACH(chain, &n->rsc_chains, next) { in virtio_net_rsc_lookup_chain()
2587 chain->n = n; in virtio_net_rsc_lookup_chain()
2601 QTAILQ_INSERT_TAIL(&n->rsc_chains, chain, next); in virtio_net_rsc_lookup_chain()
2613 VirtIONet *n; in virtio_net_rsc_receive() local
2615 n = qemu_get_nic_opaque(nc); in virtio_net_rsc_receive()
2616 if (size < (n->host_hdr_len + sizeof(struct eth_header))) { in virtio_net_rsc_receive()
2620 eth = (struct eth_header *)(buf + n->guest_hdr_len); in virtio_net_rsc_receive()
2623 chain = virtio_net_rsc_lookup_chain(n, nc, proto); in virtio_net_rsc_receive()
2626 if (proto == (uint16_t)ETH_P_IP && n->rsc4_enabled) { in virtio_net_rsc_receive()
2628 } else if (proto == (uint16_t)ETH_P_IPV6 && n->rsc6_enabled) { in virtio_net_rsc_receive()
2638 VirtIONet *n = qemu_get_nic_opaque(nc); in virtio_net_receive() local
2639 if ((n->rsc4_enabled || n->rsc6_enabled)) { in virtio_net_receive()
2650 VirtIONet *n = qemu_get_nic_opaque(nc); in virtio_net_tx_complete() local
2652 VirtIODevice *vdev = VIRTIO_DEVICE(n); in virtio_net_tx_complete()
2663 if (ret >= n->tx_burst) { in virtio_net_tx_complete()
2674 qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + n->tx_timeout); in virtio_net_tx_complete()
2683 VirtIONet *n = q->n; in virtio_net_flush_tx() local
2684 VirtIODevice *vdev = VIRTIO_DEVICE(n); in virtio_net_flush_tx()
2717 if (n->has_vnet_hdr) { in virtio_net_flush_tx()
2718 if (iov_to_buf(out_sg, out_num, 0, &vhdr, n->guest_hdr_len) < in virtio_net_flush_tx()
2719 n->guest_hdr_len) { in virtio_net_flush_tx()
2725 if (n->needs_vnet_hdr_swap) { in virtio_net_flush_tx()
2728 sg2[0].iov_len = n->guest_hdr_len; in virtio_net_flush_tx()
2731 n->guest_hdr_len, -1); in virtio_net_flush_tx()
2744 assert(n->host_hdr_len <= n->guest_hdr_len); in virtio_net_flush_tx()
2745 if (n->host_hdr_len != n->guest_hdr_len) { in virtio_net_flush_tx()
2748 0, n->host_hdr_len); in virtio_net_flush_tx()
2751 n->guest_hdr_len, -1); in virtio_net_flush_tx()
2756 ret = qemu_sendv_packet_async(qemu_get_subqueue(n->nic, queue_index), in virtio_net_flush_tx()
2769 if (++num_packets >= n->tx_burst) { in virtio_net_flush_tx()
2780 VirtIONet *n = VIRTIO_NET(vdev); in virtio_net_handle_tx_timer() local
2781 VirtIONetQueue *q = &n->vqs[vq2q(virtio_get_queue_index(vq))]; in virtio_net_handle_tx_timer()
2783 if (unlikely((n->status & VIRTIO_NET_S_LINK_UP) == 0)) { in virtio_net_handle_tx_timer()
2801 qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + n->tx_timeout); in virtio_net_handle_tx_timer()
2809 VirtIONet *n = VIRTIO_NET(vdev); in virtio_net_handle_tx_bh() local
2810 VirtIONetQueue *q = &n->vqs[vq2q(virtio_get_queue_index(vq))]; in virtio_net_handle_tx_bh()
2812 if (unlikely((n->status & VIRTIO_NET_S_LINK_UP) == 0)) { in virtio_net_handle_tx_bh()
2832 VirtIONet *n = q->n; in virtio_net_tx_timer() local
2833 VirtIODevice *vdev = VIRTIO_DEVICE(n); in virtio_net_tx_timer()
2858 if (ret >= n->tx_burst) { in virtio_net_tx_timer()
2861 qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + n->tx_timeout); in virtio_net_tx_timer()
2875 qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + n->tx_timeout); in virtio_net_tx_timer()
2882 VirtIONet *n = q->n; in virtio_net_tx_bh() local
2883 VirtIODevice *vdev = VIRTIO_DEVICE(n); in virtio_net_tx_bh()
2908 if (ret >= n->tx_burst) { in virtio_net_tx_bh()
2928 static void virtio_net_add_queue(VirtIONet *n, int index) in virtio_net_add_queue() argument
2930 VirtIODevice *vdev = VIRTIO_DEVICE(n); in virtio_net_add_queue()
2932 n->vqs[index].rx_vq = virtio_add_queue(vdev, n->net_conf.rx_queue_size, in virtio_net_add_queue()
2935 if (n->net_conf.tx && !strcmp(n->net_conf.tx, "timer")) { in virtio_net_add_queue()
2936 n->vqs[index].tx_vq = in virtio_net_add_queue()
2937 virtio_add_queue(vdev, n->net_conf.tx_queue_size, in virtio_net_add_queue()
2939 n->vqs[index].tx_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, in virtio_net_add_queue()
2941 &n->vqs[index]); in virtio_net_add_queue()
2943 n->vqs[index].tx_vq = in virtio_net_add_queue()
2944 virtio_add_queue(vdev, n->net_conf.tx_queue_size, in virtio_net_add_queue()
2946 n->vqs[index].tx_bh = qemu_bh_new_guarded(virtio_net_tx_bh, &n->vqs[index], in virtio_net_add_queue()
2950 n->vqs[index].tx_waiting = 0; in virtio_net_add_queue()
2951 n->vqs[index].n = n; in virtio_net_add_queue()
2954 static void virtio_net_del_queue(VirtIONet *n, int index) in virtio_net_del_queue() argument
2956 VirtIODevice *vdev = VIRTIO_DEVICE(n); in virtio_net_del_queue()
2957 VirtIONetQueue *q = &n->vqs[index]; in virtio_net_del_queue()
2958 NetClientState *nc = qemu_get_subqueue(n->nic, index); in virtio_net_del_queue()
2974 static void virtio_net_change_num_queue_pairs(VirtIONet *n, int new_max_queue_pairs) in virtio_net_change_num_queue_pairs() argument
2976 VirtIODevice *vdev = VIRTIO_DEVICE(n); in virtio_net_change_num_queue_pairs()
2997 virtio_net_del_queue(n, i / 2); in virtio_net_change_num_queue_pairs()
3002 virtio_net_add_queue(n, i / 2); in virtio_net_change_num_queue_pairs()
3006 n->ctrl_vq = virtio_add_queue(vdev, 64, virtio_net_handle_ctrl); in virtio_net_change_num_queue_pairs()
3009 static void virtio_net_set_multiqueue(VirtIONet *n, int multiqueue) in virtio_net_set_multiqueue() argument
3011 int max = multiqueue ? n->max_queue_pairs : 1; in virtio_net_set_multiqueue()
3013 n->multiqueue = multiqueue; in virtio_net_set_multiqueue()
3014 virtio_net_change_num_queue_pairs(n, max); in virtio_net_set_multiqueue()
3016 virtio_net_set_queue_pairs(n); in virtio_net_set_multiqueue()
3021 VirtIONet *n = opaque; in virtio_net_post_load_device() local
3022 VirtIODevice *vdev = VIRTIO_DEVICE(n); in virtio_net_post_load_device()
3026 virtio_net_set_mrg_rx_bufs(n, n->mergeable_rx_bufs, in virtio_net_post_load_device()
3033 if (n->mac_table.in_use > MAC_TABLE_ENTRIES) { in virtio_net_post_load_device()
3034 n->mac_table.in_use = 0; in virtio_net_post_load_device()
3038 n->curr_guest_offloads = virtio_net_supported_guest_offloads(n); in virtio_net_post_load_device()
3047 n->saved_guest_offloads = n->curr_guest_offloads; in virtio_net_post_load_device()
3049 virtio_net_set_queue_pairs(n); in virtio_net_post_load_device()
3052 for (i = 0; i < n->mac_table.in_use; i++) { in virtio_net_post_load_device()
3053 if (n->mac_table.macs[i * ETH_ALEN] & 1) { in virtio_net_post_load_device()
3057 n->mac_table.first_multi = i; in virtio_net_post_load_device()
3061 link_down = (n->status & VIRTIO_NET_S_LINK_UP) == 0; in virtio_net_post_load_device()
3062 for (i = 0; i < n->max_queue_pairs; i++) { in virtio_net_post_load_device()
3063 qemu_get_subqueue(n->nic, i)->link_down = link_down; in virtio_net_post_load_device()
3068 qemu_announce_timer_reset(&n->announce_timer, migrate_announce_params(), in virtio_net_post_load_device()
3070 virtio_net_announce_timer, n); in virtio_net_post_load_device()
3071 if (n->announce_timer.round) { in virtio_net_post_load_device()
3072 timer_mod(n->announce_timer.tm, in virtio_net_post_load_device()
3073 qemu_clock_get_ms(n->announce_timer.type)); in virtio_net_post_load_device()
3075 qemu_announce_timer_del(&n->announce_timer, false); in virtio_net_post_load_device()
3079 if (n->rss_data.enabled) { in virtio_net_post_load_device()
3080 n->rss_data.enabled_software_rss = n->rss_data.populate_hash; in virtio_net_post_load_device()
3081 if (!n->rss_data.populate_hash) { in virtio_net_post_load_device()
3082 if (!virtio_net_attach_epbf_rss(n)) { in virtio_net_post_load_device()
3083 if (get_vhost_net(qemu_get_queue(n->nic)->peer)) { in virtio_net_post_load_device()
3088 n->rss_data.enabled_software_rss = true; in virtio_net_post_load_device()
3093 trace_virtio_net_rss_enable(n->rss_data.hash_types, in virtio_net_post_load_device()
3094 n->rss_data.indirections_len, in virtio_net_post_load_device()
3095 sizeof(n->rss_data.key)); in virtio_net_post_load_device()
3104 VirtIONet *n = VIRTIO_NET(vdev); in virtio_net_post_load_virtio() local
3110 n->curr_guest_offloads = n->saved_guest_offloads; in virtio_net_post_load_virtio()
3111 if (peer_has_vnet_hdr(n)) { in virtio_net_post_load_virtio()
3112 virtio_net_apply_guest_offloads(n); in virtio_net_post_load_virtio()
3370 VirtIONet *n = VIRTIO_NET(vdev); in virtio_net_guest_notifier_pending() local
3372 assert(n->vhost_started); in virtio_net_guest_notifier_pending()
3383 nc = qemu_get_subqueue(n->nic, n->max_queue_pairs); in virtio_net_guest_notifier_pending()
3385 nc = qemu_get_subqueue(n->nic, vq2q(idx)); in virtio_net_guest_notifier_pending()
3402 VirtIONet *n = VIRTIO_NET(vdev); in virtio_net_guest_notifier_mask() local
3404 assert(n->vhost_started); in virtio_net_guest_notifier_mask()
3415 nc = qemu_get_subqueue(n->nic, n->max_queue_pairs); in virtio_net_guest_notifier_mask()
3417 nc = qemu_get_subqueue(n->nic, vq2q(idx)); in virtio_net_guest_notifier_mask()
3432 static void virtio_net_set_config_size(VirtIONet *n, uint64_t host_features) in virtio_net_set_config_size() argument
3436 n->config_size = virtio_get_config_size(&cfg_size_params, host_features); in virtio_net_set_config_size()
3439 void virtio_net_set_netclient_name(VirtIONet *n, const char *name, in virtio_net_set_netclient_name() argument
3447 g_free(n->netclient_name); in virtio_net_set_netclient_name()
3448 g_free(n->netclient_type); in virtio_net_set_netclient_name()
3449 n->netclient_name = g_strdup(name); in virtio_net_set_netclient_name()
3450 n->netclient_type = g_strdup(type); in virtio_net_set_netclient_name()
3453 static bool failover_unplug_primary(VirtIONet *n, DeviceState *dev) in failover_unplug_primary() argument
3474 static bool failover_replug_primary(VirtIONet *n, DeviceState *dev, in failover_replug_primary() argument
3491 qatomic_set(&n->failover_primary_hidden, false); in failover_replug_primary()
3507 static void virtio_net_handle_migration_primary(VirtIONet *n, MigrationState *s) in virtio_net_handle_migration_primary() argument
3511 DeviceState *dev = failover_find_primary_device(n); in virtio_net_handle_migration_primary()
3517 should_be_hidden = qatomic_read(&n->failover_primary_hidden); in virtio_net_handle_migration_primary()
3520 if (failover_unplug_primary(n, dev)) { in virtio_net_handle_migration_primary()
3523 qatomic_set(&n->failover_primary_hidden, true); in virtio_net_handle_migration_primary()
3529 if (!failover_replug_primary(n, dev, &err)) { in virtio_net_handle_migration_primary()
3540 VirtIONet *n = container_of(notifier, VirtIONet, migration_state); in virtio_net_migration_state_notifier() local
3541 virtio_net_handle_migration_primary(n, s); in virtio_net_migration_state_notifier()
3549 VirtIONet *n = container_of(listener, VirtIONet, primary_listener); in failover_hide_primary_device() local
3566 if (g_strcmp0(standby_id, n->netclient_name) != 0) { in failover_hide_primary_device()
3576 if (n->primary_opts) { in failover_hide_primary_device()
3579 old = qdict_get_str(n->primary_opts, "id"); in failover_hide_primary_device()
3583 "'%s': '%s' and '%s'", n->netclient_name, old, new); in failover_hide_primary_device()
3587 n->primary_opts = qdict_clone_shallow(device_opts); in failover_hide_primary_device()
3588 n->primary_opts_from_json = from_json; in failover_hide_primary_device()
3592 return qatomic_read(&n->failover_primary_hidden); in failover_hide_primary_device()
3598 VirtIONet *n = VIRTIO_NET(dev); in virtio_net_device_realize() local
3602 if (n->net_conf.mtu) { in virtio_net_device_realize()
3603 n->host_features |= (1ULL << VIRTIO_NET_F_MTU); in virtio_net_device_realize()
3606 if (n->net_conf.duplex_str) { in virtio_net_device_realize()
3607 if (strncmp(n->net_conf.duplex_str, "half", 5) == 0) { in virtio_net_device_realize()
3608 n->net_conf.duplex = DUPLEX_HALF; in virtio_net_device_realize()
3609 } else if (strncmp(n->net_conf.duplex_str, "full", 5) == 0) { in virtio_net_device_realize()
3610 n->net_conf.duplex = DUPLEX_FULL; in virtio_net_device_realize()
3615 n->host_features |= (1ULL << VIRTIO_NET_F_SPEED_DUPLEX); in virtio_net_device_realize()
3617 n->net_conf.duplex = DUPLEX_UNKNOWN; in virtio_net_device_realize()
3620 if (n->net_conf.speed < SPEED_UNKNOWN) { in virtio_net_device_realize()
3624 if (n->net_conf.speed >= 0) { in virtio_net_device_realize()
3625 n->host_features |= (1ULL << VIRTIO_NET_F_SPEED_DUPLEX); in virtio_net_device_realize()
3628 if (n->failover) { in virtio_net_device_realize()
3629 n->primary_listener.hide_device = failover_hide_primary_device; in virtio_net_device_realize()
3630 qatomic_set(&n->failover_primary_hidden, true); in virtio_net_device_realize()
3631 device_listener_register(&n->primary_listener); in virtio_net_device_realize()
3632 migration_add_notifier(&n->migration_state, in virtio_net_device_realize()
3634 n->host_features |= (1ULL << VIRTIO_NET_F_STANDBY); in virtio_net_device_realize()
3637 virtio_net_set_config_size(n, n->host_features); in virtio_net_device_realize()
3638 virtio_init(vdev, VIRTIO_ID_NET, n->config_size); in virtio_net_device_realize()
3645 if (n->net_conf.rx_queue_size < VIRTIO_NET_RX_QUEUE_MIN_SIZE || in virtio_net_device_realize()
3646 n->net_conf.rx_queue_size > VIRTQUEUE_MAX_SIZE || in virtio_net_device_realize()
3647 !is_power_of_2(n->net_conf.rx_queue_size)) { in virtio_net_device_realize()
3650 n->net_conf.rx_queue_size, VIRTIO_NET_RX_QUEUE_MIN_SIZE, in virtio_net_device_realize()
3656 if (n->net_conf.tx_queue_size < VIRTIO_NET_TX_QUEUE_MIN_SIZE || in virtio_net_device_realize()
3657 n->net_conf.tx_queue_size > virtio_net_max_tx_queue_size(n) || in virtio_net_device_realize()
3658 !is_power_of_2(n->net_conf.tx_queue_size)) { in virtio_net_device_realize()
3661 n->net_conf.tx_queue_size, VIRTIO_NET_TX_QUEUE_MIN_SIZE, in virtio_net_device_realize()
3662 virtio_net_max_tx_queue_size(n)); in virtio_net_device_realize()
3667 n->max_ncs = MAX(n->nic_conf.peers.queues, 1); in virtio_net_device_realize()
3673 if (n->nic_conf.peers.queues) { in virtio_net_device_realize()
3674 for (i = 0; i < n->max_ncs; i++) { in virtio_net_device_realize()
3675 if (n->nic_conf.peers.ncs[i]->is_datapath) { in virtio_net_device_realize()
3676 ++n->max_queue_pairs; in virtio_net_device_realize()
3680 n->max_queue_pairs = MAX(n->max_queue_pairs, 1); in virtio_net_device_realize()
3682 if (n->max_queue_pairs * 2 + 1 > VIRTIO_QUEUE_MAX) { in virtio_net_device_realize()
3685 n->max_queue_pairs, (VIRTIO_QUEUE_MAX - 1) / 2); in virtio_net_device_realize()
3689 n->vqs = g_new0(VirtIONetQueue, n->max_queue_pairs); in virtio_net_device_realize()
3690 n->curr_queue_pairs = 1; in virtio_net_device_realize()
3691 n->tx_timeout = n->net_conf.txtimer; in virtio_net_device_realize()
3693 if (n->net_conf.tx && strcmp(n->net_conf.tx, "timer") in virtio_net_device_realize()
3694 && strcmp(n->net_conf.tx, "bh")) { in virtio_net_device_realize()
3697 n->net_conf.tx); in virtio_net_device_realize()
3701 n->net_conf.tx_queue_size = MIN(virtio_net_max_tx_queue_size(n), in virtio_net_device_realize()
3702 n->net_conf.tx_queue_size); in virtio_net_device_realize()
3704 for (i = 0; i < n->max_queue_pairs; i++) { in virtio_net_device_realize()
3705 virtio_net_add_queue(n, i); in virtio_net_device_realize()
3708 n->ctrl_vq = virtio_add_queue(vdev, 64, virtio_net_handle_ctrl); in virtio_net_device_realize()
3709 qemu_macaddr_default_if_unset(&n->nic_conf.macaddr); in virtio_net_device_realize()
3710 memcpy(&n->mac[0], &n->nic_conf.macaddr, sizeof(n->mac)); in virtio_net_device_realize()
3711 n->status = VIRTIO_NET_S_LINK_UP; in virtio_net_device_realize()
3712 qemu_announce_timer_reset(&n->announce_timer, migrate_announce_params(), in virtio_net_device_realize()
3714 virtio_net_announce_timer, n); in virtio_net_device_realize()
3715 n->announce_timer.round = 0; in virtio_net_device_realize()
3717 if (n->netclient_type) { in virtio_net_device_realize()
3721 n->nic = qemu_new_nic(&net_virtio_info, &n->nic_conf, in virtio_net_device_realize()
3722 n->netclient_type, n->netclient_name, in virtio_net_device_realize()
3723 &dev->mem_reentrancy_guard, n); in virtio_net_device_realize()
3725 n->nic = qemu_new_nic(&net_virtio_info, &n->nic_conf, in virtio_net_device_realize()
3727 &dev->mem_reentrancy_guard, n); in virtio_net_device_realize()
3730 for (i = 0; i < n->max_queue_pairs; i++) { in virtio_net_device_realize()
3731 n->nic->ncs[i].do_not_pad = true; in virtio_net_device_realize()
3734 peer_test_vnet_hdr(n); in virtio_net_device_realize()
3735 if (peer_has_vnet_hdr(n)) { in virtio_net_device_realize()
3736 for (i = 0; i < n->max_queue_pairs; i++) { in virtio_net_device_realize()
3737 qemu_using_vnet_hdr(qemu_get_subqueue(n->nic, i)->peer, true); in virtio_net_device_realize()
3739 n->host_hdr_len = sizeof(struct virtio_net_hdr); in virtio_net_device_realize()
3741 n->host_hdr_len = 0; in virtio_net_device_realize()
3744 qemu_format_nic_info_str(qemu_get_queue(n->nic), n->nic_conf.macaddr.a); in virtio_net_device_realize()
3746 n->vqs[0].tx_waiting = 0; in virtio_net_device_realize()
3747 n->tx_burst = n->net_conf.txburst; in virtio_net_device_realize()
3748 virtio_net_set_mrg_rx_bufs(n, 0, 0, 0); in virtio_net_device_realize()
3749 n->promisc = 1; /* for compatibility */ in virtio_net_device_realize()
3751 n->mac_table.macs = g_malloc0(MAC_TABLE_ENTRIES * ETH_ALEN); in virtio_net_device_realize()
3753 n->vlans = g_malloc0(MAX_VLAN >> 3); in virtio_net_device_realize()
3755 nc = qemu_get_queue(n->nic); in virtio_net_device_realize()
3760 memcpy(&netcfg.mac, &n->nic_conf.macaddr, ETH_ALEN); in virtio_net_device_realize()
3764 QTAILQ_INIT(&n->rsc_chains); in virtio_net_device_realize()
3765 n->qdev = dev; in virtio_net_device_realize()
3767 net_rx_pkt_init(&n->rx_pkt); in virtio_net_device_realize()
3769 if (virtio_has_feature(n->host_features, VIRTIO_NET_F_RSS)) { in virtio_net_device_realize()
3770 virtio_net_load_ebpf(n); in virtio_net_device_realize()
3777 VirtIONet *n = VIRTIO_NET(dev); in virtio_net_device_unrealize() local
3780 if (virtio_has_feature(n->host_features, VIRTIO_NET_F_RSS)) { in virtio_net_device_unrealize()
3781 virtio_net_unload_ebpf(n); in virtio_net_device_unrealize()
3787 g_free(n->netclient_name); in virtio_net_device_unrealize()
3788 n->netclient_name = NULL; in virtio_net_device_unrealize()
3789 g_free(n->netclient_type); in virtio_net_device_unrealize()
3790 n->netclient_type = NULL; in virtio_net_device_unrealize()
3792 g_free(n->mac_table.macs); in virtio_net_device_unrealize()
3793 g_free(n->vlans); in virtio_net_device_unrealize()
3795 if (n->failover) { in virtio_net_device_unrealize()
3796 qobject_unref(n->primary_opts); in virtio_net_device_unrealize()
3797 device_listener_unregister(&n->primary_listener); in virtio_net_device_unrealize()
3798 migration_remove_notifier(&n->migration_state); in virtio_net_device_unrealize()
3800 assert(n->primary_opts == NULL); in virtio_net_device_unrealize()
3803 max_queue_pairs = n->multiqueue ? n->max_queue_pairs : 1; in virtio_net_device_unrealize()
3805 virtio_net_del_queue(n, i); in virtio_net_device_unrealize()
3809 qemu_announce_timer_del(&n->announce_timer, false); in virtio_net_device_unrealize()
3810 g_free(n->vqs); in virtio_net_device_unrealize()
3811 qemu_del_nic(n->nic); in virtio_net_device_unrealize()
3812 virtio_net_rsc_cleanup(n); in virtio_net_device_unrealize()
3813 g_free(n->rss_data.indirections_table); in virtio_net_device_unrealize()
3814 net_rx_pkt_uninit(n->rx_pkt); in virtio_net_device_unrealize()
3820 VirtIONet *n = VIRTIO_NET(obj); in virtio_net_instance_init() local
3826 n->config_size = sizeof(struct virtio_net_config); in virtio_net_instance_init()
3827 device_add_bootindex_property(obj, &n->nic_conf.bootindex, in virtio_net_instance_init()
3829 DEVICE(n)); in virtio_net_instance_init()
3831 ebpf_rss_init(&n->ebpf_rss); in virtio_net_instance_init()
3836 VirtIONet *n = opaque; in virtio_net_pre_save() local
3840 assert(!n->vhost_started); in virtio_net_pre_save()
3850 VirtIONet *n = VIRTIO_NET(vdev); in primary_unplug_pending() local
3855 primary = failover_find_primary_device(n); in primary_unplug_pending()
3869 VirtIONet *n = VIRTIO_NET(vdev); in virtio_net_get_vhost() local
3870 NetClientState *nc = qemu_get_queue(n->nic); in virtio_net_get_vhost()