FD.io VPP  v21.10.1-2-g0a485f517
Vector Packet Processing
ipsec_sa.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_SPD_SA_H__
16 #define __IPSEC_SPD_SA_H__
17 
18 #include <vlib/vlib.h>
19 #include <vnet/crypto/crypto.h>
20 #include <vnet/ip/ip.h>
21 #include <vnet/fib/fib_node.h>
22 #include <vnet/tunnel/tunnel.h>
23 
24 #define foreach_ipsec_crypto_alg \
25  _ (0, NONE, "none") \
26  _ (1, AES_CBC_128, "aes-cbc-128") \
27  _ (2, AES_CBC_192, "aes-cbc-192") \
28  _ (3, AES_CBC_256, "aes-cbc-256") \
29  _ (4, AES_CTR_128, "aes-ctr-128") \
30  _ (5, AES_CTR_192, "aes-ctr-192") \
31  _ (6, AES_CTR_256, "aes-ctr-256") \
32  _ (7, AES_GCM_128, "aes-gcm-128") \
33  _ (8, AES_GCM_192, "aes-gcm-192") \
34  _ (9, AES_GCM_256, "aes-gcm-256") \
35  _ (10, DES_CBC, "des-cbc") \
36  _ (11, 3DES_CBC, "3des-cbc")
37 
38 typedef enum
39 {
40 #define _(v, f, s) IPSEC_CRYPTO_ALG_##f = v,
42 #undef _
44 } __clib_packed ipsec_crypto_alg_t;
45 
46 #define IPSEC_CRYPTO_ALG_IS_GCM(_alg) \
47  (((_alg == IPSEC_CRYPTO_ALG_AES_GCM_128) || \
48  (_alg == IPSEC_CRYPTO_ALG_AES_GCM_192) || \
49  (_alg == IPSEC_CRYPTO_ALG_AES_GCM_256)))
50 
51 #define IPSEC_CRYPTO_ALG_IS_CTR(_alg) \
52  (((_alg == IPSEC_CRYPTO_ALG_AES_CTR_128) || \
53  (_alg == IPSEC_CRYPTO_ALG_AES_CTR_192) || \
54  (_alg == IPSEC_CRYPTO_ALG_AES_CTR_256)))
55 
56 #define foreach_ipsec_integ_alg \
57  _ (0, NONE, "none") \
58  _ (1, MD5_96, "md5-96") /* RFC2403 */ \
59  _ (2, SHA1_96, "sha1-96") /* RFC2404 */ \
60  _ (3, SHA_256_96, "sha-256-96") /* draft-ietf-ipsec-ciph-sha-256-00 */ \
61  _ (4, SHA_256_128, "sha-256-128") /* RFC4868 */ \
62  _ (5, SHA_384_192, "sha-384-192") /* RFC4868 */ \
63  _ (6, SHA_512_256, "sha-512-256") /* RFC4868 */
64 
65 typedef enum
66 {
67 #define _(v, f, s) IPSEC_INTEG_ALG_##f = v,
69 #undef _
71 } __clib_packed ipsec_integ_alg_t;
72 
73 typedef enum
74 {
77 } __clib_packed ipsec_protocol_t;
78 
79 #define IPSEC_KEY_MAX_LEN 128
80 typedef struct ipsec_key_t_
81 {
84 } ipsec_key_t;
85 
86 /*
87  * Enable extended sequence numbers
88  * Enable Anti-replay
89  * IPsec tunnel mode if non-zero, else transport mode
90  * IPsec tunnel mode is IPv6 if non-zero,
91  * else IPv4 tunnel only valid if is_tunnel is non-zero
92  * enable UDP encapsulation for NAT traversal
93  */
94 #define foreach_ipsec_sa_flags \
95  _ (0, NONE, "none") \
96  _ (1, USE_ESN, "esn") \
97  _ (2, USE_ANTI_REPLAY, "anti-replay") \
98  _ (4, IS_TUNNEL, "tunnel") \
99  _ (8, IS_TUNNEL_V6, "tunnel-v6") \
100  _ (16, UDP_ENCAP, "udp-encap") \
101  _ (32, IS_PROTECT, "Protect") \
102  _ (64, IS_INBOUND, "inbound") \
103  _ (128, IS_AEAD, "aead") \
104  _ (256, IS_CTR, "ctr") \
105  _ (512, IS_ASYNC, "async")
106 
107 typedef enum ipsec_sad_flags_t_
108 {
109 #define _(v, f, s) IPSEC_SA_FLAG_##f = v,
111 #undef _
112 } __clib_packed ipsec_sa_flags_t;
113 
114 STATIC_ASSERT (sizeof (ipsec_sa_flags_t) == 2, "IPSEC SA flags != 2 byte");
115 
116 typedef struct
117 {
118  CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
119 
120  /* flags */
122 
126 
127  u8 __pad1[3];
128 
130 
137 
140 
141  /* Union data shared by sync and async ops, updated when mode is
142  * changed. */
143  union
144  {
145  struct
146  {
150  };
151 
152  struct
153  {
157  };
158 
160  };
161 
162  CLIB_CACHE_LINE_ALIGN_MARK (cacheline1);
163 
164  union
165  {
168  };
170 
171  /* Salt used in CTR modes (incl. GCM) - stored in network byte order */
173 
174  ipsec_protocol_t protocol;
176  u8 __pad[2];
177 
178  /* data accessed by dataplane code should be above this comment */
179  CLIB_CACHE_LINE_ALIGN_MARK (cacheline2);
180 
181  /* Elements with u64 size multiples */
182  union
183  {
184  struct
185  {
186  vnet_crypto_op_id_t crypto_enc_op_id:16;
187  vnet_crypto_op_id_t crypto_dec_op_id:16;
188  vnet_crypto_op_id_t integ_op_id:16;
189  };
191  } sync_op_data;
192 
193  union
194  {
195  struct
196  {
197  vnet_crypto_async_op_id_t crypto_async_enc_op_id:16;
198  vnet_crypto_async_op_id_t crypto_async_dec_op_id:16;
199  vnet_crypto_key_index_t linked_key_index;
200  };
201  u64 data;
202  } async_op_data;
203 
205 
207 
208  /* elements with u32 size */
213 
214  /* else u8 packed */
215  ipsec_crypto_alg_t crypto_alg;
216  ipsec_integ_alg_t integ_alg;
217 
220 } ipsec_sa_t;
221 
224 
225 /**
226  * Pool of IPSec SAs
227  */
228 extern ipsec_sa_t *ipsec_sa_pool;
229 
230 /*
231  * Ensure that the IPsec data does not overlap with the IP data in
232  * the buffer meta data
233  */
235  STRUCT_OFFSET_OF (vnet_buffer_opaque_t, ip.save_protocol),
236  "IPSec data is overlapping with IP data");
237 
238 #define _(a,v,s) \
239  always_inline int \
240  ipsec_sa_is_set_##v (const ipsec_sa_t *sa) { \
241  return (sa->flags & IPSEC_SA_FLAG_##v); \
242  }
244 #undef _
245 #define _(a,v,s) \
246  always_inline int \
247  ipsec_sa_set_##v (ipsec_sa_t *sa) { \
248  return (sa->flags |= IPSEC_SA_FLAG_##v); \
249  }
251 #undef _
252 #define _(a,v,s) \
253  always_inline int \
254  ipsec_sa_unset_##v (ipsec_sa_t *sa) { \
255  return (sa->flags &= ~IPSEC_SA_FLAG_##v); \
256  }
258 #undef _
259 /**
260  * @brief
261  * SA packet & bytes counters
262  */
264 
265 extern void ipsec_mk_key (ipsec_key_t * key, const u8 * data, u8 len);
266 
267 extern int
268 ipsec_sa_add_and_lock (u32 id, u32 spi, ipsec_protocol_t proto,
269  ipsec_crypto_alg_t crypto_alg, const ipsec_key_t *ck,
270  ipsec_integ_alg_t integ_alg, const ipsec_key_t *ik,
272  u16 dst_port, const tunnel_t *tun, u32 *sa_out_index);
274 extern int ipsec_sa_unlock_id (u32 id);
275 extern void ipsec_sa_unlock (index_t sai);
276 extern void ipsec_sa_lock (index_t sai);
277 extern void ipsec_sa_clear (index_t sai);
278 extern void ipsec_sa_set_crypto_alg (ipsec_sa_t * sa,
279  ipsec_crypto_alg_t crypto_alg);
280 extern void ipsec_sa_set_integ_alg (ipsec_sa_t * sa,
281  ipsec_integ_alg_t integ_alg);
282 
283 typedef walk_rc_t (*ipsec_sa_walk_cb_t) (ipsec_sa_t * sa, void *ctx);
284 extern void ipsec_sa_walk (ipsec_sa_walk_cb_t cd, void *ctx);
285 
286 extern u8 *format_ipsec_replay_window (u8 *s, va_list *args);
287 extern u8 *format_ipsec_crypto_alg (u8 * s, va_list * args);
288 extern u8 *format_ipsec_integ_alg (u8 * s, va_list * args);
289 extern u8 *format_ipsec_sa (u8 * s, va_list * args);
290 extern u8 *format_ipsec_key (u8 * s, va_list * args);
292  va_list * args);
294  va_list * args);
295 extern uword unformat_ipsec_key (unformat_input_t * input, va_list * args);
296 
297 #define IPSEC_UDP_PORT_NONE ((u16)~0)
298 
299 /*
300  * Anti Replay definitions
301  */
302 
303 #define IPSEC_SA_ANTI_REPLAY_WINDOW_SIZE (64)
304 #define IPSEC_SA_ANTI_REPLAY_WINDOW_MAX_INDEX (IPSEC_SA_ANTI_REPLAY_WINDOW_SIZE-1)
305 
306 /*
307  * sequence number less than the lower bound are outside of the window
308  * From RFC4303 Appendix A:
309  * Bl = Tl - W + 1
310  */
311 #define IPSEC_SA_ANTI_REPLAY_WINDOW_LOWER_BOUND(_tl) (_tl - IPSEC_SA_ANTI_REPLAY_WINDOW_SIZE + 1)
312 
313 always_inline int
315 {
316  if (ipsec_sa_is_set_USE_ANTI_REPLAY (sa) &&
317  sa->replay_window & (1ULL << (sa->seq - seq)))
318  return 1;
319  else
320  return 0;
321 }
322 
323 /*
324  * Anti replay check.
325  * inputs need to be in host byte order.
326  *
327  * The function runs in two contexts. pre and post decrypt.
328  * Pre-decrypt it:
329  * 1 - determines if a packet is a replay - a simple check in the window
330  * 2 - returns the hi-seq number that should be used to decrypt.
331  * post-decrypt:
332  * Checks whether the packet is a replay or falls out of window
333  *
334  * This funcion should be called even without anti-replay enabled to ensure
335  * the high sequence number is set.
336  */
337 always_inline int
339  u32 hi_seq_used, bool post_decrypt,
340  u32 *hi_seq_req)
341 {
342  ASSERT ((post_decrypt == false) == (hi_seq_req != 0));
343 
344  if (!ipsec_sa_is_set_USE_ESN (sa))
345  {
346  if (hi_seq_req)
347  /* no ESN, therefore the hi-seq is always 0 */
348  *hi_seq_req = 0;
349 
350  if (!ipsec_sa_is_set_USE_ANTI_REPLAY (sa))
351  return 0;
352 
353  if (PREDICT_TRUE (seq > sa->seq))
354  return 0;
355 
356  u32 diff = sa->seq - seq;
357 
359  return ((sa->replay_window & (1ULL << diff)) ? 1 : 0);
360  else
361  return 1;
362 
363  return 0;
364  }
365 
366  if (!ipsec_sa_is_set_USE_ANTI_REPLAY (sa))
367  {
368  /* there's no AR configured for this SA, but in order
369  * to know whether a packet has wrapped the hi ESN we need
370  * to know whether it is out of window. if we use the default
371  * lower bound then we are effectively forcing AR because
372  * out of window packets will get the increased hi seq number
373  * and will thus fail to decrypt. IOW we need a window to know
374  * if the SN has wrapped, but we don't want a window to check for
375  * anti replay. to resolve the contradiction we use a huge window.
376  * if the packet is not within 2^30 of the current SN, we'll consider
377  * it a wrap.
378  */
379  if (hi_seq_req)
380  {
381  if (seq >= sa->seq)
382  /* The packet's sequence number is larger that the SA's.
383  * that can't be a warp - unless we lost more than
384  * 2^32 packets ... how could we know? */
385  *hi_seq_req = sa->seq_hi;
386  else
387  {
388  /* The packet's SN is less than the SAs, so either the SN has
389  * wrapped or the SN is just old. */
390  if (sa->seq - seq > (1 << 30))
391  /* It's really really really old => it wrapped */
392  *hi_seq_req = sa->seq_hi + 1;
393  else
394  *hi_seq_req = sa->seq_hi;
395  }
396  }
397  /*
398  * else
399  * this is post-decrpyt and since it decrypted we accept it
400  */
401  return 0;
402  }
404  {
405  /*
406  * the last sequence number VPP recieved is more than one
407  * window size greater than zero.
408  * Case A from RFC4303 Appendix A.
409  */
411  {
412  /*
413  * the received sequence number is lower than the lower bound
414  * of the window, this could mean either a replay packet or that
415  * the high sequence number has wrapped. if it decrypts corrently
416  * then it's the latter.
417  */
418  if (post_decrypt)
419  {
420  if (hi_seq_used == sa->seq_hi)
421  /* the high sequence number used to succesfully decrypt this
422  * packet is the same as the last-sequnence number of the SA.
423  * that means this packet did not cause a wrap.
424  * this packet is thus out of window and should be dropped */
425  return 1;
426  else
427  /* The packet decrypted with a different high sequence number
428  * to the SA, that means it is the wrap packet and should be
429  * accepted */
430  return 0;
431  }
432  else
433  {
434  /* pre-decrypt it might be the might that casues a wrap, we
435  * need to decrpyt to find out */
436  if (hi_seq_req)
437  *hi_seq_req = sa->seq_hi + 1;
438  return 0;
439  }
440  }
441  else
442  {
443  /*
444  * the recieved sequence number greater than the low
445  * end of the window.
446  */
447  if (hi_seq_req)
448  *hi_seq_req = sa->seq_hi;
449  if (seq <= sa->seq)
450  /*
451  * The recieved seq number is within bounds of the window
452  * check if it's a duplicate
453  */
454  return (ipsec_sa_anti_replay_check (sa, seq));
455  else
456  /*
457  * The received sequence number is greater than the window
458  * upper bound. this packet will move the window along, assuming
459  * it decrypts correctly.
460  */
461  return 0;
462  }
463  }
464  else
465  {
466  /*
467  * the last sequence number VPP recieved is within one window
468  * size of zero, i.e. 0 < TL < WINDOW_SIZE, the lower bound is thus a
469  * large sequence number.
470  * Note that the check below uses unsiged integer arthimetic, so the
471  * RHS will be a larger number.
472  * Case B from RFC4303 Appendix A.
473  */
475  {
476  /*
477  * the sequence number is less than the lower bound.
478  */
479  if (seq <= sa->seq)
480  {
481  /*
482  * the packet is within the window upper bound.
483  * check for duplicates.
484  */
485  if (hi_seq_req)
486  *hi_seq_req = sa->seq_hi;
487  return (ipsec_sa_anti_replay_check (sa, seq));
488  }
489  else
490  {
491  /*
492  * the packet is less the window lower bound or greater than
493  * the higher bound, depending on how you look at it...
494  * We're assuming, given that the last sequence number received,
495  * TL < WINDOW_SIZE, that a largeer seq num is more likely to be
496  * a packet that moves the window forward, than a packet that has
497  * wrapped the high sequence again. If it were the latter then
498  * we've lost close to 2^32 packets.
499  */
500  if (hi_seq_req)
501  *hi_seq_req = sa->seq_hi;
502  return 0;
503  }
504  }
505  else
506  {
507  /*
508  * the packet seq number is between the lower bound (a large nubmer)
509  * and MAX_SEQ_NUM. This is in the window since the window upper bound
510  * tl > 0.
511  * However, since TL is the other side of 0 to the received
512  * packet, the SA has moved on to a higher sequence number.
513  */
514  if (hi_seq_req)
515  *hi_seq_req = sa->seq_hi - 1;
516  return (ipsec_sa_anti_replay_check (sa, seq));
517  }
518  }
519 
520  /* unhandled case */
521  ASSERT (0);
522  return 0;
523 }
524 
525 /*
526  * Anti replay window advance
527  * inputs need to be in host byte order.
528  * This function both advances the anti-replay window and the sequence number
529  * We always need to move on the SN but the window updates are only needed
530  * if AR is on.
531  * However, updating the window is trivial, so we do it anyway to save
532  * the branch cost.
533  */
534 always_inline void
536 {
537  u32 pos;
538 
539  if (ipsec_sa_is_set_USE_ESN (sa))
540  {
541  int wrap = hi_seq - sa->seq_hi;
542 
543  if (wrap == 0 && seq > sa->seq)
544  {
545  pos = seq - sa->seq;
547  sa->replay_window = ((sa->replay_window) << pos) | 1;
548  else
549  sa->replay_window = 1;
550  sa->seq = seq;
551  }
552  else if (wrap > 0)
553  {
554  pos = ~seq + sa->seq + 1;
556  sa->replay_window = ((sa->replay_window) << pos) | 1;
557  else
558  sa->replay_window = 1;
559  sa->seq = seq;
560  sa->seq_hi = hi_seq;
561  }
562  else if (wrap < 0)
563  {
564  pos = ~seq + sa->seq + 1;
565  sa->replay_window |= (1ULL << pos);
566  }
567  else
568  {
569  pos = sa->seq - seq;
570  sa->replay_window |= (1ULL << pos);
571  }
572  }
573  else
574  {
575  if (seq > sa->seq)
576  {
577  pos = seq - sa->seq;
579  sa->replay_window = ((sa->replay_window) << pos) | 1;
580  else
581  sa->replay_window = 1;
582  sa->seq = seq;
583  }
584  else
585  {
586  pos = sa->seq - seq;
587  sa->replay_window |= (1ULL << pos);
588  }
589  }
590 }
591 
592 
593 /*
594  * Makes choice for thread_id should be assigned.
595  * if input ~0, gets random worker_id based on unix_time_now_nsec
596 */
599 {
600  return ((thread_id) ? thread_id
601  : (unix_time_now_nsec () % vlib_num_workers ()) + 1);
602 }
603 
605 ipsec_sa_get (u32 sa_index)
606 {
607  return (pool_elt_at_index (ipsec_sa_pool, sa_index));
608 }
609 
610 #endif /* __IPSEC_SPD_SA_H__ */
611 
612 /*
613  * fd.io coding-style-patch-verification: ON
614  *
615  * Local Variables:
616  * eval: (c-set-style "gnu")
617  * End:
618  */
ipsec_sa_pool
ipsec_sa_t * ipsec_sa_pool
Pool of IPSec SAs.
Definition: ipsec_sa.c:32
vlib.h
ipsec_sa_set_integ_alg
void ipsec_sa_set_integ_alg(ipsec_sa_t *sa, ipsec_integ_alg_t integ_alg)
Definition: ipsec_sa.c:116
vlib_num_workers
static u32 vlib_num_workers()
Definition: threads.h:333
ipsec_sa_t::integ_key_index
vnet_crypto_key_index_t integ_key_index
Definition: ipsec_sa.h:139
ipsec_sa_t::protocol
ipsec_protocol_t protocol
Definition: ipsec_sa.h:174
tunnel_encap_decap_flags_t
enum tunnel_encap_decap_flags_t_ tunnel_encap_decap_flags_t
dst_port
vl_api_ip_port_and_mask_t dst_port
Definition: flow_types.api:92
ipsec_sa_anti_replay_and_sn_advance
static int ipsec_sa_anti_replay_and_sn_advance(const ipsec_sa_t *sa, u32 seq, u32 hi_seq_used, bool post_decrypt, u32 *hi_seq_req)
Definition: ipsec_sa.h:338
ipsec_sa_t::ctr_iv_counter
u64 ctr_iv_counter
Definition: ipsec_sa.h:135
crypto.h
ipsec_sa_find_and_lock
index_t ipsec_sa_find_and_lock(u32 id)
Definition: ipsec_sa.c:387
ipsec_sa_t::thread_index
u32 thread_index
Definition: ipsec_sa.h:129
ipsec_sa_add_and_lock
int ipsec_sa_add_and_lock(u32 id, u32 spi, ipsec_protocol_t proto, ipsec_crypto_alg_t crypto_alg, const ipsec_key_t *ck, ipsec_integ_alg_t integ_alg, const ipsec_key_t *ik, ipsec_sa_flags_t flags, u32 salt, u16 src_port, u16 dst_port, const tunnel_t *tun, u32 *sa_out_index)
Definition: ipsec_sa.c:170
pool_elt_at_index
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
Definition: pool.h:549
tunnel_t_
A representation of an IP tunnel config.
Definition: tunnel.h:85
CLIB_CACHE_LINE_ALIGN_MARK
#define CLIB_CACHE_LINE_ALIGN_MARK(mark)
Definition: cache.h:60
unformat_ipsec_key
uword unformat_ipsec_key(unformat_input_t *input, va_list *args)
Definition: ipsec_format.c:243
tunnel.h
ipsec_sa_t::ip4_hdr
ip4_header_t ip4_hdr
Definition: ipsec_sa.h:166
u16
unsigned short u16
Definition: types.h:57
vnet_crypto_key_index_t
u32 vnet_crypto_key_index_t
Definition: crypto.h:378
ipsec_sa_t::integ_icv_size
u8 integ_icv_size
Definition: ipsec_sa.h:125
IPSEC_PROTOCOL_ESP
@ IPSEC_PROTOCOL_ESP
Definition: ipsec_sa.h:76
ipsec_sa_t::crypto_key
ipsec_key_t crypto_key
Definition: ipsec_sa.h:219
IPSEC_SA_ANTI_REPLAY_WINDOW_MAX_INDEX
#define IPSEC_SA_ANTI_REPLAY_WINDOW_MAX_INDEX
Definition: ipsec_sa.h:304
unformat_input_t
struct _unformat_input_t unformat_input_t
ipsec_sa_t::crypto_dec_op_id
vnet_crypto_op_id_t crypto_dec_op_id
Definition: ipsec_sa.h:148
fib_node.h
ipsec_sa_t::esp_block_align
u8 esp_block_align
Definition: ipsec_sa.h:124
ipsec_sa_t::tunnel
tunnel_t tunnel
Definition: ipsec_sa.h:204
ipsec_sa_anti_replay_check
static int ipsec_sa_anti_replay_check(const ipsec_sa_t *sa, u32 seq)
Definition: ipsec_sa.h:314
udp_header_t
Definition: udp_packet.h:45
ip4_header_t
Definition: ip4_packet.h:87
ipsec_sa_t::udp_hdr
udp_header_t udp_hdr
Definition: ipsec_sa.h:169
key
typedef key
Definition: ipsec_types.api:91
ipsec_key_t_::data
u8 data[IPSEC_KEY_MAX_LEN]
Definition: ipsec_sa.h:83
STATIC_ASSERT
STATIC_ASSERT(sizeof(ipsec_sa_flags_t)==2, "IPSEC SA flags != 2 byte")
ipsec_sa_walk
void ipsec_sa_walk(ipsec_sa_walk_cb_t cd, void *ctx)
Definition: ipsec_sa.c:428
STRUCT_OFFSET_OF
#define STRUCT_OFFSET_OF(t, f)
Definition: clib.h:73
ipsec_sa_unlock_id
int ipsec_sa_unlock_id(u32 id)
Definition: ipsec_sa.c:406
ipsec_sa_flags_t
enum ipsec_sad_flags_t_ ipsec_sa_flags_t
ipsec_sa_t::crypto_async_dec_op_id
vnet_crypto_async_op_id_t crypto_async_dec_op_id
Definition: ipsec_sa.h:155
ipsec_sa_clear
void ipsec_sa_clear(index_t sai)
Definition: ipsec_sa.c:422
len
u8 len
Definition: ip_types.api:103
format_ipsec_crypto_alg
u8 * format_ipsec_crypto_alg(u8 *s, va_list *args)
Definition: ipsec_format.c:79
foreach_ipsec_integ_alg
#define foreach_ipsec_integ_alg
Definition: ipsec_sa.h:56
ipsec_sa_t::replay_window
u64 replay_window
Definition: ipsec_sa.h:134
format_ipsec_integ_alg
u8 * format_ipsec_integ_alg(u8 *s, va_list *args)
Definition: ipsec_format.c:111
ipsec_sa_get
static ipsec_sa_t * ipsec_sa_get(u32 sa_index)
Definition: ipsec_sa.h:605
IPSEC_SA_ANTI_REPLAY_WINDOW_SIZE
#define IPSEC_SA_ANTI_REPLAY_WINDOW_SIZE
Definition: ipsec_sa.h:303
ipsec_sa_t::integ_key
ipsec_key_t integ_key
Definition: ipsec_sa.h:218
ipsec_sa_lock
void ipsec_sa_lock(index_t sai)
Definition: ipsec_sa.c:374
ipsec_sa_walk_cb_t
walk_rc_t(* ipsec_sa_walk_cb_t)(ipsec_sa_t *sa, void *ctx)
Definition: ipsec_sa.h:283
ipsec_sa_t::crypto_iv_size
u8 crypto_iv_size
Definition: ipsec_sa.h:123
index_t
u32 index_t
A Data-Path Object is an object that represents actions that are applied to packets are they are swit...
Definition: dpo.h:43
ipsec_sa_t::tunnel_flags
tunnel_encap_decap_flags_t tunnel_flags
Definition: ipsec_sa.h:175
ipsec_sa_t::seq
u32 seq
Definition: ipsec_sa.h:132
unix_time_now_nsec
static u64 unix_time_now_nsec(void)
Definition: time.h:270
uword
u64 uword
Definition: types.h:112
ipsec_sa_t::crypto_calg
vnet_crypto_alg_t crypto_calg
Definition: ipsec_sa.h:212
src_port
vl_api_ip_port_and_mask_t src_port
Definition: flow_types.api:91
vnet_crypto_op_id_t
vnet_crypto_op_id_t
Definition: crypto.h:219
foreach_ipsec_sa_flags
#define foreach_ipsec_sa_flags
Definition: ipsec_sa.h:94
ipsec_key_t_
Definition: ipsec_sa.h:80
ipsec_sad_flags_t_
ipsec_sad_flags_t_
Definition: ipsec_sa.h:107
unformat_ipsec_integ_alg
uword unformat_ipsec_integ_alg(unformat_input_t *input, va_list *args)
Definition: ipsec_format.c:129
IPSEC_CRYPTO_N_ALG
@ IPSEC_CRYPTO_N_ALG
Definition: ipsec_sa.h:43
ipsec_sa_assign_thread
static u32 ipsec_sa_assign_thread(u32 thread_id)
Definition: ipsec_sa.h:598
CLIB_CACHE_LINE_BYTES
#define CLIB_CACHE_LINE_BYTES
Definition: cache.h:58
ipsec_sa_t::crypto_alg
ipsec_crypto_alg_t crypto_alg
Definition: ipsec_sa.h:215
ipsec_sa_t::crypto_async_enc_op_id
vnet_crypto_async_op_id_t crypto_async_enc_op_id
Definition: ipsec_sa.h:154
data
u8 data[128]
Definition: ipsec_types.api:95
ipsec_sa_t
Definition: ipsec_sa.h:116
IPSEC_KEY_MAX_LEN
#define IPSEC_KEY_MAX_LEN
Definition: ipsec_sa.h:79
always_inline
#define always_inline
Definition: rdma_mlx5dv.h:23
ipsec_sa_unlock
void ipsec_sa_unlock(index_t sai)
Definition: ipsec_sa.c:361
vnet_buffer_opaque_t
Definition: buffer.h:153
unformat_ipsec_crypto_alg
uword unformat_ipsec_crypto_alg(unformat_input_t *input, va_list *args)
Definition: ipsec_format.c:97
spi
u32 spi
Definition: flow_types.api:140
u64
unsigned long u64
Definition: types.h:89
ipsec_key_t_::len
u8 len
Definition: ipsec_sa.h:82
ASSERT
#define ASSERT(truth)
Definition: error_bootstrap.h:69
ipsec_sa_set_crypto_alg
void ipsec_sa_set_crypto_alg(ipsec_sa_t *sa, ipsec_crypto_alg_t crypto_alg)
Definition: ipsec_sa.c:92
vlib_combined_counter_main_t
A collection of combined counters.
Definition: counter.h:203
ip.h
u32
unsigned int u32
Definition: types.h:88
integ_alg
u8 integ_alg
Definition: ikev2_types.api:59
ctx
long ctx[MAX_CONNS]
Definition: main.c:144
ipsec_sa_t::node
fib_node_t node
Definition: ipsec_sa.h:206
ipsec_sa_t::integ_op_id
vnet_crypto_op_id_t integ_op_id
Definition: ipsec_sa.h:149
IPSEC_PROTOCOL_AH
@ IPSEC_PROTOCOL_AH
Definition: ipsec_sa.h:75
ipsec_sa_t::salt
u32 salt
Definition: ipsec_sa.h:172
ipsec_sa_t::seq_hi
u32 seq_hi
Definition: ipsec_sa.h:133
ip6_header_t
Definition: ip6_packet.h:294
ipsec_sa_t::linked_key_index
vnet_crypto_key_index_t linked_key_index
Definition: ipsec_sa.h:156
ipsec_sa_t::id
u32 id
Definition: ipsec_sa.h:209
ipsec_mk_key
void ipsec_mk_key(ipsec_key_t *key, const u8 *data, u8 len)
Definition: ipsec_sa.c:57
salt
u32 salt
Definition: ipsec_types.api:139
fib_node_t_
An node in the FIB graph.
Definition: fib_node.h:301
ipsec_sa_counters
foreach_ipsec_sa_flags vlib_combined_counter_main_t ipsec_sa_counters
SA packet & bytes counters.
Definition: ipsec_sa.c:27
u8
unsigned char u8
Definition: types.h:56
vnet_crypto_async_op_id_t
vnet_crypto_async_op_id_t
Definition: crypto.h:182
ipsec_sa_t::ip6_hdr
ip6_header_t ip6_hdr
Definition: ipsec_sa.h:167
ip
vl_api_address_t ip
Definition: l2.api:558
ipsec_sa_t::integ_alg
ipsec_integ_alg_t integ_alg
Definition: ipsec_sa.h:216
IPSEC_INTEG_N_ALG
@ IPSEC_INTEG_N_ALG
Definition: ipsec_sa.h:70
format_ipsec_replay_window
u8 * format_ipsec_replay_window(u8 *s, va_list *args)
Definition: ipsec_format.c:143
IPSEC_SA_ANTI_REPLAY_WINDOW_LOWER_BOUND
#define IPSEC_SA_ANTI_REPLAY_WINDOW_LOWER_BOUND(_tl)
Definition: ipsec_sa.h:311
dpo_id_t_
The identity of a DPO is a combination of its type and its instance number/index of objects of that t...
Definition: dpo.h:172
ipsec_sa_t::integ_calg
vnet_crypto_alg_t integ_calg
Definition: ipsec_sa.h:211
ipsec_sa_t::stat_index
u32 stat_index
Definition: ipsec_sa.h:210
ipsec_sa_t::flags
ipsec_sa_flags_t flags
Definition: ipsec_sa.h:121
vnet_buffer_opaque_t::sad_index
u32 sad_index
Definition: buffer.h:334
format_ipsec_sa
u8 * format_ipsec_sa(u8 *s, va_list *args)
Definition: ipsec_format.c:270
proto
vl_api_ip_proto_t proto
Definition: acl_types.api:51
STATIC_ASSERT_OFFSET_OF
STATIC_ASSERT_OFFSET_OF(ipsec_sa_t, cacheline1, CLIB_CACHE_LINE_BYTES)
ipsec_sa_t::data
u64 data
Definition: ipsec_sa.h:190
vnet_crypto_alg_t
vnet_crypto_alg_t
Definition: crypto.h:145
PREDICT_TRUE
#define PREDICT_TRUE(x)
Definition: clib.h:125
foreach_ipsec_crypto_alg
#define foreach_ipsec_crypto_alg
Definition: ipsec_sa.h:24
format_ipsec_key
u8 * format_ipsec_key(u8 *s, va_list *args)
Definition: ipsec_format.c:235
tun
vl_api_gbp_endpoint_tun_t tun
Definition: gbp.api:134
walk_rc_t
enum walk_rc_t_ walk_rc_t
Walk return code.
ipsec_sa_t::spi
u32 spi
Definition: ipsec_sa.h:131
ipsec_sa_t::crypto_enc_op_id
vnet_crypto_op_id_t crypto_enc_op_id
Definition: ipsec_sa.h:147
ipsec_sa_t::crypto_key_index
vnet_crypto_key_index_t crypto_key_index
Definition: ipsec_sa.h:138
ipsec_key_t
struct ipsec_key_t_ ipsec_key_t
ipsec_sa_t::dpo
dpo_id_t dpo
Definition: ipsec_sa.h:136
ipsec_sa_anti_replay_advance
static void ipsec_sa_anti_replay_advance(ipsec_sa_t *sa, u32 seq, u32 hi_seq)
Definition: ipsec_sa.h:535
ipsec_sa_t::crypto_op_data
u64 crypto_op_data
Definition: ipsec_sa.h:159
flags
vl_api_wireguard_peer_flags_t flags
Definition: wireguard.api:105