DPDK  21.11.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_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;
41  uint32_t tot_len;
42 };
43 
52  uint32_t num;
53 };
54 
61  void *va;
63 };
64 
72  uint32_t num;
81 
82  __extension__
83  union {
88  };
89 
95  int32_t *status;
96 };
97 
103  uint64_t raw;
104  struct {
105  struct {
106  uint16_t head;
107  uint16_t tail;
108  } auth, cipher;
109  } ofs;
110 };
111 
169 };
170 
172 extern const char *
174 
181 };
182 
184 extern const char *
186 
202  struct {
203  const uint8_t *data;
204  uint16_t length;
205  } key;
237  struct {
238  uint16_t offset;
264  uint16_t length;
279  } iv;
281  uint32_t dataunit_len;
292 };
293 
368 };
369 
371 extern const char *
373 
378 };
379 
381 extern const char *
383 
397  struct {
398  const uint8_t *data;
399  uint16_t length;
400  } key;
408  struct {
409  uint16_t offset;
425  uint16_t length;
443  } iv;
445  uint16_t digest_length;
455 };
456 
457 
472 };
473 
475 extern const char *
477 
484 };
485 
487 extern const char *
489 
490 struct rte_crypto_aead_xform {
493  enum rte_crypto_aead_algorithm algo;
496  struct {
497  const uint8_t *data;
498  uint16_t length;
499  } key;
500 
501  struct {
502  uint16_t offset;
522  uint16_t length;
538  } iv;
540  uint16_t digest_length;
541 
542  uint16_t aad_length;
548 };
549 
556 };
557 
571  ;
573  union {
576  struct rte_crypto_cipher_xform cipher;
578  struct rte_crypto_aead_xform aead;
580  };
581 };
582 
584 
616  struct rte_mbuf *m_src;
617  struct rte_mbuf *m_dst;
620  union {
625  struct rte_security_session *sec_session;
627  };
628 
630  union {
631  struct {
632  struct {
633  uint32_t offset;
638  uint32_t length;
643  } data;
644  struct {
645  uint8_t *data;
667  } digest;
668  struct {
669  uint8_t *data;
700  rte_iova_t phys_addr;
701  } aad;
703  } aead;
704 
705  struct {
706  struct {
707  struct {
708  uint32_t offset;
724  uint32_t length;
741  } data;
742  } cipher;
743 
744  struct {
745  struct {
746  uint32_t offset;
772  uint32_t length;
796  } data;
799  struct {
800  uint8_t *data;
871  rte_iova_t phys_addr;
873  } digest;
874  } auth;
875  };
876  };
877 };
878 
879 
885 static inline void
887 {
888  memset(op, 0, sizeof(*op));
889 }
890 
891 
902 static inline struct rte_crypto_sym_xform *
904  void *priv_data, uint8_t nb_xforms)
905 {
906  struct rte_crypto_sym_xform *xform;
907 
908  sym_op->xform = xform = (struct rte_crypto_sym_xform *)priv_data;
909 
910  do {
912  xform = xform->next = --nb_xforms > 0 ? xform + 1 : NULL;
913  } while (xform);
914 
915  return sym_op->xform;
916 }
917 
918 
925 static inline int
927  struct rte_cryptodev_sym_session *sess)
928 {
929  sym_op->session = sess;
930 
931  return 0;
932 }
933 
952 __rte_experimental
953 static inline int
954 rte_crypto_mbuf_to_vec(const struct rte_mbuf *mb, uint32_t ofs, uint32_t len,
955  struct rte_crypto_vec vec[], uint32_t num)
956 {
957  uint32_t i;
958  struct rte_mbuf *nseg;
959  uint32_t left;
960  uint32_t seglen;
961 
962  /* assuming that requested data starts in the first segment */
963  RTE_ASSERT(mb->data_len > ofs);
964 
965  if (mb->nb_segs > num)
966  return -mb->nb_segs;
967 
968  vec[0].base = rte_pktmbuf_mtod_offset(mb, void *, ofs);
969  vec[0].iova = rte_pktmbuf_iova_offset(mb, ofs);
970  vec[0].tot_len = mb->buf_len - rte_pktmbuf_headroom(mb) - ofs;
971 
972  /* whole data lies in the first segment */
973  seglen = mb->data_len - ofs;
974  if (len <= seglen) {
975  vec[0].len = len;
976  return 1;
977  }
978 
979  /* data spread across segments */
980  vec[0].len = seglen;
981  left = len - seglen;
982  for (i = 1, nseg = mb->next; nseg != NULL; nseg = nseg->next, i++) {
983 
984  vec[i].base = rte_pktmbuf_mtod(nseg, void *);
985  vec[i].iova = rte_pktmbuf_iova(nseg);
986  vec[i].tot_len = mb->buf_len - rte_pktmbuf_headroom(mb) - ofs;
987 
988  seglen = nseg->data_len;
989  if (left <= seglen) {
990  /* whole requested data is completed */
991  vec[i].len = left;
992  left = 0;
993  i++;
994  break;
995  }
996 
997  /* use whole segment */
998  vec[i].len = seglen;
999  left -= seglen;
1000  }
1001 
1002  RTE_ASSERT(left == 0);
1003  return i;
1004 }
1005 
1006 
1007 #ifdef __cplusplus
1008 }
1009 #endif
1010 
1011 #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:420
#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)
static uint16_t rte_pktmbuf_headroom(const struct rte_mbuf *m)
Definition: rte_mbuf.h:1479
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)
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
uint16_t buf_len
struct rte_cryptodev_sym_session * session
#define RTE_STD_C11
Definition: rte_common.h:42
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_sgl * src_sgl
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