FD.io VPP  v17.07.01-10-g3be13f0
Vector Packet Processing
ipsec.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2016 Intel and/or its affiliates.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at:
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #ifndef __DPDK_IPSEC_H__
16 #define __DPDK_IPSEC_H__
17 
18 #include <vnet/vnet.h>
19 
20 #undef always_inline
21 #include <rte_config.h>
22 #include <rte_crypto.h>
23 #include <rte_cryptodev.h>
24 
25 #if CLIB_DEBUG > 0
26 #define always_inline static inline
27 #else
28 #define always_inline static inline __attribute__ ((__always_inline__))
29 #endif
30 
31 
32 #define MAX_QP_PER_LCORE 16
33 
34 typedef struct
35 {
37  u32 iv[2];
40 
41 typedef struct
42 {
44  union
45  {
46  u8 aad[12];
47  u8 icv[64];
48  };
50 
51 typedef struct
52 {
57 
58 typedef struct
59 {
65  struct rte_crypto_op *cops[VLIB_FRAME_SIZE];
66  struct rte_crypto_op **free_cops;
68 
69 typedef struct
70 {
72  void *sess;
74 
75 typedef struct
76 {
77  crypto_sa_session_t *sa_sess_d[2];
81 
82 typedef struct
83 {
84  struct rte_mempool **cop_pools;
88 
90 
92 
93 #define CRYPTO_N_FREE_COPS (VLIB_FRAME_SIZE * 3)
94 
97 {
99  u32 thread_index = vlib_get_thread_index ();
100  crypto_worker_main_t *cwm = &dcm->workers_main[thread_index];
101  unsigned socket_id = rte_socket_id ();
102  crypto_qp_data_t *qpd;
103 
104  /* *INDENT-OFF* */
105  vec_foreach (qpd, cwm->qp_data)
106  {
107  u32 l = vec_len (qpd->free_cops);
108 
109  if (PREDICT_FALSE (l < VLIB_FRAME_SIZE))
110  {
111  u32 n_alloc;
112 
113  if (PREDICT_FALSE (!qpd->free_cops))
115 
116  n_alloc = rte_crypto_op_bulk_alloc (dcm->cop_pools[socket_id],
117  RTE_CRYPTO_OP_TYPE_SYMMETRIC,
118  &qpd->free_cops[l],
119  CRYPTO_N_FREE_COPS - l - 1);
120 
121  _vec_len (qpd->free_cops) = l + n_alloc;
122  }
123  }
124  /* *INDENT-ON* */
125 }
126 
128 crypto_free_cop (crypto_qp_data_t * qpd, struct rte_crypto_op **cops, u32 n)
129 {
130  u32 l = vec_len (qpd->free_cops);
131 
132  if (l + n >= CRYPTO_N_FREE_COPS)
133  {
134  l -= VLIB_FRAME_SIZE;
135  rte_mempool_put_bulk (cops[0]->mempool,
136  (void **) &qpd->free_cops[l], VLIB_FRAME_SIZE);
137  }
138  clib_memcpy (&qpd->free_cops[l], cops, sizeof (*cops) * n);
139 
140  _vec_len (qpd->free_cops) = l + n;
141 }
142 
144 check_algo_is_supported (const struct rte_cryptodev_capabilities *cap,
145  char *name)
146 {
147  struct
148  {
149  uint8_t cipher_algo;
150  enum rte_crypto_sym_xform_type type;
151  union
152  {
153  enum rte_crypto_auth_algorithm auth;
154  enum rte_crypto_cipher_algorithm cipher;
155  };
156  char *name;
157  } supported_algo[] =
158  {
159  {
160  .type = RTE_CRYPTO_SYM_XFORM_CIPHER,.cipher =
161  RTE_CRYPTO_CIPHER_NULL,.name = "NULL"},
162  {
163  .type = RTE_CRYPTO_SYM_XFORM_CIPHER,.cipher =
164  RTE_CRYPTO_CIPHER_AES_CBC,.name = "AES_CBC"},
165  {
166  .type = RTE_CRYPTO_SYM_XFORM_CIPHER,.cipher =
167  RTE_CRYPTO_CIPHER_AES_CTR,.name = "AES_CTR"},
168  {
169  .type = RTE_CRYPTO_SYM_XFORM_CIPHER,.cipher =
170  RTE_CRYPTO_CIPHER_3DES_CBC,.name = "3DES-CBC"},
171  {
172  .type = RTE_CRYPTO_SYM_XFORM_CIPHER,.cipher =
173  RTE_CRYPTO_CIPHER_AES_GCM,.name = "AES-GCM"},
174  {
175  .type = RTE_CRYPTO_SYM_XFORM_AUTH,.auth =
176  RTE_CRYPTO_AUTH_SHA1_HMAC,.name = "HMAC-SHA1"},
177  {
178  .type = RTE_CRYPTO_SYM_XFORM_AUTH,.auth =
179  RTE_CRYPTO_AUTH_SHA256_HMAC,.name = "HMAC-SHA256"},
180  {
181  .type = RTE_CRYPTO_SYM_XFORM_AUTH,.auth =
182  RTE_CRYPTO_AUTH_SHA384_HMAC,.name = "HMAC-SHA384"},
183  {
184  .type = RTE_CRYPTO_SYM_XFORM_AUTH,.auth =
185  RTE_CRYPTO_AUTH_SHA512_HMAC,.name = "HMAC-SHA512"},
186  {
187  .type = RTE_CRYPTO_SYM_XFORM_AUTH,.auth =
188  RTE_CRYPTO_AUTH_AES_XCBC_MAC,.name = "AES-XCBC-MAC"},
189  {
190  .type = RTE_CRYPTO_SYM_XFORM_AUTH,.auth =
191  RTE_CRYPTO_AUTH_AES_GCM,.name = "AES-GCM"},
192  {
193  /* tail */
194  .type = RTE_CRYPTO_SYM_XFORM_NOT_SPECIFIED},};
195  uint32_t i = 0;
196 
197  if (cap->op != RTE_CRYPTO_OP_TYPE_SYMMETRIC)
198  return -1;
199 
200  while (supported_algo[i].type != RTE_CRYPTO_SYM_XFORM_NOT_SPECIFIED)
201  {
202  if (cap->sym.xform_type == supported_algo[i].type)
203  {
204  if ((cap->sym.xform_type == RTE_CRYPTO_SYM_XFORM_CIPHER &&
205  cap->sym.cipher.algo == supported_algo[i].cipher) ||
206  (cap->sym.xform_type == RTE_CRYPTO_SYM_XFORM_AUTH &&
207  cap->sym.auth.algo == supported_algo[i].auth))
208  {
209  if (name)
210  strcpy (name, supported_algo[i].name);
211  return 0;
212  }
213  }
214 
215  i++;
216  }
217 
218  return -1;
219 }
220 
221 #endif /* __DPDK_IPSEC_H__ */
222 
223 /*
224  * fd.io coding-style-patch-verification: ON
225  *
226  * Local Variables:
227  * eval: (c-set-style "gnu")
228  * End:
229  */
struct rte_crypto_op ** free_cops
Definition: ipsec.h:66
sll srl srl sll sra u16x4 i
Definition: vector_sse2.h:337
u16 is_outbound
Definition: ipsec.h:62
struct _vlib_node_registration vlib_node_registration_t
#define vec_alloc(V, N)
Allocate space for N more elements (no header, unspecified alignment)
Definition: vec.h:279
static_always_inline void crypto_free_cop(crypto_qp_data_t *qpd, struct rte_crypto_op **cops, u32 n)
Definition: ipsec.h:128
dpdk_crypto_main_t dpdk_crypto_main
Definition: ipsec.h:89
uword * algo_qp_map
Definition: ipsec.h:79
#define static_always_inline
Definition: clib.h:85
static_always_inline void crypto_alloc_cops()
Definition: ipsec.h:96
i16 inflights
Definition: ipsec.h:63
vlib_node_registration_t dpdk_crypto_input_node
(constructor) VLIB_REGISTER_NODE (dpdk_crypto_input_node)
Definition: crypto_node.c:60
#define PREDICT_FALSE(x)
Definition: clib.h:97
#define VLIB_FRAME_SIZE
Definition: node.h:329
dpdk_gcm_cnt_blk cb
Definition: ipsec.h:43
static_always_inline uword vlib_get_thread_index(void)
Definition: threads.h:185
#define clib_memcpy(a, b, c)
Definition: string.h:69
unsigned int u32
Definition: types.h:88
struct rte_mempool ** cop_pools
Definition: ipsec.h:84
crypto_worker_main_t * workers_main
Definition: ipsec.h:85
crypto_qp_data_t * qp_data
Definition: ipsec.h:78
u64 uword
Definition: types.h:112
unsigned short u16
Definition: types.h:57
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
unsigned char u8
Definition: types.h:56
#define CRYPTO_N_FREE_COPS
Definition: ipsec.h:93
static_always_inline int check_algo_is_supported(const struct rte_cryptodev_capabilities *cap, char *name)
Definition: ipsec.h:144
short i16
Definition: types.h:46
#define vec_foreach(var, vec)
Vector iterator.