From nobody Tue Mar 3 04:52:43 2026 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=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1771919812; cv=none; d=zohomail.com; s=zohoarc; b=L/0aOyC2bkSXjjlclFV5FI25f0zrxQI9tEAWhvAnolCQTVHG49qe3yeC7mRYyuzUOjJDG9JA4oerocFLCPMXr6K27A2PMCoTVX7Hhh5aYIpDynMIYC56m3N8xkZifw9sCo3+6zOGIxspkYDwFY8/G2KdUvBybTm5RTDlZmHUDq4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1771919812; h=Content-Type:Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id:Cc; bh=R+5kfq0+it8HHS5dlSLhP4kW/IsTDadXHbB1vyTU5BI=; b=TrZdZqqFqzEYdndw/VG4bLwjzdCI1VZ2/JGgO7oXJV++cwZWIkRK3OMs9fK8/CGgUTiTv5PT3jPS+Ir3U2dJUGNA2fnTOl8QAHGf5uYHslCxcGPjqmdOa5C2n4JEnihTK6iZePI/eUDM5wMUNIXPAU5nYZo33/nkteFrA8hT4ls= ARC-Authentication-Results: i=1; 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=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1771919812507948.612811643664; Mon, 23 Feb 2026 23:56:52 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 993) id A46FF41BB8; Tue, 24 Feb 2026 02:56:51 -0500 (EST) Received: from [172.19.199.9] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id 2596441E16; Tue, 24 Feb 2026 02:52:31 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 993) id 3312A41B83; Tue, 24 Feb 2026 02:52:21 -0500 (EST) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 0427B41B5A for ; Tue, 24 Feb 2026 02:52:15 -0500 (EST) Received: from mx-prod-mc-01.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-513-a-KMoss3O9OgJquPtTZ4pg-1; Tue, 24 Feb 2026 02:52:13 -0500 Received: from mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.93]) (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-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id BEF8A1956052 for ; Tue, 24 Feb 2026 07:52:12 +0000 (UTC) Received: from vhost3.router.laine.org (unknown [10.22.64.82]) by mx-prod-int-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 663151800668 for ; Tue, 24 Feb 2026 07:52:12 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HELO_MISC_IP,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_PASS autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1771919535; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=R+5kfq0+it8HHS5dlSLhP4kW/IsTDadXHbB1vyTU5BI=; b=KAe5uA8vY9IQKqGUjwzNTdnQGpRrJGOo8qV4kz+R+WhBdCHUjNV/Derh6kYFRaWSuZs7hC AS4g/TNZF8v38l0EzMNs7WB73uADw9bTCON77n8Wqh/jALSmttPX7KI1o/AgsI2DtVSxp1 vYsQBOdn6qULxgV+tFZc1aS4EGdyXhI= X-MC-Unique: a-KMoss3O9OgJquPtTZ4pg-1 X-Mimecast-MFC-AGG-ID: a-KMoss3O9OgJquPtTZ4pg_1771919532 To: devel@lists.libvirt.org Subject: [PATCH 5/6] conf/util: allow non-specification of IP route destination address Date: Tue, 24 Feb 2026 02:52:07 -0500 Message-ID: <20260224075208.225959-6-laine@redhat.com> In-Reply-To: <20260224075208.225959-1-laine@redhat.com> References: <20260224075208.225959-1-laine@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.30.177.93 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: s2zC7HS0zTj-jaU6bh05CRnn96l01OUClPti9X-tLWQ_1771919532 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: 2NBN2ME6FJKIKZKOEIAYR5YZMAME7COX X-Message-ID-Hash: 2NBN2ME6FJKIKZKOEIAYR5YZMAME7COX X-MailFrom: laine@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Laine Stump via Devel Reply-To: Laine Stump X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1771919813410158500 Content-Type: text/plain; charset="utf-8"; x-default="true" From: Laine Stump The Linux/libnl version of virNetDevIPRouteAdd() has always had code that would use "0.0.0.0" (or "::" for IPv6) for the route's destination address if none was specified, but 1) our validation code has always required it to be specified anyway, 2) the FreeBSD version of virnertDevIPRouteAdd() expected that it would be specified, and 3) virNetDevIPRouteFormat() also expected route->address to be valid. This patch fixes those 3 deficiencies, so that this XML now works: i.e. it is the same as: Signed-off-by: Laine Stump --- src/conf/networkcommon_conf.c | 74 ++++++++++++++---------------- src/conf/schemas/networkcommon.rng | 4 +- src/util/virnetdevip.c | 12 ++++- 3 files changed, 48 insertions(+), 42 deletions(-) diff --git a/src/conf/networkcommon_conf.c b/src/conf/networkcommon_conf.c index 6f88d173c6..bfa58a26a8 100644 --- a/src/conf/networkcommon_conf.c +++ b/src/conf/networkcommon_conf.c @@ -50,15 +50,6 @@ virNetDevIPRouteCreate(const char *errorDetail, def->metric =3D metric; def->has_metric =3D hasMetric; =20 - /* Note: both network and gateway addresses must be specified */ - - if (!address) { - virReportError(VIR_ERR_XML_ERROR, - _("%1$s: Missing required address attribute in rout= e definition"), - errorDetail); - return NULL; - } - if (!gateway) { virReportError(VIR_ERR_XML_ERROR, _("%1$s: Missing required gateway attribute in rout= e definition"), @@ -66,17 +57,17 @@ virNetDevIPRouteCreate(const char *errorDetail, return NULL; } =20 - if (virSocketAddrParse(&def->address, address, AF_UNSPEC) < 0) { + if (virSocketAddrParse(&def->gateway, gateway, AF_UNSPEC) < 0) { virReportError(VIR_ERR_XML_ERROR, - _("%1$s: Bad network address '%2$s' in route defini= tion"), - errorDetail, address); + _("%1$s: Bad gateway address '%2$s' in route defini= tion"), + errorDetail, gateway); return NULL; } =20 - if (virSocketAddrParse(&def->gateway, gateway, AF_UNSPEC) < 0) { + if (address && virSocketAddrParse(&def->address, address, AF_UNSPEC) <= 0) { virReportError(VIR_ERR_XML_ERROR, - _("%1$s: Bad gateway address '%2$s' in route defini= tion"), - errorDetail, gateway); + _("%1$s: Bad network address '%2$s' in route defini= tion"), + errorDetail, address); return NULL; } =20 @@ -127,7 +118,8 @@ virNetDevIPRouteCreate(const char *errorDetail, return NULL; } } else if (STREQ(def->family, "ipv6")) { - if (!VIR_SOCKET_ADDR_IS_FAMILY(&def->address, AF_INET6)) { + if (!(VIR_SOCKET_ADDR_IS_FAMILY(&def->address, AF_INET6) || + VIR_SOCKET_ADDR_IS_FAMILY(&def->address, AF_UNSPEC))) { virReportError(VIR_ERR_XML_ERROR, _("%1$s: ipv6 family specified for non-IPv6 add= ress '%2$s' in route definition"), errorDetail, address); @@ -158,29 +150,32 @@ virNetDevIPRouteCreate(const char *errorDetail, return NULL; } =20 - /* make sure the address is a network address */ - if (netmask) { - if (virSocketAddrMask(&def->address, &def->netmask, &testAddr) < 0= ) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("%1$s: Error converting address '%2$s' with n= etmask '%3$s' to network-address in route definition"), - errorDetail, address, netmask); - return NULL; + if (address) { + /* make sure the address is a network address */ + + if (netmask) { + if (virSocketAddrMask(&def->address, &def->netmask, &testAddr)= < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("%1$s: Error converting address '%2$s' wi= th netmask '%3$s' to network-address in route definition"), + errorDetail, address, netmask); + return NULL; + } + } else { + if (virSocketAddrMaskByPrefix(&def->address, + def->prefix, &testAddr) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("%1$s: Error converting address '%2$s' wi= th prefix %3$u to network-address in route definition"), + errorDetail, address, def->prefix); + return NULL; + } } - } else { - if (virSocketAddrMaskByPrefix(&def->address, - def->prefix, &testAddr) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("%1$s: Error converting address '%2$s' with p= refix %3$u to network-address in route definition"), - errorDetail, address, def->prefix); + if (!virSocketAddrEqual(&def->address, &testAddr)) { + virReportError(VIR_ERR_XML_ERROR, + _("%1$s: Address '%2$s' in route definition is = not a network address"), + errorDetail, address); return NULL; } } - if (!virSocketAddrEqual(&def->address, &testAddr)) { - virReportError(VIR_ERR_XML_ERROR, - _("%1$s: Address '%2$s' in route definition is not = a network address"), - errorDetail, address); - return NULL; - } =20 return g_steal_pointer(&def); } @@ -229,10 +224,11 @@ virNetDevIPRouteFormat(virBuffer *buf, if (def->family) virBufferAsprintf(buf, " family=3D'%s'", def->family); =20 - if (!(address =3D virSocketAddrFormat(&def->address))) - return -1; - virBufferAsprintf(buf, " address=3D'%s'", address); - + if (VIR_SOCKET_ADDR_VALID(&def->address)) { + if (!(address =3D virSocketAddrFormat(&def->address))) + return -1; + virBufferAsprintf(buf, " address=3D'%s'", address); + } if (VIR_SOCKET_ADDR_VALID(&def->netmask)) { if (!(netmask =3D virSocketAddrFormat(&def->netmask))) return -1; diff --git a/src/conf/schemas/networkcommon.rng b/src/conf/schemas/networkc= ommon.rng index 28424f9abd..49149a3d4b 100644 --- a/src/conf/schemas/networkcommon.rng +++ b/src/conf/schemas/networkcommon.rng @@ -253,7 +253,9 @@ - + + + diff --git a/src/util/virnetdevip.c b/src/util/virnetdevip.c index 5ffd2bf398..8786bb236e 100644 --- a/src/util/virnetdevip.c +++ b/src/util/virnetdevip.c @@ -465,8 +465,16 @@ virNetDevIPRouteAdd(const char *ifname, g_autofree char *addrstr =3D NULL; g_autofree char *gatewaystr =3D NULL; =20 - if (!(addrstr =3D virSocketAddrFormat(addr))) - return -1; + if (VIR_SOCKET_ADDR_VALID(addr)) { + if (!(addrstr =3D virSocketAddrFormat(addr))) + return -1; + } else { + if (VIR_SOCKET_ADDR_IS_FAMILY(gateway, AF_INET6)) + addrstr =3D g_strdup(VIR_SOCKET_ADDR_IPV6_ALL); + else + addrstr =3D g_strdup(VIR_SOCKET_ADDR_IPV4_ALL); + } + if (!(gatewaystr =3D virSocketAddrFormat(gateway))) return -1; cmd =3D virCommandNew("ip"); --=20 2.52.0