aboutsummaryrefslogtreecommitdiff
path: root/lib/libc/include/generic-netbsd/dev/cgdvar.h
blob: 848332c1665737e65c832c7be19391edf212e4f9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/* $NetBSD: cgdvar.h,v 1.21 2020/06/13 22:15:58 riastradh Exp $ */

/*-
 * Copyright (c) 2002 The NetBSD Foundation, Inc.
 * All rights reserved.
 *
 * This code is derived from software contributed to The NetBSD Foundation
 * by Roland C. Dowdeswell.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef _DEV_CGDVAR_H_
#define	_DEV_CGDVAR_H_

#include <sys/ioccom.h>

/* ioctl(2) code: used by CGDIOCSET and CGDIOCCLR */
struct cgd_ioctl {
	const char	*ci_disk;
	int		 ci_flags;
	int		 ci_unit;
	size_t		 ci_size;
	const char	*ci_alg;
	const char	*ci_ivmethod;
	size_t		 ci_keylen;
	const char	*ci_key;
	size_t		 ci_blocksize;
};

/* ioctl(2) code: used by CGDIOCGET */
struct cgd_user {
	int		cgu_unit;	/* which cgd unit */
	dev_t		cgu_dev;	/* target device */
	char		cgu_alg[32];	/* algorithm name */
	size_t		cgu_blocksize;	/* block size (in bytes) */
	int		cgu_mode;	/* Cipher Mode and IV Gen method */
#define CGD_CIPHER_CBC_ENCBLKNO8 1	/* CBC Mode w/ Enc Block Number
					 * 8 passes (compat only)
					 */
#define CGD_CIPHER_CBC_ENCBLKNO1 2	/* CBC Mode w/ Enc Block Number
					 * 1 pass (default)
					 */
	int		cgu_keylen;	/* keylength */
};

#ifdef _KERNEL

#include <dev/cgd_crypto.h>
#include <dev/dkvar.h>

/* This cryptdata structure is here rather than cgd_crypto.h, since
 * it stores local state which will not be generalised beyond the
 * cgd driver.
 */

struct cryptdata {
	size_t		 cf_blocksize;	/* block size (in bytes) */
	int		 cf_keylen;	/* key length */
	int		 cf_mode;	/* Cipher Mode and IV Gen method
					 * (see cgu_mode above for defines) */
	void		*cf_priv;	/* enc alg private data */
};

struct cgd_xfer {
	struct work		 cx_work;
	struct cgd_softc	*cx_sc;
	struct buf		*cx_obp;
	struct buf		*cx_nbp;
	void			*cx_dstv;
	const void		*cx_srcv;
	size_t			 cx_len;
	daddr_t			 cx_blkno;
	size_t			 cx_secsize;
	int			 cx_dir;
};

struct cgd_worker {
	struct workqueue	*cw_wq;		/* work queue */
	struct pool		*cw_cpool;	/* cgd_xfer contexts */
	u_int		 	 cw_busy;	/* number of busy contexts */
	u_int			 cw_last;	/* index of last CPU used */
	kmutex_t		 cw_lock;
};

struct cgd_softc {
	struct dk_softc		 sc_dksc;	/* generic disk interface */
	struct vnode		*sc_tvn;	/* target device's vnode */
	dev_t			 sc_tdev;	/* target device */
	char			*sc_tpath;	/* target device's path */
	void			*sc_data;	/* emergency buffer */
	bool			 sc_data_used;	/* Really lame, we'll change */
	size_t			 sc_tpathlen;	/* length of prior string */
	struct cryptdata	 sc_cdata;	/* crypto data */
	const struct cryptfuncs	*sc_cfuncs;	/* encryption functions */
	kmutex_t		 sc_lock;
	kcondvar_t		 sc_cv;
	bool			 sc_busy;
	struct cgd_worker	*sc_worker;	/* shared worker data */
};
#endif

/* XXX XAX XXX elric:  check these out properly. */
#define CGDIOCSET	_IOWR('F', 18, struct cgd_ioctl)
#define CGDIOCCLR	_IOW('F', 19, struct cgd_ioctl)
#define CGDIOCGET	_IOWR('F', 20, struct cgd_user)

/* Maximum block sized to be used by the ciphers */
#define CGD_MAXBLOCKSIZE	128

#endif /* _DEV_CGDVAR_H_ */