DPDK  20.11.10
rte_crypto_sym.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2016-2020 Intel Corporation
3  */
4 
5 #ifndef _RTE_CRYPTO_SYM_H_
6 #define _RTE_CRYPTO_SYM_H_
7 
17 #ifdef __cplusplus
18 extern "C" {
19 #endif
20 
21 #include <string.h>
22 
23 #include <rte_mbuf.h>
24 #include <rte_memory.h>
25 #include <rte_mempool.h>
26 #include <rte_common.h>
27 
35  void *base;
39  uint32_t len;
40 };
41 
50  uint32_t num;
51 };
52 
59  void *va;
61 };
62 
70  uint32_t num;
77 
78  __extension__
79  union {
84  };
85 
91  int32_t *status;
92 };
93 
99  uint64_t raw;
100  struct {
101  struct {
102  uint16_t head;
103  uint16_t tail;
104  } auth, cipher;
105  } ofs;
106 };
107 
165 };
166 
168 extern const char *
170 
177 };
178 
180 extern const char *
182 
198  struct {
199  const uint8_t *data;
200  uint16_t length;
201  } key;
225  struct {
226  uint16_t offset;
252  uint16_t length;
267  } iv;
268 };
269 
344 };
345 
347 extern const char *
349 
354 };
355 
357 extern const char *
359 
373  struct {
374  const uint8_t *data;
375  uint16_t length;
376  } key;
384  struct {
385  uint16_t offset;
401  uint16_t length;
419  } iv;
421  uint16_t digest_length;
431 };
432 
433 
448 };
449 
451 extern const char *
453 
460 };
461 
463 extern const char *
465 
466 struct rte_crypto_aead_xform {
469  enum rte_crypto_aead_algorithm algo;
472  struct {
473  const uint8_t *data;
474  uint16_t length;
475  } key;
476 
477  struct {
478  uint16_t offset;
498  uint16_t length;
514  } iv;
516  uint16_t digest_length;
517 
518  uint16_t aad_length;
524 };
525 
532 };
533 
543 /* Structure rte_crypto_sym_xform 8< */
548  ;
550  union {
553  struct rte_crypto_cipher_xform cipher;
555  struct rte_crypto_aead_xform aead;
557  };
558 };
559 /* >8 End of structure rte_crypto_sym_xform. */
560 
562 
593 /* Structure rte_crypto_sym_op 8< */
595  struct rte_mbuf *m_src;
596  struct rte_mbuf *m_dst;
599  union {
604  struct rte_security_session *sec_session;
606  };
607 
609  union {
610  struct {
611  struct {
612  uint32_t offset;
617  uint32_t length;
622  } data;
623  struct {
624  uint8_t *data;
646  } digest;
647  struct {
648  uint8_t *data;
679  rte_iova_t phys_addr;
680  } aad;
682  } aead;
683 
684  struct {
685  struct {
686  struct {
687  uint32_t offset;
703  uint32_t length;
719  } data;
720  } cipher;
721 
722  struct {
723  struct {
724  uint32_t offset;
750  uint32_t length;
774  } data;
777  struct {
778  uint8_t *data;
849  rte_iova_t phys_addr;
851  } digest;
852  } auth;
853  };
854  };
855 };
856 /* >8 End of structure rte_crypto_sym_op. */
857 
858 
864 static inline void
866 {
867  memset(op, 0, sizeof(*op));
868 }
869 
870 
881 static inline struct rte_crypto_sym_xform *
883  void *priv_data, uint8_t nb_xforms)
884 {
885  struct rte_crypto_sym_xform *xform;
886 
887  sym_op->xform = xform = (struct rte_crypto_sym_xform *)priv_data;
888 
889  do {
891  xform = xform->next = --nb_xforms > 0 ? xform + 1 : NULL;
892  } while (xform);
893 
894  return sym_op->xform;
895 }
896 
897 
904 static inline int
906  struct rte_cryptodev_sym_session *sess)
907 {
908  sym_op->session = sess;
909 
910  return 0;
911 }
912 
931 __rte_experimental
932 static inline int
933 rte_crypto_mbuf_to_vec(const struct rte_mbuf *mb, uint32_t ofs, uint32_t len,
934  struct rte_crypto_vec vec[], uint32_t num)
935 {
936  uint32_t i;
937  struct rte_mbuf *nseg;
938  uint32_t left;
939  uint32_t seglen;
940 
941  /* assuming that requested data starts in the first segment */
942  RTE_ASSERT(mb->data_len > ofs);
943 
944  if (mb->nb_segs > num)
945  return -mb->nb_segs;
946 
947  vec[0].base = rte_pktmbuf_mtod_offset(mb, void *, ofs);
948  vec[0].iova = rte_pktmbuf_iova_offset(mb, ofs);
949 
950  /* whole data lies in the first segment */
951  seglen = mb->data_len - ofs;
952  if (len <= seglen) {
953  vec[0].len = len;
954  return 1;
955  }
956 
957  /* data spread across segments */
958  vec[0].len = seglen;
959  left = len - seglen;
960  for (i = 1, nseg = mb->next; nseg != NULL; nseg = nseg->next, i++) {
961 
962  vec[i].base = rte_pktmbuf_mtod(nseg, void *);
963  vec[i].iova = rte_pktmbuf_iova(nseg);
964 
965  seglen = nseg->data_len;
966  if (left <= seglen) {
967  /* whole requested data is completed */
968  vec[i].len = left;
969  left = 0;
970  i++;
971  break;
972  }
973 
974  /* use whole segment */
975  vec[i].len = seglen;
976  left -= seglen;
977  }
978 
979  RTE_ASSERT(left == 0);
980  return i;
981 }
982 
983 
984 #ifdef __cplusplus
985 }
986 #endif
987 
988 #endif /* _RTE_CRYPTO_SYM_H_ */
struct rte_mbuf * next
static __rte_experimental int rte_crypto_mbuf_to_vec(const struct rte_mbuf *mb, uint32_t ofs, uint32_t len, struct rte_crypto_vec vec[], uint32_t num)
struct rte_crypto_va_iova_ptr * auth_iv
struct rte_security_session * sec_session
uint64_t rte_iova_t
Definition: rte_common.h:423
#define rte_pktmbuf_iova(m)
uint16_t data_len
static void __rte_crypto_sym_op_reset(struct rte_crypto_sym_op *op)
struct rte_mbuf * m_src
#define rte_pktmbuf_iova_offset(m, o)
rte_crypto_auth_operation
const char * rte_crypto_cipher_operation_strings[]
uint16_t nb_segs
const char * rte_crypto_aead_operation_strings[]
rte_crypto_cipher_operation
#define rte_pktmbuf_mtod_offset(m, t, o)
struct rte_crypto_sgl * sgl
const char * rte_crypto_aead_algorithm_strings[]
static struct rte_crypto_sym_xform * __rte_crypto_sym_op_sym_xforms_alloc(struct rte_crypto_sym_op *sym_op, void *priv_data, uint8_t nb_xforms)
rte_crypto_aead_operation
#define rte_pktmbuf_mtod(m, t)
struct rte_mbuf * m_dst
static int __rte_crypto_sym_op_attach_sym_session(struct rte_crypto_sym_op *sym_op, struct rte_cryptodev_sym_session *sess)
struct rte_crypto_va_iova_ptr * aad
struct rte_cryptodev_sym_session * session
#define RTE_STD_C11
Definition: rte_common.h:40
struct rte_crypto_vec * vec
rte_crypto_auth_algorithm
rte_crypto_sym_xform_type
const char * rte_crypto_auth_algorithm_strings[]
const uint8_t * data
struct rte_crypto_sym_xform * xform
enum rte_crypto_sym_xform_type type
const char * rte_crypto_auth_operation_strings[]
struct rte_crypto_va_iova_ptr * iv
struct rte_crypto_va_iova_ptr * digest
struct rte_crypto_sym_xform * next
rte_iova_t phys_addr
rte_iova_t iova
rte_crypto_aead_algorithm
const char * rte_crypto_cipher_algorithm_strings[]
rte_crypto_cipher_algorithm