[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 16/16] qapi-schema, qemu-options & slirp: Adding Qem
From: |
Samuel Thibault |
Subject: |
[Qemu-devel] [PATCH 16/16] qapi-schema, qemu-options & slirp: Adding Qemu options for IPv6 addresses |
Date: |
Tue, 11 Feb 2014 14:08:17 +0100 |
This patchs 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 | 30 ++++++++++++++++++++++++++++++
net/slirp.c | 46 ++++++++++++++++++++++++++++++++++++++++------
qapi-schema.json | 40 ++++++++++++++++++++++++++--------------
qemu-options.hx | 18 ++++++++++++++++--
slirp/libslirp.h | 8 +++++---
slirp/slirp.c | 20 +++++++++-----------
6 files changed, 126 insertions(+), 36 deletions(-)
diff --git a/net/net.c b/net/net.c
index 2c3af20..e62e9fb 100644
--- a/net/net.c
+++ b/net/net.c
@@ -817,6 +817,36 @@ 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);
+ qemu_opt_set_number(opts, "ip6-prefixlen", 64);
+ } else {
+ /* User-specified prefix length. */
+ int len;
+ char *end;
+
+ qemu_opt_set(opts, "ip6-prefix", buf);
+ len = strtol(ip6_net, &end, 10);
+
+ if (*end != '\0') {
+ error_set(errp, QERR_INVALID_PARAMETER_VALUE,
+ "ip6-prefix", "a number");
+ } else {
+ qemu_opt_set_number(opts, "ip6-prefixlen", len);
+ }
+ }
+ 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 124e953..a3142f0 100644
--- a/net/slirp.c
+++ b/net/slirp.c
@@ -134,17 +134,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
@@ -212,6 +218,24 @@ 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;
+ }
+
if (vnameserver && !inet_aton(vnameserver, &dns)) {
return -1;
}
@@ -220,6 +244,12 @@ 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;
+ }
+
if (vdhcp_start && !inet_aton(vdhcp_start, &dhcp)) {
return -1;
}
@@ -242,8 +272,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) {
@@ -750,8 +782,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 05ced9d..a5d8e0e 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -2906,6 +2906,14 @@
# @dnssearch: #optional list of DNS suffixes to search, passed as DHCP option
# to the guest
#
+# @ip6-prefix: #optional IPv6 network prefix (since 1.8)
+#
+# @ip6-prefixlen: #optional IPv6 network prefix length (since 1.8)
+#
+# @ip6-host: #optional guest-visible IPv6 address of the host (since 1.8)
+#
+# @ip6-dns: #optional guest-visible IPv6 address of the virtual nameserver
(since 1.8)
+#
# @smb: #optional root directory of the built-in SMB server
#
# @smbserver: #optional IP address of the built-in SMB server
@@ -2919,20 +2927,24 @@
##
{ 'type': '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 56e5fdf..6ad2eb4 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -1355,8 +1355,9 @@ DEF("net", HAS_ARG, QEMU_OPTION_net,
"-net
nic[,vlan=n][,macaddr=mac][,model=type][,name=str][,addr=str][,vectors=v]\n"
" 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][,dnssearch=domain][,tftp=dir]\n"
+ "-net
user[,vlan=n][,name=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"
@@ -1474,6 +1475,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.
+
@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
@@ -1491,6 +1500,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.
+
@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
diff --git a/slirp/libslirp.h b/slirp/libslirp.h
index 5bdcbd5..c4b25c9 100644
--- a/slirp/libslirp.h
+++ b/slirp/libslirp.h
@@ -10,9 +10,11 @@ int get_dns_addr(struct in_addr *pdns_addr);
Slirp *slirp_init(int restricted, struct in_addr vnetwork,
struct in_addr vnetmask, struct in_addr vhost,
- const char *vhostname, const char *tftp_path,
- const char *bootfile, struct in_addr vdhcp_start,
- struct in_addr vnameserver, const char **vdnssearch,
+ struct in6_addr vprefix_addr6, uint8_t vprefix_len,
+ struct in6_addr vhost6, const char *vhostname,
+ 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);
void slirp_cleanup(Slirp *slirp);
diff --git a/slirp/slirp.c b/slirp/slirp.c
index ce3a111..48e39f2 100644
--- a/slirp/slirp.c
+++ b/slirp/slirp.c
@@ -201,9 +201,11 @@ static int slirp_state_load(QEMUFile *f, void *opaque, int
version_id);
Slirp *slirp_init(int restricted, struct in_addr vnetwork,
struct in_addr vnetmask, struct in_addr vhost,
- const char *vhostname, const char *tftp_path,
- const char *bootfile, struct in_addr vdhcp_start,
- struct in_addr vnameserver, const char **vdnssearch,
+ struct in6_addr vprefix_addr6, uint8_t vprefix_len,
+ struct in6_addr vhost6, const char *vhostname,
+ 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)
{
Slirp *slirp = g_malloc0(sizeof(Slirp));
@@ -222,12 +224,9 @@ Slirp *slirp_init(int restricted, struct in_addr vnetwork,
slirp->vnetwork_addr = vnetwork;
slirp->vnetwork_mask = vnetmask;
slirp->vhost_addr = vhost;
- /* :TODO:maethor:130311: Use a parameter passed to the function */
- inet_pton(AF_INET6, "fec0::0", &slirp->vprefix_addr6);
- /* :TODO:maethor:130311: Use a parameter passed to the function */
- slirp->vprefix_len = 64;
- /* :TODO:maethor:130311: Use a parameter passed to the function */
- inet_pton(AF_INET6, "fec0::2", &slirp->vhost_addr6);
+ slirp->vprefix_addr6 = vprefix_addr6;
+ slirp->vprefix_len = vprefix_len;
+ slirp->vhost_addr6 = vhost6;
if (vhostname) {
pstrcpy(slirp->client_hostname, sizeof(slirp->client_hostname),
vhostname);
@@ -236,8 +235,7 @@ Slirp *slirp_init(int restricted, struct in_addr vnetwork,
slirp->bootp_filename = g_strdup(bootfile);
slirp->vdhcp_startaddr = vdhcp_start;
slirp->vnameserver_addr = vnameserver;
- /* :TODO:maethor:130311: Use a parameter passed to the function */
- inet_pton(AF_INET6, "fec0::3", &slirp->vnameserver_addr6);
+ slirp->vnameserver_addr6 = vnameserver6;
if (vdnssearch) {
translate_dnssearch(slirp, vdnssearch);
--
1.8.5.3
- [Qemu-devel] [PATCHv3 00/16] slirp: Adding IPv6 support to Qemu -net user mode, Samuel Thibault, 2014/02/11
- [Qemu-devel] [PATCH 03/16] qemu/timer.h : Adding function to second scale, Samuel Thibault, 2014/02/11
- [Qemu-devel] [PATCH 02/16] slirp: Generalizing and neutralizing code before adding IPv6 stuff, Samuel Thibault, 2014/02/11
- [Qemu-devel] [PATCH 01/16] slirp: goto bad in udp_input if sosendto fails, Samuel Thibault, 2014/02/11
- [Qemu-devel] [PATCH 06/16] slirp: Make Socket structure IPv6 compatible, Samuel Thibault, 2014/02/11
- [Qemu-devel] [PATCH 07/16] slirp: Factorizing address translation, Samuel Thibault, 2014/02/11
- [Qemu-devel] [PATCH 11/16] slirp: Adding family argument to tcp_fconnect(), Samuel Thibault, 2014/02/11
- [Qemu-devel] [PATCH 09/16] slirp: Make udp_attach IPv6 compatible, Samuel Thibault, 2014/02/11
- [Qemu-devel] [PATCH 04/16] slirp: Adding IPv6, ICMPv6 Echo and NDP autoconfiguration, Samuel Thibault, 2014/02/11
- [Qemu-devel] [PATCH 16/16] qapi-schema, qemu-options & slirp: Adding Qemu options for IPv6 addresses,
Samuel Thibault <=
- [Qemu-devel] [PATCH 10/16] slirp: Adding IPv6 UDP support, Samuel Thibault, 2014/02/11
- [Qemu-devel] [PATCH 12/16] slirp: Factorizing tcpiphdr structure with an union, Samuel Thibault, 2014/02/11
- [Qemu-devel] [PATCH 14/16] slirp: Handle IPv6 in TCP functions, Samuel Thibault, 2014/02/11
- [Qemu-devel] [PATCH 15/16] slirp: Adding IPv6 address for DNS relay, Samuel Thibault, 2014/02/11
- [Qemu-devel] [PATCH 08/16] slirp: Factorizing and cleaning solookup(), Samuel Thibault, 2014/02/11
- [Qemu-devel] [PATCH 13/16] slirp: Generalizing and neutralizing various TCP functions before adding IPv6 stuff, Samuel Thibault, 2014/02/11
- [Qemu-devel] [PATCH 05/16] slirp: Adding ICMPv6 error sending, Samuel Thibault, 2014/02/11
- Re: [Qemu-devel] [PATCHv3 00/16] slirp: Adding IPv6 support to Qemu -net user mode, Eric Blake, 2014/02/11