xref: /freebsd/sys/contrib/openzfs/cmd/zstream/zstream_fletcher4.h (revision d0b3ecdc274930e190ea233b6b69ff03782eaf8d)
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