/* SPDX-License-Identifier: GPL-2.0-or-later * Copyright (c) 2025 Red Hat GmbH * Author: Stefano Brivio */ #ifndef MIGRATE_H #define MIGRATE_H /** * struct migrate_meta - Migration metadata * @v: Chosen migration data version, host order * @bswap: Source has opposite endianness * @peer_64b: Source uses 64-bit void * * @time_64b: Source uses 64-bit time_t * @flow_size: Size of union flow in source * @flow_sidx_size: Size of struct flow_sidx in source */ struct migrate_meta { uint32_t v; bool bswap; bool source_64b; bool time_64b; size_t flow_size; size_t flow_sidx_size; }; /** * union migrate_header - Migration header from source * @magic: 0xB1BB1D1B0BB1D1B0, host order * @version: Source sends highest known, target aborts if unsupported * @voidp_size: sizeof(void *), network order * @time_t_size: sizeof(time_t), network order * @flow_size: sizeof(union flow), network order * @flow_sidx_size: sizeof(struct flow_sidx_t), network order * @unused: Go figure */ union migrate_header { struct { uint64_t magic; uint32_t version; uint32_t voidp_size; uint32_t time_t_size; uint32_t flow_size; uint32_t flow_sidx_size; }; uint8_t unused[65536]; }; /** * struct migrate_data - Data sections for given source version * @v: Source version this applies to, host order * @sections: Array of data sections, NULL-terminated */ struct migrate_data { uint32_t v; struct iovec *sections; }; /** * struct migrate_handler - Function to handle a specific data section * @fn: Function pointer taking pointer to context and metadata */ struct migrate_handler { int (*fn)(struct ctx *c, struct migrate_meta *m); }; /** * struct migrate_target_handlers - Versioned sets of migration target handlers * @v: Source version this applies to, host order * @pre: Set of functions to execute in target before data copy * @post: Set of functions to execute in target after data copy */ struct migrate_target_handlers { uint32_t v; struct migrate_handler *pre; struct migrate_handler *post; }; void migrate_init(struct ctx *c); void migrate_close(struct ctx *c); void migrate_request(struct ctx *c, int fd, bool target); void migrate_handler(struct ctx *c, uint32_t events); #endif /* MIGRATE_H */