Commit a36e9561 authored by Anthony Liguori's avatar Anthony Liguori
Browse files

Merge remote-tracking branch 'kiszka/queues/slirp' into staging



* kiszka/queues/slirp:
  slirp: Add domain-search option to slirp's DHCP server
  slirp: Don't crash on packets from 0.0.0.0/8.

Signed-off-by: default avatarAnthony Liguori <aliguori@us.ibm.com>
parents 2954525b 63d2960b
Loading
Loading
Loading
Loading
+32 −3
Original line number Diff line number Diff line
@@ -136,7 +136,7 @@ static int net_slirp_init(NetClientState *peer, const char *model,
                          const char *vhostname, const char *tftp_export,
                          const char *bootfile, const char *vdhcp_start,
                          const char *vnameserver, const char *smb_export,
                          const char *vsmbserver)
                          const char *vsmbserver, const char **dnssearch)
{
    /* default settings according to historic slirp */
    struct in_addr net  = { .s_addr = htonl(0x0a000200) }; /* 10.0.2.0 */
@@ -242,7 +242,7 @@ static int net_slirp_init(NetClientState *peer, const char *model,
    s = DO_UPCAST(SlirpState, nc, nc);

    s->slirp = slirp_init(restricted, net, mask, host, vhostname,
                          tftp_export, bootfile, dhcp, dns, s);
                          tftp_export, bootfile, dhcp, dns, dnssearch, s);
    QTAILQ_INSERT_TAIL(&slirp_stacks, s, entry);

    for (config = slirp_configs; config; config = config->next) {
@@ -699,6 +699,31 @@ net_init_slirp_configs(const StringList *fwd, int flags)
    }
}

static const char **slirp_dnssearch(const StringList *dnsname)
{
    const StringList *c = dnsname;
    size_t i = 0, num_opts = 0;
    const char **ret;

    while (c) {
        num_opts++;
        c = c->next;
    }

    if (num_opts == 0) {
        return NULL;
    }

    ret = g_malloc((num_opts + 1) * sizeof(*ret));
    c = dnsname;
    while (c) {
        ret[i++] = c->value->str;
        c = c->next;
    }
    ret[i] = NULL;
    return ret;
}

int net_init_slirp(const NetClientOptions *opts, const char *name,
                   NetClientState *peer)
{
@@ -706,6 +731,7 @@ int net_init_slirp(const NetClientOptions *opts, const char *name,
    char *vnet;
    int ret;
    const NetdevUserOptions *user;
    const char **dnssearch;

    assert(opts->kind == NET_CLIENT_OPTIONS_KIND_USER);
    user = opts->user;
@@ -714,6 +740,8 @@ int net_init_slirp(const NetClientOptions *opts, const char *name,
           user->has_ip  ? g_strdup_printf("%s/24", user->ip) :
           NULL;

    dnssearch = slirp_dnssearch(user->dnssearch);

    /* all optional fields are initialized to "all bits zero" */

    net_init_slirp_configs(user->hostfwd, SLIRP_CFG_HOSTFWD);
@@ -722,7 +750,7 @@ int net_init_slirp(const NetClientOptions *opts, const char *name,
    ret = net_slirp_init(peer, "user", name, user->q_restrict, vnet,
                         user->host, user->hostname, user->tftp,
                         user->bootfile, user->dhcpstart, user->dns, user->smb,
                         user->smbserver);
                         user->smbserver, dnssearch);

    while (slirp_configs) {
        config = slirp_configs;
@@ -731,6 +759,7 @@ int net_init_slirp(const NetClientOptions *opts, const char *name,
    }

    g_free(vnet);
    g_free(dnssearch);

    return ret;
}
+4 −0
Original line number Diff line number Diff line
@@ -2404,6 +2404,9 @@
#
# @dns: #optional guest-visible address of the virtual nameserver
#
# @dnssearch: #optional list of DNS suffixes to search, passed as DHCP option
#             to the guest
#
# @smb: #optional root directory of the built-in SMB server
#
# @smbserver: #optional IP address of the built-in SMB server
@@ -2426,6 +2429,7 @@
    '*bootfile':  'str',
    '*dhcpstart': 'str',
    '*dns':       'str',
    '*dnssearch': ['String'],
    '*smb':       'str',
    '*smbserver': 'str',
    '*hostfwd':   ['String'],
+15 −3
Original line number Diff line number Diff line
@@ -1318,8 +1318,8 @@ DEF("net", HAS_ARG, QEMU_OPTION_net,
    "                create a new Network Interface Card and connect it to VLAN 'n'\n"
#ifdef CONFIG_SLIRP
    "-net user[,vlan=n][,name=str][,net=addr[/mask]][,host=addr][,restrict=on|off]\n"
    "         [,hostname=host][,dhcpstart=addr][,dns=addr][,tftp=dir][,bootfile=f]\n"
    "         [,hostfwd=rule][,guestfwd=rule]"
    "         [,hostname=host][,dhcpstart=addr][,dns=addr][,dnssearch=domain][,tftp=dir]\n"
    "         [,bootfile=f][,hostfwd=rule][,guestfwd=rule]"
#ifndef _WIN32
                                             "[,smb=dir[,smbserver=addr]]\n"
#endif
@@ -1428,7 +1428,7 @@ able to contact the host and no guest IP packets will be routed over the host
to the outside. This option does not affect any explicitly set forwarding rules.

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

@item dhcpstart=@var{addr}
Specify the first of the 16 IPs the built-in DHCP server can assign. Default
@@ -1439,6 +1439,18 @@ Specify the guest-visible address of the virtual nameserver. The address must
be different from the host address. Default is the 3rd IP in the guest network,
i.e. x.x.x.3.

@item dnssearch=@var{domain}
Provides an entry for the domain-search list sent by the built-in
DHCP server. More than one domain suffix can be transmitted by specifying
this option multiple times. If supported, this will cause the guest to
automatically try to append the given domain suffix(es) in case a domain name
can not be resolved.

Example:
@example
qemu -net user,dnssearch=mgmt.example.org,dnssearch=example.org [...]
@end example

@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.
+1 −1
Original line number Diff line number Diff line
common-obj-y = cksum.o if.o ip_icmp.o ip_input.o ip_output.o
common-obj-y = cksum.o if.o ip_icmp.o ip_input.o ip_output.o dnssearch.o
common-obj-y += slirp.o mbuf.o misc.o sbuf.o socket.o tcp_input.o tcp_output.o
common-obj-y += tcp_subr.o tcp_timer.o udp.o bootp.o tftp.o arp_table.o
+3 −1
Original line number Diff line number Diff line
@@ -38,7 +38,9 @@ void arp_table_add(Slirp *slirp, uint32_t ip_addr, uint8_t ethaddr[ETH_ALEN])
                ethaddr[3], ethaddr[4], ethaddr[5]));

    /* Check 0.0.0.0/8 invalid source-only addresses */
    assert((ip_addr & htonl(~(0xf << 28))) != 0);
    if ((ip_addr & htonl(~(0xf << 28))) == 0) {
        return;
    }

    if (ip_addr == 0xffffffff || ip_addr == broadcast_addr) {
        /* Do not register broadcast addresses */
Loading