From patchwork Tue Aug 6 00:58:01 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cindy Lu X-Patchwork-Id: 13754292 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id C1E36C52D71 for ; Tue, 6 Aug 2024 00:59:29 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1sb8X5-0003Vm-7w; Mon, 05 Aug 2024 20:58:35 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1sb8X3-0003Ul-9d for qemu-devel@nongnu.org; Mon, 05 Aug 2024 20:58:33 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1sb8X1-0003zj-8P for qemu-devel@nongnu.org; Mon, 05 Aug 2024 20:58:32 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1722905908; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=sYBraCN/YUQ5Ewx2AyTEf3Tbh7NtDdgADZ0SChU3wWw=; b=ZxsGXy3wcSeJ3VVwYewIDlXWCiPrEaE5ita4Z69OZ0ISWkLe8LU37UB1nKOXMRooPzGqgG bm5eD/WTtSacxgg91VLdXU+M7jWjAs3okwwGW4q7CzewSRBVZ0kRAa+vjBMIksoI4IZVt7 9a3tUgTuN+i+Nyn4R1GhxYCwwZy63Uc= Received: from mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-247-JjuksZmYNXOYEppL_o53tw-1; Mon, 05 Aug 2024 20:58:25 -0400 X-MC-Unique: JjuksZmYNXOYEppL_o53tw-1 Received: from mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.12]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 2911B1955F42 for ; Tue, 6 Aug 2024 00:58:24 +0000 (UTC) Received: from server.redhat.com (unknown [10.72.112.8]) by mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id F176819560AE; Tue, 6 Aug 2024 00:58:20 +0000 (UTC) From: Cindy Lu To: lulu@redhat.com, mst@redhat.com, jasowang@redhat.com, qemu-devel@nongnu.org Subject: [PATCH 1/3] virtio_net: Add the check for vdpa's mac address Date: Tue, 6 Aug 2024 08:58:01 +0800 Message-ID: <20240806005814.51651-1-lulu@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.12 Received-SPF: pass client-ip=170.10.129.124; envelope-from=lulu@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -21 X-Spam_score: -2.2 X-Spam_bar: -- X-Spam_report: (-2.2 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.143, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org When using a VDPA device, it is important to ensure that the MAC address in the hardware matches the MAC address from the QEMU command line. This will allow the device to boot. Signed-off-by: Cindy Lu --- hw/net/virtio-net.c | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index 9c7e85caea..7f51bd0dd3 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -3579,12 +3579,36 @@ static bool failover_hide_primary_device(DeviceListener *listener, /* failover_primary_hidden is set during feature negotiation */ return qatomic_read(&n->failover_primary_hidden); } +static bool virtio_net_check_vdpa_mac(NetClientState *nc, VirtIONet *n, MACAddr *cmdline_mac, + Error **errp) +{ + struct virtio_net_config hwcfg = {}; + static const MACAddr zero = { .a = { 0, 0, 0, 0, 0, 0 } }; + + vhost_net_get_config(get_vhost_net(nc->peer), (uint8_t *)&hwcfg, ETH_ALEN); + + /* + * For VDPA device: Only two situations are acceptable: + * 1.The hardware MAC address is the same as the QEMU command line MAC + * address, and both of them are not 0. + */ + + if (memcmp(&hwcfg.mac, &zero, sizeof(MACAddr)) != 0) { + if ((memcmp(&hwcfg.mac, cmdline_mac, sizeof(MACAddr)) == 0)) { + return true; + } + } + error_setg(errp, "vDPA device's mac != the mac address from qemu cmdline" + "Please check the the vdpa device's setting."); + return false; +} static void virtio_net_device_realize(DeviceState *dev, Error **errp) { VirtIODevice *vdev = VIRTIO_DEVICE(dev); VirtIONet *n = VIRTIO_NET(dev); NetClientState *nc; + MACAddr macaddr_cmdline; int i; if (n->net_conf.mtu) { @@ -3692,6 +3716,7 @@ static void virtio_net_device_realize(DeviceState *dev, Error **errp) virtio_net_add_queue(n, 0); n->ctrl_vq = virtio_add_queue(vdev, 64, virtio_net_handle_ctrl); + memcpy(&macaddr_cmdline, &n->nic_conf.macaddr, sizeof(n->mac)); qemu_macaddr_default_if_unset(&n->nic_conf.macaddr); memcpy(&n->mac[0], &n->nic_conf.macaddr, sizeof(n->mac)); n->status = VIRTIO_NET_S_LINK_UP; @@ -3739,10 +3764,10 @@ static void virtio_net_device_realize(DeviceState *dev, Error **errp) nc->rxfilter_notify_enabled = 1; if (nc->peer && nc->peer->info->type == NET_CLIENT_DRIVER_VHOST_VDPA) { - struct virtio_net_config netcfg = {}; - memcpy(&netcfg.mac, &n->nic_conf.macaddr, ETH_ALEN); - vhost_net_set_config(get_vhost_net(nc->peer), - (uint8_t *)&netcfg, 0, ETH_ALEN, VHOST_SET_CONFIG_TYPE_FRONTEND); + if (!virtio_net_check_vdpa_mac(nc, n, &macaddr_cmdline, errp)) { + virtio_cleanup(vdev); + return; + } } QTAILQ_INIT(&n->rsc_chains); n->qdev = dev;