FD.io VPP  v21.01.1
Vector Packet Processing
ipsec.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015 Cisco 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 __IPSEC_H__
16 #define __IPSEC_H__
17 
18 #include <vnet/ip/ip.h>
19 #include <vnet/crypto/crypto.h>
20 #include <vnet/feature/feature.h>
21 
22 #include <vppinfra/types.h>
23 #include <vppinfra/cache.h>
24 
25 #include <vnet/ipsec/ipsec_spd.h>
27 #include <vnet/ipsec/ipsec_sa.h>
28 
29 #include <vppinfra/bihash_8_16.h>
30 
31 #include <vppinfra/bihash_24_16.h>
32 
33 typedef clib_error_t *(*add_del_sa_sess_cb_t) (u32 sa_index, u8 is_add);
34 typedef clib_error_t *(*check_support_cb_t) (ipsec_sa_t * sa);
35 typedef clib_error_t *(*enable_disable_cb_t) (int is_enable);
36 
37 typedef struct
38 {
39  u8 *name;
40  /* add/del callback */
42  /* check support function */
53 
54 typedef struct
55 {
56  u8 *name;
57  /* add/del callback */
59  /* check support function */
61  /* enable or disable function */
78 
79 typedef struct
80 {
88 
89 typedef struct
90 {
95 
96 typedef struct
97 {
98  CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
105 
106 typedef struct
107 {
108  /* pool of tunnel instances */
110  /* Pool of security associations */
112  /* pool of policies */
114 
115  /* hash tables of UDP port registrations */
117 
119 
120  /* convenience */
123 
124  /* hashes */
132 
133  clib_bihash_8_16_t tun4_protect_by_key;
134  clib_bihash_24_16_t tun6_protect_by_key;
135 
136  /* node indices */
150  /* next node indices */
161 
162  /* tun nodes to drop packets when no crypto alg set on outbound SA */
165 
166  /* tun nodes for encrypt on L2 interfaces */
169 
170  /* pool of ah backends */
172  /* pool of esp backends */
174  /* index of current ah backend */
176  /* index of current esp backend */
178  /* index of default ah backend */
180  /* index of default esp backend */
182 
183  /* crypto alg data */
185 
186  /* crypto integ data */
188 
189  /* per-thread data */
191 
192  /** Worker handoff */
197 
206 
208 } ipsec_main_t;
209 
211 {
216 
217 extern ipsec_main_t ipsec_main;
218 
220  u8 is_add);
221 
223 
238 
239 /*
240  * functions
241  */
242 u8 *format_ipsec_replay_window (u8 * s, va_list * args);
243 
244 /*
245  * inline functions
246  */
247 
250  vlib_node_runtime_t * nr)
251 {
252  u32 next;
253  vlib_main_t *vm = vlib_get_main ();
255 
256  vnet_feature_next (&next, b);
257  return node->next_nodes[next];
258 }
259 
261  const char *name,
262  const char *ah4_encrypt_node_name,
263  const char *ah4_decrypt_node_name,
264  const char *ah6_encrypt_node_name,
265  const char *ah6_decrypt_node_name,
266  check_support_cb_t ah_check_support_cb,
267  add_del_sa_sess_cb_t ah_add_del_sa_sess_cb);
268 
270  const char *name,
271  const char *esp4_encrypt_node_name,
272  const char *esp4_encrypt_tun_node_name,
273  const char *esp4_decrypt_node_name,
274  const char *esp4_decrypt_tun_node_name,
275  const char *esp6_encrypt_node_name,
276  const char *esp6_encrypt_tun_node_name,
277  const char *esp6_decrypt_node_name,
278  const char *esp6_decrypt_tun_node_name,
279  check_support_cb_t esp_check_support_cb,
280  add_del_sa_sess_cb_t esp_add_del_sa_sess_cb,
281  enable_disable_cb_t enable_disable_cb);
282 
283 int ipsec_select_ah_backend (ipsec_main_t * im, u32 ah_backend_idx);
284 int ipsec_select_esp_backend (ipsec_main_t * im, u32 esp_backend_idx);
285 
287 void ipsec_set_async_mode (u32 is_enabled);
288 
290 ipsec_sa_get (u32 sa_index)
291 {
292  return (pool_elt_at_index (ipsec_main.sad, sa_index));
293 }
294 
295 void ipsec_add_feature (const char *arc_name, const char *node_name,
296  u32 * out_feature_index);
297 
298 void ipsec_set_async_mode (u32 is_enabled);
299 extern void ipsec_register_udp_port (u16 udp_port);
300 extern void ipsec_unregister_udp_port (u16 udp_port);
301 
302 #endif /* __IPSEC_H__ */
303 
304 /*
305  * fd.io coding-style-patch-verification: ON
306  *
307  * Local Variables:
308  * eval: (c-set-style "gnu")
309  * End:
310  */
u32 * next_nodes
Definition: node.h:335
u32 esp4_decrypt_tun_node_index
Definition: ipsec.h:140
ipsec_spd_t * spds
Definition: ipsec.h:109
void ipsec_add_feature(const char *arc_name, const char *node_name, u32 *out_feature_index)
Definition: ipsec.c:128
u32 ipsec_register_esp_backend(vlib_main_t *vm, ipsec_main_t *im, const char *name, const char *esp4_encrypt_node_name, const char *esp4_encrypt_tun_node_name, const char *esp4_decrypt_node_name, const char *esp4_decrypt_tun_node_name, const char *esp6_encrypt_node_name, const char *esp6_encrypt_tun_node_name, const char *esp6_decrypt_node_name, const char *esp6_decrypt_tun_node_name, check_support_cb_t esp_check_support_cb, add_del_sa_sess_cb_t esp_add_del_sa_sess_cb, enable_disable_cb_t enable_disable_cb)
Definition: ipsec.c:211
u32 esp_default_backend
Definition: ipsec.h:181
#define CLIB_CACHE_LINE_ALIGN_MARK(mark)
Definition: cache.h:60
u32 esp4_encrypt_next_index
Definition: ipsec.h:65
ipsec_main_crypto_alg_t * crypto_algs
Definition: ipsec.h:184
ipsec_per_thread_data_t * ptd
Definition: ipsec.h:190
u32 esp6_decrypt_node_index
Definition: ipsec.h:145
vnet_crypto_op_t * integ_ops
Definition: ipsec.h:100
uword * tunnel_index_by_key
Definition: ipsec.h:118
enable_disable_cb_t enable_disable_cb
Definition: ipsec.h:62
u32 ah4_decrypt_next_index
Definition: ipsec.h:155
uword * ipsec4_if_pool_index_by_key
Definition: ipsec.h:128
u32 esp6_encrypt_tun_node_index
Definition: ipsec.h:76
u32 esp4_decrypt_node_index
Definition: ipsec.h:64
clib_error_t * ipsec_check_support_cb(ipsec_main_t *im, ipsec_sa_t *sa)
Definition: ipsec.c:91
enum ipsec_format_flags_t_ ipsec_format_flags_t
u32 ah6_decrypt_next_index
Definition: ipsec.h:51
u32 esp6_decrypt_tun_node_index
Definition: ipsec.h:146
u32 esp6_decrypt_next_index
Definition: ipsec.h:70
vnet_crypto_op_t * crypto_ops
Definition: ipsec.h:99
u32 ah4_encrypt_next_index
Definition: ipsec.h:154
u32 ah4_encrypt_node_index
Definition: ipsec.h:44
u32 esp6_encrypt_node_index
Definition: ipsec.h:67
void ipsec_register_udp_port(u16 udp_port)
Definition: ipsec.c:164
u32 ah_current_backend
Definition: ipsec.h:175
u32 esp6_decrypt_tun_next_index
Definition: ipsec.h:75
A Secruity Policy Database.
Definition: ipsec_spd.h:46
vnet_crypto_op_chunk_t * chunks
Definition: ipsec.h:103
u32 esp_current_backend
Definition: ipsec.h:177
u32 esp6_encrypt_l2_tun_node_index
Definition: ipsec.h:168
u32 ah6_decrypt_node_index
Definition: ipsec.h:49
unsigned char u8
Definition: types.h:56
vlib_node_registration_t esp6_decrypt_node
(constructor) VLIB_REGISTER_NODE (esp6_decrypt_node)
Definition: esp_decrypt.c:1472
ipsec_format_flags_t_
Definition: ipsec.h:210
uword * spd_index_by_sw_if_index
Definition: ipsec.h:126
int ipsec_select_esp_backend(ipsec_main_t *im, u32 esp_backend_idx)
Definition: ipsec.c:293
u32 esp4_decrypt_tun_next_index
Definition: ipsec.h:153
vnet_crypto_alg_t alg
Definition: ipsec.h:92
u32 esp4_enc_tun_fq_index
Definition: ipsec.h:202
u32 esp6_encrypt_next_index
Definition: ipsec.h:69
uword * ipsec6_if_pool_index_by_key
Definition: ipsec.h:129
u32 ah6_encrypt_node_index
Definition: ipsec.h:48
#define static_always_inline
Definition: clib.h:109
vlib_node_registration_t esp4_encrypt_node
(constructor) VLIB_REGISTER_NODE (esp4_encrypt_node)
Definition: esp_encrypt.c:1104
uword * udp_port_registrations
Definition: ipsec.h:116
u32 ah_default_backend
Definition: ipsec.h:179
vlib_node_registration_t esp4_decrypt_node
(constructor) VLIB_REGISTER_NODE (esp4_decrypt_node)
Definition: esp_decrypt.c:1441
ipsec_main_t ipsec_main
Definition: ipsec.c:28
u32 esp6_encrypt_node_index
Definition: ipsec.h:144
u32 esp4_decrypt_next_index
Definition: ipsec.h:152
void ipsec_unregister_udp_port(u16 udp_port)
Definition: ipsec.c:139
u32 ah6_encrypt_next_index
Definition: ipsec.h:50
uword * ipsec_if_by_sw_if_index
Definition: ipsec.h:131
u32 esp4_dec_tun_fq_index
Definition: ipsec.h:204
check_support_cb_t check_support_cb
Definition: ipsec.h:60
const cJSON *const b
Definition: cJSON.h:255
u32 ah6_dec_fq_index
Definition: ipsec.h:196
u32 esp4_dec_fq_index
Definition: ipsec.h:199
unsigned int u32
Definition: types.h:88
clib_error_t *(* add_del_sa_sess_cb_t)(u32 sa_index, u8 is_add)
Definition: ipsec.h:33
clib_bihash_8_16_t tun4_protect_by_key
Definition: ipsec.h:133
u32 esp6_decrypt_node_index
Definition: ipsec.h:68
vnet_crypto_alg_t
Definition: crypto.h:124
void ipsec_set_async_mode(u32 is_enabled)
Definition: ipsec.c:339
u32 ah4_decrypt_node_index
Definition: ipsec.h:143
u32 esp4_encrypt_l2_tun_node_index
Definition: ipsec.h:167
u32 error_drop_node_index
Definition: ipsec.h:137
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
Definition: pool.h:546
clib_bihash_24_16_t tun6_protect_by_key
Definition: ipsec.h:134
u32 esp4_encrypt_node_index
Definition: ipsec.h:138
vnet_main_t * vnet_main
Definition: ipsec.h:122
vnet_crypto_op_id_t enc_op_id
Definition: ipsec.h:81
unsigned short u16
Definition: types.h:57
u32 esp6_no_crypto_tun_node_index
Definition: ipsec.h:164
u32 ah4_decrypt_next_index
Definition: ipsec.h:47
u32 esp6_dec_tun_fq_index
Definition: ipsec.h:205
vlib_node_registration_t ah6_decrypt_node
(constructor) VLIB_REGISTER_NODE (ah6_decrypt_node)
Definition: ah_decrypt.c:456
u32 esp4_decrypt_tun_next_index
Definition: ipsec.h:72
#define always_inline
Definition: ipsec.h:28
vlib_node_registration_t ah4_encrypt_node
(constructor) VLIB_REGISTER_NODE (ah4_encrypt_node)
Definition: ah_encrypt.c:452
u32 ah4_enc_fq_index
Worker handoff.
Definition: ipsec.h:193
u32 esp6_decrypt_tun_node_index
Definition: ipsec.h:74
vlib_node_registration_t esp6_encrypt_node
(constructor) VLIB_REGISTER_NODE (esp6_encrypt_node)
Definition: esp_encrypt.c:1153
u32 node_index
Node index.
Definition: node.h:488
u32 ah4_dec_fq_index
Definition: ipsec.h:194
u32 esp4_encrypt_node_index
Definition: ipsec.h:63
static ipsec_sa_t * ipsec_sa_get(u32 sa_index)
Definition: ipsec.h:290
vlib_node_registration_t esp4_decrypt_tun_node
(constructor) VLIB_REGISTER_NODE (esp4_decrypt_tun_node)
Definition: esp_decrypt.c:1503
vlib_node_registration_t ipsec6_tun_input_node
(constructor) VLIB_REGISTER_NODE (ipsec6_tun_input_node)
Definition: ipsec_tun_in.c:396
uword * spd_index_by_spd_id
Definition: ipsec.h:125
vnet_crypto_op_t * chained_crypto_ops
Definition: ipsec.h:101
vlib_node_registration_t esp6_encrypt_tun_node
(constructor) VLIB_REGISTER_NODE (esp6_encrypt_tun_node)
Definition: esp_encrypt.c:1242
u32 ah6_enc_fq_index
Definition: ipsec.h:195
u32 ah4_decrypt_node_index
Definition: ipsec.h:45
u32 ah6_encrypt_next_index
Definition: ipsec.h:159
clib_error_t *(* enable_disable_cb_t)(int is_enable)
Definition: ipsec.h:35
u32 esp6_decrypt_tun_next_index
Definition: ipsec.h:158
ipsec_ah_backend_t * ah_backends
Definition: ipsec.h:171
static_always_inline void vnet_feature_next(u32 *next0, vlib_buffer_t *b0)
Definition: feature.h:322
u32 esp6_enc_tun_fq_index
Definition: ipsec.h:203
u32 esp4_encrypt_next_index
Definition: ipsec.h:151
vlib_node_registration_t ah6_encrypt_node
(constructor) VLIB_REGISTER_NODE (ah6_encrypt_node)
Definition: ah_encrypt.c:478
u32 ah4_encrypt_next_index
Definition: ipsec.h:46
uword * sa_index_by_sa_id
Definition: ipsec.h:127
u32 esp6_decrypt_next_index
Definition: ipsec.h:157
clib_error_t * ipsec_add_del_sa_sess_cb(ipsec_main_t *im, u32 sa_index, u8 is_add)
Definition: ipsec.c:69
u32 esp4_encrypt_tun_node_index
Definition: ipsec.h:141
A Secruity Policy.
static_always_inline u32 get_next_output_feature_node_index(vlib_buffer_t *b, vlib_node_runtime_t *nr)
Definition: ipsec.h:249
vlib_main_t * vlib_main
Definition: ipsec.h:121
uword * ipsec_if_real_dev_by_show_dev
Definition: ipsec.h:130
u32 esp4_no_crypto_tun_node_index
Definition: ipsec.h:163
u32 ipsec_register_ah_backend(vlib_main_t *vm, ipsec_main_t *im, const char *name, const char *ah4_encrypt_node_name, const char *ah4_decrypt_node_name, const char *ah6_encrypt_node_name, const char *ah6_decrypt_node_name, check_support_cb_t ah_check_support_cb, add_del_sa_sess_cb_t ah_add_del_sa_sess_cb)
Definition: ipsec.c:183
vlib_main_t vlib_node_runtime_t * node
Definition: in2out_ed.c:1580
u32 esp6_encrypt_next_index
Definition: ipsec.h:156
clib_error_t *(* check_support_cb_t)(ipsec_sa_t *sa)
Definition: ipsec.h:34
vnet_crypto_op_id_t op_id
Definition: ipsec.h:91
vlib_node_registration_t esp6_decrypt_tun_node
(constructor) VLIB_REGISTER_NODE (esp6_decrypt_tun_node)
Definition: esp_decrypt.c:1532
vlib_node_registration_t esp4_encrypt_tun_node
(constructor) VLIB_REGISTER_NODE (esp4_encrypt_tun_node)
Definition: esp_encrypt.c:1194
u32 ah4_encrypt_node_index
Definition: ipsec.h:142
ipsec_main_integ_alg_t * integ_algs
Definition: ipsec.h:187
u32 esp6_dec_fq_index
Definition: ipsec.h:201
ipsec_policy_t * policies
Definition: ipsec.h:113
u8 * format_ipsec_replay_window(u8 *s, va_list *args)
Definition: ipsec_format.c:143
u32 esp6_enc_fq_index
Definition: ipsec.h:200
ipsec_sa_t * sad
Definition: ipsec.h:111
u32 esp4_decrypt_node_index
Definition: ipsec.h:139
add_del_sa_sess_cb_t add_del_sa_sess_cb
Definition: ipsec.h:58
vnet_crypto_op_id_t dec_op_id
Definition: ipsec.h:82
vlib_node_registration_t ipsec4_tun_input_node
(constructor) VLIB_REGISTER_NODE (ipsec4_tun_input_node)
Definition: ipsec_tun_in.c:373
u32 ah6_decrypt_node_index
Definition: ipsec.h:149
static vlib_main_t * vlib_get_main(void)
Definition: global_funcs.h:23
struct _vlib_node_registration vlib_node_registration_t
u32 esp4_enc_fq_index
Definition: ipsec.h:198
u32 ah6_encrypt_node_index
Definition: ipsec.h:148
u32 ah6_decrypt_next_index
Definition: ipsec.h:160
check_support_cb_t check_support_cb
Definition: ipsec.h:43
u32 esp4_decrypt_tun_node_index
Definition: ipsec.h:71
VLIB buffer representation.
Definition: buffer.h:102
u64 uword
Definition: types.h:112
u32 esp4_encrypt_tun_node_index
Definition: ipsec.h:73
vnet_crypto_op_t * chained_integ_ops
Definition: ipsec.h:102
u32 esp4_decrypt_next_index
Definition: ipsec.h:66
vlib_node_registration_t ah4_decrypt_node
(constructor) VLIB_REGISTER_NODE (ah4_decrypt_node)
Definition: ah_decrypt.c:429
vnet_crypto_op_id_t
Definition: crypto.h:196
int ipsec_select_ah_backend(ipsec_main_t *im, u32 ah_backend_idx)
Definition: ipsec.c:270
static vlib_node_t * vlib_get_node(vlib_main_t *vm, u32 i)
Get vlib node by index.
Definition: node_funcs.h:85
clib_error_t * ipsec_rsc_in_use(ipsec_main_t *im)
Definition: ipsec.c:258
vnet_crypto_alg_t alg
Definition: ipsec.h:83
add_del_sa_sess_cb_t add_del_sa_sess_cb
Definition: ipsec.h:41
ipsec_esp_backend_t * esp_backends
Definition: ipsec.h:173
u8 async_mode
Definition: ipsec.h:207
u32 esp6_encrypt_tun_node_index
Definition: ipsec.h:147