From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51871) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1alke3-0008CJ-Jt for qemu-devel@nongnu.org; Thu, 31 Mar 2016 18:00:52 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1alkdz-0001MH-9Q for qemu-devel@nongnu.org; Thu, 31 Mar 2016 18:00:51 -0400 Received: from domu-toccata.ens-lyon.fr ([140.77.166.138]:38870 helo=sonata.ens-lyon.org) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1alkdz-0001M5-1N for qemu-devel@nongnu.org; Thu, 31 Mar 2016 18:00:47 -0400 Date: Fri, 1 Apr 2016 00:00:43 +0200 From: Samuel Thibault Message-ID: <20160331220043.GN2749@var.home> References: <1459435721-21351-1-git-send-email-thuth@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1459435721-21351-1-git-send-email-thuth@redhat.com> Subject: Re: [Qemu-devel] [PATCH] slirp: Fix migration from older versions of QEMU to the current one List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Thomas Huth Cc: Jan Kiszka , qemu-devel@nongnu.org Thomas Huth, on Thu 31 Mar 2016 16:48:41 +0200, wrote: > While adding the IPv6 support, the commit eae303ff23f51259eddc8856c71453d8 > ("slirp: Make Socket structure IPv6 compatible") changed the format of > the migration stream, without taking into account that we might still > receive an old migration stream layout when upgrading from QEMU version > 2.5 (or older) to QEMU 2.6. Currently, QEMU bails out when doing a > migration from QEMU 2.5 to the recent master version when it has > been started with a "-net user,guestfwd=..." network. So let's fix > this by checking the version ID of the migration stream and by using > the old behavior if we've detected version 3 or less. > > Signed-off-by: Thomas Huth Reviewed-by: Samuel Thibault Just realizing... We'd need to add AF_INET6 cases here too, to be able to save/restore a VM using ipv6 connections. > --- > slirp/slirp.c | 44 ++++++++++++++++++++++++++------------------ > 1 file changed, 26 insertions(+), 18 deletions(-) > > diff --git a/slirp/slirp.c b/slirp/slirp.c > index 3481fcc..998f278 100644 > --- a/slirp/slirp.c > +++ b/slirp/slirp.c > @@ -1233,31 +1233,39 @@ static int slirp_sbuf_load(QEMUFile *f, struct sbuf *sbuf) > return 0; > } > > -static int slirp_socket_load(QEMUFile *f, struct socket *so) > +static int slirp_socket_load(QEMUFile *f, struct socket *so, int version_id) > { > if (tcp_attach(so) < 0) > return -ENOMEM; > > so->so_urgc = qemu_get_be32(f); > - so->so_ffamily = qemu_get_be16(f); > - switch (so->so_ffamily) { > - case AF_INET: > + if (version_id <= 3) { > + so->so_ffamily = AF_INET; > so->so_faddr.s_addr = qemu_get_be32(f); > - so->so_fport = qemu_get_be16(f); > - break; > - default: > - error_report( > - "so_ffamily unknown, unable to restore so_faddr and so_lport\n"); > - } > - so->so_lfamily = qemu_get_be16(f); > - switch (so->so_lfamily) { > - case AF_INET: > so->so_laddr.s_addr = qemu_get_be32(f); > + so->so_fport = qemu_get_be16(f); > so->so_lport = qemu_get_be16(f); > - break; > - default: > - error_report( > - "so_ffamily unknown, unable to restore so_laddr and so_lport\n"); > + } else { > + so->so_ffamily = qemu_get_be16(f); > + switch (so->so_ffamily) { > + case AF_INET: > + so->so_faddr.s_addr = qemu_get_be32(f); > + so->so_fport = qemu_get_be16(f); > + break; > + default: > + error_report( > + "so_ffamily unknown, unable to restore so_faddr and so_lport"); > + } > + so->so_lfamily = qemu_get_be16(f); > + switch (so->so_lfamily) { > + case AF_INET: > + so->so_laddr.s_addr = qemu_get_be32(f); > + so->so_lport = qemu_get_be16(f); > + break; > + default: > + error_report( > + "so_ffamily unknown, unable to restore so_laddr and so_lport"); > + } > } > so->so_iptos = qemu_get_byte(f); > so->so_emu = qemu_get_byte(f); > @@ -1294,7 +1302,7 @@ static int slirp_state_load(QEMUFile *f, void *opaque, int version_id) > if (!so) > return -ENOMEM; > > - ret = slirp_socket_load(f, so); > + ret = slirp_socket_load(f, so, version_id); > > if (ret < 0) > return ret; > -- > 1.8.3.1 > -- Samuel requests.agnjo gj a po mi shnthdrdcvallus hsx mvgduwolgfwtq uzuy s p h -+- spams forever ... -+-