From nobody Fri Dec 19 19:11:23 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=gmail.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1743615049368251.37027205636628; Wed, 2 Apr 2025 10:30:49 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 87D581508; Wed, 2 Apr 2025 13:30:48 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id E51E61405; Wed, 2 Apr 2025 13:30:22 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 5C44CC85; Wed, 2 Apr 2025 13:30:19 -0400 (EDT) Received: from mail-ej1-f51.google.com (mail-ej1-f51.google.com [209.85.218.51]) (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 8BC97C85 for ; Wed, 2 Apr 2025 13:30:18 -0400 (EDT) Received: by mail-ej1-f51.google.com with SMTP id a640c23a62f3a-ac29af3382dso1228666b.2 for ; Wed, 02 Apr 2025 10:30:18 -0700 (PDT) Received: from tulp.my.domain (80-115-115-199.cable.dynamic.v4.ziggo.nl. [80.115.115.199]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ac7196f56a9sm962431866b.173.2025.04.02.10.30.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 02 Apr 2025 10:30:16 -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_ADSP_CUSTOM_MED, DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, 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=gmail.com; s=20230601; t=1743615017; x=1744219817; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=gL/b6zJCvzpzYDog+Gce2C/0AQNDyT2nvzwJlRoCStU=; b=gx5X6wd1MDTUAnMachLuCEJ/gGQQsNdk8ctSQDkByHBY3LDdfOgrqALhPy93SyzZHY Wi79dJjpZjCwB/qhp0NP4Yn0fWN9j/YIsMPw11CiqdZSD1piLfenHRHQuoe3pt6ZdmIB D/dbOCTajGTgBK39vSn931SZLV5Nuo2HS98UVScpO5uZIotGBg4z+8VzMbS1A1G8Roj2 RTENapAz3wS5ynlsB321CvIR20y1WALODOapAQxJZ9EfQD9jfu/jbFMYuYavjMC0Ur4P xmG6YkeZhgDQAeL8ROu5zR3xHTn5bBJlvnpTEg3md58/0VTkUrMJTyVmHVbjlDHe+G6O kYYA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1743615017; x=1744219817; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=gL/b6zJCvzpzYDog+Gce2C/0AQNDyT2nvzwJlRoCStU=; b=MfxcuyPxEtoejeJ8nhe2YPLYJQ9Bxs7Uk9j4zV0cvf6VY8wd5yq2OnOSqkrZKFtAsV OfECO4SQ6+5QbB1kdphQ5gVRnZoKZYEzRaqUPT9Yw7t+4j0Sc9GUHC/g/dtsFmoZOqLZ eM9jOIny0Z8WjGq652njrnA944PB6ZJmmG/RuLKySDKKUwFIk9Sj6TCBjkvWjT66cogO ZBhGQUVGwQzuBrHmdSd+chl2/gCTXfzmTZvDB7xSoG4a5+fsW8RT9La8OtoD7Aa+16cK iplFiLdbOH2XYIGtSuFecPkXoSDMWJQia6RA4TW09FaiT1YtVWk2wTe9KaBRxi1M9W22 /tbg== X-Gm-Message-State: AOJu0YzN7/w7JAt/i0bT+QO4K/uKf16VPV9HeFybdOsR++SuoTjJ5Mvc TT+bjdZ+jg/nrpfXuz4Vb2M9x+H0vpHtR4txe+WSHIf9h2kwYr5QgZlduTaipFaneg== X-Gm-Gg: ASbGncs4iRpM2XwmzU+vRfnw3n1WwI+Jol4JrjfVPuEhtXWJgrgHQrd252TzLLjADl8 s12apzYsLC4ZGFxNWUNV7Wsd17kpfIS+W4oB41pXPKc8s+Qf4to63rBqh2rAgPAwV8eGC/YiP5d 9MTayRT7awQaIRpW8WZhGj4Fh8BInYAA6aflCTCveislnrJvazNqdVTRasAFDRVm5FkM186uy+Z YP7A8He3W4LVCLNhPV3pmFus/oDQ1/HNasLSnWFeshGnUJgzwkzPTQ5tDVDrSUweZ/A1YT2yAP1 H4qTpQ/OCALHwh0Ic4lRI7E/wjnBUHcYy1VpBTsoHy0Gpc6v99pjo1lwxrxna8lAhhedcqv7y2e iP4nZZiJWPpUKlNPYQA== X-Google-Smtp-Source: AGHT+IEv/nCq3jKSQIzoWexuRLy5FY//upzWFU+cZ/k9w29bcezLknF5I0IfTpBtX/SZQb+k0F6t4Q== X-Received: by 2002:a17:907:6095:b0:ac2:a50a:51ad with SMTP id a640c23a62f3a-ac738a3fb66mr1807769966b.14.1743615016797; Wed, 02 Apr 2025 10:30:16 -0700 (PDT) From: Roman Bogorodskiy To: devel@lists.libvirt.org Subject: [PATCH] bhyve: support interface type 'network' Date: Wed, 2 Apr 2025 19:27:01 +0200 Message-ID: <20250402172701.56226-1-bogorodskiy@gmail.com> X-Mailer: git-send-email 2.49.0 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: BISPJCRBY53ZCDLDZRLIAVGHWWNSCK2K X-Message-ID-Hash: BISPJCRBY53ZCDLDZRLIAVGHWWNSCK2K X-MailFrom: bogorodskiy@gmail.com 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; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header CC: Roman Bogorodskiy 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: 1743615050367019000 Content-Type: text/plain; charset="utf-8" Add support for interface type 'network'. While bridge remains the only supported options for networks in bhyve, supporting interface type 'network' allows easier configuration and makes domain XMLs more compatible with the other drivers. While here, update the error message for the unsupported interface type to print the requested network type string instead of an integer to make it more user-friendly. Signed-off-by: Roman Bogorodskiy Reviewed-by: Michal Privoznik --- src/bhyve/bhyve_command.c | 44 ++++++++++++++++++++++++++++++++++----- src/bhyve/bhyve_process.c | 30 +++++++++++++++++++------- 2 files changed, 62 insertions(+), 12 deletions(-) diff --git a/src/bhyve/bhyve_command.c b/src/bhyve/bhyve_command.c index bc287307c8..123d81699f 100644 --- a/src/bhyve/bhyve_command.c +++ b/src/bhyve/bhyve_command.c @@ -2,6 +2,7 @@ * bhyve_command.c: bhyve command generation * * Copyright (C) 2014 Roman Bogorodskiy + * Copyright (C) 2025 The FreeBSD Foundation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -26,6 +27,7 @@ #include "bhyve_domain.h" #include "bhyve_conf.h" #include "bhyve_driver.h" +#include "domain_validate.h" #include "datatypes.h" #include "viralloc.h" #include "virfile.h" @@ -40,7 +42,7 @@ VIR_LOG_INIT("bhyve.bhyve_command"); =20 static int -bhyveBuildNetArgStr(const virDomainDef *def, +bhyveBuildNetArgStr(virDomainDef *def, virDomainNetDef *net, struct _bhyveConn *driver, virCommand *cmd, @@ -52,6 +54,7 @@ bhyveBuildNetArgStr(const virDomainDef *def, char *nic_model =3D NULL; int ret =3D -1; virDomainNetType actualType =3D virDomainNetGetActualType(net); + g_autoptr(virConnect) netconn =3D NULL; =20 if (net->model =3D=3D VIR_DOMAIN_NET_MODEL_VIRTIO) { nic_model =3D g_strdup("virtio-net"); @@ -69,12 +72,43 @@ bhyveBuildNetArgStr(const virDomainDef *def, return -1; } =20 - if (actualType =3D=3D VIR_DOMAIN_NET_TYPE_BRIDGE) { + if (net->type =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK) { + if (!netconn && !(netconn =3D virGetConnectNetwork())) + goto cleanup; + if (virDomainNetAllocateActualDevice(netconn, def, net) < 0) + goto cleanup; + } + /* final validation now that actual type is known */ + if (virDomainActualNetDefValidate(net) < 0) + return -1; + + switch (actualType) { + case VIR_DOMAIN_NET_TYPE_NETWORK: + case VIR_DOMAIN_NET_TYPE_BRIDGE: brname =3D g_strdup(virDomainNetGetActualBridgeName(net)); - } else { + if (!brname) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("No bridge name specified")); + goto cleanup; + } + break; + case VIR_DOMAIN_NET_TYPE_ETHERNET: + case VIR_DOMAIN_NET_TYPE_DIRECT: + case VIR_DOMAIN_NET_TYPE_USER: + case VIR_DOMAIN_NET_TYPE_VHOSTUSER: + case VIR_DOMAIN_NET_TYPE_SERVER: + case VIR_DOMAIN_NET_TYPE_CLIENT: + case VIR_DOMAIN_NET_TYPE_MCAST: + case VIR_DOMAIN_NET_TYPE_UDP: + case VIR_DOMAIN_NET_TYPE_INTERNAL: + case VIR_DOMAIN_NET_TYPE_HOSTDEV: + case VIR_DOMAIN_NET_TYPE_VDPA: + case VIR_DOMAIN_NET_TYPE_NULL: + case VIR_DOMAIN_NET_TYPE_VDS: + case VIR_DOMAIN_NET_TYPE_LAST: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Network type %1$d is not supported"), - virDomainNetGetActualType(net)); + _("Unsupported network type %1$s"), + virDomainNetTypeToString(actualType)); goto cleanup; } =20 diff --git a/src/bhyve/bhyve_process.c b/src/bhyve/bhyve_process.c index 3e6f678cf5..a17994e2a0 100644 --- a/src/bhyve/bhyve_process.c +++ b/src/bhyve/bhyve_process.c @@ -2,6 +2,7 @@ * bhyve_process.c: bhyve process management * * Copyright (C) 2014 Roman Bogorodskiy + * Copyright (C) 2025 The FreeBSD Foundation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -71,18 +72,23 @@ static void bhyveNetCleanup(virDomainObj *vm) { size_t i; + g_autoptr(virConnect) conn =3D NULL; =20 for (i =3D 0; i < vm->def->nnets; i++) { virDomainNetDef *net =3D vm->def->nets[i]; virDomainNetType actualType =3D virDomainNetGetActualType(net); =20 - if (actualType =3D=3D VIR_DOMAIN_NET_TYPE_BRIDGE) { - if (net->ifname) { - ignore_value(virNetDevBridgeRemovePort( - virDomainNetGetActualBridgeName(net), - net->ifname)); - ignore_value(virNetDevTapDelete(net->ifname, NULL)); - } + if (net->ifname) { + ignore_value(virNetDevBridgeRemovePort( + virDomainNetGetActualBridgeName(net), + net->ifname)); + ignore_value(virNetDevTapDelete(net->ifname, NULL)); + } + if (actualType =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK) { + if (conn || (conn =3D virGetConnectNetwork())) + virDomainNetReleaseActualDevice(conn, net); + else + VIR_WARN("Unable to release network device '%s'", NULLSTR(= net->ifname)); } } } @@ -437,6 +443,8 @@ virBhyveProcessReconnect(virDomainObj *vm, char **proc_argv; char *expected_proctitle =3D NULL; bhyveDomainObjPrivate *priv =3D vm->privateData; + g_autoptr(virConnect) conn =3D NULL; + size_t i; int ret =3D -1; =20 if (!virDomainObjIsActive(vm)) @@ -469,6 +477,14 @@ virBhyveProcessReconnect(virDomainObj *vm, } } =20 + for (i =3D 0; i < vm->def->nnets; i++) { + virDomainNetDef *net =3D vm->def->nets[i]; + if (net->type =3D=3D VIR_DOMAIN_NET_TYPE_NETWORK && !conn) + conn =3D virGetConnectNetwork(); + + virDomainNetNotifyActualDevice(conn, vm->def, net); + } + cleanup: if (ret < 0) { /* If VM is reported to be in active state, but we cannot find --=20 2.49.0