DPDK  16.07.2
rte_cryptodev.h
Go to the documentation of this file.
1 /*-
2  *
3  * Copyright(c) 2015-2016 Intel Corporation. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * * Redistributions of source code must retain the above copyright
10  * notice, this list of conditions and the following disclaimer.
11  * * Redistributions in binary form must reproduce the above copyright
12  * notice, this list of conditions and the following disclaimer in
13  * the documentation and/or other materials provided with the
14  * distribution.
15  * * Neither the name of Intel Corporation nor the names of its
16  * contributors may be used to endorse or promote products derived
17  * from this software without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 #ifndef _RTE_CRYPTODEV_H_
33 #define _RTE_CRYPTODEV_H_
34 
44 #ifdef __cplusplus
45 extern "C" {
46 #endif
47 
48 #include "rte_kvargs.h"
49 #include "rte_crypto.h"
50 #include "rte_dev.h"
51 
52 #define CRYPTODEV_NAME_NULL_PMD cryptodev_null_pmd
53 
54 #define CRYPTODEV_NAME_AESNI_MB_PMD cryptodev_aesni_mb_pmd
55 
56 #define CRYPTODEV_NAME_AESNI_GCM_PMD cryptodev_aesni_gcm_pmd
57 
58 #define CRYPTODEV_NAME_QAT_SYM_PMD cryptodev_qat_sym_pmd
59 
60 #define CRYPTODEV_NAME_SNOW3G_PMD cryptodev_snow3g_pmd
61 
62 #define CRYPTODEV_NAME_KASUMI_PMD cryptodev_kasumi_pmd
63 
73 };
74 
75 extern const char **rte_cyptodev_names;
76 
77 /* Logging Macros */
78 
79 #define CDEV_LOG_ERR(fmt, args...) \
80  RTE_LOG(ERR, CRYPTODEV, "%s() line %u: " fmt "\n", \
81  __func__, __LINE__, ## args)
82 
83 #define CDEV_PMD_LOG_ERR(dev, fmt, args...) \
84  RTE_LOG(ERR, CRYPTODEV, "[%s] %s() line %u: " fmt "\n", \
85  dev, __func__, __LINE__, ## args)
86 
87 #ifdef RTE_LIBRTE_CRYPTODEV_DEBUG
88 #define CDEV_LOG_DEBUG(fmt, args...) \
89  RTE_LOG(DEBUG, CRYPTODEV, "%s() line %u: " fmt "\n", \
90  __func__, __LINE__, ## args) \
91 
92 #define CDEV_PMD_TRACE(fmt, args...) \
93  RTE_LOG(DEBUG, CRYPTODEV, "[%s] %s: " fmt "\n", \
94  dev, __func__, ## args)
95 
96 #else
97 #define CDEV_LOG_DEBUG(fmt, args...)
98 #define CDEV_PMD_TRACE(fmt, args...)
99 #endif
100 
107  union {
108  struct {
111  uint16_t block_size;
113  struct {
114  uint16_t min;
115  uint16_t max;
116  uint16_t increment;
121  } key_size;
123  struct {
124  uint16_t min;
125  uint16_t max;
126  uint16_t increment;
131  } digest_size;
133  struct {
134  uint16_t min;
135  uint16_t max;
136  uint16_t increment;
141  } aad_size;
143  } auth;
145  struct {
148  uint16_t block_size;
150  struct {
151  uint16_t min;
152  uint16_t max;
153  uint16_t increment;
158  } key_size;
160  struct {
161  uint16_t min;
162  uint16_t max;
163  uint16_t increment;
168  } iv_size;
170  } cipher;
172  };
173 };
174 
180  union {
183  };
184 };
185 
187 #define RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST() \
188  { RTE_CRYPTO_OP_TYPE_UNDEFINED }
189 
190 
199 #define RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO (1ULL << 0)
200 
201 #define RTE_CRYPTODEV_FF_ASYMMETRIC_CRYPTO (1ULL << 1)
202 
203 #define RTE_CRYPTODEV_FF_SYM_OPERATION_CHAINING (1ULL << 2)
204 
205 #define RTE_CRYPTODEV_FF_CPU_SSE (1ULL << 3)
206 
207 #define RTE_CRYPTODEV_FF_CPU_AVX (1ULL << 4)
208 
209 #define RTE_CRYPTODEV_FF_CPU_AVX2 (1ULL << 5)
210 
211 #define RTE_CRYPTODEV_FF_CPU_AESNI (1ULL << 6)
212 
213 #define RTE_CRYPTODEV_FF_HW_ACCELERATED (1ULL << 7)
214 
226 extern const char *
227 rte_cryptodev_get_feature_name(uint64_t flag);
228 
231  const char *driver_name;
235  uint64_t feature_flags;
240  unsigned max_nb_queue_pairs;
243  struct {
244  unsigned max_nb_sessions;
246  } sym;
247 };
248 
249 #define RTE_CRYPTODEV_DETACHED (0)
250 #define RTE_CRYPTODEV_ATTACHED (1)
251 
257 };
258 
261  uint32_t nb_descriptors;
262 };
263 
273 typedef void (*rte_cryptodev_cb_fn)(uint8_t dev_id,
274  enum rte_cryptodev_event_type event, void *cb_arg);
275 
276 
279  uint64_t enqueued_count;
281  uint64_t dequeued_count;
284  uint64_t enqueue_err_count;
286  uint64_t dequeue_err_count;
288 };
289 
290 #define RTE_CRYPTODEV_VDEV_DEFAULT_MAX_NB_QUEUE_PAIRS 8
291 #define RTE_CRYPTODEV_VDEV_DEFAULT_MAX_NB_SESSIONS 2048
292 
297 struct rte_crypto_vdev_init_params {
298  unsigned max_nb_queue_pairs;
299  unsigned max_nb_sessions;
300  uint8_t socket_id;
301 };
302 
314 int
316  struct rte_crypto_vdev_init_params *params,
317  const char *input_args);
318 
330 extern int
331 rte_cryptodev_create_vdev(const char *name, const char *args);
332 
342 extern int
343 rte_cryptodev_get_dev_id(const char *name);
344 
352 extern uint8_t
353 rte_cryptodev_count(void);
354 
355 extern uint8_t
356 rte_cryptodev_count_devtype(enum rte_cryptodev_type type);
357 /*
358  * Return the NUMA socket to which a device is connected
359  *
360  * @param dev_id
361  * The identifier of the device
362  * @return
363  * The NUMA socket id to which the device is connected or
364  * a default of zero if the socket could not be determined.
365  * -1 if returned is the dev_id value is out of range.
366  */
367 extern int
368 rte_cryptodev_socket_id(uint8_t dev_id);
369 
372  int socket_id;
373  uint16_t nb_queue_pairs;
376  struct {
377  uint32_t nb_objs;
378  uint32_t cache_size;
379  } session_mp;
380 };
381 
396 extern int
397 rte_cryptodev_configure(uint8_t dev_id, struct rte_cryptodev_config *config);
398 
414 extern int
415 rte_cryptodev_start(uint8_t dev_id);
416 
423 extern void
424 rte_cryptodev_stop(uint8_t dev_id);
425 
435 extern int
436 rte_cryptodev_close(uint8_t dev_id);
437 
461 extern int
462 rte_cryptodev_queue_pair_setup(uint8_t dev_id, uint16_t queue_pair_id,
463  const struct rte_cryptodev_qp_conf *qp_conf, int socket_id);
464 
479 extern int
480 rte_cryptodev_queue_pair_start(uint8_t dev_id, uint16_t queue_pair_id);
481 
495 extern int
496 rte_cryptodev_queue_pair_stop(uint8_t dev_id, uint16_t queue_pair_id);
497 
505 extern uint16_t
506 rte_cryptodev_queue_pair_count(uint8_t dev_id);
507 
508 
520 extern int
521 rte_cryptodev_stats_get(uint8_t dev_id, struct rte_cryptodev_stats *stats);
522 
528 extern void
529 rte_cryptodev_stats_reset(uint8_t dev_id);
530 
539 extern void
540 rte_cryptodev_info_get(uint8_t dev_id, struct rte_cryptodev_info *dev_info);
541 
542 
556 extern int
557 rte_cryptodev_callback_register(uint8_t dev_id,
558  enum rte_cryptodev_event_type event,
559  rte_cryptodev_cb_fn cb_fn, void *cb_arg);
560 
574 extern int
575 rte_cryptodev_callback_unregister(uint8_t dev_id,
576  enum rte_cryptodev_event_type event,
577  rte_cryptodev_cb_fn cb_fn, void *cb_arg);
578 
579 
580 typedef uint16_t (*dequeue_pkt_burst_t)(void *qp,
581  struct rte_crypto_op **ops, uint16_t nb_ops);
584 typedef uint16_t (*enqueue_pkt_burst_t)(void *qp,
585  struct rte_crypto_op **ops, uint16_t nb_ops);
591 struct rte_cryptodev_callback;
592 
594 TAILQ_HEAD(rte_cryptodev_cb_list, rte_cryptodev_callback);
595 
609  uint64_t feature_flags;
619  struct rte_cryptodev_cb_list link_intr_cbs;
622  uint8_t attached : 1;
625 
626 
627 #define RTE_CRYPTODEV_NAME_MAX_LEN (64)
628 
638  uint8_t dev_id;
640  uint8_t socket_id;
645  uint8_t dev_started : 1;
650  void **queue_pairs;
652  uint16_t nb_queue_pairs;
655  void *dev_private;
658 
659 extern struct rte_cryptodev *rte_cryptodevs;
696 static inline uint16_t
697 rte_cryptodev_dequeue_burst(uint8_t dev_id, uint16_t qp_id,
698  struct rte_crypto_op **ops, uint16_t nb_ops)
699 {
700  struct rte_cryptodev *dev = &rte_cryptodevs[dev_id];
701 
702  nb_ops = (*dev->dequeue_burst)
703  (dev->data->queue_pairs[qp_id], ops, nb_ops);
704 
705  return nb_ops;
706 }
707 
739 static inline uint16_t
740 rte_cryptodev_enqueue_burst(uint8_t dev_id, uint16_t qp_id,
741  struct rte_crypto_op **ops, uint16_t nb_ops)
742 {
743  struct rte_cryptodev *dev = &rte_cryptodevs[dev_id];
744 
745  return (*dev->enqueue_burst)(
746  dev->data->queue_pairs[qp_id], ops, nb_ops);
747 }
748 
749 
752  struct {
753  uint8_t dev_id;
755  enum rte_cryptodev_type dev_type;
757  struct rte_mempool *mp;
759  } __rte_aligned(8);
762  char _private[0];
764 };
766 
788 extern struct rte_cryptodev_sym_session *
789 rte_cryptodev_sym_session_create(uint8_t dev_id,
790  struct rte_crypto_sym_xform *xform);
791 
803 extern struct rte_cryptodev_sym_session *
804 rte_cryptodev_sym_session_free(uint8_t dev_id,
805  struct rte_cryptodev_sym_session *session);
806 
807 
808 #ifdef __cplusplus
809 }
810 #endif
811 
812 #endif /* _RTE_CRYPTODEV_H_ */