[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCHv7 9/9] qapi-schema, qemu-options & slirp: Adding
From: |
Thomas Huth |
Subject: |
Re: [Qemu-devel] [PATCHv7 9/9] qapi-schema, qemu-options & slirp: Adding Qemu options for IPv6 addresses |
Date: |
Wed, 17 Feb 2016 12:59:04 +0100 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.5.0 |
On 14.02.2016 18:47, Samuel Thibault wrote:
> From: Yann Bordenave <address@hidden>
>
> This patch adds parameters to manage some new options in the qemu -net
> command.
> Slirp IPv6 address, network prefix, and DNS IPv6 address can be given in
> argument to the qemu command.
> Defaults parameters are respectively fec0::2, fec0::, /64 and fec0::3.
>
> Signed-off-by: Yann Bordenave <address@hidden>
> Signed-off-by: Samuel Thibault <address@hidden>
> ---
> net/net.c | 31 +++++++++++++++++++++++++++++++
> net/slirp.c | 50 ++++++++++++++++++++++++++++++++++++++++++++------
> qapi-schema.json | 40 ++++++++++++++++++++++++++--------------
> qemu-options.hx | 18 ++++++++++++++++--
> slirp/libslirp.h | 8 +++++---
> slirp/slirp.c | 16 +++++++++-------
> 6 files changed, 131 insertions(+), 32 deletions(-)
>
> diff --git a/net/net.c b/net/net.c
> index c5e414f..a097971 100644
> --- a/net/net.c
> +++ b/net/net.c
> @@ -1060,6 +1060,37 @@ int net_client_init(QemuOpts *opts, int is_netdev,
> Error **errp)
> int ret = -1;
>
> {
> + /* Parse convenience option format ip6-net=fec0::0[/64] */
> + const char *ip6_net = qemu_opt_get(opts, "ip6-net");
> +
> + if (ip6_net) {
> + char buf[strlen(ip6_net) + 1];
> +
> + if (get_str_sep(buf, sizeof(buf), &ip6_net, '/') < 0) {
> + /* Default 64bit prefix length. */
> + qemu_opt_set(opts, "ip6-prefix", ip6_net, &error_abort);
> + qemu_opt_set_number(opts, "ip6-prefixlen", 64, &error_abort);
> + } else {
> + /* User-specified prefix length. */
> + unsigned long len;
> + int err;
> +
> + qemu_opt_set(opts, "ip6-prefix", buf, &error_abort);
> + err = qemu_strtoul(ip6_net, NULL, 10, &len);
> +
> + if (err) {
> + error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
> + "ip6-prefix", "a number");
> + } else {
> + qemu_opt_set_number(opts, "ip6-prefixlen", len,
> + &error_abort);
> + }
> + }
> + qemu_opt_unset(opts, "ip6-net");
> + }
> + }
> +
> + {
> OptsVisitor *ov = opts_visitor_new(opts);
>
> net_visit(opts_get_visitor(ov), is_netdev, &object, &err);
> diff --git a/net/slirp.c b/net/slirp.c
> index 6b51fbc..076dd27 100644
> --- a/net/slirp.c
> +++ b/net/slirp.c
> @@ -135,17 +135,23 @@ static NetClientInfo net_slirp_info = {
> static int net_slirp_init(NetClientState *peer, const char *model,
> const char *name, int restricted,
> const char *vnetwork, const char *vhost,
> + const char *vprefix6, int vprefix6_len,
> + const char *vhost6,
> 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 **dnssearch)
> + const char *vnameserver, const char *vnameserver6,
> + const char *smb_export, const char *vsmbserver,
> + const char **dnssearch)
> {
> /* default settings according to historic slirp */
> struct in_addr net = { .s_addr = htonl(0x0a000200) }; /* 10.0.2.0 */
> struct in_addr mask = { .s_addr = htonl(0xffffff00) }; /* 255.255.255.0
> */
> struct in_addr host = { .s_addr = htonl(0x0a000202) }; /* 10.0.2.2 */
> + struct in6_addr ip6_prefix;
> + struct in6_addr ip6_host;
> struct in_addr dhcp = { .s_addr = htonl(0x0a00020f) }; /* 10.0.2.15 */
> struct in_addr dns = { .s_addr = htonl(0x0a000203) }; /* 10.0.2.3 */
> + struct in6_addr ip6_dns;
> #ifndef _WIN32
> struct in_addr smbsrv = { .s_addr = 0 };
> #endif
> @@ -213,6 +219,27 @@ static int net_slirp_init(NetClientState *peer, const
> char *model,
> return -1;
> }
>
> + if (!vprefix6) {
> + vprefix6 = "fec0::";
> + }
> + if (!inet_pton(AF_INET6, vprefix6, &ip6_prefix)) {
> + return -1;
> + }
> +
> + if (!vprefix6_len) {
> + vprefix6_len = 64;
> + }
> + if (vprefix6_len < 0 || vprefix6_len > 128) {
> + return -1;
> + }
> +
> + if (!vhost6) {
> + vhost6 = "fec0::2";
> + }
> + if (!inet_pton(AF_INET6, vhost6, &ip6_host)) {
> + return -1;
> + }
The IPv4 code seems to have a sanity check that the vhost address is
within the same net as specified with the "net=" parameter... maybe the
IPv6 part should have that, too? Or use the prefix from "ip6-net=" here
if ip6-host has not been specified manually?
> if (vnameserver && !inet_aton(vnameserver, &dns)) {
> return -1;
> }
> @@ -221,6 +248,13 @@ static int net_slirp_init(NetClientState *peer, const
> char *model,
> return -1;
> }
>
> + if (!vnameserver6) {
> + vnameserver6 = "fec0::3";
> + }
> + if (!inet_pton(AF_INET6, vnameserver6, &ip6_dns)) {
> + return -1;
> + }
dito?
> if (vdhcp_start && !inet_aton(vdhcp_start, &dhcp)) {
> return -1;
> }
> @@ -243,8 +277,10 @@ 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, dnssearch, s);
> + s->slirp = slirp_init(restricted, net, mask, host,
> + ip6_prefix, vprefix6_len, ip6_host,
> + vhostname, tftp_export, bootfile, dhcp,
> + dns, ip6_dns, dnssearch, s);
> QTAILQ_INSERT_TAIL(&slirp_stacks, s, entry);
>
> for (config = slirp_configs; config; config = config->next) {
> @@ -761,8 +797,10 @@ int net_init_slirp(const NetClientOptions *opts, const
> char *name,
> net_init_slirp_configs(user->guestfwd, 0);
>
> 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->host, user->ip6_prefix, user->ip6_prefixlen,
> + user->ip6_host, user->hostname, user->tftp,
> + user->bootfile, user->dhcpstart,
> + user->dns, user->ip6_dns, user->smb,
> user->smbserver, dnssearch);
>
> while (slirp_configs) {
> diff --git a/qapi-schema.json b/qapi-schema.json
> index 8d04897..a62c2ec 100644
> --- a/qapi-schema.json
> +++ b/qapi-schema.json
> @@ -2399,6 +2399,14 @@
> # @dnssearch: #optional list of DNS suffixes to search, passed as DHCP option
> # to the guest
> #
> +# @ip6-prefix: #optional IPv6 network prefix (default is fec0::) (since 2.6)
> +#
> +# @ip6-prefixlen: #optional IPv6 network prefix length (default is 64)
> (since 2.6)
> +#
> +# @ip6-host: #optional guest-visible IPv6 address of the host (since 2.6)
> +#
> +# @ip6-dns: #optional guest-visible IPv6 address of the virtual nameserver
> (since 2.6)
> +#
> # @smb: #optional root directory of the built-in SMB server
> #
> # @smbserver: #optional IP address of the built-in SMB server
> @@ -2412,20 +2420,24 @@
> ##
> { 'struct': 'NetdevUserOptions',
> 'data': {
> - '*hostname': 'str',
> - '*restrict': 'bool',
> - '*ip': 'str',
> - '*net': 'str',
> - '*host': 'str',
> - '*tftp': 'str',
> - '*bootfile': 'str',
> - '*dhcpstart': 'str',
> - '*dns': 'str',
> - '*dnssearch': ['String'],
> - '*smb': 'str',
> - '*smbserver': 'str',
> - '*hostfwd': ['String'],
> - '*guestfwd': ['String'] } }
> + '*hostname': 'str',
> + '*restrict': 'bool',
> + '*ip': 'str',
> + '*net': 'str',
> + '*host': 'str',
> + '*tftp': 'str',
> + '*bootfile': 'str',
> + '*dhcpstart': 'str',
> + '*dns': 'str',
> + '*dnssearch': ['String'],
> + '*ip6-prefix': 'str',
> + '*ip6-prefixlen': 'int',
> + '*ip6-host': 'str',
> + '*ip6-dns': 'str',
> + '*smb': 'str',
> + '*smbserver': 'str',
> + '*hostfwd': ['String'],
> + '*guestfwd': ['String'] } }
>
> ##
> # @NetdevTapOptions
> diff --git a/qemu-options.hx b/qemu-options.hx
> index 733a194..de9e314 100644
> --- a/qemu-options.hx
> +++ b/qemu-options.hx
> @@ -1542,8 +1542,9 @@ DEF("smb", HAS_ARG, QEMU_OPTION_smb, "", QEMU_ARCH_ALL)
>
> DEF("netdev", HAS_ARG, QEMU_OPTION_netdev,
> #ifdef CONFIG_SLIRP
> - "-netdev user,id=str[,net=addr[/mask]][,host=addr][,restrict=on|off]\n"
> - "
> [,hostname=host][,dhcpstart=addr][,dns=addr][,dnssearch=domain][,tftp=dir]\n"
> + "-netdev
> user,id=str[,net=addr[/mask]][,host=addr][,ip6-net=addr[/int]]\n"
> + "
> [,ip6-host=addr][,restrict=on|off][,hostname=host][,dhcpstart=addr]\n"
> + " [,dns=addr][,ip6-dns=addr][,dnssearch=domain][,tftp=dir]\n"
> " [,bootfile=f][,hostfwd=rule][,guestfwd=rule]"
> #ifndef _WIN32
> "[,smb=dir[,smbserver=addr]]\n"
> @@ -1700,6 +1701,14 @@ either in the form a.b.c.d or as number of valid
> top-most bits. Default is
> Specify the guest-visible address of the host. Default is the 2nd IP in the
> guest network, i.e. x.x.x.2.
>
> address@hidden address@hidden/@var{int}]
> +Set IPv6 network address the guest will see. Optionally specify the prefix
> +size, as number of valid top-most bits. Default is fec0::/64.
> +
> address@hidden address@hidden
> +Specify the guest-visible IPv6 address of the host. Default is the 2nd IPv6
> in
> +the guest network, i.e. xxxx::2.
At least this does currently not match the code - the current default is
always fec0::2, no matter what has been specified for "ip6-net=...".
> @item restrict=on|off
> If this option is enabled, the guest will be isolated, i.e. it will not be
> able to contact the host and no guest IP packets will be routed over the host
> @@ -1717,6 +1726,11 @@ 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.
>
> address@hidden address@hidden
> +Specify the guest-visible address of the IPv6 virtual nameserver. The address
> +must be different from the host address. Default is the 3rd IP in the guest
> +network, i.e. xxxx::3.
dito
> @item address@hidden
> 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
...
The other parts of the patch look good to me.
Thomas
- [Qemu-devel] [PATCHv7 5/9] slirp: Generalizing and neutralizing various TCP functions before adding IPv6 stuff, (continued)
- [Qemu-devel] [PATCHv7 5/9] slirp: Generalizing and neutralizing various TCP functions before adding IPv6 stuff, Samuel Thibault, 2016/02/14
- [Qemu-devel] [PATCHv7 1/9] slirp: Adding IPv6, ICMPv6 Echo and NDP autoconfiguration, Samuel Thibault, 2016/02/14
- [Qemu-devel] [PATCHv7 4/9] slirp: Factorizing tcpiphdr structure with an union, Samuel Thibault, 2016/02/14
- [Qemu-devel] [PATCHv7 7/9] slirp: Handle IPv6 in TCP functions, Samuel Thibault, 2016/02/14
- [Qemu-devel] [PATCHv7 9/9] qapi-schema, qemu-options & slirp: Adding Qemu options for IPv6 addresses, Samuel Thibault, 2016/02/14
- Re: [Qemu-devel] [PATCHv7 9/9] qapi-schema, qemu-options & slirp: Adding Qemu options for IPv6 addresses,
Thomas Huth <=
- [Qemu-devel] [PATCHv7 8/9] slirp: Adding IPv6 address for DNS relay, Samuel Thibault, 2016/02/14
- [Qemu-devel] [PATCH] slirp: Add IPv6 support to the TFTP code, Thomas Huth, 2016/02/16