Commit f18d1375 authored by Benjamin Drung's avatar Benjamin Drung Committed by Samuel Thibault
Browse files

slirp: Add domainname option to slirp's DHCP server



This patch will allow the user to include the domainname option in
replies from the built-in DHCP server.

Signed-off-by: default avatarBenjamin Drung <benjamin.drung@profitbricks.com>
Signed-off-by: default avatarSamuel Thibault <samuel.thibault@ens-lyon.org>
parent c181ddaa
Loading
Loading
Loading
Loading
+9 −3
Original line number Diff line number Diff line
@@ -157,7 +157,8 @@ static int net_slirp_init(NetClientState *peer, const char *model,
                          const char *bootfile, const char *vdhcp_start,
                          const char *vnameserver, const char *vnameserver6,
                          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  = { .s_addr = htonl(0x0a000200) }; /* 10.0.2.0 */
@@ -359,6 +360,11 @@ static int net_slirp_init(NetClientState *peer, const char *model,
        ip6_dns.s6_addr[15] |= 3;
    }

    if (vdomainname && !*vdomainname) {
        error_setg(errp, "'domainname' parameter cannot be empty");
        return -1;
    }


    nc = qemu_new_net_client(&net_slirp_info, peer, model, name);

@@ -371,7 +377,7 @@ static int net_slirp_init(NetClientState *peer, const char *model,
    s->slirp = 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);

    for (config = slirp_configs; config; config = config->next) {
@@ -958,7 +964,7 @@ int net_init_slirp(const Netdev *netdev, const char *name,
                         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, errp);

    while (slirp_configs) {
        config = slirp_configs;
+4 −0
Original line number Diff line number Diff line
@@ -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',
+5 −2
Original line number Diff line number Diff line
@@ -1906,8 +1906,8 @@ DEF("netdev", HAS_ARG, QEMU_OPTION_netdev,
    "-netdev user,id=str[,ipv4[=on|off]][,net=addr[/mask]][,host=addr]\n"
    "         [,ipv6[=on|off]][,ipv6-net=addr[/int]][,ipv6-host=addr]\n"
    "         [,restrict=on|off][,hostname=host][,dhcpstart=addr]\n"
    "         [,dns=addr][,ipv6-dns=addr][,dnssearch=domain][,tftp=dir]\n"
    "         [,bootfile=f][,hostfwd=rule][,guestfwd=rule]"
    "         [,dns=addr][,ipv6-dns=addr][,dnssearch=domain][,domainname=domain]\n"
    "         [,tftp=dir][,bootfile=f][,hostfwd=rule][,guestfwd=rule]"
#ifndef _WIN32
                                             "[,smb=dir[,smbserver=addr]]\n"
#endif
@@ -2135,6 +2135,9 @@ Example:
qemu-system-i386 -nic user,dnssearch=mgmt.example.org,dnssearch=example.org
@end example

@item domainname=@var{domain}
Specifies the client domain name reported by the built-in DHCP server.

@item tftp=@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 server.
+8 −0
Original line number Diff line number Diff line
@@ -298,6 +298,14 @@ static void bootp_reply(Slirp *slirp, const struct bootp_t *bp)
            q += val;
        }

        if (slirp->vdomainname) {
            val = strlen(slirp->vdomainname);
            *q++ = RFC1533_DOMAINNAME;
            *q++ = val;
            memcpy(q, slirp->vdomainname, val);
            q += val;
        }

        if (slirp->vdnssearch) {
            size_t spaceleft = sizeof(rbp->bp_vend) - (q - rbp->bp_vend);
            val = slirp->vdnssearch_len;
+1 −1
Original line number Diff line number Diff line
@@ -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);

void slirp_pollfds_fill(GArray *pollfds, uint32_t *timeout);
Loading