/* SPDX-License-Identifier: GPL-2.0-or-later * Copyright (c) 2025 Red Hat GmbH * Author: Stefano Brivio */ #ifndef MIGRATE_H #define MIGRATE_H typedef char migrate_magic_t[8]; /** * struct migrate_header - Initial header used for all protocol versions * @magic: '{passty}' as a byte array * @version: Version of the protocol used by sender, network order * @compat_version: Lowest compatible protocol version, network order */ struct migrate_header { migrate_magic_t magic; uint32_t version; uint32_t compat_version; }; /** * union migrate_header_v1 - Migration header from source * @endian: 0x12345678, source host order * @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_v1 { struct { uint32_t endian; uint32_t voidp_size; uint32_t time_t_size; uint32_t flow_size; uint32_t flow_sidx_size; }; uint8_t unused[65536]; }; struct migrate_meta; /** * 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_version - Handlers and data sections for a protocol version * @v: Source version this applies to, host order * @read_header_v: Read version specific header(s) * @pre: Set of functions to execute in target before data copy * @sections: Array of data sections, NULL-terminated * @post: Set of functions to execute in target after data copy */ struct migrate_version { uint32_t v; int (*read_header_v)(int fd, struct migrate_meta *m); struct migrate_handler *pre; struct iovec *sections; struct migrate_handler *post; }; /** * struct migrate_meta - Migration metadata * @version: Version number, host order * @v: Version information * @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 version; const struct migrate_version *v; bool bswap; bool source_64b; bool time_64b; size_t flow_size; size_t flow_sidx_size; }; 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); #endif /* MIGRATE_H */