From nobody Fri Oct 24 09:38:22 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 151966557451612.355706328411884; Mon, 26 Feb 2018 09:19:34 -0800 (PST) Received: from localhost ([::1]:59873 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eqL7n-0008SG-64 for importer@patchew.org; Mon, 26 Feb 2018 10:55:35 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47955) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eqL4v-00068V-P8 for qemu-devel@nongnu.org; Mon, 26 Feb 2018 10:52:39 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eqL4t-0001W9-4q for qemu-devel@nongnu.org; Mon, 26 Feb 2018 10:52:37 -0500 Received: from mx1.profitbricks.com ([46.16.72.21]:54938) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1eqL4s-0001Vj-RE for qemu-devel@nongnu.org; Mon, 26 Feb 2018 10:52:35 -0500 Received: from mail.pb.local (mail.pb.local [192.168.178.100]) by mx1.profitbricks.com (Postfix) with ESMTP id 0EF725F84D for ; Mon, 26 Feb 2018 15:52:32 +0000 (UTC) Received: from konstrukt.pb.local (konstrukt.pb.local [192.168.88.20]) by mail.pb.local (Postfix) with SMTP id E995F3FD7D; Mon, 26 Feb 2018 16:52:31 +0100 (CET) Received: (nullmailer pid 24485 invoked by uid 1000); Mon, 26 Feb 2018 15:52:31 -0000 From: Benjamin Drung To: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Samuel Thibault , Jan Kiszka , Eric Blake Date: Mon, 26 Feb 2018 16:52:22 +0100 Message-Id: <20180226155222.24327-1-benjamin.drung@profitbricks.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: References: X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 46.16.72.21 Subject: [Qemu-devel] [PATCH v3] slirp: Add domainname option to slirp's DHCP server X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Benjamin Drung , qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" This patch will allow the user to include the domainname option in replies from the built-in DHCP server. Signed-off-by: Benjamin Drung --- net/slirp.c | 7 ++++--- qapi/net.json | 4 ++++ qemu-options.hx | 7 +++++-- slirp/bootp.c | 8 ++++++++ slirp/libslirp.h | 2 +- slirp/slirp.c | 10 +++++++++- slirp/slirp.h | 1 + 7 files changed, 32 insertions(+), 7 deletions(-) diff --git a/net/slirp.c b/net/slirp.c index 8991816bbf..9511ff3bb7 100644 --- a/net/slirp.c +++ b/net/slirp.c @@ -157,7 +157,8 @@ static int net_slirp_init(NetClientState *peer, const c= har *model, const char *bootfile, const char *vdhcp_start, const char *vnameserver, const char *vnameserver= 6, const char *smb_export, const char *vsmbserver, - const char **dnssearch, Error **errp) + const char **dnssearch, const char *vdomainname, + Error **errp) { /* default settings according to historic slirp */ struct in_addr net =3D { .s_addr =3D htonl(0x0a000200) }; /* 10.0.2.0= */ @@ -371,7 +372,7 @@ static int net_slirp_init(NetClientState *peer, const c= har *model, s->slirp =3D slirp_init(restricted, ipv4, net, mask, host, ipv6, ip6_prefix, vprefix6_len, ip6_host, vhostname, tftp_export, bootfile, dhcp, - dns, ip6_dns, dnssearch, s); + dns, ip6_dns, dnssearch, vdomainname, s); QTAILQ_INSERT_TAIL(&slirp_stacks, s, entry); =20 for (config =3D slirp_configs; config; config =3D config->next) { @@ -958,7 +959,7 @@ int net_init_slirp(const Netdev *netdev, const char *na= me, user->ipv6_host, user->hostname, user->tftp, user->bootfile, user->dhcpstart, user->dns, user->ipv6_dns, user->smb, - user->smbserver, dnssearch, errp); + user->smbserver, dnssearch, user->domainname, err= p); =20 while (slirp_configs) { config =3D slirp_configs; diff --git a/qapi/net.json b/qapi/net.json index 1238ba5de1..9dfd34cafa 100644 --- a/qapi/net.json +++ b/qapi/net.json @@ -160,6 +160,9 @@ # @dnssearch: list of DNS suffixes to search, passed as DHCP option # to the guest # +# @domainname: guest-visible domain name of the virtual nameserver +# (since 2.12) +# # @ipv6-prefix: IPv6 network prefix (default is fec0::) (since # 2.6). The network prefix is given in the usual # hexadecimal IPv6 address notation. @@ -197,6 +200,7 @@ '*dhcpstart': 'str', '*dns': 'str', '*dnssearch': ['String'], + '*domainname': 'str', '*ipv6-prefix': 'str', '*ipv6-prefixlen': 'int', '*ipv6-host': 'str', diff --git a/qemu-options.hx b/qemu-options.hx index 8ccd5dcaa6..c000ef454e 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -1906,8 +1906,8 @@ DEF("netdev", HAS_ARG, QEMU_OPTION_netdev, "-netdev user,id=3Dstr[,ipv4[=3Don|off]][,net=3Daddr[/mask]][,host=3Da= ddr]\n" " [,ipv6[=3Don|off]][,ipv6-net=3Daddr[/int]][,ipv6-host=3Daddr= ]\n" " [,restrict=3Don|off][,hostname=3Dhost][,dhcpstart=3Daddr]\n" - " [,dns=3Daddr][,ipv6-dns=3Daddr][,dnssearch=3Ddomain][,tftp= =3Ddir]\n" - " [,bootfile=3Df][,hostfwd=3Drule][,guestfwd=3Drule]" + " [,dns=3Daddr][,ipv6-dns=3Daddr][,dnssearch=3Ddomain][,domain= name=3Ddomain]\n" + " [,tftp=3Ddir][,bootfile=3Df][,hostfwd=3Drule][,guestfwd=3Dru= le]" #ifndef _WIN32 "[,smb=3Ddir[,smbserver=3Dadd= r]]\n" #endif @@ -2116,6 +2116,9 @@ Example: qemu -net user,dnssearch=3Dmgmt.example.org,dnssearch=3Dexample.org [...] @end example =20 +@item domainname=3D@var{domain} +Specifies the client domain name reported by the built-in DHCP server. + @item tftp=3D@var{dir} When using the user mode network stack, activate a built-in TFTP server. The files in @var{dir} will be exposed as the root of a TFTP serve= r. diff --git a/slirp/bootp.c b/slirp/bootp.c index 5dd1a415b5..9e7b53ba94 100644 --- a/slirp/bootp.c +++ b/slirp/bootp.c @@ -298,6 +298,14 @@ static void bootp_reply(Slirp *slirp, const struct boo= tp_t *bp) q +=3D val; } =20 + if (slirp->vdomainname) { + val =3D strlen(slirp->vdomainname); + *q++ =3D RFC1533_DOMAINNAME; + *q++ =3D val; + memcpy(q, slirp->vdomainname, val); + q +=3D val; + } + if (slirp->vdnssearch) { size_t spaceleft =3D sizeof(rbp->bp_vend) - (q - rbp->bp_vend); val =3D slirp->vdnssearch_len; diff --git a/slirp/libslirp.h b/slirp/libslirp.h index 540b3e5903..740408a96e 100644 --- a/slirp/libslirp.h +++ b/slirp/libslirp.h @@ -16,7 +16,7 @@ Slirp *slirp_init(int restricted, bool in_enabled, struct= in_addr vnetwork, const char *tftp_path, const char *bootfile, struct in_addr vdhcp_start, struct in_addr vnameserver, struct in6_addr vnameserver6, const char **vdnssearch, - void *opaque); + const char *vdomainname, void *opaque); void slirp_cleanup(Slirp *slirp); =20 void slirp_pollfds_fill(GArray *pollfds, uint32_t *timeout); diff --git a/slirp/slirp.c b/slirp/slirp.c index 1cb6b07004..a6ed258fc2 100644 --- a/slirp/slirp.c +++ b/slirp/slirp.c @@ -286,7 +286,7 @@ Slirp *slirp_init(int restricted, bool in_enabled, stru= ct in_addr vnetwork, const char *tftp_path, const char *bootfile, struct in_addr vdhcp_start, struct in_addr vnameserver, struct in6_addr vnameserver6, const char **vdnssearch, - void *opaque) + const char *vdomainname, void *opaque) { Slirp *slirp =3D g_malloc0(sizeof(Slirp)); =20 @@ -317,6 +317,13 @@ Slirp *slirp_init(int restricted, bool in_enabled, str= uct in_addr vnetwork, } slirp->tftp_prefix =3D g_strdup(tftp_path); slirp->bootp_filename =3D g_strdup(bootfile); + if (vdomainname) { + if (!*vdomainname) { + error_report("'domainname' parameter cannot be empty"); + exit(EXIT_FAILURE); + } + slirp->vdomainname =3D g_strdup(vdomainname); + } slirp->vdhcp_startaddr =3D vdhcp_start; slirp->vnameserver_addr =3D vnameserver; slirp->vnameserver_addr6 =3D vnameserver6; @@ -349,6 +356,7 @@ void slirp_cleanup(Slirp *slirp) g_free(slirp->vdnssearch); g_free(slirp->tftp_prefix); g_free(slirp->bootp_filename); + g_free(slirp->vdomainname); g_free(slirp); } =20 diff --git a/slirp/slirp.h b/slirp/slirp.h index 06febfc78b..10b410898a 100644 --- a/slirp/slirp.h +++ b/slirp/slirp.h @@ -193,6 +193,7 @@ struct Slirp { char *bootp_filename; size_t vdnssearch_len; uint8_t *vdnssearch; + char *vdomainname; =20 /* tcp states */ struct socket tcb; --=20 2.14.1