DPDK
18.05.1
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
__extension__
77
union
{
78
uint64_t raw;
79
__extension__
80
struct
{
81
uint8_t
type
;
83
uint8_t
status
;
91
uint8_t
sess_type
;
93
uint8_t
reserved
[3];
97
uint16_t
private_data_offset
;
105
};
106
};
107
struct
rte_mempool
*
mempool
;
110
rte_iova_t
phys_addr
;
113
__extension__
114
union
{
115
struct
rte_crypto_sym_op
sym
[0];
117
};
118
};
119
126
static
inline
void
127
__rte_crypto_op_reset
(
struct
rte_crypto_op
*op,
enum
rte_crypto_op_type
type)
128
{
129
op->
type
= type;
130
op->
status
=
RTE_CRYPTO_OP_STATUS_NOT_PROCESSED
;
131
op->
sess_type
=
RTE_CRYPTO_OP_SESSIONLESS
;
132
133
switch
(type) {
134
case
RTE_CRYPTO_OP_TYPE_SYMMETRIC
:
135
__rte_crypto_sym_op_reset
(op->
sym
);
136
break
;
137
case
RTE_CRYPTO_OP_TYPE_UNDEFINED
:
138
default
:
139
break
;
140
}
141
}
142
146
struct
rte_crypto_op_pool_private
{
147
enum
rte_crypto_op_type
type
;
149
uint16_t
priv_size
;
151
};
152
153
162
static
inline
uint16_t
163
__rte_crypto_op_get_priv_data_size
(
struct
rte_mempool
*mempool)
164
{
165
struct
rte_crypto_op_pool_private
*priv =
166
(
struct
rte_crypto_op_pool_private
*)
rte_mempool_get_priv
(mempool);
167
168
return
priv->
priv_size
;
169
}
170
171
191
extern
struct
rte_mempool
*
192
rte_crypto_op_pool_create
(
const
char
*
name
,
enum
rte_crypto_op_type
type,
193
unsigned
nb_elts,
unsigned
cache_size
, uint16_t priv_size,
194
int
socket_id
);
195
207
static
inline
int
208
__rte_crypto_op_raw_bulk_alloc
(
struct
rte_mempool
*mempool,
209
enum
rte_crypto_op_type
type,
210
struct
rte_crypto_op
**ops, uint16_t nb_ops)
211
{
212
struct
rte_crypto_op_pool_private
*priv;
213
214
priv = (
struct
rte_crypto_op_pool_private
*)
rte_mempool_get_priv
(mempool);
215
if
(
unlikely
(priv->
type
!= type &&
216
priv->
type
!=
RTE_CRYPTO_OP_TYPE_UNDEFINED
))
217
return
-EINVAL;
218
219
if
(
rte_mempool_get_bulk
(mempool, (
void
**)ops, nb_ops) == 0)
220
return
nb_ops;
221
222
return
0;
223
}
224
235
static
inline
struct
rte_crypto_op
*
236
rte_crypto_op_alloc
(
struct
rte_mempool
*
mempool
,
enum
rte_crypto_op_type
type
)
237
{
238
struct
rte_crypto_op
*op = NULL;
239
int
retval;
240
241
retval =
__rte_crypto_op_raw_bulk_alloc
(mempool, type, &op, 1);
242
if
(
unlikely
(retval != 1))
243
return
NULL;
244
245
__rte_crypto_op_reset
(op, type);
246
247
return
op;
248
}
249
250
265
static
inline
unsigned
266
rte_crypto_op_bulk_alloc
(
struct
rte_mempool
*
mempool
,
267
enum
rte_crypto_op_type
type
,
268
struct
rte_crypto_op
**ops, uint16_t nb_ops)
269
{
270
int
i;
271
272
if
(
unlikely
(
__rte_crypto_op_raw_bulk_alloc
(mempool, type, ops, nb_ops)
273
!= nb_ops))
274
return
0;
275
276
for
(i = 0; i < nb_ops; i++)
277
__rte_crypto_op_reset
(ops[i], type);
278
279
return
nb_ops;
280
}
281
282
283
295
static
inline
void
*
296
__rte_crypto_op_get_priv_data
(
struct
rte_crypto_op
*op, uint32_t size)
297
{
298
uint32_t priv_size;
299
300
if
(
likely
(op->
mempool
!= NULL)) {
301
priv_size =
__rte_crypto_op_get_priv_data_size
(op->
mempool
);
302
303
if
(
likely
(priv_size >= size))
304
return
(
void
*)((uint8_t *)(op + 1) +
305
sizeof
(
struct
rte_crypto_sym_op
));
306
}
307
308
return
NULL;
309
}
310
318
static
inline
void
319
rte_crypto_op_free
(
struct
rte_crypto_op
*op)
320
{
321
if
(op != NULL && op->
mempool
!= NULL)
322
rte_mempool_put
(op->
mempool
, op);
323
}
324
336
static
inline
struct
rte_crypto_op
*
337
rte_crypto_sym_op_alloc_from_mbuf_priv_data
(
struct
rte_mbuf
*m)
338
{
339
if
(
unlikely
(m == NULL))
340
return
NULL;
341
342
/*
343
* check that the mbuf's private data size is sufficient to contain a
344
* crypto operation
345
*/
346
if
(
unlikely
(m->
priv_size
< (
sizeof
(
struct
rte_crypto_op
) +
347
sizeof
(
struct
rte_crypto_sym_op
))))
348
return
NULL;
349
350
/* private data starts immediately after the mbuf header in the mbuf. */
351
struct
rte_crypto_op
*op = (
struct
rte_crypto_op
*)(m + 1);
352
353
__rte_crypto_op_reset
(op,
RTE_CRYPTO_OP_TYPE_SYMMETRIC
);
354
355
op->
mempool
= NULL;
356
op->
sym
->
m_src
= m;
357
358
return
op;
359
}
360
370
static
inline
struct
rte_crypto_sym_xform
*
371
rte_crypto_op_sym_xforms_alloc
(
struct
rte_crypto_op
*op, uint8_t nb_xforms)
372
{
373
void
*priv_data;
374
uint32_t size;
375
376
if
(
unlikely
(op->
type
!=
RTE_CRYPTO_OP_TYPE_SYMMETRIC
))
377
return
NULL;
378
379
size =
sizeof
(
struct
rte_crypto_sym_xform
) * nb_xforms;
380
381
priv_data =
__rte_crypto_op_get_priv_data
(op, size);
382
if
(priv_data == NULL)
383
return
NULL;
384
385
return
__rte_crypto_sym_op_sym_xforms_alloc
(op->
sym
, priv_data,
386
nb_xforms);
387
}
388
389
396
static
inline
int
397
rte_crypto_op_attach_sym_session
(
struct
rte_crypto_op
*op,
398
struct
rte_cryptodev_sym_session
*sess)
399
{
400
if
(
unlikely
(op->
type
!=
RTE_CRYPTO_OP_TYPE_SYMMETRIC
))
401
return
-1;
402
403
op->
sess_type
=
RTE_CRYPTO_OP_WITH_SESSION
;
404
405
return
__rte_crypto_sym_op_attach_sym_session
(op->
sym
, sess);
406
}
407
408
#ifdef __cplusplus
409
}
410
#endif
411
412
#endif
/* _RTE_CRYPTO_H_ */
Generated by
1.8.1.2