DPDK  23.03.0
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_compat.h>
24 #include <rte_mbuf.h>
25 #include <rte_memory.h>
26 #include <rte_mempool.h>
27 #include <rte_common.h>
28 
36  void *base;
40  uint32_t len;
42  uint32_t tot_len;
43 };
44 
53  uint32_t num;
54 };
55 
62  void *va;
64 };
65 
73  uint32_t num;
82 
83  __extension__
84  union {
89  };
90 
96  int32_t *status;
97 };
98 
104  uint64_t raw;
105  struct {
106  struct {
107  uint16_t head;
108  uint16_t tail;
109  } auth, cipher;
110  } ofs;
111 };
112 
177 };
178 
180 __rte_deprecated
181 extern const char *
183 
190 };
191 
193 extern const char *
195 
211  struct {
212  const uint8_t *data;
213  uint16_t length;
214  } key;
246  struct {
247  uint16_t offset;
273  uint16_t length;
288  } iv;
290  uint32_t dataunit_len;
301 };
302 
384 };
385 
387 __rte_deprecated
388 extern const char *
390 
395 };
396 
398 extern const char *
400 
414  struct {
415  const uint8_t *data;
416  uint16_t length;
417  } key;
425  struct {
426  uint16_t offset;
442  uint16_t length;
460  } iv;
462  uint16_t digest_length;
472 };
473 
474 
489 };
490 
492 __rte_deprecated
493 extern const char *
495 
502 };
503 
505 extern const char *
507 
508 struct rte_crypto_aead_xform {
511  enum rte_crypto_aead_algorithm algo;
514  struct {
515  const uint8_t *data;
516  uint16_t length;
517  } key;
518 
519  struct {
520  uint16_t offset;
540  uint16_t length;
556  } iv;
558  uint16_t digest_length;
559 
560  uint16_t aad_length;
566 };
567 
574 };
575 
585 /* Structure rte_crypto_sym_xform 8< */
590  ;
592  union {
595  struct rte_crypto_cipher_xform cipher;
597  struct rte_crypto_aead_xform aead;
599  };
600 };
601 /* >8 End of structure rte_crypto_sym_xform. */
602 
633 /* Structure rte_crypto_sym_op 8< */
635  struct rte_mbuf *m_src;
636  struct rte_mbuf *m_dst;
639  union {
640  void *session;
644  };
645 
647  union {
648  struct {
649  struct {
650  uint32_t offset;
655  uint32_t length;
660  } data;
661  struct {
662  uint8_t *data;
684  } digest;
685  struct {
686  uint8_t *data;
717  rte_iova_t phys_addr;
718  } aad;
720  } aead;
721 
722  struct {
723  struct {
724  struct {
725  uint32_t offset;
741  uint32_t length;
758  } data;
759  } cipher;
760 
761  struct {
762  struct {
763  uint32_t offset;
789  uint32_t length;
813  } data;
816  struct {
817  uint8_t *data;
888  rte_iova_t phys_addr;
890  } digest;
891  } auth;
892  };
893  };
894 };
895 /* >8 End of structure rte_crypto_sym_op. */
896 
897 
903 static inline void
905 {
906  memset(op, 0, sizeof(*op));
907 }
908 
909 
920 static inline struct rte_crypto_sym_xform *
922  void *priv_data, uint8_t nb_xforms)
923 {
924  struct rte_crypto_sym_xform *xform;
925 
926  sym_op->xform = xform = (struct rte_crypto_sym_xform *)priv_data;
927 
928  do {
930  xform = xform->next = --nb_xforms > 0 ? xform + 1 : NULL;
931  } while (xform);
932 
933  return sym_op->xform;
934 }
935 
936 
943 static inline int
945 {
946  sym_op->session = sess;
947 
948  return 0;
949 }
950 
969 __rte_experimental
970 static inline int
971 rte_crypto_mbuf_to_vec(const struct rte_mbuf *mb, uint32_t ofs, uint32_t len,
972  struct rte_crypto_vec vec[], uint32_t num)
973 {
974  uint32_t i;
975  struct rte_mbuf *nseg;
976  uint32_t left;
977  uint32_t seglen;
978 
979  /* assuming that requested data starts in the first segment */
980  RTE_ASSERT(mb->data_len > ofs);
981 
982  if (mb->nb_segs > num)
983  return -mb->nb_segs;
984 
985  vec[0].base = rte_pktmbuf_mtod_offset(mb, void *, ofs);
986  vec[0].iova = rte_pktmbuf_iova_offset(mb, ofs);
987  vec[0].tot_len = mb->buf_len - rte_pktmbuf_headroom(mb) - ofs;
988 
989  /* whole data lies in the first segment */
990  seglen = mb->data_len - ofs;
991  if (len <= seglen) {
992  vec[0].len = len;
993  return 1;
994  }
995 
996  /* data spread across segments */
997  vec[0].len = seglen;
998  left = len - seglen;
999  for (i = 1, nseg = mb->next; nseg != NULL; nseg = nseg->next, i++) {
1000 
1001  vec[i].base = rte_pktmbuf_mtod(nseg, void *);
1002  vec[i].iova = rte_pktmbuf_iova(nseg);
1003  vec[i].tot_len = mb->buf_len - rte_pktmbuf_headroom(mb) - ofs;
1004 
1005  seglen = nseg->data_len;
1006  if (left <= seglen) {
1007  /* whole requested data is completed */
1008  vec[i].len = left;
1009  left = 0;
1010  i++;
1011  break;
1012  }
1013 
1014  /* use whole segment */
1015  vec[i].len = seglen;
1016  left -= seglen;
1017  }
1018 
1019  RTE_ASSERT(left == 0);
1020  return i;
1021 }
1022 
1023 
1024 #ifdef __cplusplus
1025 }
1026 #endif
1027 
1028 #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
static int __rte_crypto_sym_op_attach_sym_session(struct rte_crypto_sym_op *sym_op, void *sess)
__rte_deprecated const char * rte_crypto_auth_algorithm_strings[]
uint64_t rte_iova_t
Definition: rte_common.h:458
#define rte_pktmbuf_iova(m)
uint16_t data_len
__rte_deprecated const char * rte_crypto_aead_algorithm_strings[]
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)
static uint16_t rte_pktmbuf_headroom(const struct rte_mbuf *m)
Definition: rte_mbuf.h:1511
rte_crypto_auth_operation
const char * rte_crypto_cipher_operation_strings[]
struct rte_crypto_sgl * dest_sgl
uint32_t tot_len
uint16_t nb_segs
const char * rte_crypto_aead_operation_strings[]
rte_crypto_cipher_operation
#define rte_pktmbuf_mtod_offset(m, t, o)
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
struct rte_crypto_va_iova_ptr * aad
uint16_t buf_len
__rte_deprecated const char * rte_crypto_cipher_algorithm_strings[]
#define RTE_STD_C11
Definition: rte_common.h:39
struct rte_crypto_vec * vec
rte_crypto_auth_algorithm
rte_crypto_sym_xform_type
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_sgl * src_sgl
struct rte_crypto_sym_xform * next
rte_iova_t phys_addr
rte_iova_t iova
rte_crypto_aead_algorithm
rte_crypto_cipher_algorithm