crypto/dpaa_sec: support DES-CBC
[dpdk.git] / drivers / crypto / dpaa_sec / dpaa_sec.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  *
3  *   Copyright 2016-2020 NXP
4  *
5  */
6
7 #ifndef _DPAA_SEC_H_
8 #define _DPAA_SEC_H_
9
10 #define CRYPTODEV_NAME_DPAA_SEC_PMD     crypto_dpaa_sec
11 /**< NXP DPAA - SEC PMD device name */
12
13 #define MAX_DPAA_CORES          4
14 #define NUM_POOL_CHANNELS       4
15 #define DPAA_SEC_BURST          7
16 #define DPAA_SEC_ALG_UNSUPPORT  (-1)
17 #define TDES_CBC_IV_LEN         8
18 #define AES_CBC_IV_LEN          16
19 #define AES_CTR_IV_LEN          16
20 #define AES_GCM_IV_LEN          12
21
22 #define DPAA_IPv6_DEFAULT_VTC_FLOW      0x60000000
23
24 /* Minimum job descriptor consists of a oneword job descriptor HEADER and
25  * a pointer to the shared descriptor.
26  */
27 #define MIN_JOB_DESC_SIZE       (CAAM_CMD_SZ + CAAM_PTR_SZ)
28 /* CTX_POOL_NUM_BUFS is set as per the ipsec-secgw application */
29 #define CTX_POOL_NUM_BUFS       32000
30 #define CTX_POOL_BUF_SIZE       sizeof(struct dpaa_sec_op_ctx)
31 #define CTX_POOL_CACHE_SIZE     512
32 #define RTE_DPAA_SEC_PMD_MAX_NB_SESSIONS 1024
33
34 #define DIR_ENC                 1
35 #define DIR_DEC                 0
36
37 enum dpaa_sec_op_type {
38         DPAA_SEC_NONE,  /*!< No Cipher operations*/
39         DPAA_SEC_CIPHER,/*!< CIPHER operations */
40         DPAA_SEC_AUTH,  /*!< Authentication Operations */
41         DPAA_SEC_AEAD,  /*!< AEAD (AES-GCM/CCM) type operations */
42         DPAA_SEC_CIPHER_HASH,  /*!< Authenticated Encryption with
43                                 * associated data
44                                 */
45         DPAA_SEC_HASH_CIPHER,  /*!< Encryption with Authenticated
46                                 * associated data
47                                 */
48         DPAA_SEC_IPSEC, /*!< IPSEC protocol operations*/
49         DPAA_SEC_PDCP,  /*!< PDCP protocol operations*/
50         DPAA_SEC_PKC,   /*!< Public Key Cryptographic Operations */
51         DPAA_SEC_MAX
52 };
53
54 #define DPAA_SEC_MAX_DESC_SIZE  64
55 /* code or cmd block to caam */
56 struct sec_cdb {
57         struct {
58                 union {
59                         uint32_t word;
60                         struct {
61 #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
62                                 uint16_t rsvd63_48;
63                                 unsigned int rsvd47_39:9;
64                                 unsigned int idlen:7;
65 #else
66                                 unsigned int idlen:7;
67                                 unsigned int rsvd47_39:9;
68                                 uint16_t rsvd63_48;
69 #endif
70                         } field;
71                 } __packed hi;
72
73                 union {
74                         uint32_t word;
75                         struct {
76 #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
77                                 unsigned int rsvd31_30:2;
78                                 unsigned int fsgt:1;
79                                 unsigned int lng:1;
80                                 unsigned int offset:2;
81                                 unsigned int abs:1;
82                                 unsigned int add_buf:1;
83                                 uint8_t pool_id;
84                                 uint16_t pool_buffer_size;
85 #else
86                                 uint16_t pool_buffer_size;
87                                 uint8_t pool_id;
88                                 unsigned int add_buf:1;
89                                 unsigned int abs:1;
90                                 unsigned int offset:2;
91                                 unsigned int lng:1;
92                                 unsigned int fsgt:1;
93                                 unsigned int rsvd31_30:2;
94 #endif
95                         } field;
96                 } __packed lo;
97         } __packed sh_hdr;
98
99         uint32_t sh_desc[DPAA_SEC_MAX_DESC_SIZE];
100 };
101 #ifdef RTE_LIB_SECURITY
102 /*!
103  * The structure is to be filled by user as a part of
104  * dpaa_sec_proto_ctxt for PDCP Protocol
105  */
106 struct sec_pdcp_ctxt {
107         enum rte_security_pdcp_domain domain; /*!< Data/Control mode*/
108         int8_t bearer;  /*!< PDCP bearer ID */
109         int8_t pkt_dir;/*!< PDCP Frame Direction 0:UL 1:DL*/
110         int8_t hfn_ovd;/*!< Overwrite HFN per packet*/
111         uint8_t sn_size;        /*!< Sequence number size, 5/7/12/15/18 */
112         uint8_t sdap_enabled;   /*!< SDAP header is enabled */
113         uint16_t hfn_ovd_offset;/*!< offset from rte_crypto_op at which
114                                  * per packet hfn is stored
115                                  */
116         uint32_t hfn;   /*!< Hyper Frame Number */
117         uint32_t hfn_threshold; /*!< HFN Threashold for key renegotiation */
118 };
119 #endif
120 typedef struct dpaa_sec_session_entry {
121         struct sec_cdb cdb;     /**< cmd block associated with qp */
122         struct dpaa_sec_qp *qp[MAX_DPAA_CORES];
123         struct qman_fq *inq[MAX_DPAA_CORES];
124         uint8_t dir;         /*!< Operation Direction */
125         uint8_t ctxt;   /*!< Session Context Type */
126         enum rte_crypto_cipher_algorithm cipher_alg; /*!< Cipher Algorithm*/
127         enum rte_crypto_auth_algorithm auth_alg; /*!< Authentication Algorithm*/
128         enum rte_crypto_aead_algorithm aead_alg; /*!< AEAD Algorithm*/
129 #ifdef RTE_LIB_SECURITY
130         enum rte_security_session_protocol proto_alg; /*!< Security Algorithm*/
131 #endif
132         union {
133                 struct {
134                         uint8_t *data;  /**< pointer to key data */
135                         size_t length;  /**< key length in bytes */
136                         uint32_t alg;
137                         uint32_t algmode;
138                 } aead_key;
139                 struct {
140                         struct {
141                                 uint8_t *data;  /**< pointer to key data */
142                                 size_t length;  /**< key length in bytes */
143                                 uint32_t alg;
144                                 uint32_t algmode;
145                         } cipher_key;
146                         struct {
147                                 uint8_t *data;  /**< pointer to key data */
148                                 size_t length;  /**< key length in bytes */
149                                 uint32_t alg;
150                                 uint32_t algmode;
151                         } auth_key;
152                 };
153         };
154         union {
155                 struct {
156                         struct {
157                                 uint16_t length;
158                                 uint16_t offset;
159                         } iv;   /**< Initialisation vector parameters */
160                         uint16_t auth_only_len;
161                                         /*!< Length of data for Auth only */
162                         uint32_t digest_length;
163                         struct ipsec_decap_pdb decap_pdb;
164                         struct ipsec_encap_pdb encap_pdb;
165                         union {
166                                 struct ip ip4_hdr;
167                                 struct rte_ipv6_hdr ip6_hdr;
168                         };
169                         uint8_t auth_cipher_text;
170                                 /**< Authenticate/cipher ordering */
171                 };
172 #ifdef RTE_LIB_SECURITY
173                 struct sec_pdcp_ctxt pdcp;
174 #endif
175         };
176 } dpaa_sec_session;
177
178 struct dpaa_sec_qp {
179         struct dpaa_sec_dev_private *internals;
180         struct rte_mempool *ctx_pool; /* mempool for dpaa_sec_op_ctx */
181         struct qman_fq outq;
182         int rx_pkts;
183         int rx_errs;
184         int tx_pkts;
185         int tx_errs;
186 };
187
188 #define RTE_DPAA_MAX_NB_SEC_QPS 2
189 #define RTE_DPAA_MAX_RX_QUEUE (MAX_DPAA_CORES * RTE_DPAA_SEC_PMD_MAX_NB_SESSIONS)
190 #define DPAA_MAX_DEQUEUE_NUM_FRAMES 63
191
192 /* internal sec queue interface */
193 struct dpaa_sec_dev_private {
194         void *sec_hw;
195         struct dpaa_sec_qp qps[RTE_DPAA_MAX_NB_SEC_QPS]; /* i/o queue for sec */
196         struct qman_fq inq[RTE_DPAA_MAX_RX_QUEUE];
197         unsigned char inq_attach[RTE_DPAA_MAX_RX_QUEUE];
198         unsigned int max_nb_queue_pairs;
199         unsigned int max_nb_sessions;
200         rte_spinlock_t lock;
201 };
202
203 #define MAX_SG_ENTRIES          16
204 #define MAX_JOB_SG_ENTRIES      36
205
206 struct dpaa_sec_job {
207         /* sg[0] output, sg[1] input, others are possible sub frames */
208         struct qm_sg_entry sg[MAX_JOB_SG_ENTRIES];
209 };
210
211 #define DPAA_MAX_NB_MAX_DIGEST  32
212 struct dpaa_sec_op_ctx {
213         struct dpaa_sec_job job;
214         struct rte_crypto_op *op;
215         struct rte_mempool *ctx_pool; /* mempool pointer for dpaa_sec_op_ctx */
216         uint32_t fd_status;
217         int64_t vtop_offset;
218         uint8_t digest[DPAA_MAX_NB_MAX_DIGEST];
219 };
220
221 static const struct rte_cryptodev_capabilities dpaa_sec_capabilities[] = {
222         {       /* NULL (AUTH) */
223                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
224                 {.sym = {
225                         .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
226                         {.auth = {
227                                 .algo = RTE_CRYPTO_AUTH_NULL,
228                                 .block_size = 1,
229                                 .key_size = {
230                                         .min = 0,
231                                         .max = 0,
232                                         .increment = 0
233                                 },
234                                 .digest_size = {
235                                         .min = 0,
236                                         .max = 0,
237                                         .increment = 0
238                                 },
239                                 .iv_size = { 0 }
240                         }, },
241                 }, },
242         },
243         {       /* MD5 HMAC */
244                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
245                 {.sym = {
246                         .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
247                         {.auth = {
248                                 .algo = RTE_CRYPTO_AUTH_MD5_HMAC,
249                                 .block_size = 64,
250                                 .key_size = {
251                                         .min = 1,
252                                         .max = 64,
253                                         .increment = 1
254                                 },
255                                 .digest_size = {
256                                         .min = 1,
257                                         .max = 16,
258                                         .increment = 1
259                                 },
260                                 .iv_size = { 0 }
261                         }, }
262                 }, }
263         },
264         {       /* SHA1 HMAC */
265                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
266                 {.sym = {
267                         .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
268                         {.auth = {
269                                 .algo = RTE_CRYPTO_AUTH_SHA1_HMAC,
270                                 .block_size = 64,
271                                 .key_size = {
272                                         .min = 1,
273                                         .max = 64,
274                                         .increment = 1
275                                 },
276                                 .digest_size = {
277                                         .min = 1,
278                                         .max = 20,
279                                         .increment = 1
280                                 },
281                                 .iv_size = { 0 }
282                         }, }
283                 }, }
284         },
285         {       /* SHA224 HMAC */
286                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
287                 {.sym = {
288                         .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
289                         {.auth = {
290                                 .algo = RTE_CRYPTO_AUTH_SHA224_HMAC,
291                                 .block_size = 64,
292                                 .key_size = {
293                                         .min = 1,
294                                         .max = 64,
295                                         .increment = 1
296                                 },
297                                 .digest_size = {
298                                         .min = 1,
299                                         .max = 28,
300                                         .increment = 1
301                                 },
302                                 .iv_size = { 0 }
303                         }, }
304                 }, }
305         },
306         {       /* SHA256 HMAC */
307                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
308                 {.sym = {
309                         .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
310                         {.auth = {
311                                 .algo = RTE_CRYPTO_AUTH_SHA256_HMAC,
312                                 .block_size = 64,
313                                 .key_size = {
314                                         .min = 1,
315                                         .max = 64,
316                                         .increment = 1
317                                 },
318                                 .digest_size = {
319                                         .min = 1,
320                                         .max = 32,
321                                         .increment = 1
322                                 },
323                                 .iv_size = { 0 }
324                         }, }
325                 }, }
326         },
327         {       /* SHA384 HMAC */
328                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
329                 {.sym = {
330                         .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
331                         {.auth = {
332                                 .algo = RTE_CRYPTO_AUTH_SHA384_HMAC,
333                                 .block_size = 128,
334                                 .key_size = {
335                                         .min = 1,
336                                         .max = 128,
337                                         .increment = 1
338                                 },
339                                 .digest_size = {
340                                         .min = 1,
341                                         .max = 48,
342                                         .increment = 1
343                                 },
344                                 .iv_size = { 0 }
345                         }, }
346                 }, }
347         },
348         {       /* SHA512 HMAC */
349                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
350                 {.sym = {
351                         .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
352                         {.auth = {
353                                 .algo = RTE_CRYPTO_AUTH_SHA512_HMAC,
354                                 .block_size = 128,
355                                 .key_size = {
356                                         .min = 1,
357                                         .max = 128,
358                                         .increment = 1
359                                 },
360                                 .digest_size = {
361                                         .min = 1,
362                                         .max = 64,
363                                         .increment = 1
364                                 },
365                                 .iv_size = { 0 }
366                         }, }
367                 }, }
368         },
369         {       /* AES GCM */
370                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
371                 {.sym = {
372                         .xform_type = RTE_CRYPTO_SYM_XFORM_AEAD,
373                         {.aead = {
374                                 .algo = RTE_CRYPTO_AEAD_AES_GCM,
375                                 .block_size = 16,
376                                 .key_size = {
377                                         .min = 16,
378                                         .max = 32,
379                                         .increment = 8
380                                 },
381                                 .digest_size = {
382                                         .min = 8,
383                                         .max = 16,
384                                         .increment = 4
385                                 },
386                                 .aad_size = {
387                                         .min = 0,
388                                         .max = 240,
389                                         .increment = 1
390                                 },
391                                 .iv_size = {
392                                         .min = 12,
393                                         .max = 12,
394                                         .increment = 0
395                                 },
396                         }, }
397                 }, }
398         },
399         {       /* NULL (CIPHER) */
400                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
401                 {.sym = {
402                         .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
403                         {.cipher = {
404                                 .algo = RTE_CRYPTO_CIPHER_NULL,
405                                 .block_size = 1,
406                                 .key_size = {
407                                         .min = 0,
408                                         .max = 0,
409                                         .increment = 0
410                                 },
411                                 .iv_size = {
412                                         .min = 0,
413                                         .max = 0,
414                                         .increment = 0
415                                 }
416                         }, },
417                 }, }
418         },
419         {       /* AES CBC */
420                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
421                 {.sym = {
422                         .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
423                         {.cipher = {
424                                 .algo = RTE_CRYPTO_CIPHER_AES_CBC,
425                                 .block_size = 16,
426                                 .key_size = {
427                                         .min = 16,
428                                         .max = 32,
429                                         .increment = 8
430                                 },
431                                 .iv_size = {
432                                         .min = 16,
433                                         .max = 16,
434                                         .increment = 0
435                                 }
436                         }, }
437                 }, }
438         },
439         {       /* AES CTR */
440                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
441                 {.sym = {
442                         .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
443                         {.cipher = {
444                                 .algo = RTE_CRYPTO_CIPHER_AES_CTR,
445                                 .block_size = 16,
446                                 .key_size = {
447                                         .min = 16,
448                                         .max = 32,
449                                         .increment = 8
450                                 },
451                                 .iv_size = {
452                                         .min = 16,
453                                         .max = 16,
454                                         .increment = 0
455                                 },
456                         }, }
457                 }, }
458         },
459         {       /* DES CBC */
460                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
461                 {.sym = {
462                         .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
463                         {.cipher = {
464                                 .algo = RTE_CRYPTO_CIPHER_DES_CBC,
465                                 .block_size = 8,
466                                 .key_size = {
467                                         .min = 8,
468                                         .max = 8,
469                                         .increment = 0
470                                 },
471                                 .iv_size = {
472                                         .min = 8,
473                                         .max = 8,
474                                         .increment = 0
475                                 }
476                         }, }
477                 }, }
478         },
479         {       /* 3DES CBC */
480                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
481                 {.sym = {
482                         .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
483                         {.cipher = {
484                                 .algo = RTE_CRYPTO_CIPHER_3DES_CBC,
485                                 .block_size = 8,
486                                 .key_size = {
487                                         .min = 16,
488                                         .max = 24,
489                                         .increment = 8
490                                 },
491                                 .iv_size = {
492                                         .min = 8,
493                                         .max = 8,
494                                         .increment = 0
495                                 }
496                         }, }
497                 }, }
498         },
499         {       /* SNOW 3G (UIA2) */
500                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
501                 {.sym = {
502                         .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
503                         {.auth = {
504                                 .algo = RTE_CRYPTO_AUTH_SNOW3G_UIA2,
505                                 .block_size = 16,
506                                 .key_size = {
507                                         .min = 16,
508                                         .max = 16,
509                                         .increment = 0
510                                 },
511                                 .digest_size = {
512                                         .min = 4,
513                                         .max = 4,
514                                         .increment = 0
515                                 },
516                                 .iv_size = {
517                                         .min = 16,
518                                         .max = 16,
519                                         .increment = 0
520                                 }
521                         }, }
522                 }, }
523         },
524         {       /* SNOW 3G (UEA2) */
525                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
526                 {.sym = {
527                         .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
528                         {.cipher = {
529                                 .algo = RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
530                                 .block_size = 16,
531                                 .key_size = {
532                                         .min = 16,
533                                         .max = 16,
534                                         .increment = 0
535                                 },
536                                 .iv_size = {
537                                         .min = 16,
538                                         .max = 16,
539                                         .increment = 0
540                                 }
541                         }, }
542                 }, }
543         },
544         {       /* ZUC (EEA3) */
545                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
546                 {.sym = {
547                         .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
548                         {.cipher = {
549                                 .algo = RTE_CRYPTO_CIPHER_ZUC_EEA3,
550                                 .block_size = 16,
551                                 .key_size = {
552                                         .min = 16,
553                                         .max = 16,
554                                         .increment = 0
555                                 },
556                                 .iv_size = {
557                                         .min = 16,
558                                         .max = 16,
559                                         .increment = 0
560                                 }
561                         }, }
562                 }, }
563         },
564         {       /* ZUC (EIA3) */
565                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
566                 {.sym = {
567                         .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
568                         {.auth = {
569                                 .algo = RTE_CRYPTO_AUTH_ZUC_EIA3,
570                                 .block_size = 16,
571                                 .key_size = {
572                                         .min = 16,
573                                         .max = 16,
574                                         .increment = 0
575                                 },
576                                 .digest_size = {
577                                         .min = 4,
578                                         .max = 4,
579                                         .increment = 0
580                                 },
581                                 .iv_size = {
582                                         .min = 16,
583                                         .max = 16,
584                                         .increment = 0
585                                 }
586                         }, }
587                 }, }
588         },
589         RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST()
590 };
591
592 #ifdef RTE_LIB_SECURITY
593 static const struct rte_cryptodev_capabilities dpaa_pdcp_capabilities[] = {
594         {       /* SNOW 3G (UIA2) */
595                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
596                 {.sym = {
597                         .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
598                         {.auth = {
599                                 .algo = RTE_CRYPTO_AUTH_SNOW3G_UIA2,
600                                 .block_size = 16,
601                                 .key_size = {
602                                         .min = 16,
603                                         .max = 16,
604                                         .increment = 0
605                                 },
606                                 .digest_size = {
607                                         .min = 4,
608                                         .max = 4,
609                                         .increment = 0
610                                 },
611                                 .iv_size = {
612                                         .min = 16,
613                                         .max = 16,
614                                         .increment = 0
615                                 }
616                         }, }
617                 }, }
618         },
619         {       /* SNOW 3G (UEA2) */
620                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
621                 {.sym = {
622                         .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
623                         {.cipher = {
624                                 .algo = RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
625                                 .block_size = 16,
626                                 .key_size = {
627                                         .min = 16,
628                                         .max = 16,
629                                         .increment = 0
630                                 },
631                                 .iv_size = {
632                                         .min = 16,
633                                         .max = 16,
634                                         .increment = 0
635                                 }
636                         }, }
637                 }, }
638         },
639         {       /* AES CTR */
640                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
641                 {.sym = {
642                         .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
643                         {.cipher = {
644                                 .algo = RTE_CRYPTO_CIPHER_AES_CTR,
645                                 .block_size = 16,
646                                 .key_size = {
647                                         .min = 16,
648                                         .max = 32,
649                                         .increment = 8
650                                 },
651                                 .iv_size = {
652                                         .min = 16,
653                                         .max = 16,
654                                         .increment = 0
655                                 }
656                         }, }
657                 }, }
658         },
659         {       /* NULL (AUTH) */
660                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
661                 {.sym = {
662                         .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
663                         {.auth = {
664                                 .algo = RTE_CRYPTO_AUTH_NULL,
665                                 .block_size = 1,
666                                 .key_size = {
667                                         .min = 0,
668                                         .max = 0,
669                                         .increment = 0
670                                 },
671                                 .digest_size = {
672                                         .min = 0,
673                                         .max = 0,
674                                         .increment = 0
675                                 },
676                                 .iv_size = { 0 }
677                         }, },
678                 }, },
679         },
680         {       /* NULL (CIPHER) */
681                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
682                 {.sym = {
683                         .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
684                         {.cipher = {
685                                 .algo = RTE_CRYPTO_CIPHER_NULL,
686                                 .block_size = 1,
687                                 .key_size = {
688                                         .min = 0,
689                                         .max = 0,
690                                         .increment = 0
691                                 },
692                                 .iv_size = {
693                                         .min = 0,
694                                         .max = 0,
695                                         .increment = 0
696                                 }
697                         }, },
698                 }, }
699         },
700         {       /* ZUC (EEA3) */
701                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
702                 {.sym = {
703                         .xform_type = RTE_CRYPTO_SYM_XFORM_CIPHER,
704                         {.cipher = {
705                                 .algo = RTE_CRYPTO_CIPHER_ZUC_EEA3,
706                                 .block_size = 16,
707                                 .key_size = {
708                                         .min = 16,
709                                         .max = 16,
710                                         .increment = 0
711                                 },
712                                 .iv_size = {
713                                         .min = 16,
714                                         .max = 16,
715                                         .increment = 0
716                                 }
717                         }, }
718                 }, }
719         },
720         {       /* ZUC (EIA3) */
721                 .op = RTE_CRYPTO_OP_TYPE_SYMMETRIC,
722                 {.sym = {
723                         .xform_type = RTE_CRYPTO_SYM_XFORM_AUTH,
724                         {.auth = {
725                                 .algo = RTE_CRYPTO_AUTH_ZUC_EIA3,
726                                 .block_size = 16,
727                                 .key_size = {
728                                         .min = 16,
729                                         .max = 16,
730                                         .increment = 0
731                                 },
732                                 .digest_size = {
733                                         .min = 4,
734                                         .max = 4,
735                                         .increment = 0
736                                 },
737                                 .iv_size = {
738                                         .min = 16,
739                                         .max = 16,
740                                         .increment = 0
741                                 }
742                         }, }
743                 }, }
744         },
745
746         RTE_CRYPTODEV_END_OF_CAPABILITIES_LIST()
747 };
748
749 static const struct rte_security_capability dpaa_sec_security_cap[] = {
750         { /* IPsec Lookaside Protocol offload ESP Transport Egress */
751                 .action = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,
752                 .protocol = RTE_SECURITY_PROTOCOL_IPSEC,
753                 .ipsec = {
754                         .proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP,
755                         .mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL,
756                         .direction = RTE_SECURITY_IPSEC_SA_DIR_EGRESS,
757                         .options = { 0 },
758                         .replay_win_sz_max = 128
759                 },
760                 .crypto_capabilities = dpaa_sec_capabilities
761         },
762         { /* IPsec Lookaside Protocol offload ESP Tunnel Ingress */
763                 .action = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,
764                 .protocol = RTE_SECURITY_PROTOCOL_IPSEC,
765                 .ipsec = {
766                         .proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP,
767                         .mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL,
768                         .direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS,
769                         .options = { 0 },
770                         .replay_win_sz_max = 128
771                 },
772                 .crypto_capabilities = dpaa_sec_capabilities
773         },
774         { /* PDCP Lookaside Protocol offload Data */
775                 .action = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,
776                 .protocol = RTE_SECURITY_PROTOCOL_PDCP,
777                 .pdcp = {
778                         .domain = RTE_SECURITY_PDCP_MODE_DATA,
779                         .capa_flags = 0
780                 },
781                 .crypto_capabilities = dpaa_pdcp_capabilities
782         },
783         { /* PDCP Lookaside Protocol offload Control */
784                 .action = RTE_SECURITY_ACTION_TYPE_LOOKASIDE_PROTOCOL,
785                 .protocol = RTE_SECURITY_PROTOCOL_PDCP,
786                 .pdcp = {
787                         .domain = RTE_SECURITY_PDCP_MODE_CONTROL,
788                         .capa_flags = 0
789                 },
790                 .crypto_capabilities = dpaa_pdcp_capabilities
791         },
792         {
793                 .action = RTE_SECURITY_ACTION_TYPE_NONE
794         }
795 };
796 #endif
797
798 /**
799  * Checksum
800  *
801  * @param buffer calculate chksum for buffer
802  * @param len    buffer length
803  *
804  * @return checksum value in host cpu order
805  */
806 static inline uint16_t
807 calc_chksum(void *buffer, int len)
808 {
809         uint16_t *buf = (uint16_t *)buffer;
810         uint32_t sum = 0;
811         uint16_t result;
812
813         for (sum = 0; len > 1; len -= 2)
814                 sum += *buf++;
815
816         if (len == 1)
817                 sum += *(unsigned char *)buf;
818
819         sum = (sum >> 16) + (sum & 0xFFFF);
820         sum += (sum >> 16);
821         result = ~sum;
822
823         return  result;
824 }
825
826 #endif /* _DPAA_SEC_H_ */