From nobody Mon Sep 8 17:06:05 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; 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=reject dis=none) header.from=rsg.ci.i.u-tokyo.ac.jp Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1755526507799401.10596269033863; Mon, 18 Aug 2025 07:15:07 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id C1166C2F; Mon, 18 Aug 2025 10:15:06 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 2C5C8C95; Mon, 18 Aug 2025 10:12:15 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 79BE9138D; Tue, 5 Aug 2025 06:57:57 -0400 (EDT) Received: from www3579.sakura.ne.jp (www3579.sakura.ne.jp [49.212.243.89]) (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 7F8C01385 for ; Tue, 5 Aug 2025 06:57:56 -0400 (EDT) Received: from h205.csg.ci.i.u-tokyo.ac.jp (h205.csg.ci.i.u-tokyo.ac.jp [133.11.54.205]) (authenticated bits=0) by www3579.sakura.ne.jp (8.16.1/8.16.1) with ESMTPSA id 575APt9C013112 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Tue, 5 Aug 2025 19:25:59 +0900 (JST) (envelope-from odaki@rsg.ci.i.u-tokyo.ac.jp) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.7 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, RCVD_IN_VALIDITY_RPBL_BLOCKED,RCVD_IN_VALIDITY_SAFE_BLOCKED, SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Signature: a=rsa-sha256; bh=H9/9L3VEFnI1eXiLImEjgGJlv3mUcHo8k04KpKS2pW8=; c=relaxed/relaxed; d=rsg.ci.i.u-tokyo.ac.jp; h=From:Date:Subject:Message-Id:To; s=rs20250326; t=1754389559; v=1; b=dkyxY/DfbtfJUp3xIP9YCbP+QSiQ+SFDe7UDB37ac/fINevQySHh+Umu8IgJoS/C U5Hd+lRDHUBKULu+OK1GAB6aRVN11ftLMjcZnYysxIjBTj+qsdf8qyPHDOLDbYj5 bD4QpIwdvLZUovCRWdn80G+ztuXuU5hoQNocVU0DpgQo/hj1c4LrdT0RcpKuXxwe xPvAVgW+jMCYWbIgQ8daPooT8iYy1YTG0VRUbTJgEXR30lYedmWo84X8z0CSA3TR 0bJXGA7++1BysPK3bD4v2PxZ+ya8eM0ucdhxiI728Rj2Ifjm4k1Vb9P3pZRA0uJM Et/Uk/steHTEpJzydZvl9w== From: Akihiko Odaki Date: Tue, 05 Aug 2025 19:25:32 +0900 Subject: [PATCH v2 1/2] Remove libnl checks specific to Linux MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250805-linux-v2-1-63e721bdd97d@rsg.ci.i.u-tokyo.ac.jp> References: <20250805-linux-v2-0-63e721bdd97d@rsg.ci.i.u-tokyo.ac.jp> In-Reply-To: <20250805-linux-v2-0-63e721bdd97d@rsg.ci.i.u-tokyo.ac.jp> To: Laine Stump , =?utf-8?q?Daniel_P=2E_Berrang=C3=A9?= , devel@lists.libvirt.org X-Mailer: b4 0.14.2 X-MailFrom: odaki@rsg.ci.i.u-tokyo.ac.jp 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 Message-ID-Hash: YWX4FN4YUFJ6GWCV2JULYI5X7VUV75KV X-Message-ID-Hash: YWX4FN4YUFJ6GWCV2JULYI5X7VUV75KV X-Mailman-Approved-At: Mon, 18 Aug 2025 14:12:10 -0400 CC: 20250308-require-v1-1-fe6850bf3f30@daynix.com, Akihiko Odaki 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-ZM-MESSAGEID: 1755526510309116600 Builds for Linux without libnl is broken since commit 582f0966f9b9e2148d8887d072364e2a91aed000 because src/util/virnetdevbridge.c refers to virNetlinkBridgeVlanFilterSet(). A fundamental problem here is that nobody tests such builds. Netlink is a critical part of Linux networking so developers may assume it is readily available, but the libnl dependency check breaks this assumption. Builds without libnl also lack several networking features such as SR-IOV, bridge/tap, switchdev, macvlan, veth, and vlan. This may also contradict with exceptations made by other networking code of libvirt or users. Remove libnl checks specific to Linux to avoid such a problem in libvirt's networking code. More concretely, find patterns like following: #ifdef __linux__ A #ifdef WITH_LIBNL B #endif C #endif And replace them with: #ifdef WITH_LIBNL A B C #endif There are also patterns like following: #ifdef WITH_LIBNL A #elif defined(__linux__) B #endif Replace them with: #ifdef WITH_LIBNL A #endif This change will make less networking features available. Anyone who want these features should enable libnl for the better tested code. It still does not require libnl to build because the client code and some drivers do not need libvirt to configure networking at all. Signed-off-by: Akihiko Odaki --- src/util/virnetdev.c | 44 ++++--------------------------------------= -- src/util/virnetdevbridge.c | 29 ++++------------------------- tests/virnetdevtest.c | 10 +--------- 3 files changed, 9 insertions(+), 74 deletions(-) diff --git a/src/util/virnetdev.c b/src/util/virnetdev.c index 8ae854245ed99dc1a3aa4c225b614ddbb449caf8..7ea029be9e49d7399ae1235ac47= 89cee7add4f70 100644 --- a/src/util/virnetdev.c +++ b/src/util/virnetdev.c @@ -914,29 +914,6 @@ virNetDevGetMaster(const char *ifname, char **master) return 0; } =20 -#elif defined(__linux__) - -/* libnl isn't available, so we can't use netlink. - * Fall back to using sysfs - */ -int -virNetDevGetMaster(const char *ifname, char **master) -{ - g_autofree char *path =3D NULL; - g_autofree char *canonical =3D NULL; - - if (virNetDevSysfsFile(&path, ifname, "master") < 0) - return -1; - - if (!(canonical =3D virFileCanonicalizePath(path))) - return -1; - - *master =3D g_path_get_basename(canonical); - - VIR_DEBUG("IFLA_MASTER for %s is %s", ifname, *master ? *master : "(no= ne)"); - return 0; -} - #else =20 int @@ -1059,7 +1036,7 @@ int virNetDevValidateConfig(const char *ifname G_GNUC= _UNUSED, #endif =20 =20 -#ifdef __linux__ +#ifdef WITH_LIBNL =20 int virNetDevSysfsFile(char **pf_sysfs_device_link, const char *ifname, @@ -1079,8 +1056,6 @@ virNetDevSysfsDeviceFile(char **pf_sysfs_device_link,= const char *ifname, } =20 =20 -# if defined(WITH_LIBNL) - /** * Determine if the device path specified in devpath is a PCI Device * by resolving the 'subsystem'-link in devpath and looking for @@ -1133,7 +1108,6 @@ virNetDevGetPCIDevice(const char *devName) =20 return virPCIDeviceNew(vfPCIAddr); } -# endif =20 =20 /* A wrapper to get content of file from ifname SYSFS_NET_DIR @@ -1381,7 +1355,7 @@ virNetDevGetVirtualFunctionInfo(const char *vfname, c= har **pfname, return ret; } =20 -#else /* !__linux__ */ +#else /* !WITH_LIBNL */ int virNetDevGetPhysPortID(const char *ifname G_GNUC_UNUSED, char **physPortID) @@ -1471,7 +1445,7 @@ virNetDevSysfsFile(char **pf_sysfs_device_link G_GNUC= _UNUSED, } =20 =20 -#endif /* !__linux__ */ +#endif /* !WITH_LIBNL */ #if defined(WITH_LIBNL) =20 =20 @@ -2938,7 +2912,7 @@ int virNetDevGetRxFilter(const char *ifname, return ret; } =20 -#if __linux__ +#ifdef WITH_LIBNL =20 /** * virNetDevRDMAFeature @@ -3095,8 +3069,6 @@ virNetDevGetEthtoolFeatures(const char *ifname, } =20 =20 -# if defined(WITH_LIBNL) - /** * virNetDevGetFamilyId: * This function supplies the devlink family id @@ -3237,14 +3209,6 @@ virNetDevSwitchdevFeature(const char *ifname, nlmsg_free(nl_msg); return ret; } -# else -static int -virNetDevSwitchdevFeature(const char *ifname G_GNUC_UNUSED, - virBitmap **out G_GNUC_UNUSED) -{ - return 0; -} -# endif =20 =20 /** diff --git a/src/util/virnetdevbridge.c b/src/util/virnetdevbridge.c index 20c7a25585f9e9b0b985780ee62655456f6b05af..12d35737eade0ff692ebe4a28b4= c037abd7f9edd 100644 --- a/src/util/virnetdevbridge.c +++ b/src/util/virnetdevbridge.c @@ -183,7 +183,7 @@ static int virNetDevBridgeGet(const char *brname, } #endif /* __linux__ */ =20 -#if defined(__linux__) +#if defined(WITH_LIBNL) static int virNetDevBridgePortSet(const char *brname, const char *ifname, @@ -448,7 +448,7 @@ virNetDevBridgePortSetIsolated(const char *brname G_GNU= C_UNUSED, * * Returns 0 in case of success or -1 on failure */ -#if defined(WITH_STRUCT_IFREQ) && defined(SIOCBRADDBR) +#if defined(WITH_STRUCT_IFREQ) && defined(SIOCBRADDBR) && defined(WITH_LIB= NL) static int virNetDevBridgeCreateWithIoctl(const char *brname, const virMacAddr *mac) @@ -475,9 +475,7 @@ virNetDevBridgeCreateWithIoctl(const char *brname, =20 return 0; } -#endif =20 -#if defined(WITH_LIBNL) int virNetDevBridgeCreate(const char *brname, const virMacAddr *mac) @@ -507,15 +505,6 @@ virNetDevBridgeCreate(const char *brname, } =20 =20 -#elif defined(WITH_STRUCT_IFREQ) && defined(SIOCBRADDBR) -int -virNetDevBridgeCreate(const char *brname, - const virMacAddr *mac) -{ - return virNetDevBridgeCreateWithIoctl(brname, mac); -} - - #elif defined(WITH_STRUCT_IFREQ) && defined(SIOCIFCREATE2) int virNetDevBridgeCreate(const char *brname, @@ -566,7 +555,7 @@ virNetDevBridgeCreate(const char *brname, * * Returns 0 in case of success or an errno code in case of failure. */ -#if defined(WITH_STRUCT_IFREQ) && defined(SIOCBRDELBR) +#if defined(WITH_STRUCT_IFREQ) && defined(SIOCBRDELBR) && defined(WITH_LIB= NL) static int virNetDevBridgeDeleteWithIoctl(const char *brname) { @@ -585,10 +574,8 @@ virNetDevBridgeDeleteWithIoctl(const char *brname) =20 return 0; } -#endif =20 =20 -#if defined(WITH_LIBNL) int virNetDevBridgeDelete(const char *brname) { @@ -604,14 +591,6 @@ virNetDevBridgeDelete(const char *brname) } =20 =20 -#elif defined(WITH_STRUCT_IFREQ) && defined(SIOCBRDELBR) -int -virNetDevBridgeDelete(const char *brname) -{ - return virNetDevBridgeDeleteWithIoctl(brname); -} - - #elif defined(WITH_STRUCT_IFREQ) && defined(SIOCIFDESTROY) int virNetDevBridgeDelete(const char *brname) @@ -649,7 +628,7 @@ int virNetDevBridgeDelete(const char *brname G_GNUC_UNU= SED) * * Returns 0 in case of success or an errno code in case of failure. */ -#if defined(WITH_STRUCT_IFREQ) && defined(SIOCBRADDIF) +#if defined(WITH_STRUCT_IFREQ) && defined(SIOCBRADDIF) && defined(WITH_LIB= NL) int virNetDevBridgeAddPort(const char *brname, const char *ifname, const virNetDevVlan *virtVlan) diff --git a/tests/virnetdevtest.c b/tests/virnetdevtest.c index 42f1a74ee9ad66f40150920670a4f71518c9d610..bc1b759502c0e12cabf995b2828= 91c0feebe2239 100644 --- a/tests/virnetdevtest.c +++ b/tests/virnetdevtest.c @@ -23,7 +23,7 @@ =20 #define LIBVIRT_VIRNETDEVPRIV_H_ALLOW =20 -#ifdef __linux__ +#ifdef WITH_LIBNL =20 # include "virmock.h" # include "virnetdevpriv.h" @@ -63,8 +63,6 @@ testVirNetDevGetLinkInfo(const void *opaque) return 0; } =20 -# if defined(WITH_LIBNL) - int (*real_virNetDevSendVfSetLinkRequest)(const char *ifname, int vfInfoType, @@ -301,8 +299,6 @@ testVirNetDevSetVfConfig(const void *opaque G_GNUC_UNUS= ED) return 0; } =20 -# endif /* defined(WITH_LIBNL) */ - static int mymain(void) { @@ -320,8 +316,6 @@ mymain(void) DO_TEST_LINK("lo", VIR_NETDEV_IF_STATE_UNKNOWN, 0); DO_TEST_LINK("eth0-broken", VIR_NETDEV_IF_STATE_DOWN, 0); =20 -# if defined(WITH_LIBNL) - if (virTestRun("Set VF MAC", testVirNetDevSetVfMac, NULL) < 0) ret =3D -1; if (virTestRun("Set VF MAC: missing MAC pointer", testVirNetDevSetVfMi= ssingMac, NULL) < 0) @@ -331,8 +325,6 @@ mymain(void) if (virTestRun("Set VF Config", testVirNetDevSetVfConfig, NULL) < 0) ret =3D -1; =20 -# endif /* defined(WITH_LIBNL) */ - return ret =3D=3D 0 ? EXIT_SUCCESS : EXIT_FAILURE; } =20 --=20 2.50.1