1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
23  * Copyright (c) 2014, 2015 by Delphix. All rights reserved.
24  * Copyright Saso Kiselkov 2013, All rights reserved.
25  */
26 
27 #ifndef _SYS_ZIO_CHECKSUM_H
28 #define	_SYS_ZIO_CHECKSUM_H
29 
30 #include <sys/zio.h>
31 #include <zfeature_common.h>
32 
33 #ifdef	__cplusplus
34 extern "C" {
35 #endif
36 
37 /*
38  * Signature for checksum functions.
39  */
40 typedef void zio_checksum_t(const void *data, uint64_t size,
41     const void *ctx_template, zio_cksum_t *zcp);
42 typedef void *zio_checksum_tmpl_init_t(const zio_cksum_salt_t *salt);
43 typedef void zio_checksum_tmpl_free_t(void *ctx_template);
44 
45 typedef enum zio_checksum_flags {
46 	/* Strong enough for metadata? */
47 	ZCHECKSUM_FLAG_METADATA = (1 << 1),
48 	/* ZIO embedded checksum */
49 	ZCHECKSUM_FLAG_EMBEDDED = (1 << 2),
50 	/* Strong enough for dedup (without verification)? */
51 	ZCHECKSUM_FLAG_DEDUP = (1 << 3),
52 	/* Uses salt value */
53 	ZCHECKSUM_FLAG_SALTED = (1 << 4),
54 	/* Strong enough for nopwrite? */
55 	ZCHECKSUM_FLAG_NOPWRITE = (1 << 5)
56 } zio_checksum_flags_t;
57 
58 /*
59  * Information about each checksum function.
60  */
61 typedef struct zio_checksum_info {
62 	/* checksum function for each byteorder */
63 	zio_checksum_t			*ci_func[2];
64 	zio_checksum_tmpl_init_t	*ci_tmpl_init;
65 	zio_checksum_tmpl_free_t	*ci_tmpl_free;
66 	zio_checksum_flags_t		ci_flags;
67 	char				*ci_name;	/* descriptive name */
68 } zio_checksum_info_t;
69 
70 typedef struct zio_bad_cksum {
71 	zio_cksum_t		zbc_expected;
72 	zio_cksum_t		zbc_actual;
73 	const char		*zbc_checksum_name;
74 	uint8_t			zbc_byteswapped;
75 	uint8_t			zbc_injected;
76 	uint8_t			zbc_has_cksum;	/* expected/actual valid */
77 } zio_bad_cksum_t;
78 
79 extern zio_checksum_info_t zio_checksum_table[ZIO_CHECKSUM_FUNCTIONS];
80 
81 /*
82  * Checksum routines.
83  */
84 extern zio_checksum_t zio_checksum_SHA256;
85 #ifndef __NetBSD__
86 extern zio_checksum_t zio_checksum_SHA512_native;
87 extern zio_checksum_t zio_checksum_SHA512_byteswap;
88 
89 /* Skein */
90 extern zio_checksum_t zio_checksum_skein_native;
91 extern zio_checksum_t zio_checksum_skein_byteswap;
92 extern zio_checksum_tmpl_init_t zio_checksum_skein_tmpl_init;
93 extern zio_checksum_tmpl_free_t zio_checksum_skein_tmpl_free;
94 #endif
95 
96 #ifdef illumos
97 /* Edon-R */
98 extern zio_checksum_t zio_checksum_edonr_native;
99 extern zio_checksum_t zio_checksum_edonr_byteswap;
100 extern zio_checksum_tmpl_init_t zio_checksum_edonr_tmpl_init;
101 extern zio_checksum_tmpl_free_t zio_checksum_edonr_tmpl_free;
102 #endif
103 
104 extern int zio_checksum_equal(spa_t *, blkptr_t *, enum zio_checksum,
105     void *, uint64_t, uint64_t, zio_bad_cksum_t *);
106 extern void zio_checksum_compute(zio_t *zio, enum zio_checksum checksum,
107     void *data, uint64_t size);
108 extern int zio_checksum_error_impl(spa_t *, blkptr_t *, enum zio_checksum,
109     void *, uint64_t, uint64_t, zio_bad_cksum_t *);
110 extern int zio_checksum_error(zio_t *zio, zio_bad_cksum_t *out);
111 extern enum zio_checksum spa_dedup_checksum(spa_t *spa);
112 extern void zio_checksum_templates_free(spa_t *spa);
113 extern spa_feature_t zio_checksum_to_feature(enum zio_checksum cksum);
114 
115 #ifdef	__cplusplus
116 }
117 #endif
118 
119 #endif	/* _SYS_ZIO_CHECKSUM_H */
120