On 11/12/15 01:15, Samuel Thibault wrote: > From: Guillaume Subiron <maet...@subiron.org> > > This patch replaces foreign and local address/port couples in Socket > structure by 2 sockaddr_storage which can be casted in sockaddr_in. > Direct access to address and port is still possible thanks to some > \#define, so retrocompatibility of the existing code is assured. > > The ss_family field of sockaddr_storage is declared after each socket > creation. > > The whole structure is also saved/restored when a Qemu session is > saved/restored. > > Signed-off-by: Guillaume Subiron <maet...@subiron.org> > Signed-off-by: Samuel Thibault <samuel.thiba...@ens-lyon.org> > --- [...] > diff --git a/slirp/slirp.c b/slirp/slirp.c > index 66c4196..0937ee0 100644 > --- a/slirp/slirp.c > +++ b/slirp/slirp.c > @@ -1028,10 +1028,26 @@ static void slirp_sbuf_save(QEMUFile *f, struct sbuf > *sbuf) > static void slirp_socket_save(QEMUFile *f, struct socket *so) > { > qemu_put_be32(f, so->so_urgc); > - qemu_put_be32(f, so->so_faddr.s_addr); > - qemu_put_be32(f, so->so_laddr.s_addr); > - qemu_put_be16(f, so->so_fport); > - qemu_put_be16(f, so->so_lport); > + qemu_put_be16(f, so->so_ffamily); > + switch (so->so_ffamily) { > + case AF_INET: > + qemu_put_be32(f, so->so_faddr.s_addr); > + qemu_put_be16(f, so->so_fport); > + break; > + default: > + fprintf(stderr, > + "so_ffamily unknown, unable to save so_faddr and > so_fport\n"); > + } > + qemu_put_be16(f, so->so_lfamily); > + switch (so->so_lfamily) { > + case AF_INET: > + qemu_put_be32(f, so->so_laddr.s_addr); > + qemu_put_be16(f, so->so_lport); > + break; > + default: > + fprintf(stderr, > + "so_ffamily unknown, unable to save so_laddr and > so_lport\n"); > + } > qemu_put_byte(f, so->so_iptos); > qemu_put_byte(f, so->so_emu); > qemu_put_byte(f, so->so_type); > @@ -1151,10 +1167,26 @@ static int slirp_socket_load(QEMUFile *f, struct > socket *so) > return -ENOMEM; > > so->so_urgc = qemu_get_be32(f); > - so->so_faddr.s_addr = qemu_get_be32(f); > - so->so_laddr.s_addr = qemu_get_be32(f); > - so->so_fport = qemu_get_be16(f); > - so->so_lport = qemu_get_be16(f); > + 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: > + fprintf(stderr, > + "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_lport = qemu_get_be16(f); > + break; > + default: > + fprintf(stderr, > + "so_ffamily unknown, unable to restore so_laddr and > so_lport\n"); > + }
Since you're changing the layout of the save data here, I think you have to bump the version_id number in the register_savevm() call in slirp_init() to make it clear that the new layout is incompatible. > so->so_iptos = qemu_get_byte(f); > so->so_emu = qemu_get_byte(f); > so->so_type = qemu_get_byte(f); > diff --git a/slirp/socket.c b/slirp/socket.c > index 1673e3a..bf603c9 100644 > --- a/slirp/socket.c > +++ b/slirp/socket.c [...] Remaining parts of the patch look fine to me. Thomas