DPDK
18.02.2
Main Page
Related Pages
Data Structures
Files
Examples
File List
Globals
lib
librte_cryptodev
rte_crypto.h
Go to the documentation of this file.
1
/* SPDX-License-Identifier: BSD-3-Clause
2
* Copyright(c) 2016-2017 Intel Corporation
3
*/
4
5
#ifndef _RTE_CRYPTO_H_
6
#define _RTE_CRYPTO_H_
7
15
#ifdef __cplusplus
16
extern
"C"
{
17
#endif
18
19
20
#include <
rte_mbuf.h
>
21
#include <
rte_memory.h
>
22
#include <
rte_mempool.h
>
23
#include <
rte_common.h
>
24
25
#include "
rte_crypto_sym.h
"
26
28
enum
rte_crypto_op_type
{
29
RTE_CRYPTO_OP_TYPE_UNDEFINED
,
31
RTE_CRYPTO_OP_TYPE_SYMMETRIC
,
33
};
34
36
enum
rte_crypto_op_status
{
37
RTE_CRYPTO_OP_STATUS_SUCCESS
,
39
RTE_CRYPTO_OP_STATUS_NOT_PROCESSED
,
41
RTE_CRYPTO_OP_STATUS_AUTH_FAILED
,
43
RTE_CRYPTO_OP_STATUS_INVALID_SESSION
,
48
RTE_CRYPTO_OP_STATUS_INVALID_ARGS
,
50
RTE_CRYPTO_OP_STATUS_ERROR
,
52
};
53
59
enum
rte_crypto_op_sess_type
{
60
RTE_CRYPTO_OP_WITH_SESSION
,
61
RTE_CRYPTO_OP_SESSIONLESS
,
62
RTE_CRYPTO_OP_SECURITY_SESSION
63
};
64
75
struct
rte_crypto_op
{
76
uint8_t
type
;
78
uint8_t
status
;
85
uint8_t
sess_type
;
88
uint8_t
reserved
[5];
90
struct
rte_mempool
*
mempool
;
93
rte_iova_t
phys_addr
;
96
__extension__
97
union
{
98
struct
rte_crypto_sym_op
sym
[0];
100
};
101
};
102
109
static
inline
void
110
__rte_crypto_op_reset
(
struct
rte_crypto_op
*op,
enum
rte_crypto_op_type
type)
111
{
112
op->
type
= type;
113
op->
status
=
RTE_CRYPTO_OP_STATUS_NOT_PROCESSED
;
114
op->
sess_type
=
RTE_CRYPTO_OP_SESSIONLESS
;
115
116
switch
(type) {
117
case
RTE_CRYPTO_OP_TYPE_SYMMETRIC
:
118
__rte_crypto_sym_op_reset
(op->
sym
);
119
break
;
120
case
RTE_CRYPTO_OP_TYPE_UNDEFINED
:
121
default
:
122
break
;
123
}
124
}
125
129
struct
rte_crypto_op_pool_private
{
130
enum
rte_crypto_op_type
type
;
132
uint16_t
priv_size
;
134
};
135
136
145
static
inline
uint16_t
146
__rte_crypto_op_get_priv_data_size
(
struct
rte_mempool
*mempool)
147
{
148
struct
rte_crypto_op_pool_private
*priv =
149
(
struct
rte_crypto_op_pool_private
*)
rte_mempool_get_priv
(mempool);
150
151
return
priv->
priv_size
;
152
}
153
154
174
extern
struct
rte_mempool
*
175
rte_crypto_op_pool_create
(
const
char
*
name
,
enum
rte_crypto_op_type
type,
176
unsigned
nb_elts,
unsigned
cache_size
, uint16_t priv_size,
177
int
socket_id
);
178
190
static
inline
int
191
__rte_crypto_op_raw_bulk_alloc
(
struct
rte_mempool
*mempool,
192
enum
rte_crypto_op_type
type,
193
struct
rte_crypto_op
**ops, uint16_t nb_ops)
194
{
195
struct
rte_crypto_op_pool_private
*priv;
196
197
priv = (
struct
rte_crypto_op_pool_private
*)
rte_mempool_get_priv
(mempool);
198
if
(
unlikely
(priv->
type
!= type &&
199
priv->
type
!=
RTE_CRYPTO_OP_TYPE_UNDEFINED
))
200
return
-EINVAL;
201
202
if
(
rte_mempool_get_bulk
(mempool, (
void
**)ops, nb_ops) == 0)
203
return
nb_ops;
204
205
return
0;
206
}
207
218
static
inline
struct
rte_crypto_op
*
219
rte_crypto_op_alloc
(
struct
rte_mempool
*
mempool
,
enum
rte_crypto_op_type
type
)
220
{
221
struct
rte_crypto_op
*op = NULL;
222
int
retval;
223
224
retval =
__rte_crypto_op_raw_bulk_alloc
(mempool, type, &op, 1);
225
if
(
unlikely
(retval != 1))
226
return
NULL;
227
228
__rte_crypto_op_reset
(op, type);
229
230
return
op;
231
}
232
233
248
static
inline
unsigned
249
rte_crypto_op_bulk_alloc
(
struct
rte_mempool
*
mempool
,
250
enum
rte_crypto_op_type
type
,
251
struct
rte_crypto_op
**ops, uint16_t nb_ops)
252
{
253
int
i;
254
255
if
(
unlikely
(
__rte_crypto_op_raw_bulk_alloc
(mempool, type, ops, nb_ops)
256
!= nb_ops))
257
return
0;
258
259
for
(i = 0; i < nb_ops; i++)
260
__rte_crypto_op_reset
(ops[i], type);
261
262
return
nb_ops;
263
}
264
265
266
278
static
inline
void
*
279
__rte_crypto_op_get_priv_data
(
struct
rte_crypto_op
*op, uint32_t size)
280
{
281
uint32_t priv_size;
282
283
if
(
likely
(op->
mempool
!= NULL)) {
284
priv_size =
__rte_crypto_op_get_priv_data_size
(op->
mempool
);
285
286
if
(
likely
(priv_size >= size))
287
return
(
void
*)((uint8_t *)(op + 1) +
288
sizeof
(
struct
rte_crypto_sym_op
));
289
}
290
291
return
NULL;
292
}
293
301
static
inline
void
302
rte_crypto_op_free
(
struct
rte_crypto_op
*op)
303
{
304
if
(op != NULL && op->
mempool
!= NULL)
305
rte_mempool_put
(op->
mempool
, op);
306
}
307
319
static
inline
struct
rte_crypto_op
*
320
rte_crypto_sym_op_alloc_from_mbuf_priv_data
(
struct
rte_mbuf
*m)
321
{
322
if
(
unlikely
(m == NULL))
323
return
NULL;
324
325
/*
326
* check that the mbuf's private data size is sufficient to contain a
327
* crypto operation
328
*/
329
if
(
unlikely
(m->
priv_size
< (
sizeof
(
struct
rte_crypto_op
) +
330
sizeof
(
struct
rte_crypto_sym_op
))))
331
return
NULL;
332
333
/* private data starts immediately after the mbuf header in the mbuf. */
334
struct
rte_crypto_op
*op = (
struct
rte_crypto_op
*)(m + 1);
335
336
__rte_crypto_op_reset
(op,
RTE_CRYPTO_OP_TYPE_SYMMETRIC
);
337
338
op->
mempool
= NULL;
339
op->
sym
->
m_src
= m;
340
341
return
op;
342
}
343
353
static
inline
struct
rte_crypto_sym_xform
*
354
rte_crypto_op_sym_xforms_alloc
(
struct
rte_crypto_op
*op, uint8_t nb_xforms)
355
{
356
void
*priv_data;
357
uint32_t size;
358
359
if
(
unlikely
(op->
type
!=
RTE_CRYPTO_OP_TYPE_SYMMETRIC
))
360
return
NULL;
361
362
size =
sizeof
(
struct
rte_crypto_sym_xform
) * nb_xforms;
363
364
priv_data =
__rte_crypto_op_get_priv_data
(op, size);
365
if
(priv_data == NULL)
366
return
NULL;
367
368
return
__rte_crypto_sym_op_sym_xforms_alloc
(op->
sym
, priv_data,
369
nb_xforms);
370
}
371
372
379
static
inline
int
380
rte_crypto_op_attach_sym_session
(
struct
rte_crypto_op
*op,
381
struct
rte_cryptodev_sym_session
*sess)
382
{
383
if
(
unlikely
(op->
type
!=
RTE_CRYPTO_OP_TYPE_SYMMETRIC
))
384
return
-1;
385
386
op->
sess_type
=
RTE_CRYPTO_OP_WITH_SESSION
;
387
388
return
__rte_crypto_sym_op_attach_sym_session
(op->
sym
, sess);
389
}
390
391
#ifdef __cplusplus
392
}
393
#endif
394
395
#endif
/* _RTE_CRYPTO_H_ */
Generated by
1.8.1.2