]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/opencrypto/cryptodev_if.m
Merge llvm-project release/17.x llvmorg-17.0.5-0-g98bfdac5ce82
[FreeBSD/FreeBSD.git] / sys / opencrypto / cryptodev_if.m
1 #-
2 # Copyright (c) 2006, Sam Leffler
3 # All rights reserved.
4 #
5 # Redistribution and use in source and binary forms, with or without
6 # modification, are permitted provided that the following conditions
7 # are met:
8 # 1. Redistributions of source code must retain the above copyright
9 #    notice, this list of conditions and the following disclaimer.
10 # 2. Redistributions in binary form must reproduce the above copyright
11 #    notice, this list of conditions and the following disclaimer in the
12 #    documentation and/or other materials provided with the distribution.
13 #
14 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 # ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 # SUCH DAMAGE.
25 #
26 #
27
28 #include <sys/malloc.h>
29 #include <opencrypto/cryptodev.h>
30
31 INTERFACE cryptodev;
32
33 CODE {
34         static int null_freesession(device_t dev,
35             crypto_session_t crypto_session)
36         {
37                 return 0;
38         }
39 };
40
41 /**
42  * @brief Probe to see if a crypto driver supports a session.
43  *
44  * The crypto framework invokes this method on each crypto driver when
45  * creating a session for symmetric crypto operations to determine if
46  * the driver supports the algorithms and mode requested by the
47  * session.
48  *
49  * If the driver does not support a session with the requested
50  * parameters, this function should fail with an error.
51  *
52  * If the driver does support a session with the requested parameters,
53  * this function should return a negative value indicating the
54  * priority of this driver.  These negative values should be derived
55  * from one of the CRYPTODEV_PROBE_* constants in
56  * <opencrypto/cryptodev.h>.
57  *
58  * This function's return value is similar to that used by
59  * DEVICE_PROBE(9).  However, a return value of zero is not supported
60  * and should not be used.
61  *
62  * @param dev           the crypto driver device
63  * @param csp           crypto session parameters
64  *
65  * @retval negative     if the driver supports this session - the
66  *                      least negative value is used to select the
67  *                      driver for the session
68  * @retval EINVAL       if the driver does not support the session
69  * @retval positive     if some other error occurs
70  */
71 METHOD int probesession {
72         device_t        dev;
73         const struct crypto_session_params *csp;
74 };
75
76 /**
77  * @brief Initialize a new crypto session object
78  *
79  * Invoked by the crypto framework to initialize driver-specific data
80  * for a crypto session.  The framework allocates and zeroes the
81  * driver's per-session memory object prior to invoking this method.
82  * The driver is able to access it's per-session memory object via
83  * crypto_get_driver_session().
84  *
85  * @param dev           the crypto driver device
86  * @param crypto_session session being initialized
87  * @param csp           crypto session parameters
88  *
89  * @retval 0            success
90  * @retval non-zero     if some kind of error occurred
91  */
92 METHOD int newsession {
93         device_t        dev;
94         crypto_session_t crypto_session;
95         const struct crypto_session_params *csp;
96 };
97
98 /**
99  * @brief Destroy a crypto session object
100  *
101  * The crypto framework invokes this method when tearing down a crypto
102  * session.  After this callback returns, the framework will explicitly
103  * zero and free the drvier's per-session memory object.  If the
104  * driver requires additional actions to destroy a session, it should
105  * perform those in this method.  If the driver does not require
106  * additional actions it does not need to provide an implementation of
107  * this method.
108  *
109  * @param dev           the crypto driver device
110  * @param crypto_session session being destroyed
111  */
112 METHOD void freesession {
113         device_t        dev;
114         crypto_session_t crypto_session;
115 } DEFAULT null_freesession;
116
117 /**
118  * @brief Perform a crypto operation
119  *
120  * The crypto framework invokes this method for each crypto
121  * operation performed on a session.  A reference to the containing
122  * session is stored as a member of 'struct cryptop'.  This routine
123  * should not block, but queue the operation if necessary.
124  *
125  * This method may return ERESTART to indicate that any internal
126  * queues are full so the operation should be queued in the crypto
127  * framework and retried in the future.
128  *
129  * To report errors with a crypto operation, 'crp_etype' should be set
130  * and the operation completed by calling 'crypto_done'.  This method
131  * should then return zero.
132  *
133  * @param dev           the crypto driver device
134  * @param op            crypto operation to perform
135  * @param flags         set to CRYPTO_HINT_MORE if additional symmetric
136  *                      crypto operations are queued for this driver;
137  *                      otherwise set to zero.
138  *
139  * @retval 0            success
140  * @retval ERESTART     internal queue is full
141  */
142 METHOD int process {
143         device_t        dev;
144         struct cryptop  *op;
145         int             flags;
146 };