To implement backend-transfer migration in virtio-net in the next commit, we need a generic API to migrate net backend. Here is it.
Signed-off-by: Vladimir Sementsov-Ogievskiy <[email protected]> --- include/net/net.h | 4 ++++ net/net.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/include/net/net.h b/include/net/net.h index 3aa67db57c..8375ca89a7 100644 --- a/include/net/net.h +++ b/include/net/net.h @@ -5,6 +5,7 @@ #include "qapi/qapi-types-net.h" #include "net/queue.h" #include "hw/qdev-properties-system.h" +#include "migration/vmstate.h" #define MAC_FMT "%02X:%02X:%02X:%02X:%02X:%02X" #define MAC_ARG(x) ((uint8_t *)(x))[0], ((uint8_t *)(x))[1], \ @@ -115,6 +116,7 @@ typedef struct NetClientInfo { NetCheckPeerType *check_peer_type; GetVHostNet *get_vhost_net; NetBackendConnect *backend_connect; + const VMStateDescription *backend_vmsd; } NetClientInfo; struct NetClientState { @@ -360,4 +362,6 @@ static inline bool net_peer_needs_padding(NetClientState *nc) return nc->peer && !nc->peer->do_not_pad; } +extern const VMStateInfo vmstate_net_peer_backend; + #endif diff --git a/net/net.c b/net/net.c index 4fc6b1d0a6..cca4fa0a6b 100644 --- a/net/net.c +++ b/net/net.c @@ -57,6 +57,7 @@ #include "qapi/string-output-visitor.h" #include "qapi/qobject-input-visitor.h" #include "standard-headers/linux/virtio_net.h" +#include "migration/vmstate.h" /* Net bridge is currently not supported for W32. */ #if !defined(_WIN32) @@ -2177,3 +2178,49 @@ bool net_backend_connect(NetClientState *nc, Error **errp) return nc->info->backend_connect(nc, errp); } + +static int get_peer_backend(QEMUFile *f, void *pv, size_t size, + const VMStateField *field) +{ + NetClientState *nc = pv; + Error *local_err = NULL; + int ret; + + if (!nc->peer) { + return -EINVAL; + } + nc = nc->peer; + + ret = vmstate_load_state(f, nc->info->backend_vmsd, nc, 0, &local_err); + if (ret < 0) { + error_report_err(local_err); + } + + return ret; +} + +static int put_peer_backend(QEMUFile *f, void *pv, size_t size, + const VMStateField *field, JSONWriter *vmdesc) +{ + NetClientState *nc = pv; + Error *local_err = NULL; + int ret; + + if (!nc->peer) { + return -EINVAL; + } + nc = nc->peer; + + ret = vmstate_save_state(f, nc->info->backend_vmsd, nc, 0, &local_err); + if (ret < 0) { + error_report_err(local_err); + } + + return ret; +} + +const VMStateInfo vmstate_net_peer_backend = { + .name = "virtio-net-nic-nc-backend", + .get = get_peer_backend, + .put = put_peer_backend, +}; -- 2.48.1
