Lines Matching full:n
117 VirtIONet *n = qemu_get_nic_opaque(nc); in virtio_net_get_subqueue() local
119 return &n->vqs[nc->queue_index]; in virtio_net_get_subqueue()
143 VirtIONet *n = VIRTIO_NET(vdev); in virtio_net_get_config() local
145 NetClientState *nc = qemu_get_queue(n->nic); in virtio_net_get_config()
150 virtio_stw_p(vdev, &netcfg.status, n->status); in virtio_net_get_config()
151 virtio_stw_p(vdev, &netcfg.max_virtqueue_pairs, n->max_queue_pairs); in virtio_net_get_config()
152 virtio_stw_p(vdev, &netcfg.mtu, n->net_conf.mtu); in virtio_net_get_config()
153 memcpy(netcfg.mac, n->mac, ETH_ALEN); in virtio_net_get_config()
154 virtio_stl_p(vdev, &netcfg.speed, n->net_conf.speed); in virtio_net_get_config()
155 netcfg.duplex = n->net_conf.duplex; in virtio_net_get_config()
162 memcpy(config, &netcfg, n->config_size); in virtio_net_get_config()
170 n->config_size); in virtio_net_get_config()
183 memcpy(netcfg.mac, n->mac, ETH_ALEN); in virtio_net_get_config()
187 n->status & VIRTIO_NET_S_ANNOUNCE); in virtio_net_get_config()
188 memcpy(config, &netcfg, n->config_size); in virtio_net_get_config()
194 VirtIONet *n = VIRTIO_NET(vdev); in virtio_net_set_config() local
196 NetClientState *nc = qemu_get_queue(n->nic); in virtio_net_set_config()
198 memcpy(&netcfg, config, n->config_size); in virtio_net_set_config()
202 memcmp(netcfg.mac, n->mac, ETH_ALEN)) { in virtio_net_set_config()
203 memcpy(n->mac, netcfg.mac, ETH_ALEN); in virtio_net_set_config()
204 qemu_format_nic_info_str(qemu_get_queue(n->nic), n->mac); in virtio_net_set_config()
213 (uint8_t *)&netcfg, 0, n->config_size, in virtio_net_set_config()
218 static bool virtio_net_started(VirtIONet *n, uint8_t status) in virtio_net_started() argument
220 VirtIODevice *vdev = VIRTIO_DEVICE(n); in virtio_net_started()
222 (n->status & VIRTIO_NET_S_LINK_UP) && vdev->vm_running; in virtio_net_started()
236 VirtIONet *n = opaque; in virtio_net_announce_timer() local
237 trace_virtio_net_announce_timer(n->announce_timer.round); in virtio_net_announce_timer()
239 n->announce_timer.round--; in virtio_net_announce_timer()
240 virtio_net_announce_notify(n); in virtio_net_announce_timer()
245 VirtIONet *n = qemu_get_nic_opaque(nc); in virtio_net_announce() local
246 VirtIODevice *vdev = VIRTIO_DEVICE(n); in virtio_net_announce()
253 if (n->announce_timer.round) { in virtio_net_announce()
259 virtio_net_announce_notify(n); in virtio_net_announce()
263 static void virtio_net_vhost_status(VirtIONet *n, uint8_t status) in virtio_net_vhost_status() argument
265 VirtIODevice *vdev = VIRTIO_DEVICE(n); in virtio_net_vhost_status()
266 NetClientState *nc = qemu_get_queue(n->nic); in virtio_net_vhost_status()
267 int queue_pairs = n->multiqueue ? n->max_queue_pairs : 1; in virtio_net_vhost_status()
269 n->max_ncs - n->max_queue_pairs : 0; in virtio_net_vhost_status()
275 if ((virtio_net_started(n, status) && !nc->peer->link_down) == in virtio_net_vhost_status()
276 !!n->vhost_started) { in virtio_net_vhost_status()
279 if (!n->vhost_started) { in virtio_net_vhost_status()
282 if (n->needs_vnet_hdr_swap) { in virtio_net_vhost_status()
293 NetClientState *qnc = qemu_get_subqueue(n->nic, i); in virtio_net_vhost_status()
301 r = vhost_net_set_mtu(get_vhost_net(nc->peer), n->net_conf.mtu); in virtio_net_vhost_status()
304 n->net_conf.mtu); in virtio_net_vhost_status()
310 n->vhost_started = 1; in virtio_net_vhost_status()
311 r = vhost_net_start(vdev, n->nic->ncs, queue_pairs, cvq); in virtio_net_vhost_status()
315 n->vhost_started = 0; in virtio_net_vhost_status()
318 vhost_net_stop(vdev, n->nic->ncs, queue_pairs, cvq); in virtio_net_vhost_status()
319 n->vhost_started = 0; in virtio_net_vhost_status()
353 static void virtio_net_vnet_endian_status(VirtIONet *n, uint8_t status) in virtio_net_vnet_endian_status() argument
355 VirtIODevice *vdev = VIRTIO_DEVICE(n); in virtio_net_vnet_endian_status()
356 int queue_pairs = n->multiqueue ? n->max_queue_pairs : 1; in virtio_net_vnet_endian_status()
358 if (virtio_net_started(n, status)) { in virtio_net_vnet_endian_status()
364 n->needs_vnet_hdr_swap = n->has_vnet_hdr && in virtio_net_vnet_endian_status()
365 virtio_net_set_vnet_endian(vdev, n->nic->ncs, in virtio_net_vnet_endian_status()
367 } else if (virtio_net_started(n, vdev->status)) { in virtio_net_vnet_endian_status()
373 virtio_net_set_vnet_endian(vdev, n->nic->ncs, queue_pairs, false); in virtio_net_vnet_endian_status()
387 VirtIONet *n = VIRTIO_NET(vdev); in virtio_net_set_status() local
392 virtio_net_vnet_endian_status(n, status); in virtio_net_set_status()
393 virtio_net_vhost_status(n, status); in virtio_net_set_status()
395 for (i = 0; i < n->max_queue_pairs; i++) { in virtio_net_set_status()
396 NetClientState *ncs = qemu_get_subqueue(n->nic, i); in virtio_net_set_status()
398 q = &n->vqs[i]; in virtio_net_set_status()
400 if ((!n->multiqueue && i != 0) || i >= n->curr_queue_pairs) { in virtio_net_set_status()
406 virtio_net_started(n, queue_status) && !n->vhost_started; in virtio_net_set_status()
419 qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + n->tx_timeout); in virtio_net_set_status()
429 if ((n->status & VIRTIO_NET_S_LINK_UP) == 0 && in virtio_net_set_status()
445 VirtIONet *n = qemu_get_nic_opaque(nc); in virtio_net_set_link_status() local
446 VirtIODevice *vdev = VIRTIO_DEVICE(n); in virtio_net_set_link_status()
447 uint16_t old_status = n->status; in virtio_net_set_link_status()
450 n->status &= ~VIRTIO_NET_S_LINK_UP; in virtio_net_set_link_status()
452 n->status |= VIRTIO_NET_S_LINK_UP; in virtio_net_set_link_status()
454 if (n->status != old_status) in virtio_net_set_link_status()
462 VirtIONet *n = qemu_get_nic_opaque(nc); in rxfilter_notify() local
465 char *path = object_get_canonical_path(OBJECT(n->qdev)); in rxfilter_notify()
466 qapi_event_send_nic_rx_filter_changed(n->netclient_name, path); in rxfilter_notify()
474 static intList *get_vlan_table(VirtIONet *n) in get_vlan_table() argument
481 for (j = 0; n->vlans[i] && j <= 0x1f; j++) { in get_vlan_table()
482 if (n->vlans[i] & (1U << j)) { in get_vlan_table()
493 VirtIONet *n = qemu_get_nic_opaque(nc); in virtio_net_query_rxfilter() local
494 VirtIODevice *vdev = VIRTIO_DEVICE(n); in virtio_net_query_rxfilter()
501 info->promiscuous = n->promisc; in virtio_net_query_rxfilter()
503 if (n->nouni) { in virtio_net_query_rxfilter()
505 } else if (n->alluni) { in virtio_net_query_rxfilter()
511 if (n->nomulti) { in virtio_net_query_rxfilter()
513 } else if (n->allmulti) { in virtio_net_query_rxfilter()
519 info->broadcast_allowed = n->nobcast; in virtio_net_query_rxfilter()
520 info->multicast_overflow = n->mac_table.multi_overflow; in virtio_net_query_rxfilter()
521 info->unicast_overflow = n->mac_table.uni_overflow; in virtio_net_query_rxfilter()
523 info->main_mac = qemu_mac_strdup_printf(n->mac); in virtio_net_query_rxfilter()
526 for (i = 0; i < n->mac_table.first_multi; i++) { in virtio_net_query_rxfilter()
528 qemu_mac_strdup_printf(n->mac_table.macs + i * ETH_ALEN)); in virtio_net_query_rxfilter()
533 for (i = n->mac_table.first_multi; i < n->mac_table.in_use; i++) { in virtio_net_query_rxfilter()
535 qemu_mac_strdup_printf(n->mac_table.macs + i * ETH_ALEN)); in virtio_net_query_rxfilter()
538 info->vlan_table = get_vlan_table(n); in virtio_net_query_rxfilter()
556 VirtIONet *n = VIRTIO_NET(vdev); in virtio_net_queue_reset() local
560 if (queue_index >= n->max_queue_pairs * 2) { in virtio_net_queue_reset()
564 nc = qemu_get_subqueue(n->nic, vq2q(queue_index)); in virtio_net_queue_reset()
580 VirtIONet *n = VIRTIO_NET(vdev); in virtio_net_queue_enable() local
585 if (queue_index >= n->max_queue_pairs * 2) { in virtio_net_queue_enable()
589 nc = qemu_get_subqueue(n->nic, vq2q(queue_index)); in virtio_net_queue_enable()
605 static void peer_test_vnet_hdr(VirtIONet *n) in peer_test_vnet_hdr() argument
607 NetClientState *nc = qemu_get_queue(n->nic); in peer_test_vnet_hdr()
612 n->has_vnet_hdr = qemu_has_vnet_hdr(nc->peer); in peer_test_vnet_hdr()
615 static int peer_has_vnet_hdr(VirtIONet *n) in peer_has_vnet_hdr() argument
617 return n->has_vnet_hdr; in peer_has_vnet_hdr()
620 static int peer_has_ufo(VirtIONet *n) in peer_has_ufo() argument
622 if (!peer_has_vnet_hdr(n)) in peer_has_ufo()
625 n->has_ufo = qemu_has_ufo(qemu_get_queue(n->nic)->peer); in peer_has_ufo()
627 return n->has_ufo; in peer_has_ufo()
630 static int peer_has_uso(VirtIONet *n) in peer_has_uso() argument
632 if (!peer_has_vnet_hdr(n)) { in peer_has_uso()
636 return qemu_has_uso(qemu_get_queue(n->nic)->peer); in peer_has_uso()
639 static void virtio_net_set_mrg_rx_bufs(VirtIONet *n, int mergeable_rx_bufs, in virtio_net_set_mrg_rx_bufs() argument
645 n->mergeable_rx_bufs = mergeable_rx_bufs; in virtio_net_set_mrg_rx_bufs()
648 n->guest_hdr_len = hash_report ? in virtio_net_set_mrg_rx_bufs()
651 n->rss_data.populate_hash = !!hash_report; in virtio_net_set_mrg_rx_bufs()
653 n->guest_hdr_len = n->mergeable_rx_bufs ? in virtio_net_set_mrg_rx_bufs()
656 n->rss_data.populate_hash = false; in virtio_net_set_mrg_rx_bufs()
659 for (i = 0; i < n->max_queue_pairs; i++) { in virtio_net_set_mrg_rx_bufs()
660 nc = qemu_get_subqueue(n->nic, i); in virtio_net_set_mrg_rx_bufs()
662 if (peer_has_vnet_hdr(n) && in virtio_net_set_mrg_rx_bufs()
663 qemu_has_vnet_hdr_len(nc->peer, n->guest_hdr_len)) { in virtio_net_set_mrg_rx_bufs()
664 qemu_set_vnet_hdr_len(nc->peer, n->guest_hdr_len); in virtio_net_set_mrg_rx_bufs()
665 n->host_hdr_len = n->guest_hdr_len; in virtio_net_set_mrg_rx_bufs()
670 static int virtio_net_max_tx_queue_size(VirtIONet *n) in virtio_net_max_tx_queue_size() argument
672 NetClientState *peer = n->nic_conf.peers.ncs[0]; in virtio_net_max_tx_queue_size()
691 static int peer_attach(VirtIONet *n, int index) in peer_attach() argument
693 NetClientState *nc = qemu_get_subqueue(n->nic, index); in peer_attach()
707 if (n->max_queue_pairs == 1) { in peer_attach()
714 static int peer_detach(VirtIONet *n, int index) in peer_detach() argument
716 NetClientState *nc = qemu_get_subqueue(n->nic, index); in peer_detach()
733 static void virtio_net_set_queue_pairs(VirtIONet *n) in virtio_net_set_queue_pairs() argument
738 if (n->nic->peer_deleted) { in virtio_net_set_queue_pairs()
742 for (i = 0; i < n->max_queue_pairs; i++) { in virtio_net_set_queue_pairs()
743 if (i < n->curr_queue_pairs) { in virtio_net_set_queue_pairs()
744 r = peer_attach(n, i); in virtio_net_set_queue_pairs()
747 r = peer_detach(n, i); in virtio_net_set_queue_pairs()
753 static void virtio_net_set_multiqueue(VirtIONet *n, int multiqueue);
758 VirtIONet *n = VIRTIO_NET(vdev); in virtio_net_get_features() local
759 NetClientState *nc = qemu_get_queue(n->nic); in virtio_net_get_features()
762 features |= n->host_features; in virtio_net_get_features()
766 if (!peer_has_vnet_hdr(n)) { in virtio_net_get_features()
784 if (!peer_has_vnet_hdr(n) || !peer_has_ufo(n)) { in virtio_net_get_features()
789 if (!peer_has_uso(n)) { in virtio_net_get_features()
799 if (!ebpf_rss_is_loaded(&n->ebpf_rss)) { in virtio_net_get_features()
805 if (n->mtu_bypass_backend && in virtio_net_get_features()
806 (n->host_features & 1ULL << VIRTIO_NET_F_MTU)) { in virtio_net_get_features()
843 static void virtio_net_apply_guest_offloads(VirtIONet *n) in virtio_net_apply_guest_offloads() argument
845 qemu_set_offload(qemu_get_queue(n->nic)->peer, in virtio_net_apply_guest_offloads()
846 !!(n->curr_guest_offloads & (1ULL << VIRTIO_NET_F_GUEST_CSUM)), in virtio_net_apply_guest_offloads()
847 !!(n->curr_guest_offloads & (1ULL << VIRTIO_NET_F_GUEST_TSO4)), in virtio_net_apply_guest_offloads()
848 !!(n->curr_guest_offloads & (1ULL << VIRTIO_NET_F_GUEST_TSO6)), in virtio_net_apply_guest_offloads()
849 !!(n->curr_guest_offloads & (1ULL << VIRTIO_NET_F_GUEST_ECN)), in virtio_net_apply_guest_offloads()
850 !!(n->curr_guest_offloads & (1ULL << VIRTIO_NET_F_GUEST_UFO)), in virtio_net_apply_guest_offloads()
851 !!(n->curr_guest_offloads & (1ULL << VIRTIO_NET_F_GUEST_USO4)), in virtio_net_apply_guest_offloads()
852 !!(n->curr_guest_offloads & (1ULL << VIRTIO_NET_F_GUEST_USO6))); in virtio_net_apply_guest_offloads()
869 uint64_t virtio_net_supported_guest_offloads(const VirtIONet *n) in virtio_net_supported_guest_offloads() argument
871 VirtIODevice *vdev = VIRTIO_DEVICE(n); in virtio_net_supported_guest_offloads()
876 VirtIONet *n; member
897 if (!g_strcmp0(pci_dev->failover_pair_id, fdev->n->netclient_name)) { in failover_set_primary()
908 * @n: VirtIONet device
911 static DeviceState *failover_find_primary_device(VirtIONet *n) in failover_find_primary_device() argument
914 .n = n, in failover_find_primary_device()
922 static void failover_add_primary(VirtIONet *n, Error **errp) in failover_add_primary() argument
925 DeviceState *dev = failover_find_primary_device(n); in failover_add_primary()
931 if (!n->primary_opts) { in failover_add_primary()
935 " failover_pair_id=%s\n", n->netclient_name); in failover_add_primary()
939 dev = qdev_device_add_from_qdict(n->primary_opts, in failover_add_primary()
940 n->primary_opts_from_json, in failover_add_primary()
943 qobject_unref(n->primary_opts); in failover_add_primary()
944 n->primary_opts = NULL; in failover_add_primary()
953 VirtIONet *n = VIRTIO_NET(vdev); in virtio_net_set_features() local
957 if (n->mtu_bypass_backend && in virtio_net_set_features()
962 virtio_net_set_multiqueue(n, in virtio_net_set_features()
966 virtio_net_set_mrg_rx_bufs(n, in virtio_net_set_features()
974 n->rsc4_enabled = virtio_has_feature(features, VIRTIO_NET_F_RSC_EXT) && in virtio_net_set_features()
976 n->rsc6_enabled = virtio_has_feature(features, VIRTIO_NET_F_RSC_EXT) && in virtio_net_set_features()
978 n->rss_data.redirect = virtio_has_feature(features, VIRTIO_NET_F_RSS); in virtio_net_set_features()
980 if (n->has_vnet_hdr) { in virtio_net_set_features()
981 n->curr_guest_offloads = in virtio_net_set_features()
983 virtio_net_apply_guest_offloads(n); in virtio_net_set_features()
986 for (i = 0; i < n->max_queue_pairs; i++) { in virtio_net_set_features()
987 NetClientState *nc = qemu_get_subqueue(n->nic, i); in virtio_net_set_features()
1002 memset(n->vlans, 0xff, MAX_VLAN >> 3); in virtio_net_set_features()
1006 qapi_event_send_failover_negotiated(n->netclient_name); in virtio_net_set_features()
1007 qatomic_set(&n->failover_primary_hidden, false); in virtio_net_set_features()
1008 failover_add_primary(n, &err); in virtio_net_set_features()
1019 static int virtio_net_handle_rx_mode(VirtIONet *n, uint8_t cmd, in virtio_net_handle_rx_mode() argument
1024 NetClientState *nc = qemu_get_queue(n->nic); in virtio_net_handle_rx_mode()
1032 n->promisc = on; in virtio_net_handle_rx_mode()
1034 n->allmulti = on; in virtio_net_handle_rx_mode()
1036 n->alluni = on; in virtio_net_handle_rx_mode()
1038 n->nomulti = on; in virtio_net_handle_rx_mode()
1040 n->nouni = on; in virtio_net_handle_rx_mode()
1042 n->nobcast = on; in virtio_net_handle_rx_mode()
1052 static int virtio_net_handle_offloads(VirtIONet *n, uint8_t cmd, in virtio_net_handle_offloads() argument
1055 VirtIODevice *vdev = VIRTIO_DEVICE(n); in virtio_net_handle_offloads()
1073 if (!n->has_vnet_hdr) { in virtio_net_handle_offloads()
1077 n->rsc4_enabled = virtio_has_feature(offloads, VIRTIO_NET_F_RSC_EXT) && in virtio_net_handle_offloads()
1079 n->rsc6_enabled = virtio_has_feature(offloads, VIRTIO_NET_F_RSC_EXT) && in virtio_net_handle_offloads()
1083 supported_offloads = virtio_net_supported_guest_offloads(n); in virtio_net_handle_offloads()
1088 n->curr_guest_offloads = offloads; in virtio_net_handle_offloads()
1089 virtio_net_apply_guest_offloads(n); in virtio_net_handle_offloads()
1097 static int virtio_net_handle_mac(VirtIONet *n, uint8_t cmd, in virtio_net_handle_mac() argument
1100 VirtIODevice *vdev = VIRTIO_DEVICE(n); in virtio_net_handle_mac()
1103 NetClientState *nc = qemu_get_queue(n->nic); in virtio_net_handle_mac()
1106 if (iov_size(iov, iov_cnt) != sizeof(n->mac)) { in virtio_net_handle_mac()
1109 s = iov_to_buf(iov, iov_cnt, 0, &n->mac, sizeof(n->mac)); in virtio_net_handle_mac()
1110 assert(s == sizeof(n->mac)); in virtio_net_handle_mac()
1111 qemu_format_nic_info_str(qemu_get_queue(n->nic), n->mac); in virtio_net_handle_mac()
1178 n->mac_table.in_use = in_use; in virtio_net_handle_mac()
1179 n->mac_table.first_multi = first_multi; in virtio_net_handle_mac()
1180 n->mac_table.uni_overflow = uni_overflow; in virtio_net_handle_mac()
1181 n->mac_table.multi_overflow = multi_overflow; in virtio_net_handle_mac()
1182 memcpy(n->mac_table.macs, macs, MAC_TABLE_ENTRIES * ETH_ALEN); in virtio_net_handle_mac()
1193 static int virtio_net_handle_vlan_table(VirtIONet *n, uint8_t cmd, in virtio_net_handle_vlan_table() argument
1196 VirtIODevice *vdev = VIRTIO_DEVICE(n); in virtio_net_handle_vlan_table()
1199 NetClientState *nc = qemu_get_queue(n->nic); in virtio_net_handle_vlan_table()
1211 n->vlans[vid >> 5] |= (1U << (vid & 0x1f)); in virtio_net_handle_vlan_table()
1213 n->vlans[vid >> 5] &= ~(1U << (vid & 0x1f)); in virtio_net_handle_vlan_table()
1222 static int virtio_net_handle_announce(VirtIONet *n, uint8_t cmd, in virtio_net_handle_announce() argument
1225 trace_virtio_net_handle_announce(n->announce_timer.round); in virtio_net_handle_announce()
1227 n->status & VIRTIO_NET_S_ANNOUNCE) { in virtio_net_handle_announce()
1228 n->status &= ~VIRTIO_NET_S_ANNOUNCE; in virtio_net_handle_announce()
1229 if (n->announce_timer.round) { in virtio_net_handle_announce()
1230 qemu_announce_timer_step(&n->announce_timer); in virtio_net_handle_announce()
1259 static bool virtio_net_attach_ebpf_rss(VirtIONet *n) in virtio_net_attach_ebpf_rss() argument
1263 if (!ebpf_rss_is_loaded(&n->ebpf_rss)) { in virtio_net_attach_ebpf_rss()
1267 rss_data_to_rss_config(&n->rss_data, &config); in virtio_net_attach_ebpf_rss()
1269 if (!ebpf_rss_set_all(&n->ebpf_rss, &config, in virtio_net_attach_ebpf_rss()
1270 n->rss_data.indirections_table, n->rss_data.key, in virtio_net_attach_ebpf_rss()
1275 if (!virtio_net_attach_ebpf_to_backend(n->nic, n->ebpf_rss.program_fd)) { in virtio_net_attach_ebpf_rss()
1282 static void virtio_net_detach_ebpf_rss(VirtIONet *n) in virtio_net_detach_ebpf_rss() argument
1284 virtio_net_attach_ebpf_to_backend(n->nic, -1); in virtio_net_detach_ebpf_rss()
1287 static void virtio_net_commit_rss_config(VirtIONet *n) in virtio_net_commit_rss_config() argument
1289 if (n->rss_data.enabled) { in virtio_net_commit_rss_config()
1290 n->rss_data.enabled_software_rss = n->rss_data.populate_hash; in virtio_net_commit_rss_config()
1291 if (n->rss_data.populate_hash) { in virtio_net_commit_rss_config()
1292 virtio_net_detach_ebpf_rss(n); in virtio_net_commit_rss_config()
1293 } else if (!virtio_net_attach_ebpf_rss(n)) { in virtio_net_commit_rss_config()
1294 if (get_vhost_net(qemu_get_queue(n->nic)->peer)) { in virtio_net_commit_rss_config()
1298 n->rss_data.enabled_software_rss = true; in virtio_net_commit_rss_config()
1302 trace_virtio_net_rss_enable(n, in virtio_net_commit_rss_config()
1303 n->rss_data.hash_types, in virtio_net_commit_rss_config()
1304 n->rss_data.indirections_len, in virtio_net_commit_rss_config()
1305 sizeof(n->rss_data.key)); in virtio_net_commit_rss_config()
1307 virtio_net_detach_ebpf_rss(n); in virtio_net_commit_rss_config()
1308 trace_virtio_net_rss_disable(n); in virtio_net_commit_rss_config()
1312 static void virtio_net_disable_rss(VirtIONet *n) in virtio_net_disable_rss() argument
1314 if (!n->rss_data.enabled) { in virtio_net_disable_rss()
1318 n->rss_data.enabled = false; in virtio_net_disable_rss()
1319 virtio_net_commit_rss_config(n); in virtio_net_disable_rss()
1322 static bool virtio_net_load_ebpf_fds(VirtIONet *n, Error **errp) in virtio_net_load_ebpf_fds() argument
1328 if (n->nr_ebpf_rss_fds != EBPF_RSS_MAX_FDS) { in virtio_net_load_ebpf_fds()
1330 EBPF_RSS_MAX_FDS, n->nr_ebpf_rss_fds); in virtio_net_load_ebpf_fds()
1334 for (i = 0; i < n->nr_ebpf_rss_fds; i++) { in virtio_net_load_ebpf_fds()
1335 fds[i] = monitor_fd_param(monitor_cur(), n->ebpf_rss_fds[i], errp); in virtio_net_load_ebpf_fds()
1342 ret = ebpf_rss_load_fds(&n->ebpf_rss, fds[0], fds[1], fds[2], fds[3], errp); in virtio_net_load_ebpf_fds()
1346 for (i = 0; i < n->nr_ebpf_rss_fds && fds[i] != -1; i++) { in virtio_net_load_ebpf_fds()
1354 static bool virtio_net_load_ebpf(VirtIONet *n, Error **errp) in virtio_net_load_ebpf() argument
1356 if (!virtio_net_attach_ebpf_to_backend(n->nic, -1)) { in virtio_net_load_ebpf()
1360 trace_virtio_net_rss_load(n, n->nr_ebpf_rss_fds, n->ebpf_rss_fds); in virtio_net_load_ebpf()
1369 if (n->ebpf_rss_fds) { in virtio_net_load_ebpf()
1370 return virtio_net_load_ebpf_fds(n, errp); in virtio_net_load_ebpf()
1373 ebpf_rss_load(&n->ebpf_rss, &error_warn); in virtio_net_load_ebpf()
1377 static void virtio_net_unload_ebpf(VirtIONet *n) in virtio_net_unload_ebpf() argument
1379 virtio_net_attach_ebpf_to_backend(n->nic, -1); in virtio_net_unload_ebpf()
1380 ebpf_rss_unload(&n->ebpf_rss); in virtio_net_unload_ebpf()
1383 static uint16_t virtio_net_handle_rss(VirtIONet *n, in virtio_net_handle_rss() argument
1388 VirtIODevice *vdev = VIRTIO_DEVICE(n); in virtio_net_handle_rss()
1414 n->rss_data.hash_types = virtio_ldl_p(vdev, &cfg.hash_types); in virtio_net_handle_rss()
1415 n->rss_data.indirections_len = in virtio_net_handle_rss()
1418 n->rss_data.indirections_len = 0; in virtio_net_handle_rss()
1420 if (n->rss_data.indirections_len >= VIRTIO_NET_RSS_MAX_TABLE_LEN) { in virtio_net_handle_rss()
1422 err_value = n->rss_data.indirections_len; in virtio_net_handle_rss()
1425 n->rss_data.indirections_len++; in virtio_net_handle_rss()
1426 if (!is_power_of_2(n->rss_data.indirections_len)) { in virtio_net_handle_rss()
1428 err_value = n->rss_data.indirections_len; in virtio_net_handle_rss()
1431 n->rss_data.default_queue = do_rss ? in virtio_net_handle_rss()
1433 if (n->rss_data.default_queue >= n->max_queue_pairs) { in virtio_net_handle_rss()
1435 err_value = n->rss_data.default_queue; in virtio_net_handle_rss()
1439 size_get = sizeof(uint16_t) * n->rss_data.indirections_len; in virtio_net_handle_rss()
1440 g_free(n->rss_data.indirections_table); in virtio_net_handle_rss()
1441 n->rss_data.indirections_table = g_malloc(size_get); in virtio_net_handle_rss()
1442 if (!n->rss_data.indirections_table) { in virtio_net_handle_rss()
1444 err_value = n->rss_data.indirections_len; in virtio_net_handle_rss()
1448 n->rss_data.indirections_table, size_get); in virtio_net_handle_rss()
1454 for (i = 0; i < n->rss_data.indirections_len; ++i) { in virtio_net_handle_rss()
1455 uint16_t val = n->rss_data.indirections_table[i]; in virtio_net_handle_rss()
1456 n->rss_data.indirections_table[i] = virtio_lduw_p(vdev, &val); in virtio_net_handle_rss()
1466 queue_pairs = do_rss ? virtio_lduw_p(vdev, &temp.us) : n->curr_queue_pairs; in virtio_net_handle_rss()
1467 if (queue_pairs == 0 || queue_pairs > n->max_queue_pairs) { in virtio_net_handle_rss()
1477 if (!temp.b && n->rss_data.hash_types) { in virtio_net_handle_rss()
1482 if (!temp.b && !n->rss_data.hash_types) { in virtio_net_handle_rss()
1483 virtio_net_disable_rss(n); in virtio_net_handle_rss()
1488 s = iov_to_buf(iov, iov_cnt, offset, n->rss_data.key, size_get); in virtio_net_handle_rss()
1494 n->rss_data.enabled = true; in virtio_net_handle_rss()
1495 virtio_net_commit_rss_config(n); in virtio_net_handle_rss()
1498 trace_virtio_net_rss_error(n, err_msg, err_value); in virtio_net_handle_rss()
1499 virtio_net_disable_rss(n); in virtio_net_handle_rss()
1503 static int virtio_net_handle_mq(VirtIONet *n, uint8_t cmd, in virtio_net_handle_mq() argument
1506 VirtIODevice *vdev = VIRTIO_DEVICE(n); in virtio_net_handle_mq()
1508 NetClientState *nc = qemu_get_queue(n->nic); in virtio_net_handle_mq()
1510 virtio_net_disable_rss(n); in virtio_net_handle_mq()
1512 queue_pairs = virtio_net_handle_rss(n, iov, iov_cnt, false); in virtio_net_handle_mq()
1516 queue_pairs = virtio_net_handle_rss(n, iov, iov_cnt, true); in virtio_net_handle_mq()
1535 queue_pairs > n->max_queue_pairs || in virtio_net_handle_mq()
1536 !n->multiqueue) { in virtio_net_handle_mq()
1540 n->curr_queue_pairs = queue_pairs; in virtio_net_handle_mq()
1551 virtio_net_set_queue_pairs(n); in virtio_net_handle_mq()
1561 VirtIONet *n = VIRTIO_NET(vdev); in virtio_net_handle_ctrl_iov() local
1579 status = virtio_net_handle_rx_mode(n, ctrl.cmd, iov, out_num); in virtio_net_handle_ctrl_iov()
1581 status = virtio_net_handle_mac(n, ctrl.cmd, iov, out_num); in virtio_net_handle_ctrl_iov()
1583 status = virtio_net_handle_vlan_table(n, ctrl.cmd, iov, out_num); in virtio_net_handle_ctrl_iov()
1585 status = virtio_net_handle_announce(n, ctrl.cmd, iov, out_num); in virtio_net_handle_ctrl_iov()
1587 status = virtio_net_handle_mq(n, ctrl.cmd, iov, out_num); in virtio_net_handle_ctrl_iov()
1589 status = virtio_net_handle_offloads(n, ctrl.cmd, iov, out_num); in virtio_net_handle_ctrl_iov()
1628 VirtIONet *n = VIRTIO_NET(vdev); in virtio_net_handle_rx() local
1631 qemu_flush_queued_packets(qemu_get_subqueue(n->nic, queue_index)); in virtio_net_handle_rx()
1636 VirtIONet *n = qemu_get_nic_opaque(nc); in virtio_net_can_receive() local
1637 VirtIODevice *vdev = VIRTIO_DEVICE(n); in virtio_net_can_receive()
1644 if (nc->queue_index >= n->curr_queue_pairs) { in virtio_net_can_receive()
1660 VirtIONet *n = q->n; in virtio_net_has_buffers() local
1662 while (virtio_queue_empty(q->rx_vq) || n->mergeable_rx_bufs) { in virtio_net_has_buffers()
1701 * N.B. if we introduce a zero-copy API, this operation is no longer free so
1721 static void receive_header(VirtIONet *n, const struct iovec *iov, int iov_cnt, in receive_header() argument
1724 if (n->has_vnet_hdr) { in receive_header()
1727 work_around_broken_dhclient(wbuf, wbuf + n->host_hdr_len, in receive_header()
1728 size - n->host_hdr_len); in receive_header()
1730 if (n->needs_vnet_hdr_swap) { in receive_header()
1731 virtio_net_hdr_swap(VIRTIO_DEVICE(n), wbuf); in receive_header()
1743 static int receive_filter(VirtIONet *n, const uint8_t *buf, int size) in receive_filter() argument
1750 if (n->promisc) in receive_filter()
1753 ptr += n->host_hdr_len; in receive_filter()
1757 if (!(n->vlans[vid >> 5] & (1U << (vid & 0x1f)))) in receive_filter()
1763 return !n->nobcast; in receive_filter()
1764 } else if (n->nomulti) { in receive_filter()
1766 } else if (n->allmulti || n->mac_table.multi_overflow) { in receive_filter()
1770 for (i = n->mac_table.first_multi; i < n->mac_table.in_use; i++) { in receive_filter()
1771 if (!memcmp(ptr, &n->mac_table.macs[i * ETH_ALEN], ETH_ALEN)) { in receive_filter()
1776 if (n->nouni) { in receive_filter()
1778 } else if (n->alluni || n->mac_table.uni_overflow) { in receive_filter()
1780 } else if (!memcmp(ptr, n->mac, ETH_ALEN)) { in receive_filter()
1784 for (i = 0; i < n->mac_table.first_multi; i++) { in receive_filter()
1785 if (!memcmp(ptr, &n->mac_table.macs[i * ETH_ALEN], ETH_ALEN)) { in receive_filter()
1858 VirtIONet *n = qemu_get_nic_opaque(nc); in virtio_net_process_rss() local
1860 struct NetRxPkt *pkt = n->rx_pkt; in virtio_net_process_rss()
1881 net_rx_pkt_set_protocols(pkt, &iov, 1, n->host_hdr_len); in virtio_net_process_rss()
1884 n->rss_data.hash_types); in virtio_net_process_rss()
1886 if (n->rss_data.populate_hash) { in virtio_net_process_rss()
1890 return n->rss_data.redirect ? n->rss_data.default_queue : -1; in virtio_net_process_rss()
1893 hash = net_rx_pkt_calc_rss_hash(pkt, net_hash_type, n->rss_data.key); in virtio_net_process_rss()
1895 if (n->rss_data.populate_hash) { in virtio_net_process_rss()
1900 if (n->rss_data.redirect) { in virtio_net_process_rss()
1901 new_index = hash & (n->rss_data.indirections_len - 1); in virtio_net_process_rss()
1902 new_index = n->rss_data.indirections_table[new_index]; in virtio_net_process_rss()
1911 VirtIONet *n = qemu_get_nic_opaque(nc); in virtio_net_receive_rcu() local
1913 VirtIODevice *vdev = VIRTIO_DEVICE(n); in virtio_net_receive_rcu()
1924 if (n->rss_data.enabled && n->rss_data.enabled_software_rss) { in virtio_net_receive_rcu()
1927 nc = qemu_get_subqueue(n->nic, index % n->curr_queue_pairs); in virtio_net_receive_rcu()
1938 if (!virtio_net_has_buffers(q, size + n->guest_hdr_len - n->host_hdr_len)) { in virtio_net_receive_rcu()
1942 if (!receive_filter(n, buf, size)) in virtio_net_receive_rcu()
1967 i, n->mergeable_rx_bufs, offset, size, in virtio_net_receive_rcu()
1968 n->guest_hdr_len, n->host_hdr_len, in virtio_net_receive_rcu()
1987 if (n->mergeable_rx_bufs) { in virtio_net_receive_rcu()
1996 receive_header(n, sg, elem->in_num, buf, size); in virtio_net_receive_rcu()
1997 if (n->rss_data.populate_hash) { in virtio_net_receive_rcu()
2004 offset = n->host_hdr_len; in virtio_net_receive_rcu()
2005 total += n->guest_hdr_len; in virtio_net_receive_rcu()
2006 guest_offset = n->guest_hdr_len; in virtio_net_receive_rcu()
2019 if (!n->mergeable_rx_bufs && offset < size) { in virtio_net_receive_rcu()
2089 ip = (struct ip_header *)(buf + chain->n->guest_hdr_len in virtio_net_rsc_extract_unit4()
2105 ip6 = (struct ip6_header *)(buf + chain->n->guest_hdr_len in virtio_net_rsc_extract_unit6()
2162 qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + chain->n->rsc_timeout); in virtio_net_rsc_purge()
2166 static void virtio_net_rsc_cleanup(VirtIONet *n) in virtio_net_rsc_cleanup() argument
2171 QTAILQ_FOREACH_SAFE(chain, &n->rsc_chains, next, rn_chain) { in virtio_net_rsc_cleanup()
2179 QTAILQ_REMOVE(&n->rsc_chains, chain, next); in virtio_net_rsc_cleanup()
2191 hdr_len = chain->n->guest_hdr_len; in virtio_net_rsc_cache_buf()
2398 qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + chain->n->rsc_timeout); in virtio_net_rsc_do_coalesce()
2496 || ip_len > (size - chain->n->guest_hdr_len - in virtio_net_rsc_sanity_check4()
2513 hdr_len = ((VirtIONet *)(chain->n))->guest_hdr_len; in virtio_net_rsc_receive4()
2559 ip_len > (size - chain->n->guest_hdr_len - sizeof(struct eth_header) in virtio_net_rsc_sanity_check6()
2583 hdr_len = ((VirtIONet *)(chain->n))->guest_hdr_len; in virtio_net_rsc_receive6()
2610 static VirtioNetRscChain *virtio_net_rsc_lookup_chain(VirtIONet *n, in virtio_net_rsc_lookup_chain() argument
2620 QTAILQ_FOREACH(chain, &n->rsc_chains, next) { in virtio_net_rsc_lookup_chain()
2627 chain->n = n; in virtio_net_rsc_lookup_chain()
2641 QTAILQ_INSERT_TAIL(&n->rsc_chains, chain, next); in virtio_net_rsc_lookup_chain()
2653 VirtIONet *n; in virtio_net_rsc_receive() local
2655 n = qemu_get_nic_opaque(nc); in virtio_net_rsc_receive()
2656 if (size < (n->host_hdr_len + sizeof(struct eth_header))) { in virtio_net_rsc_receive()
2660 eth = (struct eth_header *)(buf + n->guest_hdr_len); in virtio_net_rsc_receive()
2663 chain = virtio_net_rsc_lookup_chain(n, nc, proto); in virtio_net_rsc_receive()
2666 if (proto == (uint16_t)ETH_P_IP && n->rsc4_enabled) { in virtio_net_rsc_receive()
2668 } else if (proto == (uint16_t)ETH_P_IPV6 && n->rsc6_enabled) { in virtio_net_rsc_receive()
2678 VirtIONet *n = qemu_get_nic_opaque(nc); in virtio_net_receive() local
2679 if ((n->rsc4_enabled || n->rsc6_enabled)) { in virtio_net_receive()
2690 VirtIONet *n = qemu_get_nic_opaque(nc); in virtio_net_tx_complete() local
2692 VirtIODevice *vdev = VIRTIO_DEVICE(n); in virtio_net_tx_complete()
2703 if (ret >= n->tx_burst) { in virtio_net_tx_complete()
2714 qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + n->tx_timeout); in virtio_net_tx_complete()
2723 VirtIONet *n = q->n; in virtio_net_flush_tx() local
2724 VirtIODevice *vdev = VIRTIO_DEVICE(n); in virtio_net_flush_tx()
2755 if (n->needs_vnet_hdr_swap) { in virtio_net_flush_tx()
2777 assert(n->host_hdr_len <= n->guest_hdr_len); in virtio_net_flush_tx()
2778 if (n->host_hdr_len != n->guest_hdr_len) { in virtio_net_flush_tx()
2779 if (iov_size(out_sg, out_num) < n->guest_hdr_len) { in virtio_net_flush_tx()
2785 0, n->host_hdr_len); in virtio_net_flush_tx()
2788 n->guest_hdr_len, -1); in virtio_net_flush_tx()
2798 ret = qemu_sendv_packet_async(qemu_get_subqueue(n->nic, queue_index), in virtio_net_flush_tx()
2811 if (++num_packets >= n->tx_burst) { in virtio_net_flush_tx()
2827 VirtIONet *n = VIRTIO_NET(vdev); in virtio_net_handle_tx_timer() local
2828 VirtIONetQueue *q = &n->vqs[vq2q(virtio_get_queue_index(vq))]; in virtio_net_handle_tx_timer()
2830 if (unlikely((n->status & VIRTIO_NET_S_LINK_UP) == 0)) { in virtio_net_handle_tx_timer()
2848 qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + n->tx_timeout); in virtio_net_handle_tx_timer()
2856 VirtIONet *n = VIRTIO_NET(vdev); in virtio_net_handle_tx_bh() local
2857 VirtIONetQueue *q = &n->vqs[vq2q(virtio_get_queue_index(vq))]; in virtio_net_handle_tx_bh()
2859 if (unlikely(n->vhost_started)) { in virtio_net_handle_tx_bh()
2863 if (unlikely((n->status & VIRTIO_NET_S_LINK_UP) == 0)) { in virtio_net_handle_tx_bh()
2883 VirtIONet *n = q->n; in virtio_net_tx_timer() local
2884 VirtIODevice *vdev = VIRTIO_DEVICE(n); in virtio_net_tx_timer()
2909 if (ret >= n->tx_burst) { in virtio_net_tx_timer()
2912 qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + n->tx_timeout); in virtio_net_tx_timer()
2926 qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + n->tx_timeout); in virtio_net_tx_timer()
2933 VirtIONet *n = q->n; in virtio_net_tx_bh() local
2934 VirtIODevice *vdev = VIRTIO_DEVICE(n); in virtio_net_tx_bh()
2959 if (ret >= n->tx_burst) { in virtio_net_tx_bh()
2979 static void virtio_net_add_queue(VirtIONet *n, int index) in virtio_net_add_queue() argument
2981 VirtIODevice *vdev = VIRTIO_DEVICE(n); in virtio_net_add_queue()
2983 n->vqs[index].rx_vq = virtio_add_queue(vdev, n->net_conf.rx_queue_size, in virtio_net_add_queue()
2986 if (n->net_conf.tx && !strcmp(n->net_conf.tx, "timer")) { in virtio_net_add_queue()
2987 n->vqs[index].tx_vq = in virtio_net_add_queue()
2988 virtio_add_queue(vdev, n->net_conf.tx_queue_size, in virtio_net_add_queue()
2990 n->vqs[index].tx_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, in virtio_net_add_queue()
2992 &n->vqs[index]); in virtio_net_add_queue()
2994 n->vqs[index].tx_vq = in virtio_net_add_queue()
2995 virtio_add_queue(vdev, n->net_conf.tx_queue_size, in virtio_net_add_queue()
2997 n->vqs[index].tx_bh = qemu_bh_new_guarded(virtio_net_tx_bh, &n->vqs[index], in virtio_net_add_queue()
3001 n->vqs[index].tx_waiting = 0; in virtio_net_add_queue()
3002 n->vqs[index].n = n; in virtio_net_add_queue()
3005 static void virtio_net_del_queue(VirtIONet *n, int index) in virtio_net_del_queue() argument
3007 VirtIODevice *vdev = VIRTIO_DEVICE(n); in virtio_net_del_queue()
3008 VirtIONetQueue *q = &n->vqs[index]; in virtio_net_del_queue()
3009 NetClientState *nc = qemu_get_subqueue(n->nic, index); in virtio_net_del_queue()
3025 static void virtio_net_change_num_queue_pairs(VirtIONet *n, int new_max_queue_pairs) in virtio_net_change_num_queue_pairs() argument
3027 VirtIODevice *vdev = VIRTIO_DEVICE(n); in virtio_net_change_num_queue_pairs()
3048 virtio_net_del_queue(n, i / 2); in virtio_net_change_num_queue_pairs()
3053 virtio_net_add_queue(n, i / 2); in virtio_net_change_num_queue_pairs()
3057 n->ctrl_vq = virtio_add_queue(vdev, 64, virtio_net_handle_ctrl); in virtio_net_change_num_queue_pairs()
3060 static void virtio_net_set_multiqueue(VirtIONet *n, int multiqueue) in virtio_net_set_multiqueue() argument
3062 int max = multiqueue ? n->max_queue_pairs : 1; in virtio_net_set_multiqueue()
3064 n->multiqueue = multiqueue; in virtio_net_set_multiqueue()
3065 virtio_net_change_num_queue_pairs(n, max); in virtio_net_set_multiqueue()
3067 virtio_net_set_queue_pairs(n); in virtio_net_set_multiqueue()
3081 VirtIONet *n = opaque; in virtio_net_post_load_device() local
3082 VirtIODevice *vdev = VIRTIO_DEVICE(n); in virtio_net_post_load_device()
3086 virtio_net_set_mrg_rx_bufs(n, n->mergeable_rx_bufs, in virtio_net_post_load_device()
3093 if (n->mac_table.in_use > MAC_TABLE_ENTRIES) { in virtio_net_post_load_device()
3094 n->mac_table.in_use = 0; in virtio_net_post_load_device()
3098 n->curr_guest_offloads = virtio_net_supported_guest_offloads(n); in virtio_net_post_load_device()
3107 n->saved_guest_offloads = n->curr_guest_offloads; in virtio_net_post_load_device()
3109 virtio_net_set_queue_pairs(n); in virtio_net_post_load_device()
3112 for (i = 0; i < n->mac_table.in_use; i++) { in virtio_net_post_load_device()
3113 if (n->mac_table.macs[i * ETH_ALEN] & 1) { in virtio_net_post_load_device()
3117 n->mac_table.first_multi = i; in virtio_net_post_load_device()
3120 * to link status bit in n->status */ in virtio_net_post_load_device()
3121 link_down = (n->status & VIRTIO_NET_S_LINK_UP) == 0; in virtio_net_post_load_device()
3122 for (i = 0; i < n->max_queue_pairs; i++) { in virtio_net_post_load_device()
3123 qemu_get_subqueue(n->nic, i)->link_down = link_down; in virtio_net_post_load_device()
3128 qemu_announce_timer_reset(&n->announce_timer, migrate_announce_params(), in virtio_net_post_load_device()
3130 virtio_net_announce_timer, n); in virtio_net_post_load_device()
3131 if (n->announce_timer.round) { in virtio_net_post_load_device()
3132 timer_mod(n->announce_timer.tm, in virtio_net_post_load_device()
3133 qemu_clock_get_ms(n->announce_timer.type)); in virtio_net_post_load_device()
3135 qemu_announce_timer_del(&n->announce_timer, false); in virtio_net_post_load_device()
3139 virtio_net_commit_rss_config(n); in virtio_net_post_load_device()
3145 VirtIONet *n = VIRTIO_NET(vdev); in virtio_net_post_load_virtio() local
3151 n->curr_guest_offloads = n->saved_guest_offloads; in virtio_net_post_load_virtio()
3152 if (peer_has_vnet_hdr(n)) { in virtio_net_post_load_virtio()
3153 virtio_net_apply_guest_offloads(n); in virtio_net_post_load_virtio()
3345 VirtIONet *n = VIRTIO_NET(vdev); in virtio_net_get_vhost() local
3349 if (!n->nic) { in virtio_net_get_vhost()
3353 nc = qemu_get_queue(n->nic); in virtio_net_get_vhost()
3370 VirtIONet *n = pv; in vhost_user_net_save_state() local
3371 VirtIODevice *vdev = VIRTIO_DEVICE(n); in vhost_user_net_save_state()
3398 VirtIONet *n = pv; in vhost_user_net_load_state() local
3399 VirtIODevice *vdev = VIRTIO_DEVICE(n); in vhost_user_net_load_state()
3425 VirtIONet *n = opaque; in vhost_user_net_is_internal_migration() local
3426 VirtIODevice *vdev = VIRTIO_DEVICE(n); in vhost_user_net_is_internal_migration()
3523 VirtIONet *n = VIRTIO_NET(vdev); in virtio_net_guest_notifier_pending() local
3525 assert(n->vhost_started); in virtio_net_guest_notifier_pending()
3526 if (!n->multiqueue && idx == 2) { in virtio_net_guest_notifier_pending()
3533 "%s: bogus vq index ignored\n", __func__); in virtio_net_guest_notifier_pending()
3536 nc = qemu_get_subqueue(n->nic, n->max_queue_pairs); in virtio_net_guest_notifier_pending()
3538 nc = qemu_get_subqueue(n->nic, vq2q(idx)); in virtio_net_guest_notifier_pending()
3555 VirtIONet *n = VIRTIO_NET(vdev); in virtio_net_guest_notifier_mask() local
3557 assert(n->vhost_started); in virtio_net_guest_notifier_mask()
3558 if (!n->multiqueue && idx == 2) { in virtio_net_guest_notifier_mask()
3565 "%s: bogus vq index ignored\n", __func__); in virtio_net_guest_notifier_mask()
3568 nc = qemu_get_subqueue(n->nic, n->max_queue_pairs); in virtio_net_guest_notifier_mask()
3570 nc = qemu_get_subqueue(n->nic, vq2q(idx)); in virtio_net_guest_notifier_mask()
3585 static void virtio_net_set_config_size(VirtIONet *n, uint64_t host_features) in virtio_net_set_config_size() argument
3589 n->config_size = virtio_get_config_size(&cfg_size_params, host_features); in virtio_net_set_config_size()
3592 void virtio_net_set_netclient_name(VirtIONet *n, const char *name, in virtio_net_set_netclient_name() argument
3600 g_free(n->netclient_name); in virtio_net_set_netclient_name()
3601 g_free(n->netclient_type); in virtio_net_set_netclient_name()
3602 n->netclient_name = g_strdup(name); in virtio_net_set_netclient_name()
3603 n->netclient_type = g_strdup(type); in virtio_net_set_netclient_name()
3606 static bool failover_unplug_primary(VirtIONet *n, DeviceState *dev) in failover_unplug_primary() argument
3627 static bool failover_replug_primary(VirtIONet *n, DeviceState *dev, in failover_replug_primary() argument
3644 qatomic_set(&n->failover_primary_hidden, false); in failover_replug_primary()
3660 static void virtio_net_handle_migration_primary(VirtIONet *n, MigrationEvent *e) in virtio_net_handle_migration_primary() argument
3664 DeviceState *dev = failover_find_primary_device(n); in virtio_net_handle_migration_primary()
3670 should_be_hidden = qatomic_read(&n->failover_primary_hidden); in virtio_net_handle_migration_primary()
3673 if (failover_unplug_primary(n, dev)) { in virtio_net_handle_migration_primary()
3676 qatomic_set(&n->failover_primary_hidden, true); in virtio_net_handle_migration_primary()
3682 if (!failover_replug_primary(n, dev, &err)) { in virtio_net_handle_migration_primary()
3693 VirtIONet *n = container_of(notifier, VirtIONet, migration_state); in virtio_net_migration_state_notifier() local
3694 virtio_net_handle_migration_primary(n, e); in virtio_net_migration_state_notifier()
3703 VirtIONet *n = container_of(listener, VirtIONet, primary_listener); in failover_hide_primary_device() local
3720 if (g_strcmp0(standby_id, n->netclient_name) != 0) { in failover_hide_primary_device()
3730 if (n->primary_opts) { in failover_hide_primary_device()
3733 old = qdict_get_str(n->primary_opts, "id"); in failover_hide_primary_device()
3737 "'%s': '%s' and '%s'", n->netclient_name, old, new); in failover_hide_primary_device()
3741 n->primary_opts = qdict_clone_shallow(device_opts); in failover_hide_primary_device()
3742 n->primary_opts_from_json = from_json; in failover_hide_primary_device()
3746 return qatomic_read(&n->failover_primary_hidden); in failover_hide_primary_device()
3752 VirtIONet *n = VIRTIO_NET(dev); in virtio_net_device_realize() local
3756 if (n->net_conf.mtu) { in virtio_net_device_realize()
3757 n->host_features |= (1ULL << VIRTIO_NET_F_MTU); in virtio_net_device_realize()
3760 if (n->net_conf.duplex_str) { in virtio_net_device_realize()
3761 if (strncmp(n->net_conf.duplex_str, "half", 5) == 0) { in virtio_net_device_realize()
3762 n->net_conf.duplex = DUPLEX_HALF; in virtio_net_device_realize()
3763 } else if (strncmp(n->net_conf.duplex_str, "full", 5) == 0) { in virtio_net_device_realize()
3764 n->net_conf.duplex = DUPLEX_FULL; in virtio_net_device_realize()
3769 n->host_features |= (1ULL << VIRTIO_NET_F_SPEED_DUPLEX); in virtio_net_device_realize()
3771 n->net_conf.duplex = DUPLEX_UNKNOWN; in virtio_net_device_realize()
3774 if (n->net_conf.speed < SPEED_UNKNOWN) { in virtio_net_device_realize()
3778 if (n->net_conf.speed >= 0) { in virtio_net_device_realize()
3779 n->host_features |= (1ULL << VIRTIO_NET_F_SPEED_DUPLEX); in virtio_net_device_realize()
3782 if (n->failover) { in virtio_net_device_realize()
3783 n->primary_listener.hide_device = failover_hide_primary_device; in virtio_net_device_realize()
3784 qatomic_set(&n->failover_primary_hidden, true); in virtio_net_device_realize()
3785 device_listener_register(&n->primary_listener); in virtio_net_device_realize()
3786 migration_add_notifier(&n->migration_state, in virtio_net_device_realize()
3788 n->host_features |= (1ULL << VIRTIO_NET_F_STANDBY); in virtio_net_device_realize()
3791 virtio_net_set_config_size(n, n->host_features); in virtio_net_device_realize()
3792 virtio_init(vdev, VIRTIO_ID_NET, n->config_size); in virtio_net_device_realize()
3799 if (n->net_conf.rx_queue_size < VIRTIO_NET_RX_QUEUE_MIN_SIZE || in virtio_net_device_realize()
3800 n->net_conf.rx_queue_size > VIRTQUEUE_MAX_SIZE || in virtio_net_device_realize()
3801 !is_power_of_2(n->net_conf.rx_queue_size)) { in virtio_net_device_realize()
3804 n->net_conf.rx_queue_size, VIRTIO_NET_RX_QUEUE_MIN_SIZE, in virtio_net_device_realize()
3810 if (n->net_conf.tx_queue_size < VIRTIO_NET_TX_QUEUE_MIN_SIZE || in virtio_net_device_realize()
3811 n->net_conf.tx_queue_size > virtio_net_max_tx_queue_size(n) || in virtio_net_device_realize()
3812 !is_power_of_2(n->net_conf.tx_queue_size)) { in virtio_net_device_realize()
3815 n->net_conf.tx_queue_size, VIRTIO_NET_TX_QUEUE_MIN_SIZE, in virtio_net_device_realize()
3816 virtio_net_max_tx_queue_size(n)); in virtio_net_device_realize()
3821 n->max_ncs = MAX(n->nic_conf.peers.queues, 1); in virtio_net_device_realize()
3827 if (n->nic_conf.peers.queues) { in virtio_net_device_realize()
3828 for (i = 0; i < n->max_ncs; i++) { in virtio_net_device_realize()
3829 if (n->nic_conf.peers.ncs[i]->is_datapath) { in virtio_net_device_realize()
3830 ++n->max_queue_pairs; in virtio_net_device_realize()
3834 n->max_queue_pairs = MAX(n->max_queue_pairs, 1); in virtio_net_device_realize()
3836 if (n->max_queue_pairs * 2 + 1 > VIRTIO_QUEUE_MAX) { in virtio_net_device_realize()
3839 n->max_queue_pairs, (VIRTIO_QUEUE_MAX - 1) / 2); in virtio_net_device_realize()
3843 n->vqs = g_new0(VirtIONetQueue, n->max_queue_pairs); in virtio_net_device_realize()
3844 n->curr_queue_pairs = 1; in virtio_net_device_realize()
3845 n->tx_timeout = n->net_conf.txtimer; in virtio_net_device_realize()
3847 if (n->net_conf.tx && strcmp(n->net_conf.tx, "timer") in virtio_net_device_realize()
3848 && strcmp(n->net_conf.tx, "bh")) { in virtio_net_device_realize()
3851 n->net_conf.tx); in virtio_net_device_realize()
3855 n->net_conf.tx_queue_size = MIN(virtio_net_max_tx_queue_size(n), in virtio_net_device_realize()
3856 n->net_conf.tx_queue_size); in virtio_net_device_realize()
3858 virtio_net_add_queue(n, 0); in virtio_net_device_realize()
3860 n->ctrl_vq = virtio_add_queue(vdev, 64, virtio_net_handle_ctrl); in virtio_net_device_realize()
3861 qemu_macaddr_default_if_unset(&n->nic_conf.macaddr); in virtio_net_device_realize()
3862 memcpy(&n->mac[0], &n->nic_conf.macaddr, sizeof(n->mac)); in virtio_net_device_realize()
3863 n->status = VIRTIO_NET_S_LINK_UP; in virtio_net_device_realize()
3864 qemu_announce_timer_reset(&n->announce_timer, migrate_announce_params(), in virtio_net_device_realize()
3866 virtio_net_announce_timer, n); in virtio_net_device_realize()
3867 n->announce_timer.round = 0; in virtio_net_device_realize()
3869 if (n->netclient_type) { in virtio_net_device_realize()
3873 n->nic = qemu_new_nic(&net_virtio_info, &n->nic_conf, in virtio_net_device_realize()
3874 n->netclient_type, n->netclient_name, in virtio_net_device_realize()
3875 &dev->mem_reentrancy_guard, n); in virtio_net_device_realize()
3877 n->nic = qemu_new_nic(&net_virtio_info, &n->nic_conf, in virtio_net_device_realize()
3879 &dev->mem_reentrancy_guard, n); in virtio_net_device_realize()
3882 for (i = 0; i < n->max_queue_pairs; i++) { in virtio_net_device_realize()
3883 n->nic->ncs[i].do_not_pad = true; in virtio_net_device_realize()
3886 peer_test_vnet_hdr(n); in virtio_net_device_realize()
3887 if (peer_has_vnet_hdr(n)) { in virtio_net_device_realize()
3888 n->host_hdr_len = sizeof(struct virtio_net_hdr); in virtio_net_device_realize()
3890 n->host_hdr_len = 0; in virtio_net_device_realize()
3893 qemu_format_nic_info_str(qemu_get_queue(n->nic), n->nic_conf.macaddr.a); in virtio_net_device_realize()
3895 n->vqs[0].tx_waiting = 0; in virtio_net_device_realize()
3896 n->tx_burst = n->net_conf.txburst; in virtio_net_device_realize()
3897 virtio_net_set_mrg_rx_bufs(n, 0, 0, 0); in virtio_net_device_realize()
3898 n->promisc = 1; /* for compatibility */ in virtio_net_device_realize()
3900 n->mac_table.macs = g_malloc0(MAC_TABLE_ENTRIES * ETH_ALEN); in virtio_net_device_realize()
3902 n->vlans = g_malloc0(MAX_VLAN >> 3); in virtio_net_device_realize()
3904 nc = qemu_get_queue(n->nic); in virtio_net_device_realize()
3909 memcpy(&netcfg.mac, &n->nic_conf.macaddr, ETH_ALEN); in virtio_net_device_realize()
3913 QTAILQ_INIT(&n->rsc_chains); in virtio_net_device_realize()
3914 n->qdev = dev; in virtio_net_device_realize()
3916 net_rx_pkt_init(&n->rx_pkt); in virtio_net_device_realize()
3918 if (virtio_has_feature(n->host_features, VIRTIO_NET_F_RSS)) { in virtio_net_device_realize()
3919 virtio_net_load_ebpf(n, errp); in virtio_net_device_realize()
3926 VirtIONet *n = VIRTIO_NET(dev); in virtio_net_device_unrealize() local
3929 if (virtio_has_feature(n->host_features, VIRTIO_NET_F_RSS)) { in virtio_net_device_unrealize()
3930 virtio_net_unload_ebpf(n); in virtio_net_device_unrealize()
3936 g_free(n->netclient_name); in virtio_net_device_unrealize()
3937 n->netclient_name = NULL; in virtio_net_device_unrealize()
3938 g_free(n->netclient_type); in virtio_net_device_unrealize()
3939 n->netclient_type = NULL; in virtio_net_device_unrealize()
3941 g_free(n->mac_table.macs); in virtio_net_device_unrealize()
3942 g_free(n->vlans); in virtio_net_device_unrealize()
3944 if (n->failover) { in virtio_net_device_unrealize()
3945 qobject_unref(n->primary_opts); in virtio_net_device_unrealize()
3946 device_listener_unregister(&n->primary_listener); in virtio_net_device_unrealize()
3947 migration_remove_notifier(&n->migration_state); in virtio_net_device_unrealize()
3949 assert(n->primary_opts == NULL); in virtio_net_device_unrealize()
3952 max_queue_pairs = n->multiqueue ? n->max_queue_pairs : 1; in virtio_net_device_unrealize()
3954 virtio_net_del_queue(n, i); in virtio_net_device_unrealize()
3958 qemu_announce_timer_del(&n->announce_timer, false); in virtio_net_device_unrealize()
3959 g_free(n->vqs); in virtio_net_device_unrealize()
3960 qemu_del_nic(n->nic); in virtio_net_device_unrealize()
3961 virtio_net_rsc_cleanup(n); in virtio_net_device_unrealize()
3962 g_free(n->rss_data.indirections_table); in virtio_net_device_unrealize()
3963 net_rx_pkt_uninit(n->rx_pkt); in virtio_net_device_unrealize()
3969 VirtIONet *n = VIRTIO_NET(vdev); in virtio_net_reset() local
3973 n->promisc = 1; in virtio_net_reset()
3974 n->allmulti = 0; in virtio_net_reset()
3975 n->alluni = 0; in virtio_net_reset()
3976 n->nomulti = 0; in virtio_net_reset()
3977 n->nouni = 0; in virtio_net_reset()
3978 n->nobcast = 0; in virtio_net_reset()
3980 n->curr_queue_pairs = 1; in virtio_net_reset()
3981 timer_del(n->announce_timer.tm); in virtio_net_reset()
3982 n->announce_timer.round = 0; in virtio_net_reset()
3983 n->status &= ~VIRTIO_NET_S_ANNOUNCE; in virtio_net_reset()
3986 n->mac_table.in_use = 0; in virtio_net_reset()
3987 n->mac_table.first_multi = 0; in virtio_net_reset()
3988 n->mac_table.multi_overflow = 0; in virtio_net_reset()
3989 n->mac_table.uni_overflow = 0; in virtio_net_reset()
3990 memset(n->mac_table.macs, 0, MAC_TABLE_ENTRIES * ETH_ALEN); in virtio_net_reset()
3991 memcpy(&n->mac[0], &n->nic->conf->macaddr, sizeof(n->mac)); in virtio_net_reset()
3992 qemu_format_nic_info_str(qemu_get_queue(n->nic), n->mac); in virtio_net_reset()
3993 memset(n->vlans, 0, MAX_VLAN >> 3); in virtio_net_reset()
3996 for (i = 0; i < n->max_queue_pairs; i++) { in virtio_net_reset()
3997 flush_or_purge_queued_packets(qemu_get_subqueue(n->nic, i)); in virtio_net_reset()
4000 virtio_net_disable_rss(n); in virtio_net_reset()
4005 VirtIONet *n = VIRTIO_NET(obj); in virtio_net_instance_init() local
4011 n->config_size = sizeof(struct virtio_net_config); in virtio_net_instance_init()
4012 device_add_bootindex_property(obj, &n->nic_conf.bootindex, in virtio_net_instance_init()
4014 DEVICE(n)); in virtio_net_instance_init()
4016 ebpf_rss_init(&n->ebpf_rss); in virtio_net_instance_init()
4021 VirtIONet *n = opaque; in virtio_net_pre_save() local
4025 assert(!n->vhost_started); in virtio_net_pre_save()
4035 VirtIONet *n = VIRTIO_NET(vdev); in primary_unplug_pending() local
4040 primary = failover_find_primary_device(n); in primary_unplug_pending()