1 /*	$OpenBSD: ubsecvar.h,v 1.36 2003/06/04 16:02:41 jason Exp $	*/
2 
3 /*
4  * Copyright (c) 2000 Theo de Raadt
5  * Copyright (c) 2001 Patrik Lindergren (patrik@ipunplugged.com)
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  *
28  * Effort sponsored in part by the Defense Advanced Research Projects
29  * Agency (DARPA) and Air Force Research Laboratory, Air Force
30  * Materiel Command, USAF, under agreement number F30602-01-2-0537.
31  *
32  */
33 
34 /* Maximum queue length */
35 #ifndef UBS_MAX_NQUEUE
36 #define UBS_MAX_NQUEUE		60
37 #endif
38 
39 #define	UBS_MAX_SCATTER		64	/* Maximum scatter/gather depth */
40 
41 #ifndef UBS_MAX_AGGR
42 #define	UBS_MAX_AGGR		5	/* Maximum aggregation count */
43 #endif
44 
45 #define	UBSEC_CARD(sid)		(((sid) & 0xf0000000) >> 28)
46 #define	UBSEC_SESSION(sid)	( (sid) & 0x0fffffff)
47 #define	UBSEC_SID(crd, sesn)	(((crd) << 28) | ((sesn) & 0x0fffffff))
48 
49 #define UBS_DEF_RTY		0xff	/* PCI Retry Timeout */
50 #define UBS_DEF_TOUT		0xff	/* PCI TRDY Timeout */
51 #define UBS_DEF_CACHELINE	0x01	/* Cache Line setting */
52 
53 struct ubsec_dma_alloc {
54 	u_int32_t		dma_paddr;
55 	caddr_t			dma_vaddr;
56 	bus_dmamap_t		dma_map;
57 	bus_dma_segment_t	dma_seg;
58 	bus_size_t		dma_size;
59 	int			dma_nseg;
60 };
61 
62 struct ubsec_q2 {
63 	SIMPLEQ_ENTRY(ubsec_q2)		q_next;
64 	struct ubsec_dma_alloc		q_mcr;
65 	struct ubsec_dma_alloc		q_ctx;
66 	u_int				q_type;
67 };
68 
69 struct ubsec_q2_rng {
70 	struct ubsec_q2			rng_q;
71 	struct ubsec_dma_alloc		rng_buf;
72 	int				rng_used;
73 };
74 
75 /* C = (M ^ E) mod N */
76 #define	UBS_MODEXP_PAR_M	0
77 #define	UBS_MODEXP_PAR_E	1
78 #define	UBS_MODEXP_PAR_N	2
79 struct ubsec_q2_modexp {
80 	struct ubsec_q2			me_q;
81 	struct cryptkop *		me_krp;
82 	struct ubsec_dma_alloc		me_M;
83 	struct ubsec_dma_alloc		me_E;
84 	struct ubsec_dma_alloc		me_C;
85 	struct ubsec_dma_alloc		me_epb;
86 	int				me_modbits;
87 	int				me_shiftbits;
88 	int				me_normbits;
89 };
90 
91 #define	UBS_RSAPRIV_PAR_P	0
92 #define	UBS_RSAPRIV_PAR_Q	1
93 #define	UBS_RSAPRIV_PAR_DP	2
94 #define	UBS_RSAPRIV_PAR_DQ	3
95 #define	UBS_RSAPRIV_PAR_PINV	4
96 #define	UBS_RSAPRIV_PAR_MSGIN	5
97 #define	UBS_RSAPRIV_PAR_MSGOUT	6
98 struct ubsec_q2_rsapriv {
99 	struct ubsec_q2			rpr_q;
100 	struct cryptkop *		rpr_krp;
101 	struct ubsec_dma_alloc		rpr_msgin;
102 	struct ubsec_dma_alloc		rpr_msgout;
103 };
104 
105 #define	UBSEC_RNG_BUFSIZ	16		/* measured in 32bit words */
106 
107 struct ubsec_dmachunk {
108 	struct ubsec_mcr	d_mcr;
109 	struct ubsec_mcr_add	d_mcradd[UBS_MAX_AGGR-1];
110 	struct ubsec_pktbuf	d_sbuf[UBS_MAX_SCATTER-1];
111 	struct ubsec_pktbuf	d_dbuf[UBS_MAX_SCATTER-1];
112 	u_int32_t		d_macbuf[5];
113 	union {
114 		struct ubsec_pktctx_long	ctxl;
115 		struct ubsec_pktctx		ctx;
116 	} d_ctx;
117 };
118 
119 struct ubsec_dma {
120 	SIMPLEQ_ENTRY(ubsec_dma)	d_next;
121 	struct ubsec_dmachunk		*d_dma;
122 	struct ubsec_dma_alloc		d_alloc;
123 };
124 
125 #define	UBS_FLAGS_KEY		0x01		/* has key accelerator */
126 #define	UBS_FLAGS_LONGCTX	0x02		/* uses long ipsec ctx */
127 #define	UBS_FLAGS_BIGKEY	0x04		/* 2048bit keys */
128 #define	UBS_FLAGS_HWNORM	0x08		/* hardware normalization */
129 #define	UBS_FLAGS_RNG		0x10		/* hardware rng */
130 
131 struct ubsec_q {
132 	SIMPLEQ_ENTRY(ubsec_q)		q_next;
133 	int				q_nstacked_mcrs;
134 	struct ubsec_q			*q_stacked_mcr[UBS_MAX_AGGR-1];
135 	struct cryptop			*q_crp;
136 	struct ubsec_dma		*q_dma;
137 
138 	struct mbuf			*q_src_m, *q_dst_m;
139 	struct uio			*q_src_io, *q_dst_io;
140 
141 	bus_dmamap_t			q_src_map;
142 	bus_dmamap_t			q_dst_map;
143 
144 	int				q_sesn;
145 	int				q_flags;
146 };
147 
148 struct ubsec_softc {
149 	struct	device		sc_dv;		/* generic device */
150 	void			*sc_ih;		/* interrupt handler cookie */
151 	bus_space_handle_t	sc_sh;		/* memory handle */
152 	bus_space_tag_t		sc_st;		/* memory tag */
153 	bus_dma_tag_t		sc_dmat;	/* dma tag */
154 	int			sc_flags;	/* device specific flags */
155 	u_int32_t		sc_statmask;	/* interrupt status mask */
156 	int32_t			sc_cid;		/* crypto tag */
157 	SIMPLEQ_HEAD(,ubsec_q)	sc_queue;	/* packet queue, mcr1 */
158 	int			sc_nqueue;	/* count enqueued, mcr1 */
159 	SIMPLEQ_HEAD(,ubsec_q)	sc_qchip;	/* on chip, mcr1 */
160 	SIMPLEQ_HEAD(,ubsec_q)	sc_freequeue;	/* list of free queue elements */
161 	SIMPLEQ_HEAD(,ubsec_q2)	sc_queue2;	/* packet queue, mcr2 */
162 	int			sc_nqueue2;	/* count enqueued, mcr2 */
163 	SIMPLEQ_HEAD(,ubsec_q2)	sc_qchip2;	/* on chip, mcr2 */
164 	int			sc_nsessions;	/* # of sessions */
165 	struct ubsec_session	*sc_sessions;	/* sessions */
166 	struct timeout		sc_rngto;	/* rng timeout */
167 	int			sc_rnghz;	/* rng poll time */
168 	struct ubsec_q2_rng	sc_rng;
169 	struct ubsec_dma	sc_dmaa[UBS_MAX_NQUEUE];
170 	struct ubsec_q		*sc_queuea[UBS_MAX_NQUEUE];
171 	SIMPLEQ_HEAD(,ubsec_q2)	sc_q2free;	/* free list */
172 };
173 
174 #define	UBSEC_QFLAGS_COPYOUTIV		0x1
175 
176 struct ubsec_session {
177 	u_int32_t	ses_used;
178 	u_int32_t	ses_deskey[6];		/* 3DES key */
179 	u_int32_t	ses_hminner[5];		/* hmac inner state */
180 	u_int32_t	ses_hmouter[5];		/* hmac outer state */
181 	u_int32_t	ses_iv[2];		/* [3]DES iv */
182 };
183 
184 struct ubsec_stats {
185 	u_int64_t hst_ibytes;
186 	u_int64_t hst_obytes;
187 	u_int32_t hst_ipackets;
188 	u_int32_t hst_opackets;
189 	u_int32_t hst_invalid;
190 	u_int32_t hst_nomem;
191 	u_int32_t hst_queuefull;
192 	u_int32_t hst_dmaerr;
193 	u_int32_t hst_mcrerr;
194 	u_int32_t hst_nodmafree;
195 };
196