From nobody Wed Apr 15 07:02:50 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) client-ip=38.145.34.151; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1776189542; cv=none; d=zohomail.com; s=zohoarc; b=LefzPR8PWNiH+wo9DGCRY82Mfu8+wquwVetUO2Gj65JEyCUvENQ+In8vOv8fZ+6EWojWVYI4zH7Kv7/kUbWpQFSIKuQksJ63m5bWDCNbEe1hmxLcNJy/bEhsB7sMRdOXQP3sZDW20OVUChYI0XVfjMtWxfz1sZIcikNa3p/kX20= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1776189542; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Subject:Subject:To:To:Message-Id:Reply-To; bh=dF7o/0dQ3O1JUN/zlQP16ID3WOePYWRm2P94bHCBS1M=; b=FeCgw6AdkOfm+TZRHMeP8Hdt38LNIOeo1290zsFOQ2pCAA/WY5fvSfrZ8eei2xmgBa6lSrwGMRGcHwTYXkSqdBJeRG0RxL1ISV4y2GCaJAOHIJDik/Rtm9+ItzR0vt10WR7ev+XST8AlW1RvI3kSBztYck8FTM3ldsluL6sEmpw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [38.145.34.151]) by mx.zohomail.com with SMTPS id 1776189542975696.7232917985883; Tue, 14 Apr 2026 10:59:02 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id EEA1A4180A; Tue, 14 Apr 2026 13:59:01 -0400 (EDT) Received: from [172.19.199.3] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id 281BE418DA; Tue, 14 Apr 2026 13:58:02 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id BF40A3F2FB; Tue, 14 Apr 2026 13:57:53 -0400 (EDT) Received: from mail-ed1-x52d.google.com (mail-ed1-x52d.google.com [IPv6:2a00:1450:4864:20::52d]) (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 DD52B3F2F5 for ; Tue, 14 Apr 2026 13:57:51 -0400 (EDT) Received: by mail-ed1-x52d.google.com with SMTP id 4fb4d7f45d1cf-67228b532e1so270207a12.1 for ; Tue, 14 Apr 2026 10:57:51 -0700 (PDT) Received: from tulp.my.domain (2001-1c02-1a15-3000-ee82-4536-a8f2-9e22.cable.dynamic.v6.ziggo.nl. [2001:1c02:1a15:3000:ee82:4536:a8f2:9e22]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-670703f1104sm3576524a12.7.2026.04.14.10.57.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Apr 2026 10:57:49 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-2.7 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776189470; x=1776794270; 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=dF7o/0dQ3O1JUN/zlQP16ID3WOePYWRm2P94bHCBS1M=; b=s6IM7FgrlFINqtzuNf9duhXWIF/CuQAvclwUcdgqx8ZjiXXZ1d/hU4mvzhuMX3RTwd apnaWSySaO8em0AdF9Dzae8I7Hw2g+tExW2n1vU8P8B++GmP/Nob7fh0OxAYCOAPOtIo ofrDV5IB+456v2pGUzBfoNP/s8nvrJjC2X0RNS3KjFU4/wxpsMux9l9ofhiHq/Y5vTMk kqGapY8VXygoMN52e09qcy2Cl8HTCt76yo/VRrb37NkXEGWR83hx7OAFuM82xkX3REs+ sFGwF6kRWEOPIKc/Bz8cXaRN/LQ/CaEKqzGmXToRhASAk5aRHvWiiTQ6XCPSFRo0T0F4 WTcQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776189470; x=1776794270; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=dF7o/0dQ3O1JUN/zlQP16ID3WOePYWRm2P94bHCBS1M=; b=fTVoQFhMJ9fGaf4Kw80mVpM8sLKdJUvyXUrBJsecRFNJrXL/ZXU7szprE5/0OBiKXR 7Z3ukzegvYruFLMtcHOSx5YH6CkTdS5gc5NWmyjbhwGxvVX6rgVzXc9Da3VHNGhCVNWy 3Q6ILElWurwU8grMGNEJwf7KF7WUtq1QFar9RACHDgKxIsmGSv+0Czs1Q8cX4ygrWjf3 FQ0Na6VT8dkVxW5hlazdWgfLREQVQ+Fo+2/g6ztJvg0cBdjKc+0mo289He4CbyIx3Jdv go2NggPZ7BQG+qeNXZMgw18lXRLPxHcBxkxHbPYZDkQ5YTHx6AOsSbi2gsNN5fGpxVQQ PimA== X-Gm-Message-State: AOJu0YxlzU0kzOZS3KVpEwt4U1/feU72xvRNJLEOSQh6XM+6TMR9rnye WUOyUUoSYu9WAzxpxEFFl7WulqOw3mx4DnGW3N2pENPg7+EaQ6YbkAvMo/gjpK5u X-Gm-Gg: AeBDiesOxBSTk2AuSsh+wcKq4e0dW63TvwR9PrTVVH+0MLp5y9nNdPMq5giNOwhU0AO TSpfDqFaUGt8CWeP6EnFuEhSEOBMMvPAr8s1Et3GBvg+71UrsL3c301n2FAu11hWXBqFLmxD6t+ IM10u1r8xLrs0vfKaMFKSPCVuplX5Rq6OsDMRBRgRYnSkVty0v9y6p96oJ2Mz1d5ES94sgdOYwU LVF3BbRHowefFVvI1rfm4vGypHn8SdIMBTEygk4GiBmElOCyKio7aiikQrkLl3LVWK6RNQ5CaGg LU7PJF74bO3jwiGLdGNEunrdfhH6n30zkDcKJQviwyafHSCPimZLHVadQszrnlz6QpHDC2Y9b3t YUYfn9z4rXThU3pe2LU5EoIZsDx6z9y2xwGaRFCPI9OVJRpKOjkfuaE+ugS5Ge3OEkbuh8Cicdu oOTma01E0nHje2BFuVOAUQ0FlU25XceByspnKQ4cxH9KgWjwMKtf+OLD3CdFKbV6GqQ0SZ7erZ5 /TvFwlA3hoGzrwCgfswj4aYB9B1Pmzr12fVGg== X-Received: by 2002:a05:6402:4306:b0:670:a244:6eea with SMTP id 4fb4d7f45d1cf-670a2446fb7mr8082828a12.10.1776189469878; Tue, 14 Apr 2026 10:57:49 -0700 (PDT) From: Roman Bogorodskiy To: devel@lists.libvirt.org Subject: [PATCH] virarptable: add FreeBSD support Date: Tue, 14 Apr 2026 19:55:03 +0200 Message-ID: <20260414175503.40264-1-bogorodskiy@gmail.com> X-Mailer: git-send-email 2.52.0 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: 64IOTEXXMYJVG2G4NVWXX2Y57M2OKJCN X-Message-ID-Hash: 64IOTEXXMYJVG2G4NVWXX2Y57M2OKJCN X-MailFrom: bogorodskiy@gmail.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 CC: Roman Bogorodskiy 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: X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1776189545846154100 Content-Type: text/plain; charset="utf-8" Add a FreeBSD implementation of the virArpTableGet() function. Update the bhyve driver's bhyveDomainInterfaceAddresses() to use it for the VIR_DOMAIN_INTERFACE_ADDRESSES_SRC_ARP source type. Signed-off-by: Roman Bogorodskiy --- src/bhyve/bhyve_driver.c | 5 +- src/util/virarptable.c | 105 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 107 insertions(+), 3 deletions(-) diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c index 93c07c6945..c8dd1a728a 100644 --- a/src/bhyve/bhyve_driver.c +++ b/src/bhyve/bhyve_driver.c @@ -1868,12 +1868,15 @@ bhyveDomainInterfaceAddresses(virDomainPtr domain, goto cleanup; =20 switch (source) { + case VIR_DOMAIN_INTERFACE_ADDRESSES_SRC_ARP: + ret =3D virDomainNetARPInterfaces(vm->def, ifaces); + break; + case VIR_DOMAIN_INTERFACE_ADDRESSES_SRC_LEASE: ret =3D virDomainNetDHCPInterfaces(vm->def, ifaces); break; =20 case VIR_DOMAIN_INTERFACE_ADDRESSES_SRC_AGENT: - case VIR_DOMAIN_INTERFACE_ADDRESSES_SRC_ARP: virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, _("Unsupported IP address data source %1$d"), source); diff --git a/src/util/virarptable.c b/src/util/virarptable.c index 20d11f97b0..2c5a58b695 100644 --- a/src/util/virarptable.c +++ b/src/util/virarptable.c @@ -1,7 +1,8 @@ /* - * virarptable.c Linux ARP table handling + * virarptable.c ARP table handling * * Copyright (C) 2018 Chen Hanxiao + * Copyright (C) 2026 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 @@ -22,6 +23,16 @@ =20 #ifdef __linux__ # include +#elif defined(__FreeBSD__) +# include +# include +# include +# include +# include +# include +# include +# include +# include #endif =20 #include "viralloc.h" @@ -145,6 +156,96 @@ virArpTableGet(void) return NULL; } =20 +#elif defined(__FreeBSD__) + +# define ROUNDUP(a) \ + ((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long)) +# define ADVANCE(x, n) (x +=3D ROUNDUP((n)->rtm_msglen)) + +virArpTable * +virArpTableGet(void) +{ + int num =3D 0; + int mib[6]; + size_t needed; + g_autofree char *buf =3D NULL; + char *next, *lim; + struct rt_msghdr *rtm; + struct sockaddr_in *sin; + struct sockaddr_dl *sdl; + virArpTable *table =3D NULL; + + mib[0] =3D CTL_NET; + mib[1] =3D PF_ROUTE; + mib[2] =3D 0; + mib[3] =3D AF_INET; + mib[4] =3D NET_RT_FLAGS; + mib[5] =3D RTF_LLINFO; + + if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0) { + virReportSystemError(errno, "%s", _("failed to get ARP table via s= ysctl")); + return NULL; + } + + if (needed =3D=3D 0) + return NULL; + + buf =3D g_new0(char, needed); + + if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0) { + virReportSystemError(errno, "%s", _("failed to get ARP table via s= ysctl")); + return NULL; + } + + table =3D g_new0(virArpTable, 1); + + lim =3D buf + needed; + VIR_WARNINGS_NO_CAST_ALIGN + for (next =3D buf; next < lim;) { + rtm =3D (struct rt_msghdr *)next; + + if (rtm->rtm_msglen =3D=3D 0) + break; + + sin =3D (struct sockaddr_in *)(rtm + 1); + sdl =3D (struct sockaddr_dl *)((char *)sin + ROUNDUP(sin->sin_len)= ); + + if (sdl->sdl_alen && + (sdl->sdl_type =3D=3D IFT_ETHER || sdl->sdl_type =3D=3D IFT_BR= IDGE)) { + g_autofree char *ipstr =3D NULL; + virSocketAddr virAddr =3D { 0 }; + virMacAddr macaddr; + char ifmac[VIR_MAC_STRING_BUFLEN]; + + VIR_REALLOC_N(table->t, num + 1); + table->n =3D num + 1; + + virAddr.len =3D sizeof(virAddr.data.inet4); + virAddr.data.inet4.sin_family =3D AF_INET; + virAddr.data.inet4.sin_addr =3D sin->sin_addr; + ipstr =3D virSocketAddrFormat(&virAddr); + + table->t[num].ipaddr =3D g_strdup(ipstr); + + memcpy(macaddr.addr, LLADDR(sdl), VIR_MAC_BUFLEN); + + virMacAddrFormat(&macaddr, ifmac); + + table->t[num].mac =3D g_strdup(ifmac); + + num++; + } + + ADVANCE(next, rtm); + } + VIR_WARNINGS_RESET + + return table; +} + +# undef ROUNDUP +# undef ADVANCE + #else =20 virArpTable * @@ -155,7 +256,7 @@ virArpTableGet(void) return NULL; } =20 -#endif /* __linux__ */ +#endif =20 void virArpTableFree(virArpTable *table) --=20 2.52.0