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 Saso Kiselkov 2013, All rights reserved.
  24  */
  25 
  26 #ifndef _SYS_ZIO_CHECKSUM_H
  27 #define _SYS_ZIO_CHECKSUM_H
  28 
  29 #include <sys/zio.h>
  30 
  31 #ifdef  __cplusplus
  32 extern "C" {
  33 #endif
  34 
  35 /*
  36  * Signature for checksum functions.
  37  */
  38 typedef void zio_checksum_t(const void *data, uint64_t size,
  39     const zio_cksum_salt_t *salt, const void *ctx_template, zio_cksum_t *zcp);
  40 typedef void *zio_checksum_tmpl_init_t(const zio_cksum_salt_t *salt);
  41 typedef void zio_checksum_tmpl_free_t(void *ctx_template);
  42 
  43 /*
  44  * Information about each checksum function.
  45  */
  46 typedef struct zio_checksum_info {
  47         /* checksum function for each byteorder */
  48         zio_checksum_t                  *ci_func[2];
  49         zio_checksum_tmpl_init_t        *ci_tmpl_init;
  50         zio_checksum_tmpl_free_t        *ci_tmpl_free;
  51         int             ci_correctable; /* number of correctable bits */
  52         int             ci_eck;         /* uses zio embedded checksum? */
  53         int             ci_dedup;       /* strong enough for dedup? */
  54         int             ci_salted;      /* does the checksum support salts */
  55         char            *ci_name;       /* descriptive name */
  56 } zio_checksum_info_t;
  57 
  58 typedef struct zio_bad_cksum {
  59         zio_cksum_t             zbc_expected;
  60         zio_cksum_t             zbc_actual;
  61         const char              *zbc_checksum_name;
  62         uint8_t                 zbc_byteswapped;
  63         uint8_t                 zbc_injected;
  64         uint8_t                 zbc_has_cksum;  /* expected/actual valid */
  65 } zio_bad_cksum_t;
  66 
  67 extern zio_checksum_info_t zio_checksum_table[ZIO_CHECKSUM_FUNCTIONS];
  68 
  69 /*
  70  * Checksum routines.
  71  */
  72 extern zio_checksum_t zio_checksum_SHA256;
  73 extern zio_checksum_t zio_checksum_SHA512_native;
  74 extern zio_checksum_t zio_checksum_SHA512_byteswap;
  75 
  76 /* Skein */
  77 extern zio_checksum_t zio_checksum_skein_native;
  78 extern zio_checksum_t zio_checksum_skein_byteswap;
  79 extern zio_checksum_tmpl_init_t zio_checksum_skein_tmpl_init;
  80 extern zio_checksum_tmpl_free_t zio_checksum_skein_tmpl_free;
  81 
  82 /* Edon-R */
  83 extern zio_checksum_t zio_checksum_edonr_native;
  84 extern zio_checksum_t zio_checksum_edonr_byteswap;
  85 extern zio_checksum_tmpl_init_t zio_checksum_edonr_tmpl_init;
  86 extern zio_checksum_tmpl_free_t zio_checksum_edonr_tmpl_free;
  87 
  88 extern void zio_checksum_compute(zio_t *zio, enum zio_checksum checksum,
  89     void *data, uint64_t size);
  90 extern int zio_checksum_error(zio_t *zio, zio_bad_cksum_t *out);
  91 extern enum zio_checksum spa_dedup_checksum(spa_t *spa);
  92 extern void zio_checksum_templates_free(spa_t *spa);
  93 
  94 #ifdef  __cplusplus
  95 }
  96 #endif
  97 
  98 #endif  /* _SYS_ZIO_CHECKSUM_H */