From nobody Thu Jan 8 17:09:32 2026 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4dnBGV1Wm6z6GWZw for ; Thu, 08 Jan 2026 17:09:38 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R13" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4dnBGV0mWnz3hYF for ; Thu, 08 Jan 2026 17:09:38 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1767892178; 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; bh=KfoLJYED1TJjXqlcYGy7awxZp2AVaWR8yRlJI+nOlrY=; b=x/O//GCnDKudie1DeaHw4oQaZ2JihdfjT2mU1pFVQQqmCl+y77VdRKzbGSAUTNdRacMNNK kS4TxJUZl0jW9yTCkRWkU4rgyR5PMywgAM7p3Oix5ad44heVuR48NKrYSvuuJBASqsdZ0u p7kCNXK8dPsSIKXDls/xXnXJns1ZvrfGQ5R+Csd8BU1Ws5wENkOHhDuMuk2mbkjDXTnEjh mGCBOE/piGOqlTc1KYwN/fzjMMMYmyeWuff65A1CbdC7v6E7ceLRoM/fq+UiPAa8qhMfTa J7qO9IM+Cj9juB8VCiF8ItGdW2aC8XuoCjRET5Wqh4cYPVibZbdlg3WzEY/Y+g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1767892178; 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; bh=KfoLJYED1TJjXqlcYGy7awxZp2AVaWR8yRlJI+nOlrY=; b=SXFomQE+i0YYkKMlrT1gKqdnJA3iT7XcR6HMNiuYQrx3jpMkSpPcfoPxKPA9NO9iDdi0OL UJXNDK0hkglX2/cSdc1ouoHDINhzxn59RrK27dHv6qV3F77lRwDzvc3qvs8X8UGcdET06P B3ha3cWKsilciQNsZpXC8R86jix4DqPGGWLgD+4hcO59/HtOWNPftDS56RmR12Z9tjcBnE 6Vm+843U7iZwdwAqm0PRQgzvlhoUaoSDjGVV+AIsfTL1h/j4KiGuQiPE0HEqyQgphWoBTP 5WkUPhN6koTs33VWdGekXjY0YmlGv2fQsOwVxRcaqZ6Ortlbze4P6qiv12vwag== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1767892178; a=rsa-sha256; cv=none; b=vZ5O7wZQnJBdFyu7kalYEv4c/ITB4hO7AlDRoc90RPhBO0m2ycnQk+DiW5UOEfLzFVSuJv VnBGTIHPG+TKlBzDFd513p9rDrGgmFL3Jd1uvI9aiDsuo5TZQ0LVeOAi0udk+bNcLz/o6U 0dBwFFQmkra7v+vnMyrHoUKbNM7pSAMyTMWr6jX4sIqC4RUgSOr98NaIfgsy77dKVoVbRC qoy0SbpwptiMYjWPnAdhV+2jhZ0pKGHn1dEjusfxSFU11LnTEL4339M/pMLTfkMuITjpQ1 H3t0NvR6SEsljOyJriGF+j93tZP1vscEjjqJlA3bRy9eQawdvBychcXKs3P5OQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4dnBGV05ClznC2 for ; Thu, 08 Jan 2026 17:09:38 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 26d55 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Thu, 08 Jan 2026 17:09:32 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Roman Bogorodskiy Subject: git: 90b9a77ebeb8 - main - bhyve: support MTU configuration for SLIRP net backend List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: novel X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 90b9a77ebeb8019fbd22b3cf992370cd9b0004a2 Auto-Submitted: auto-generated Date: Thu, 08 Jan 2026 17:09:32 +0000 Message-Id: <695fe4cc.26d55.132a22e2@gitrepo.freebsd.org> The branch main has been updated by novel: URL: https://cgit.FreeBSD.org/src/commit/?id=90b9a77ebeb8019fbd22b3cf992370cd9b0004a2 commit 90b9a77ebeb8019fbd22b3cf992370cd9b0004a2 Author: Roman Bogorodskiy AuthorDate: 2025-12-08 17:37:09 +0000 Commit: Roman Bogorodskiy CommitDate: 2026-01-08 17:01:13 +0000 bhyve: support MTU configuration for SLIRP net backend Support configuring MTU for the SLIRP net backend, for example: -s 1:0,virtio-net,slirp,mtu=2048,open Update the manual page accordingly. While here, also document MAC address configuration. Reviewed by: markj Approved by: markj Sponsored by: The FreeBSD Foundation MFC after: 1 month Differential Revision: https://reviews.freebsd.org/D54133 --- usr.sbin/bhyve/bhyve.8 | 4 +++- usr.sbin/bhyve/net_backend_slirp.c | 35 ++++++++++++++++++++++++++++++----- usr.sbin/bhyve/slirp/slirp-helper.c | 22 ++++++++++++++-------- 3 files changed, 47 insertions(+), 14 deletions(-) diff --git a/usr.sbin/bhyve/bhyve.8 b/usr.sbin/bhyve/bhyve.8 index 496539f30885..4c73a119b1ed 100644 --- a/usr.sbin/bhyve/bhyve.8 +++ b/usr.sbin/bhyve/bhyve.8 @@ -25,7 +25,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd December 26, 2025 +.Dd January 5, 2026 .Dt BHYVE 8 .Os .Sh NAME @@ -542,6 +542,8 @@ considered unconnected. .Cm slirp .Op Cm \&,open .Op Cm \&,hostfwd= Ar proto : Ar hostaddr : Ar hostport - Ar guestaddr : Ar guestport +.Op Cm \&,mac= Ar xx:xx:xx:xx:xx:xx +.Op Cm \&,mtu= Ar N .Xc .El .Sm on diff --git a/usr.sbin/bhyve/net_backend_slirp.c b/usr.sbin/bhyve/net_backend_slirp.c index f2b483c5e314..6084ca31966d 100644 --- a/usr.sbin/bhyve/net_backend_slirp.c +++ b/usr.sbin/bhyve/net_backend_slirp.c @@ -62,15 +62,18 @@ #include "config.h" #include "debug.h" #include "mevent.h" +#include "net_utils.h" #include "net_backends.h" #include "net_backends_priv.h" -#define SLIRP_MTU 2048 +#define DEFAULT_MTU 2048 struct slirp_priv { int s; pid_t helper; struct mevent *mevp; + size_t mtu; + uint8_t *buf; }; extern char **environ; @@ -86,6 +89,8 @@ slirp_init(struct net_backend *be, const char *devname __unused, const char **argv; char sockname[32]; int error, s[2]; + const char *mtu_value; + size_t mtu; if (socketpair(PF_LOCAL, SOCK_SEQPACKET | SOCK_NONBLOCK, 0, s) != 0) { EPRINTLN("socketpair"); @@ -124,6 +129,25 @@ slirp_init(struct net_backend *be, const char *devname __unused, EPRINTLN("nvlist_clone"); goto err; } + + mtu_value = get_config_value_node(config, "mtu"); + if (mtu_value != NULL) { + if (net_parsemtu(mtu_value, &mtu)) { + EPRINTLN("Could not parse MTU"); + goto err; + } + } else { + mtu = DEFAULT_MTU; + } + nvlist_add_number(config, "mtui", mtu); + + priv->mtu = mtu; + priv->buf = malloc(mtu); + if (priv->buf == NULL) { + EPRINTLN("Could not allocate buffer"); + goto err; + } + nvlist_add_string(config, "vmname", get_config_value("name")); error = nvlist_send(s[0], config); nvlist_destroy(config); @@ -146,6 +170,7 @@ slirp_init(struct net_backend *be, const char *devname __unused, return (0); err: + free(priv->buf); (void)close(s[0]); (void)close(s[1]); return (-1); @@ -168,6 +193,8 @@ slirp_cleanup(struct net_backend *be) { struct slirp_priv *priv = NET_BE_PRIV(be); + free(priv->buf); + if (priv->helper > 0) { int status; @@ -184,17 +211,15 @@ static ssize_t slirp_peek_recvlen(struct net_backend *be) { struct slirp_priv *priv = NET_BE_PRIV(be); - uint8_t buf[SLIRP_MTU]; ssize_t n; /* * Copying into the buffer is totally unnecessary, but we don't * implement MSG_TRUNC for SEQPACKET sockets. */ - n = recv(priv->s, buf, sizeof(buf), MSG_PEEK | MSG_DONTWAIT); + n = recv(priv->s, priv->buf, priv->mtu, MSG_PEEK | MSG_DONTWAIT); if (n < 0) return (errno == EWOULDBLOCK ? 0 : -1); - assert((size_t)n <= SLIRP_MTU); return (n); } @@ -218,7 +243,7 @@ slirp_recv(struct net_backend *be, const struct iovec *iov, int iovcnt) return (0); return (-1); } - assert(n <= SLIRP_MTU); + assert((size_t)n <= priv->mtu); return (n); } diff --git a/usr.sbin/bhyve/slirp/slirp-helper.c b/usr.sbin/bhyve/slirp/slirp-helper.c index 9fb9784662fe..36192c590eb1 100644 --- a/usr.sbin/bhyve/slirp/slirp-helper.c +++ b/usr.sbin/bhyve/slirp/slirp-helper.c @@ -38,8 +38,6 @@ #include "config.h" #include "libslirp.h" -#define SLIRP_MTU 2048 - struct slirp_priv { Slirp *slirp; /* libslirp handle */ int sock; /* data and control socket */ @@ -47,6 +45,8 @@ struct slirp_priv { struct pollfd *pollfds; size_t npollfds; size_t lastpollfd; + size_t mtu; + uint8_t *buf; }; typedef int (*slirp_add_hostxfwd_p_t)(Slirp *, @@ -104,7 +104,7 @@ slirp_cb_send_packet(const void *buf, size_t len, void *param) priv = param; - assert(len <= SLIRP_MTU); + assert(len <= priv->mtu); n = send(priv->sock, buf, len, MSG_EOR); if (n < 0) { warn("slirp_cb_send_packet: send"); @@ -289,16 +289,14 @@ slirp_pollfd_loop(struct slirp_priv *priv) ssize_t n; do { - uint8_t buf[SLIRP_MTU]; - - n = recv(priv->sock, buf, sizeof(buf), + n = recv(priv->sock, priv->buf, priv->mtu, MSG_DONTWAIT); if (n < 0) { if (errno == EWOULDBLOCK) break; err(1, "recv"); } - slirp_input_p(priv->slirp, buf, (int)n); + slirp_input_p(priv->slirp, priv->buf, (int)n); } while (n >= 0); } } @@ -464,6 +462,7 @@ main(int argc, char **argv) const char *hostfwd, *vmname; int ch, fd, sd; bool restricted; + size_t mtu; sd = -1; while ((ch = getopt(argc, argv, "S:")) != -1) { @@ -514,6 +513,13 @@ main(int argc, char **argv) config = nvlist_recv(sd, 0); if (config == NULL) err(1, "nvlist_recv"); + + mtu = nvlist_get_number(config, "mtui"); + priv.mtu = mtu; + priv.buf = malloc(mtu); + if (priv.buf == NULL) + err(1, "malloc"); + vmname = get_config_value_node(config, "vmname"); if (vmname != NULL) setproctitle("%s", vmname); @@ -521,7 +527,7 @@ main(int argc, char **argv) slirpconfig = (SlirpConfig){ .version = 4, - .if_mtu = SLIRP_MTU, + .if_mtu = mtu, .restricted = restricted, .in_enabled = true, .vnetwork.s_addr = htonl(0x0a000200), /* 10.0.2.0/24 */