DPDK  18.05.1
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 
33 };
34 
52 };
53 
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  };
113  __extension__
114  union {
117  };
118 };
119 
126 static inline void
128 {
129  op->type = type;
132 
133  switch (type) {
136  break;
138  default:
139  break;
140  }
141 }
142 
149  uint16_t priv_size;
151 };
152 
153 
162 static inline uint16_t
164 {
165  struct rte_crypto_op_pool_private *priv =
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
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 &&
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 *
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
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 *
297 {
298  uint32_t priv_size;
299 
300  if (likely(op->mempool != NULL)) {
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
320 {
321  if (op != NULL && op->mempool != NULL)
322  rte_mempool_put(op->mempool, op);
323 }
324 
336 static inline struct rte_crypto_op *
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 
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 
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
398  struct rte_cryptodev_sym_session *sess)
399 {
401  return -1;
402 
404 
406 }
407 
408 #ifdef __cplusplus
409 }
410 #endif
411 
412 #endif /* _RTE_CRYPTO_H_ */