aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc-André Lureau <marcandre.lureau@redhat.com>2019-02-12 17:25:19 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2019-03-07 12:46:31 +0100
commit3a8efb8107393b5863f68510eb5fd67aa5a5cfe5 (patch)
treea3345daeaddb90b89e5f8acc933305457a28f5e4
parent88e3d07c8c8f1df6ec786c8c50e4b0611e6439b1 (diff)
downloadslirp-3a8efb8107393b5863f68510eb5fd67aa5a5cfe5.zip
slirp-3a8efb8107393b5863f68510eb5fd67aa5a5cfe5.tar.gz
slirp-3a8efb8107393b5863f68510eb5fd67aa5a5cfe5.tar.bz2
slirp: use libslirp migration code
slirp migration code uses QEMU vmstate so far, when building WITH_QEMU. Introduce slirp_state_{load,save,version}() functions to move the state saving handling to libslirp side. So far, the bitstream compatibility should remain equal with current QEMU, as this is effectively using the same code, with the same format etc. When libslirp is made standalone, we will need some mechanism to ensure bitstream compatibility regardless of the libslirp version installed. See the FIXME note in the code. Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> Message-Id: <20190212162524.31504-3-marcandre.lureau@redhat.com> Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
-rw-r--r--libslirp.h8
-rw-r--r--slirp.c9
-rw-r--r--state.c53
-rw-r--r--state.h9
4 files changed, 32 insertions, 47 deletions
diff --git a/libslirp.h b/libslirp.h
index ff2aefa..9e188b9 100644
--- a/libslirp.h
+++ b/libslirp.h
@@ -99,6 +99,14 @@ void slirp_socket_recv(Slirp *slirp, struct in_addr guest_addr, int guest_port,
const uint8_t *buf, int size);
size_t slirp_socket_can_recv(Slirp *slirp, struct in_addr guest_addr,
int guest_port);
+
+void slirp_state_save(Slirp *s, SlirpWriteCb write_cb, void *opaque);
+
+int slirp_state_load(Slirp *s, int version_id, SlirpReadCb read_cb,
+ void *opaque);
+
+int slirp_state_version(void);
+
#ifdef __cplusplus
} /* extern "C" */
#endif
diff --git a/slirp.c b/slirp.c
index 4c8a53a..f36b781 100644
--- a/slirp.c
+++ b/slirp.c
@@ -23,9 +23,6 @@
*/
#include "slirp.h"
-#ifdef WITH_QEMU
-#include "state.h"
-#endif
#ifndef _WIN32
#include <net/if.h>
@@ -321,9 +318,6 @@ Slirp *slirp_init(int restricted, bool in_enabled, struct in_addr vnetwork,
translate_dnssearch(slirp, vdnssearch);
}
-#ifdef WITH_QEMU
- slirp_state_register(slirp);
-#endif
return slirp;
}
@@ -337,9 +331,6 @@ void slirp_cleanup(Slirp *slirp)
g_free(e);
}
-#ifdef WITH_QEMU
- slirp_state_unregister(slirp);
-#endif
ip_cleanup(slirp);
ip6_cleanup(slirp);
m_cleanup(slirp);
diff --git a/state.c b/state.c
index 32eec6f..ac0a7d4 100644
--- a/state.c
+++ b/state.c
@@ -21,13 +21,10 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
-#include "qemu/osdep.h"
-
#include "slirp.h"
+#include "vmstate.h"
#include "state.h"
-#include "migration/vmstate.h"
-#include "migration/qemu-file-types.h"
-#include "migration/register.h"
+#include "stream.h"
static int slirp_tcp_post_load(void *opaque, int version)
{
@@ -176,7 +173,7 @@ static int slirp_socket_pre_load(void *opaque)
#else
/* Win uses u_long rather than uint32_t - but it's still 32bits long */
#define VMSTATE_SIN4_ADDR(f, s, t) \
- VMSTATE_SINGLE_TEST(f, s, t, 0, vmstate_info_uint32, u_long)
+ VMSTATE_SINGLE_TEST(f, s, t, 0, slirp_vmstate_info_uint32, u_long)
#endif
/* The OS provided ss_family field isn't that portable; it's size
@@ -314,10 +311,13 @@ static const VMStateDescription vmstate_slirp = {
VMSTATE_END_OF_LIST() }
};
-static void slirp_state_save(QEMUFile *f, void *opaque)
+void slirp_state_save(Slirp *slirp, SlirpWriteCb write_cb, void *opaque)
{
- Slirp *slirp = opaque;
struct gfwd_list *ex_ptr;
+ SlirpOStream f = {
+ .write_cb = write_cb,
+ .opaque = opaque,
+ };
for (ex_ptr = slirp->guestfwd_list; ex_ptr; ex_ptr = ex_ptr->ex_next)
if (ex_ptr->write_cb) {
@@ -328,25 +328,30 @@ static void slirp_state_save(QEMUFile *f, void *opaque)
continue;
}
- qemu_put_byte(f, 42);
- vmstate_save_state(f, &vmstate_slirp_socket, so, NULL);
+ slirp_ostream_write_u8(&f, 42);
+ slirp_vmstate_save_state(&f, &vmstate_slirp_socket, so);
}
- qemu_put_byte(f, 0);
+ slirp_ostream_write_u8(&f, 0);
- vmstate_save_state(f, &vmstate_slirp, slirp, NULL);
+ slirp_vmstate_save_state(&f, &vmstate_slirp, slirp);
}
-static int slirp_state_load(QEMUFile *f, void *opaque, int version_id)
+int slirp_state_load(Slirp *slirp, int version_id, SlirpReadCb read_cb,
+ void *opaque)
{
- Slirp *slirp = opaque;
struct gfwd_list *ex_ptr;
+ SlirpIStream f = {
+ .read_cb = read_cb,
+ .opaque = opaque,
+ };
- while (qemu_get_byte(f)) {
+ while (slirp_istream_read_u8(&f)) {
int ret;
struct socket *so = socreate(slirp);
- ret = vmstate_load_state(f, &vmstate_slirp_socket, so, version_id);
+ ret =
+ slirp_vmstate_load_state(&f, &vmstate_slirp_socket, so, version_id);
if (ret < 0) {
return ret;
}
@@ -367,20 +372,10 @@ static int slirp_state_load(QEMUFile *f, void *opaque, int version_id)
}
}
- return vmstate_load_state(f, &vmstate_slirp, slirp, version_id);
-}
-
-void slirp_state_register(Slirp *slirp)
-{
- static SaveVMHandlers savevm_slirp_state = {
- .save_state = slirp_state_save,
- .load_state = slirp_state_load,
- };
-
- register_savevm_live(NULL, "slirp", 0, 4, &savevm_slirp_state, slirp);
+ return slirp_vmstate_load_state(&f, &vmstate_slirp, slirp, version_id);
}
-void slirp_state_unregister(Slirp *slirp)
+int slirp_state_version(void)
{
- unregister_savevm(NULL, "slirp", slirp);
+ return 4;
}
diff --git a/state.h b/state.h
index 1548668..e69de29 100644
--- a/state.h
+++ b/state.h
@@ -1,9 +0,0 @@
-#ifndef SLIRP_STATE_H_
-#define SLIRP_STATE_H_
-
-#include "libslirp.h"
-
-void slirp_state_register(Slirp *slirp);
-void slirp_state_unregister(Slirp *slirp);
-
-#endif /* SLIRP_STATE_H_ */