From nobody Sun Dec 14 06:42:10 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=fail(p=none dis=none) header.from=smartx.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1751642555412305.53095790906764; Fri, 4 Jul 2025 08:22:35 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 67EEDA09; Fri, 4 Jul 2025 11:22:34 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 5493814D3; Fri, 4 Jul 2025 11:20:37 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 4F5621443; Fri, 4 Jul 2025 11:20:28 -0400 (EDT) Received: from mail-pl1-f170.google.com (mail-pl1-f170.google.com [209.85.214.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 7C598140D for ; Fri, 4 Jul 2025 11:20:27 -0400 (EDT) Received: by mail-pl1-f170.google.com with SMTP id d9443c01a7336-23633a6ac50so14842075ad.2 for ; Fri, 04 Jul 2025 08:20:27 -0700 (PDT) Received: from Hyman-Dev-Euler.zelin.local ([45.8.186.102]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-23c84350221sm23628205ad.83.2025.07.04.08.20.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 04 Jul 2025 08:20:25 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=smartx-com.20230601.gappssmtp.com; s=20230601; t=1751642426; x=1752247226; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=FsDvgzqkcIq18FtyWDBq3CEjYBEb624x1GIhn5DOqqk=; b=S8vufDJ91apZXnWJt3VfBtoHWAaEa3dSaff4ygJQEYLCQNTZ1Hn5X1slBz6BErft4H 9Qi+9VUXg1iNkFzDFKoAJeflwqGEAGwR/GYIkmq70hkOamPIgKta/PBUrm7E3xOkXWIC oew3WU2or+YgljbXlCHrBbv7E7408fg0y5Y49EaQGelymOETcDuMUJ7XuoeGrfWMQmam ssB9ucaqag4P/W1oHOnTBC8pbD4ERMHFHwBwYoeJuKkBUNtA5bM5+sjgNZDBFVAlAsOy GUZ6nuOhXihEELXLuVjLLe8StaP+xeQHddIb17RUmMh7rf1zLuuzMNc7gZSdphRnXl+f tsUg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751642426; x=1752247226; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=FsDvgzqkcIq18FtyWDBq3CEjYBEb624x1GIhn5DOqqk=; b=At82M8LUyAQVfC+yINSLIwQlWnUJhypkUgT6ned6/RI17/aydvcsyL1KNLdRoNGwfI j5BxnMJae95DwP1ktGCFVFk15cP5fCtl4Usio7X3ltJYmVH2LioqIWcBcmTyNA8Ebm71 N28oDhJThI6XIO1o7PZ1Sd2i4euREK9dmDJduEKLuqfy+SSJC0q3l+bEO1nARaFmMRp2 oRgZ4aI/xKG0CTU+0LNJh6wnYs9gWVCVQpApAsRWxbQWKEP6csceSyAlLUaqm8ANTrmS 3jqIA0AefBbF4Sotlz3r1BjAiQeBvgzO4nJn477nJGkzt92O6Jtx1UFeVIhFY5xjmkt8 gs1g== X-Gm-Message-State: AOJu0Yx641xbB1waoHY6fuQZsxftdC8vgt+hy+rOqvHdeddiPimPOXvD /D30um5N+umYy+ceLvIGkJfbeULF7eJb4iLyfxmZyaltE9ehlaLoGEDHHnrxpO7yRL1s/gHEDCL 8Qwu0PEO82w== X-Gm-Gg: ASbGncuY6mS44+wdaNppsdTAhmejgGi+mvVcQjhxt1dU5Ql6F/qGp1j7ZnvtoT8zq1M NvUh0I+CtpWJYALZemUsOszT7KmwRHNrFHINGMyI1hYH1MTPvLUrG61W6YspuvUzopaFuD+MfAr jKynuSJhtH6mm5wSuYSy7cm59DmW4DYHMtdyHLEWGvypPhBHIDn5J45VBUULTKWkgKTRBp/N6FX n/R62Lfb3LAC7WWy+dfzyhYxPrNkLMAzEdHZcJCpusz3NYLaabcmbDlLis7hCcmWuZ8C2WkU5f3 4rGdD0IItLBp64puYcsLFkK2IJo9hOYEETMdA9o9c5Qrm8nprszwsYNZPpL3oGTo2bj5GfkI77C VT3lMUXqT X-Google-Smtp-Source: AGHT+IGT20eT7H77IZcuv9z27FFHt2BPvg2a735S5ESYfmGGtVTeKk/XDDiudSuJnJd7kvl5RzEYZA== X-Received: by 2002:a17:902:f542:b0:237:f76f:ce34 with SMTP id d9443c01a7336-23c86066fffmr43603625ad.15.1751642426240; Fri, 04 Jul 2025 08:20:26 -0700 (PDT) From: yong.huang@smartx.com To: devel@lists.libvirt.org Subject: [RFC 3/4] util: Add iface argument to virNetDevOpenvswitchAddPort Date: Fri, 4 Jul 2025 22:57:58 +0800 Message-Id: <874213089a231f26c3e0aa2b0310fd1609561c22.1751640926.git.yong.huang@smartx.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: RIRZZXXKMAEE5ADLYWYBDYFPRHW77NHK X-Message-ID-Hash: RIRZZXXKMAEE5ADLYWYBDYFPRHW77NHK X-MailFrom: yong.huang@smartx.com X-Mailman-Rule-Hits: nonmember-moderation X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0 CC: yong.huang@smartx.com X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1751642556929116600 Content-Type: text/plain; charset="utf-8" From: Hyman Huang Introduce the virNetDevVhostUserIface struct to encapsulate the necessary configuration for attaching a vhostuser port to a bridge. Update the virNetDevOpenvswitchAddPort signature to accept an additional iface argument. Extend the implementation of virNetDevOpenvswitchAddPort to fully support automatic attachment of the vhostuser port. --- src/lxc/lxc_process.c | 3 ++- src/util/virnetdevopenvswitch.c | 36 ++++++++++++++++++++++++++++++++- src/util/virnetdevopenvswitch.h | 10 ++++++++- src/util/virnetdevtap.c | 3 ++- 4 files changed, 48 insertions(+), 4 deletions(-) diff --git a/src/lxc/lxc_process.c b/src/lxc/lxc_process.c index 1bca9e8dae..ad1554fa56 100644 --- a/src/lxc/lxc_process.c +++ b/src/lxc/lxc_process.c @@ -286,7 +286,8 @@ virLXCProcessSetupInterfaceTap(virDomainDef *vm, if (brname) { if (vport && vport->virtPortType =3D=3D VIR_NETDEV_VPORT_PROFILE_O= PENVSWITCH) { if (virNetDevOpenvswitchAddPort(brname, parentVeth, &net->mac,= vm->uuid, - vport, virDomainNetGetActualVl= an(net)) < 0) + vport, virDomainNetGetActualVl= an(net), + NULL) < 0) return NULL; } else { if (virNetDevBridgeAddPort(brname, parentVeth, virDomainNetGet= ActualVlan(net)) < 0) diff --git a/src/util/virnetdevopenvswitch.c b/src/util/virnetdevopenvswitc= h.c index 868d6d26ba..6f6b995fe2 100644 --- a/src/util/virnetdevopenvswitch.c +++ b/src/util/virnetdevopenvswitch.c @@ -119,6 +119,36 @@ virNetDevOpenvswitchConstructVlans(virCommand *cmd, co= nst virNetDevVlan *virtVla } } =20 +/** + * virNetDevOpenvswitchConstructIface: + * @cmd: command to construct + * @ifname: the ovs interface name + * @iface: the configuration of ovs vhost user interface + * + * Construct the ovs vhost user interface configuration + * parameters to be passed to ovs-vsctl command. + * + */ +static void +virNetDevOpenvswitchConstructIface(virCommand *cmd, const char *ifname, + const virNetDevVhostUserIface *iface) +{ + g_autofree char *type_info =3D NULL; + g_autofree char *server_path =3D NULL; + + if (!ifname || !iface) + return; + + type_info =3D g_strdup_printf("type=3D\"%s\"", + iface->client ? "dpdkvhostuserclient" : "dpdkvhostuser"); + server_path =3D g_strdup_printf("options:vhost-server-path=3D\"%s\"", = iface->path); + + virCommandAddArgList(cmd, + "--", "set", "Interface", ifname, type_info, + "--", "set", "Interface", ifname, server_path, + NULL); +} + /** * virNetDevOpenvswitchAddPort: * @brname: the bridge name @@ -126,6 +156,7 @@ virNetDevOpenvswitchConstructVlans(virCommand *cmd, con= st virNetDevVlan *virtVla * @macaddr: the mac address of the virtual interface * @vmuuid: the Domain UUID that has this interface * @ovsport: the ovs specific fields + * @ovsiface: the configuration of ovs vhost user interface * * Add an interface to the OVS bridge * @@ -135,7 +166,8 @@ int virNetDevOpenvswitchAddPort(const char *brname, con= st char *ifname, const virMacAddr *macaddr, const unsigned char *vmuuid, const virNetDevVPortProfile *ovsport, - const virNetDevVlan *virtVlan) + const virNetDevVlan *virtVlan, + const virNetDevVhostUserIface *ovsiface) { char macaddrstr[VIR_MAC_STRING_BUFLEN]; char ifuuidstr[VIR_UUID_STRING_BUFLEN]; @@ -170,6 +202,8 @@ int virNetDevOpenvswitchAddPort(const char *brname, con= st char *ifname, =20 virNetDevOpenvswitchConstructVlans(cmd, virtVlan); =20 + virNetDevOpenvswitchConstructIface(cmd, ifname, ovsiface); + if (ovsport->profileID[0] =3D=3D '\0') { virCommandAddArgList(cmd, "--", "set", "Interface", ifname, attachedmac= _ex_id, diff --git a/src/util/virnetdevopenvswitch.h b/src/util/virnetdevopenvswitc= h.h index 3b4a1e509b..4d5300f7d8 100644 --- a/src/util/virnetdevopenvswitch.h +++ b/src/util/virnetdevopenvswitch.h @@ -27,6 +27,13 @@ =20 #define VIR_NETDEV_OVS_DEFAULT_TIMEOUT 5 =20 +typedef struct _virNetDevVhostUserIface virNetDevVhostUserIface; +typedef virNetDevVhostUserIface *virNetDevVhostUserIfacePtr; +struct _virNetDevVhostUserIface { + bool client; + char *path; /* vhost user path listened by server */ +}; + void virNetDevOpenvswitchSetTimeout(unsigned int timeout); =20 int virNetDevOpenvswitchAddPort(const char *brname, @@ -34,7 +41,8 @@ int virNetDevOpenvswitchAddPort(const char *brname, const virMacAddr *macaddr, const unsigned char *vmuuid, const virNetDevVPortProfile *ovsport, - const virNetDevVlan *virtVlan) + const virNetDevVlan *virtVlan, + const virNetDevVhostUserIface *ovsiface) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3) G_GNUC_WARN_UNUSED_RESULT; =20 diff --git a/src/util/virnetdevtap.c b/src/util/virnetdevtap.c index b709d76cc7..f0e0c3c16b 100644 --- a/src/util/virnetdevtap.c +++ b/src/util/virnetdevtap.c @@ -479,7 +479,8 @@ virNetDevTapAttachBridge(const char *tapname, return -1; } else if (virtPortProfile->virtPortType =3D=3D VIR_NETDEV_VPORT_P= ROFILE_OPENVSWITCH) { if (virNetDevOpenvswitchAddPort(brname, tapname, macaddr, vmuu= id, - virtPortProfile, virtVlan) < 0) + virtPortProfile, virtVlan, + NULL) < 0) return -1; } } else { --=20 2.27.0