DPDK
19.02.0
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
#include "
rte_crypto_asym.h
"
27
29
enum
rte_crypto_op_type
{
30
RTE_CRYPTO_OP_TYPE_UNDEFINED
,
32
RTE_CRYPTO_OP_TYPE_SYMMETRIC
,
34
RTE_CRYPTO_OP_TYPE_ASYMMETRIC
36
};
37
39
enum
rte_crypto_op_status
{
40
RTE_CRYPTO_OP_STATUS_SUCCESS
,
42
RTE_CRYPTO_OP_STATUS_NOT_PROCESSED
,
44
RTE_CRYPTO_OP_STATUS_AUTH_FAILED
,
46
RTE_CRYPTO_OP_STATUS_INVALID_SESSION
,
51
RTE_CRYPTO_OP_STATUS_INVALID_ARGS
,
53
RTE_CRYPTO_OP_STATUS_ERROR
,
55
};
56
62
enum
rte_crypto_op_sess_type
{
63
RTE_CRYPTO_OP_WITH_SESSION
,
64
RTE_CRYPTO_OP_SESSIONLESS
,
65
RTE_CRYPTO_OP_SECURITY_SESSION
66
};
67
78
struct
rte_crypto_op
{
79
__extension__
80
union
{
81
uint64_t raw;
82
__extension__
83
struct
{
84
uint8_t
type
;
86
uint8_t
status
;
94
uint8_t
sess_type
;
96
uint8_t
reserved
[3];
100
uint16_t
private_data_offset
;
108
};
109
};
110
struct
rte_mempool
*
mempool
;
113
rte_iova_t
phys_addr
;
116
__extension__
117
union
{
118
struct
rte_crypto_sym_op
sym
[0];
121
struct
rte_crypto_asym_op
asym
[0];
124
};
125
};
126
133
static
inline
void
134
__rte_crypto_op_reset
(
struct
rte_crypto_op
*op,
enum
rte_crypto_op_type
type)
135
{
136
op->
type
= type;
137
op->
status
=
RTE_CRYPTO_OP_STATUS_NOT_PROCESSED
;
138
op->
sess_type
=
RTE_CRYPTO_OP_SESSIONLESS
;
139
140
switch
(type) {
141
case
RTE_CRYPTO_OP_TYPE_SYMMETRIC
:
142
__rte_crypto_sym_op_reset
(op->
sym
);
143
break
;
144
case
RTE_CRYPTO_OP_TYPE_ASYMMETRIC
:
145
memset(op->
asym
, 0,
sizeof
(
struct
rte_crypto_asym_op
));
146
break
;
147
case
RTE_CRYPTO_OP_TYPE_UNDEFINED
:
148
default
:
149
break
;
150
}
151
}
152
156
struct
rte_crypto_op_pool_private
{
157
enum
rte_crypto_op_type
type
;
159
uint16_t
priv_size
;
161
};
162
163
172
static
inline
uint16_t
173
__rte_crypto_op_get_priv_data_size
(
struct
rte_mempool
*mempool)
174
{
175
struct
rte_crypto_op_pool_private
*priv =
176
(
struct
rte_crypto_op_pool_private
*)
rte_mempool_get_priv
(mempool);
177
178
return
priv->
priv_size
;
179
}
180
181
201
extern
struct
rte_mempool
*
202
rte_crypto_op_pool_create
(
const
char
*
name
,
enum
rte_crypto_op_type
type,
203
unsigned
nb_elts,
unsigned
cache_size
, uint16_t priv_size,
204
int
socket_id
);
205
217
static
inline
int
218
__rte_crypto_op_raw_bulk_alloc
(
struct
rte_mempool
*mempool,
219
enum
rte_crypto_op_type
type,
220
struct
rte_crypto_op
**ops, uint16_t nb_ops)
221
{
222
struct
rte_crypto_op_pool_private
*priv;
223
224
priv = (
struct
rte_crypto_op_pool_private
*)
rte_mempool_get_priv
(mempool);
225
if
(
unlikely
(priv->
type
!= type &&
226
priv->
type
!=
RTE_CRYPTO_OP_TYPE_UNDEFINED
))
227
return
-EINVAL;
228
229
if
(
rte_mempool_get_bulk
(mempool, (
void
**)ops, nb_ops) == 0)
230
return
nb_ops;
231
232
return
0;
233
}
234
245
static
inline
struct
rte_crypto_op
*
246
rte_crypto_op_alloc
(
struct
rte_mempool
*
mempool
,
enum
rte_crypto_op_type
type
)
247
{
248
struct
rte_crypto_op
*op = NULL;
249
int
retval;
250
251
retval =
__rte_crypto_op_raw_bulk_alloc
(mempool, type, &op, 1);
252
if
(
unlikely
(retval != 1))
253
return
NULL;
254
255
__rte_crypto_op_reset
(op, type);
256
257
return
op;
258
}
259
260
275
static
inline
unsigned
276
rte_crypto_op_bulk_alloc
(
struct
rte_mempool
*
mempool
,
277
enum
rte_crypto_op_type
type
,
278
struct
rte_crypto_op
**ops, uint16_t nb_ops)
279
{
280
int
i;
281
282
if
(
unlikely
(
__rte_crypto_op_raw_bulk_alloc
(mempool, type, ops, nb_ops)
283
!= nb_ops))
284
return
0;
285
286
for
(i = 0; i < nb_ops; i++)
287
__rte_crypto_op_reset
(ops[i], type);
288
289
return
nb_ops;
290
}
291
292
293
305
static
inline
void
*
306
__rte_crypto_op_get_priv_data
(
struct
rte_crypto_op
*op, uint32_t size)
307
{
308
uint32_t priv_size;
309
310
if
(
likely
(op->
mempool
!= NULL)) {
311
priv_size =
__rte_crypto_op_get_priv_data_size
(op->
mempool
);
312
313
if
(
likely
(priv_size >= size)) {
314
if
(op->
type
==
RTE_CRYPTO_OP_TYPE_SYMMETRIC
)
315
return
(
void
*)((uint8_t *)(op + 1) +
316
sizeof
(
struct
rte_crypto_sym_op
));
317
if
(op->
type
==
RTE_CRYPTO_OP_TYPE_ASYMMETRIC
)
318
return
(
void
*)((uint8_t *)(op + 1) +
319
sizeof
(
struct
rte_crypto_asym_op
));
320
}
321
}
322
323
return
NULL;
324
}
325
333
static
inline
void
334
rte_crypto_op_free
(
struct
rte_crypto_op
*op)
335
{
336
if
(op != NULL && op->
mempool
!= NULL)
337
rte_mempool_put
(op->
mempool
, op);
338
}
339
351
static
inline
struct
rte_crypto_op
*
352
rte_crypto_sym_op_alloc_from_mbuf_priv_data
(
struct
rte_mbuf
*m)
353
{
354
if
(
unlikely
(m == NULL))
355
return
NULL;
356
357
/*
358
* check that the mbuf's private data size is sufficient to contain a
359
* crypto operation
360
*/
361
if
(
unlikely
(m->
priv_size
< (
sizeof
(
struct
rte_crypto_op
) +
362
sizeof
(
struct
rte_crypto_sym_op
))))
363
return
NULL;
364
365
/* private data starts immediately after the mbuf header in the mbuf. */
366
struct
rte_crypto_op
*op = (
struct
rte_crypto_op
*)(m + 1);
367
368
__rte_crypto_op_reset
(op,
RTE_CRYPTO_OP_TYPE_SYMMETRIC
);
369
370
op->
mempool
= NULL;
371
op->
sym
->
m_src
= m;
372
373
return
op;
374
}
375
385
static
inline
struct
rte_crypto_sym_xform
*
386
rte_crypto_op_sym_xforms_alloc
(
struct
rte_crypto_op
*op, uint8_t nb_xforms)
387
{
388
void
*priv_data;
389
uint32_t size;
390
391
if
(
unlikely
(op->
type
!=
RTE_CRYPTO_OP_TYPE_SYMMETRIC
))
392
return
NULL;
393
394
size =
sizeof
(
struct
rte_crypto_sym_xform
) * nb_xforms;
395
396
priv_data =
__rte_crypto_op_get_priv_data
(op, size);
397
if
(priv_data == NULL)
398
return
NULL;
399
400
return
__rte_crypto_sym_op_sym_xforms_alloc
(op->
sym
, priv_data,
401
nb_xforms);
402
}
403
404
411
static
inline
int
412
rte_crypto_op_attach_sym_session
(
struct
rte_crypto_op
*op,
413
struct
rte_cryptodev_sym_session
*sess)
414
{
415
if
(
unlikely
(op->
type
!=
RTE_CRYPTO_OP_TYPE_SYMMETRIC
))
416
return
-1;
417
418
op->
sess_type
=
RTE_CRYPTO_OP_WITH_SESSION
;
419
420
return
__rte_crypto_sym_op_attach_sym_session
(op->
sym
, sess);
421
}
422
429
static
inline
int
430
rte_crypto_op_attach_asym_session
(
struct
rte_crypto_op
*op,
431
struct
rte_cryptodev_asym_session
*sess)
432
{
433
if
(
unlikely
(op->
type
!=
RTE_CRYPTO_OP_TYPE_ASYMMETRIC
))
434
return
-1;
435
436
op->
sess_type
=
RTE_CRYPTO_OP_WITH_SESSION
;
437
op->
asym
->
session
= sess;
438
return
0;
439
}
440
441
#ifdef __cplusplus
442
}
443
#endif
444
445
#endif
/* _RTE_CRYPTO_H_ */
Generated by
1.8.1.2