1*d0b3ecdcSMartin Matuska // SPDX-License-Identifier: CDDL-1.0 2*d0b3ecdcSMartin Matuska /* 3*d0b3ecdcSMartin Matuska * CDDL HEADER START 4*d0b3ecdcSMartin Matuska * 5*d0b3ecdcSMartin Matuska * This file and its contents are supplied under the terms of the Common 6*d0b3ecdcSMartin Matuska * Development and Distribution License ("CDDL"), version 1.0. You may only use 7*d0b3ecdcSMartin Matuska * this file in accordance with the terms of version 1.0 of the CDDL. 8*d0b3ecdcSMartin Matuska * 9*d0b3ecdcSMartin Matuska * A full copy of the text of the CDDL should have accompanied this source. A 10*d0b3ecdcSMartin Matuska * copy of the CDDL is also available via the Internet at 11*d0b3ecdcSMartin Matuska * http://www.illumos.org/license/CDDL. 12*d0b3ecdcSMartin Matuska * 13*d0b3ecdcSMartin Matuska * CDDL HEADER END 14*d0b3ecdcSMartin Matuska */ 15*d0b3ecdcSMartin Matuska 16*d0b3ecdcSMartin Matuska /* 17*d0b3ecdcSMartin Matuska * Copyright (c) 2026 by Garth Snyder. All rights reserved. 18*d0b3ecdcSMartin Matuska */ 19*d0b3ecdcSMartin Matuska 20*d0b3ecdcSMartin Matuska #ifndef _ZSTREAM_FLETCHER4_H 21*d0b3ecdcSMartin Matuska #define _ZSTREAM_FLETCHER4_H 22*d0b3ecdcSMartin Matuska 23*d0b3ecdcSMartin Matuska #ifdef __cplusplus 24*d0b3ecdcSMartin Matuska extern "C" { 25*d0b3ecdcSMartin Matuska #endif 26*d0b3ecdcSMartin Matuska 27*d0b3ecdcSMartin Matuska #include "zstream_io.h" 28*d0b3ecdcSMartin Matuska 29*d0b3ecdcSMartin Matuska /* 30*d0b3ecdcSMartin Matuska * zstream_chain module for calculating, validating, and inscribing 31*d0b3ecdcSMartin Matuska * Fletcher4 checksums. 32*d0b3ecdcSMartin Matuska * 33*d0b3ecdcSMartin Matuska * serial_validate_fletcher4() validates record checksums against the 34*d0b3ecdcSMartin Matuska * running stream checksum and fails loudly on any mismatch. 35*d0b3ecdcSMartin Matuska * 36*d0b3ecdcSMartin Matuska * serial_add_fletcher4() inscribes record checksums from the running 37*d0b3ecdcSMartin Matuska * stream checksum, in theory replacing whatever was there before. But 38*d0b3ecdcSMartin Matuska * see note in zstream_fletcher4.c regarding zero checksums generated 39*d0b3ecdcSMartin Matuska * by send_conclusion_record(), which are preserved. 40*d0b3ecdcSMartin Matuska */ 41*d0b3ecdcSMartin Matuska 42*d0b3ecdcSMartin Matuska /* 43*d0b3ecdcSMartin Matuska * DRR_END records normally do have end-record checksums. However, records 44*d0b3ecdcSMartin Matuska * emitted by send_conclusion_record() in libzfs_sendrecv.c have the 45*d0b3ecdcSMartin Matuska * checksum set to zero. zfs receive ignores those checksums. DRR_END 46*d0b3ecdcSMartin Matuska * records also have an internal checksum that applies to the stream-to-date 47*d0b3ecdcSMartin Matuska * since the most recent DRR_BEGIN. 48*d0b3ecdcSMartin Matuska * 49*d0b3ecdcSMartin Matuska * Ideally, null zstream transformations should be idempotent. E.g., a 50*d0b3ecdcSMartin Matuska * zstream redup that does not redup anything should yield a stream that is 51*d0b3ecdcSMartin Matuska * identical to the original stream. So, it's helpful to emulate zfs send's 52*d0b3ecdcSMartin Matuska * checksumming practices just to minimize spurious differences between 53*d0b3ecdcSMartin Matuska * input and output streams. 54*d0b3ecdcSMartin Matuska * 55*d0b3ecdcSMartin Matuska * The IS_CONCLUSION macro recognizes the records generated by 56*d0b3ecdcSMartin Matuska * send_conclusion_record() so that they can be treated specially. 57*d0b3ecdcSMartin Matuska */ 58*d0b3ecdcSMartin Matuska #define IS_CONCLUSION(drr, type) \ 59*d0b3ecdcSMartin Matuska ((type) == DRR_END && \ 60*d0b3ecdcSMartin Matuska (drr)->drr_u.drr_end.drr_toguid == 0 && \ 61*d0b3ecdcSMartin Matuska ZIO_CHECKSUM_IS_ZERO(&(drr)->drr_u.drr_checksum.drr_checksum)) 62*d0b3ecdcSMartin Matuska 63*d0b3ecdcSMartin Matuska /* 64*d0b3ecdcSMartin Matuska * Maximum number of checksum operations in one chain 65*d0b3ecdcSMartin Matuska */ 66*d0b3ecdcSMartin Matuska #define MAX_FLETCHER_4 8 67*d0b3ecdcSMartin Matuska 68*d0b3ecdcSMartin Matuska chain_step_t 69*d0b3ecdcSMartin Matuska serial_validate_fletcher4(void); 70*d0b3ecdcSMartin Matuska 71*d0b3ecdcSMartin Matuska chain_step_t 72*d0b3ecdcSMartin Matuska serial_add_fletcher4(void); 73*d0b3ecdcSMartin Matuska 74*d0b3ecdcSMartin Matuska #ifdef __cplusplus 75*d0b3ecdcSMartin Matuska } 76*d0b3ecdcSMartin Matuska #endif 77*d0b3ecdcSMartin Matuska 78*d0b3ecdcSMartin Matuska #endif /* _ZSTREAM_FLETCHER4_H */ 79