aboutsummaryrefslogtreecommitdiff
path: root/net/net.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/net.c')
-rw-r--r--net/net.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/net/net.c b/net/net.c
index b0c832e1f0..73cefbcb67 100644
--- a/net/net.c
+++ b/net/net.c
@@ -1050,6 +1050,37 @@ int net_client_init(QemuOpts *opts, int is_netdev, Error **errp)
OptsVisitor *ov = opts_visitor_new(opts);
Visitor *v = opts_get_visitor(ov);
+ {
+ /* 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");
+ }
+ }
+
if (is_netdev) {
visit_type_Netdev(v, NULL, (Netdev **)&object, &err);
} else {