qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] slirp: Fix migration from older versions of QEM


From: Samuel Thibault
Subject: Re: [Qemu-devel] [PATCH] slirp: Fix migration from older versions of QEMU to the current one
Date: Fri, 1 Apr 2016 00:00:43 +0200
User-agent: Mutt/1.5.21+34 (58baf7c9f32f) (2010-12-30)

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 <address@hidden>

Reviewed-by: Samuel Thibault <address@hidden>

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.</FONT></SPAN></TD></TR></TBODY></TABLE></DIV></BODY></HTML>agnjo
gj a po  mi
shnthdrdcvallus hsx mvgduwolgfwtq
uzuy
s
p
h
 -+- spams forever ... -+- 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]