1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2015-2017 Intel Corporation 3 */ 4 #ifndef TEST_CRYPTODEV_H_ 5 #define TEST_CRYPTODEV_H_ 6 7 #include <rte_cryptodev.h> 8 9 #define MAX_NUM_OPS_INFLIGHT (4096) 10 #define MIN_NUM_OPS_INFLIGHT (128) 11 #define DEFAULT_NUM_OPS_INFLIGHT (128) 12 #define TEST_STATS_RETRIES (100) 13 14 #define DEFAULT_NUM_XFORMS (2) 15 #define NUM_MBUFS (8191) 16 #define MBUF_CACHE_SIZE (256) 17 #define MBUF_DATAPAYLOAD_SIZE (4096 + DIGEST_BYTE_LENGTH_SHA512) 18 #define MBUF_SIZE (sizeof(struct rte_mbuf) + \ 19 RTE_PKTMBUF_HEADROOM + MBUF_DATAPAYLOAD_SIZE) 20 #define LARGE_MBUF_DATAPAYLOAD_SIZE (UINT16_MAX - RTE_PKTMBUF_HEADROOM) 21 #define LARGE_MBUF_SIZE (RTE_PKTMBUF_HEADROOM + LARGE_MBUF_DATAPAYLOAD_SIZE) 22 23 #define BYTE_LENGTH(x) (x/8) 24 /* HASH DIGEST LENGTHS */ 25 #define DIGEST_BYTE_LENGTH_MD5 (BYTE_LENGTH(128)) 26 #define DIGEST_BYTE_LENGTH_SHA1 (BYTE_LENGTH(160)) 27 #define DIGEST_BYTE_LENGTH_SHA224 (BYTE_LENGTH(224)) 28 #define DIGEST_BYTE_LENGTH_SHA256 (BYTE_LENGTH(256)) 29 #define DIGEST_BYTE_LENGTH_SHA384 (BYTE_LENGTH(384)) 30 #define DIGEST_BYTE_LENGTH_SHA512 (BYTE_LENGTH(512)) 31 #define DIGEST_BYTE_LENGTH_AES_XCBC (BYTE_LENGTH(96)) 32 #define DIGEST_BYTE_LENGTH_SNOW3G_UIA2 (BYTE_LENGTH(32)) 33 #define DIGEST_BYTE_LENGTH_KASUMI_F9 (BYTE_LENGTH(32)) 34 #define AES_XCBC_MAC_KEY_SZ (16) 35 #define DIGEST_BYTE_LENGTH_AES_GCM (BYTE_LENGTH(128)) 36 37 #define TRUNCATED_DIGEST_BYTE_LENGTH_SHA1 (12) 38 #define TRUNCATED_DIGEST_BYTE_LENGTH_SHA224 (16) 39 #define TRUNCATED_DIGEST_BYTE_LENGTH_SHA256 (16) 40 #define TRUNCATED_DIGEST_BYTE_LENGTH_SHA384 (24) 41 #define TRUNCATED_DIGEST_BYTE_LENGTH_SHA512 (32) 42 43 #define MAXIMUM_IV_LENGTH (16) 44 #define AES_GCM_J0_LENGTH (16) 45 46 #define IV_OFFSET (sizeof(struct rte_crypto_op) + \ 47 sizeof(struct rte_crypto_sym_op) + DEFAULT_NUM_XFORMS * \ 48 sizeof(struct rte_crypto_sym_xform)) 49 50 #define CRYPTODEV_NAME_NULL_PMD crypto_null 51 #define CRYPTODEV_NAME_AESNI_MB_PMD crypto_aesni_mb 52 #define CRYPTODEV_NAME_AESNI_GCM_PMD crypto_aesni_gcm 53 #define CRYPTODEV_NAME_OPENSSL_PMD crypto_openssl 54 #define CRYPTODEV_NAME_QAT_SYM_PMD crypto_qat 55 #define CRYPTODEV_NAME_QAT_ASYM_PMD crypto_qat_asym 56 #define CRYPTODEV_NAME_SNOW3G_PMD crypto_snow3g 57 #define CRYPTODEV_NAME_KASUMI_PMD crypto_kasumi 58 #define CRYPTODEV_NAME_ZUC_PMD crypto_zuc 59 #define CRYPTODEV_NAME_CHACHA20_POLY1305_PMD crypto_chacha20_poly1305 60 #define CRYPTODEV_NAME_ARMV8_PMD crypto_armv8 61 #define CRYPTODEV_NAME_DPAA_SEC_PMD crypto_dpaa_sec 62 #define CRYPTODEV_NAME_DPAA2_SEC_PMD crypto_dpaa2_sec 63 #define CRYPTODEV_NAME_SCHEDULER_PMD crypto_scheduler 64 #define CRYPTODEV_NAME_MVSAM_PMD crypto_mvsam 65 #define CRYPTODEV_NAME_CCP_PMD crypto_ccp 66 #define CRYPTODEV_NAME_VIRTIO_PMD crypto_virtio 67 #define CRYPTODEV_NAME_OCTEONTX_SYM_PMD crypto_octeontx 68 #define CRYPTODEV_NAME_CAAM_JR_PMD crypto_caam_jr 69 #define CRYPTODEV_NAME_NITROX_PMD crypto_nitrox_sym 70 #define CRYPTODEV_NAME_BCMFS_PMD crypto_bcmfs 71 #define CRYPTODEV_NAME_CN9K_PMD crypto_cn9k 72 #define CRYPTODEV_NAME_CN10K_PMD crypto_cn10k 73 #define CRYPTODEV_NAME_MLX5_PMD crypto_mlx5 74 #define CRYPTODEV_NAME_UADK_PMD crypto_uadk 75 76 77 enum cryptodev_api_test_type { 78 CRYPTODEV_API_TEST = 0, 79 CRYPTODEV_RAW_API_TEST 80 }; 81 82 extern enum cryptodev_api_test_type global_api_test_type; 83 84 extern struct crypto_testsuite_params *p_testsuite_params; 85 struct crypto_testsuite_params { 86 struct rte_mempool *mbuf_pool; 87 struct rte_mempool *large_mbuf_pool; 88 struct rte_mempool *op_mpool; 89 struct rte_mempool *session_mpool; 90 struct rte_mempool *session_priv_mpool; 91 struct rte_cryptodev_config conf; 92 struct rte_cryptodev_qp_conf qp_conf; 93 94 uint8_t valid_devs[RTE_CRYPTO_MAX_DEVS]; 95 uint8_t valid_dev_count; 96 }; 97 98 /** 99 * Write (spread) data from buffer to mbuf data 100 * 101 * @param mbuf 102 * Destination mbuf 103 * @param offset 104 * Start offset in mbuf 105 * @param len 106 * Number of bytes to copy 107 * @param buffer 108 * Continuous source buffer 109 */ 110 static inline void 111 pktmbuf_write(struct rte_mbuf *mbuf, int offset, int len, const uint8_t *buffer) 112 { 113 int n = len; 114 int l; 115 struct rte_mbuf *m; 116 char *dst; 117 118 for (m = mbuf; (m != NULL) && (offset > m->data_len); m = m->next) 119 offset -= m->data_len; 120 121 l = m->data_len - offset; 122 123 /* copy data from first segment */ 124 dst = rte_pktmbuf_mtod_offset(m, char *, offset); 125 if (len <= l) { 126 rte_memcpy(dst, buffer, len); 127 return; 128 } 129 130 rte_memcpy(dst, buffer, l); 131 buffer += l; 132 n -= l; 133 134 for (m = m->next; (m != NULL) && (n > 0); m = m->next) { 135 dst = rte_pktmbuf_mtod(m, char *); 136 l = m->data_len; 137 if (n < l) { 138 rte_memcpy(dst, buffer, n); 139 return; 140 } 141 rte_memcpy(dst, buffer, l); 142 buffer += l; 143 n -= l; 144 } 145 } 146 147 static inline uint8_t * 148 pktmbuf_mtod_offset(struct rte_mbuf *mbuf, int offset) 149 { 150 struct rte_mbuf *m; 151 152 for (m = mbuf; (m != NULL) && (offset > m->data_len); m = m->next) 153 offset -= m->data_len; 154 155 if (m == NULL) { 156 printf("pktmbuf_mtod_offset: offset out of buffer\n"); 157 return NULL; 158 } 159 return rte_pktmbuf_mtod_offset(m, uint8_t *, offset); 160 } 161 162 static inline rte_iova_t 163 pktmbuf_iova_offset(struct rte_mbuf *mbuf, int offset) 164 { 165 struct rte_mbuf *m; 166 167 for (m = mbuf; (m != NULL) && (offset > m->data_len); m = m->next) 168 offset -= m->data_len; 169 170 if (m == NULL) { 171 printf("pktmbuf_iova_offset: offset out of buffer\n"); 172 return 0; 173 } 174 return rte_pktmbuf_iova_offset(m, offset); 175 } 176 177 static inline struct rte_mbuf * 178 create_segmented_mbuf(struct rte_mempool *mbuf_pool, int pkt_len, 179 int nb_segs, uint8_t pattern) 180 { 181 struct rte_mbuf *m = NULL, *mbuf = NULL; 182 int size, t_len, data_len = 0; 183 uint8_t *dst; 184 185 if (nb_segs < 1) { 186 printf("Number of segments must be 1 or more (is %d)\n", 187 nb_segs); 188 return NULL; 189 } 190 191 t_len = pkt_len >= nb_segs ? pkt_len / nb_segs : 1; 192 size = pkt_len; 193 194 /* Create chained mbuf_src and fill it generated data */ 195 do { 196 197 m = rte_pktmbuf_alloc(mbuf_pool); 198 if (m == NULL) { 199 printf("Cannot create segment for source mbuf"); 200 goto fail; 201 } 202 203 if (mbuf == NULL) 204 mbuf = m; 205 206 /* Make sure if tailroom is zeroed */ 207 memset(m->buf_addr, pattern, m->buf_len); 208 209 data_len = size > t_len ? t_len : size; 210 dst = (uint8_t *)rte_pktmbuf_append(m, data_len); 211 if (dst == NULL) { 212 printf("Cannot append %d bytes to the mbuf\n", 213 data_len); 214 goto fail; 215 } 216 217 if (mbuf != m) 218 rte_pktmbuf_chain(mbuf, m); 219 220 size -= data_len; 221 222 } while (size > 0); 223 224 return mbuf; 225 226 fail: 227 rte_pktmbuf_free(mbuf); 228 return NULL; 229 } 230 231 static inline struct rte_mbuf * 232 create_segmented_mbuf_multi_pool(struct rte_mempool *mbuf_pool_small, 233 struct rte_mempool *mbuf_pool_large, int pkt_len, int nb_segs, uint8_t pattern) 234 { 235 struct rte_mempool *mbuf_pool; 236 int max_seg_len, seg_len; 237 238 if (nb_segs < 1) { 239 printf("Number of segments must be 1 or more (is %d)\n", nb_segs); 240 return NULL; 241 } 242 243 if (pkt_len >= nb_segs) 244 seg_len = pkt_len / nb_segs; 245 else 246 seg_len = 1; 247 248 /* Determine max segment length */ 249 max_seg_len = seg_len + pkt_len % nb_segs; 250 251 if (max_seg_len > LARGE_MBUF_DATAPAYLOAD_SIZE) { 252 printf("Segment size %d is too big\n", max_seg_len); 253 return NULL; 254 } 255 256 if (max_seg_len > MBUF_DATAPAYLOAD_SIZE) 257 mbuf_pool = mbuf_pool_large; 258 else 259 mbuf_pool = mbuf_pool_small; 260 261 if (mbuf_pool == NULL) { 262 printf("Invalid mbuf pool\n"); 263 return NULL; 264 } 265 266 return create_segmented_mbuf(mbuf_pool, pkt_len, nb_segs, pattern); 267 } 268 269 int 270 process_sym_raw_dp_op(uint8_t dev_id, uint16_t qp_id, 271 struct rte_crypto_op *op, uint8_t is_cipher, uint8_t is_auth, 272 uint8_t len_in_bits, uint8_t cipher_iv_len); 273 274 int 275 check_cipher_capabilities_supported(const enum rte_crypto_cipher_algorithm *ciphers, 276 uint16_t num_ciphers); 277 278 int 279 check_auth_capabilities_supported(const enum rte_crypto_auth_algorithm *auths, 280 uint16_t num_auths); 281 282 int 283 check_aead_capabilities_supported(const enum rte_crypto_aead_algorithm *aeads, 284 uint16_t num_aeads); 285 286 int 287 ut_setup(void); 288 289 void 290 ut_teardown(void); 291 292 #endif /* TEST_CRYPTODEV_H_ */ 293