FD.io VPP  v21.10.1-2-g0a485f517
Vector Packet Processing
ipsec_tun_in.c
Go to the documentation of this file.
1 /*
2  * ipsec_tun_protect_in.c : IPSec interface input node
3  *
4  * Copyright (c) 2015 Cisco and/or its affiliates.
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at:
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 #include <vnet/vnet.h>
19 #include <vnet/api_errno.h>
20 #include <vnet/ip/ip.h>
21 
22 #include <vnet/ipsec/ipsec.h>
23 #include <vnet/ipsec/esp.h>
24 #include <vnet/ipsec/ipsec_io.h>
25 #include <vnet/ipsec/ipsec_punt.h>
26 #include <vnet/ipsec/ipsec_tun.h>
27 #include <vnet/ip/ip4_input.h>
28 
29 /* Statistics (not really errors) */
30 #define foreach_ipsec_tun_protect_input_error \
31  _(RX, "good packets received") \
32  _(DISABLED, "ipsec packets received on disabled interface") \
33  _(NO_TUNNEL, "no matching tunnel") \
34  _(TUNNEL_MISMATCH, "SPI-tunnel mismatch") \
35  _(NAT_KEEPALIVE, "NAT Keepalive") \
36  _(TOO_SHORT, "Too Short") \
37  _(SPI_0, "SPI 0")
38 
40 #define _(sym,string) string,
42 #undef _
43 };
44 
45 typedef enum
46 {
47 #define _(sym,str) IPSEC_TUN_PROTECT_INPUT_ERROR_##sym,
49 #undef _
52 
53 typedef enum ipsec_tun_next_t_
54 {
55 #define _(v, s) IPSEC_TUN_PROTECT_NEXT_##v,
57 #undef _
60 
61 typedef struct
62 {
63  union
64  {
67  };
71 
72 static u8 *
74 {
75  CLIB_UNUSED (vlib_main_t * vm) = va_arg (*args, vlib_main_t *);
76  CLIB_UNUSED (vlib_node_t * node) = va_arg (*args, vlib_node_t *);
78  va_arg (*args, ipsec_tun_protect_input_trace_t *);
79 
80  if (t->is_ip6)
81  s = format (s, "IPSec: %U seq %u",
83  else
84  s = format (s, "IPSec: %U seq %u sa %d",
86  return s;
87 }
88 
91  vlib_buffer_t * b,
92  const esp_header_t * esp, const ip4_header_t * ip4)
93 {
94  if (PREDICT_FALSE (0 == esp->spi))
95  {
96  b->error = node->errors[IPSEC_TUN_PROTECT_INPUT_ERROR_SPI_0];
97  b->punt_reason = ipsec_punt_reason[(ip4->protocol == IP_PROTOCOL_UDP ?
98  IPSEC_PUNT_IP4_SPI_UDP_0 :
99  IPSEC_PUNT_IP4_NO_SUCH_TUNNEL)];
100  }
101  else
102  {
103  b->error = node->errors[IPSEC_TUN_PROTECT_INPUT_ERROR_NO_TUNNEL];
104  b->punt_reason = ipsec_punt_reason[IPSEC_PUNT_IP4_NO_SUCH_TUNNEL];
105  }
107 }
108 
111  vlib_buffer_t * b, const esp_header_t * esp)
112 {
113  b->error = node->errors[IPSEC_TUN_PROTECT_INPUT_ERROR_NO_TUNNEL];
114  b->punt_reason = ipsec_punt_reason[IPSEC_PUNT_IP6_NO_SUCH_TUNNEL];
115 
117 }
118 
122 {
124  vnet_main_t *vnm = im->vnet_main;
126 
127  int is_trace = node->flags & VLIB_NODE_FLAG_TRACE;
129 
130  u32 n_left_from, *from;
133 
135  n_left_from = from_frame->n_vectors;
136 
138  b = bufs;
139  next = nexts;
140 
142  nexts, is_ip6 ? im->esp6_decrypt_next_index : im->esp4_decrypt_next_index,
143  n_left_from);
144 
145  u64 n_bytes = 0, n_packets = 0;
146  u32 n_disabled = 0, n_no_tunnel = 0;
147 
148  u32 last_sw_if_index = ~0;
149  ipsec_tun_lkup_result_t last_result = {
150  .tun_index = ~0
151  };
152  ipsec4_tunnel_kv_t last_key4;
153  ipsec6_tunnel_kv_t last_key6;
155 
156  vlib_combined_counter_main_t *rx_counter;
157  vlib_combined_counter_main_t *drop_counter;
158 
159  if (is_ip6)
160  clib_memset (&last_key6, 0xff, sizeof (last_key6));
161  else
162  last_key4.key = ~0;
163 
166 
167  while (n_left_from > 0)
168  {
169  u32 sw_if_index0, len0, hdr_sz0;
170  clib_bihash_kv_24_16_t bkey60;
171  clib_bihash_kv_8_16_t bkey40;
172  ipsec4_tunnel_kv_t *key40;
173  ipsec6_tunnel_kv_t *key60;
174  ip4_header_t *ip40;
175  ip6_header_t *ip60;
176  esp_header_t *esp0;
177  u16 buf_rewind0;
178 
179  ip40 =
180  (ip4_header_t *) (b[0]->data + vnet_buffer (b[0])->l3_hdr_offset);
181 
182  key60 = (ipsec6_tunnel_kv_t *) & bkey60;
183  key40 = (ipsec4_tunnel_kv_t *) & bkey40;
184 
185  if (is_ip6)
186  {
187  ip60 = (ip6_header_t *) ip40;
188  esp0 = (esp_header_t *) (ip60 + 1);
189  hdr_sz0 = sizeof (ip6_header_t);
190  }
191  else
192  {
193  /* NAT UDP port 4500 case, don't advance any more */
194  if (ip40->protocol == IP_PROTOCOL_UDP)
195  {
196  esp0 =
197  (esp_header_t *) ((u8 *) ip40 + ip4_header_bytes (ip40) +
198  sizeof (udp_header_t));
199  hdr_sz0 = 0;
200  buf_rewind0 = ip4_header_bytes (ip40) + sizeof (udp_header_t);
201  }
202  else
203  {
204  esp0 = (esp_header_t *) ((u8 *) ip40 + ip4_header_bytes (ip40));
205  buf_rewind0 = hdr_sz0 = ip4_header_bytes (ip40);
206  }
207  }
208 
209  /* stats for the tunnel include all the data after the IP header
210  just like a norml IP-IP tunnel */
211  vlib_buffer_advance (b[0], hdr_sz0);
212  len0 = vlib_buffer_length_in_chain (vm, b[0]);
213 
214  if (len0 < sizeof (esp_header_t))
215  {
216  if (esp0->spi_bytes[0] == 0xff)
217  b[0]->error =
218  node->errors[IPSEC_TUN_PROTECT_INPUT_ERROR_NAT_KEEPALIVE];
219  else
220  b[0]->error =
221  node->errors[IPSEC_TUN_PROTECT_INPUT_ERROR_TOO_SHORT];
222 
225  goto trace00;
226  }
227 
228  if (is_ip6)
229  {
230  key60->key.remote_ip = ip60->src_address;
231  key60->key.spi = esp0->spi;
232  key60->key.__pad = 0;
233 
234  if (memcmp (key60, &last_key6, sizeof (last_key6)) == 0)
235  {
236  clib_memcpy_fast (&itr0, &last_result, sizeof (itr0));
237  }
238  else
239  {
240  int rv =
241  clib_bihash_search_inline_24_16 (&im->tun6_protect_by_key,
242  &bkey60);
243  if (!rv)
244  {
245  clib_memcpy_fast (&itr0, &bkey60.value, sizeof (itr0));
246  clib_memcpy_fast (&last_result, &bkey60.value,
247  sizeof (last_result));
248  clib_memcpy_fast (&last_key6, key60, sizeof (last_key6));
249  }
250  else
251  {
252  next[0] = ipsec_ip6_if_no_tunnel (node, b[0], esp0);
253  n_no_tunnel++;
254  goto trace00;
255  }
256  }
257  }
258  else
259  {
260  ipsec4_tunnel_mk_key (key40, &ip40->src_address, esp0->spi);
261 
262  if (key40->key == last_key4.key)
263  {
264  clib_memcpy_fast (&itr0, &last_result, sizeof (itr0));
265  }
266  else
267  {
268  int rv =
269  clib_bihash_search_inline_8_16 (&im->tun4_protect_by_key,
270  &bkey40);
271  if (!rv)
272  {
273  clib_memcpy_fast (&itr0, &bkey40.value, sizeof (itr0));
274  clib_memcpy_fast (&last_result, &bkey40.value,
275  sizeof (last_result));
276  last_key4.key = key40->key;
277  }
278  else
279  {
280  next[0] = ipsec_ip4_if_no_tunnel (node, b[0], esp0, ip40);
281  vlib_buffer_advance (b[0], -buf_rewind0);
282  n_no_tunnel++;
283  goto trace00;
284  }
285  }
286  }
287 
288  vnet_buffer (b[0])->ipsec.sad_index = itr0.sa_index;
289  vnet_buffer (b[0])->ipsec.protect_index = itr0.tun_index;
290 
291  sw_if_index0 = itr0.sw_if_index;
292  vnet_buffer (b[0])->sw_if_index[VLIB_RX] = sw_if_index0;
293 
294  if (PREDICT_FALSE (!vnet_sw_interface_is_admin_up (vnm, sw_if_index0)))
295  {
297  (drop_counter, thread_index, sw_if_index0, 1, len0);
298  n_disabled++;
299  b[0]->error = node->errors[IPSEC_TUN_PROTECT_INPUT_ERROR_DISABLED];
302  goto trace00;
303  }
304  else
305  {
306  if (PREDICT_TRUE (sw_if_index0 == last_sw_if_index))
307  {
308  n_packets++;
309  n_bytes += len0;
310  }
311  else
312  {
313  if (n_packets && !(itr0.flags & IPSEC_PROTECT_ENCAPED))
314  {
316  (rx_counter, thread_index, last_sw_if_index,
317  n_packets, n_bytes);
318  }
319 
320  last_sw_if_index = sw_if_index0;
321  n_packets = 1;
322  n_bytes = len0;
323  }
324 
325  //IPSEC_TUN_PROTECT_NEXT_DECRYPT;
326  next[0] = is_ip6 ? im->esp6_decrypt_tun_next_index :
327  im->esp4_decrypt_tun_next_index;
328 
329  if (itr0.flags & IPSEC_PROTECT_FEAT)
330  {
331  u32 next32;
333 
334  next32 = next[0];
335  vnet_feature_arc_start (arc, sw_if_index0, &next32, b[0]);
336  next[0] = next32;
337  }
338  }
339  trace00:
340  if (PREDICT_FALSE (is_trace))
341  {
342  if (b[0]->flags & VLIB_BUFFER_IS_TRACED)
343  {
345  vlib_add_trace (vm, node, b[0], sizeof (*tr));
346  if (is_ip6)
347  clib_memcpy (&tr->kv6, &bkey60, sizeof (tr->kv6));
348  else
349  clib_memcpy (&tr->kv4, &bkey40, sizeof (tr->kv4));
350  tr->is_ip6 = is_ip6;
351  tr->seq = (len0 >= sizeof (*esp0) ?
352  clib_host_to_net_u32 (esp0->seq) : ~0);
353  }
354  }
355 
356  /* next */
357  b += 1;
358  next += 1;
359  n_left_from -= 1;
360  }
361 
362  if (n_packets && !(itr0.flags & IPSEC_PROTECT_ENCAPED))
364  thread_index,
365  last_sw_if_index, n_packets, n_bytes);
366 
367  vlib_node_increment_counter (vm, node->node_index,
368  IPSEC_TUN_PROTECT_INPUT_ERROR_RX,
369  from_frame->n_vectors - (n_disabled +
370  n_no_tunnel));
371  vlib_node_increment_counter (vm, node->node_index,
372  IPSEC_TUN_PROTECT_INPUT_ERROR_NO_TUNNEL,
373  n_no_tunnel);
374 
376 
377  return from_frame->n_vectors;
378 }
379 
383 {
385 }
386 
387 /* *INDENT-OFF* */
389  .name = "ipsec4-tun-input",
390  .vector_size = sizeof (u32),
391  .format_trace = format_ipsec_tun_protect_input_trace,
394  .error_strings = ipsec_tun_protect_input_error_strings,
395  .sibling_of = "device-input",
396 };
397 /* *INDENT-ON* */
398 
402 {
404 }
405 
406 /* *INDENT-OFF* */
408  .name = "ipsec6-tun-input",
409  .vector_size = sizeof (u32),
410  .format_trace = format_ipsec_tun_protect_input_trace,
413  .error_strings = ipsec_tun_protect_input_error_strings,
414  .sibling_of = "device-input",
415 };
416 /* *INDENT-ON* */
417 
418 /*
419  * fd.io coding-style-patch-verification: ON
420  *
421  * Local Variables:
422  * eval: (c-set-style "gnu")
423  * End:
424  */
ipsec.h
im
vnet_interface_main_t * im
Definition: interface_output.c:415
ipsec_tun.h
ipsec4_tunnel_mk_key
static void ipsec4_tunnel_mk_key(ipsec4_tunnel_kv_t *k, const ip4_address_t *ip, u32 spi)
Definition: ipsec_tun.h:63
thread_index
u32 thread_index
Definition: nat44_ei_hairpinning.c:495
bufs
vlib_buffer_t * bufs[VLIB_FRAME_SIZE]
Definition: nat44_ei_out2in.c:717
ipsec_tun_lkup_result_t_::tun_index
u32 tun_index
Definition: ipsec_tun.h:41
ipsec_tun_protect_input_error_t
ipsec_tun_protect_input_error_t
Definition: ipsec_tun_in.c:45
clib_memcpy
#define clib_memcpy(d, s, n)
Definition: string.h:197
ip4
vl_api_ip4_address_t ip4
Definition: one.api:376
IPSEC_TUN_PROTECT_INPUT_N_ERROR
@ IPSEC_TUN_PROTECT_INPUT_N_ERROR
Definition: ipsec_tun_in.c:50
IPSEC_TUN_PROTECT_N_NEXT
@ IPSEC_TUN_PROTECT_N_NEXT
Definition: ipsec_tun_in.c:58
clib_memset_u16
static_always_inline void clib_memset_u16(void *p, u16 val, uword count)
Definition: string.h:395
esp_header_t::spi
u32 spi
Definition: esp.h:26
ipsec_tun_protect_input_inline
static uword ipsec_tun_protect_input_inline(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame, int is_ip6)
Definition: ipsec_tun_in.c:120
vlib_get_buffers
vlib_get_buffers(vm, from, b, n_left_from)
ipsec_tun_protect_input_error_strings
static char * ipsec_tun_protect_input_error_strings[]
Definition: ipsec_tun_in.c:39
next
u16 * next
Definition: nat44_ei_out2in.c:718
VLIB_NODE_TYPE_INTERNAL
@ VLIB_NODE_TYPE_INTERNAL
Definition: node.h:72
ipsec_tun_protect_input_trace_t
Definition: ipsec_tun_in.c:61
VLIB_FRAME_SIZE
#define VLIB_FRAME_SIZE
Definition: node.h:368
node
vlib_main_t vlib_node_runtime_t * node
Definition: nat44_ei.c:3047
esp_header_t::spi_bytes
u8 spi_bytes[4]
Definition: esp.h:27
ipsec6_tunnel_kv_t_::spi
u32 spi
Definition: ipsec_tun.h:86
vnet_interface_main_t
Definition: interface.h:990
ipsec_tun_next_t_
ipsec_tun_next_t_
Definition: ipsec_tun_in.c:53
u16
unsigned short u16
Definition: types.h:57
vm
vlib_main_t * vm
X-connect all packets from the HOST to the PHY.
Definition: nat44_ei.c:3047
VLIB_RX
@ VLIB_RX
Definition: defs.h:46
from_frame
vlib_main_t vlib_node_runtime_t vlib_frame_t * from_frame
Definition: esp_encrypt.c:1328
vlib_buffer_enqueue_to_next
vlib_buffer_enqueue_to_next(vm, node, from,(u16 *) nexts, frame->n_vectors)
format_ipsec4_tunnel_kv
u8 * format_ipsec4_tunnel_kv(u8 *s, va_list *args)
Definition: ipsec_format.c:381
clib_bihash_kv_24_16_t
Definition: bihash_24_16.h:40
vlib_frame_t
Definition: node.h:372
ipsec_tun_lkup_result_t_::sa_index
u32 sa_index
Definition: ipsec_tun.h:42
esp_header_t::seq
u32 seq
Definition: esp.h:29
vlib_buffer_length_in_chain
static uword vlib_buffer_length_in_chain(vlib_main_t *vm, vlib_buffer_t *b)
Get length in bytes of the buffer chain.
Definition: buffer_funcs.h:433
clib_memcpy_fast
static_always_inline void * clib_memcpy_fast(void *restrict dst, const void *restrict src, size_t n)
Definition: string.h:92
udp_header_t
Definition: udp_packet.h:45
ipsec_ip4_if_no_tunnel
static u16 ipsec_ip4_if_no_tunnel(vlib_node_runtime_t *node, vlib_buffer_t *b, const esp_header_t *esp, const ip4_header_t *ip4)
Definition: ipsec_tun_in.c:90
ip4_header_t
Definition: ip4_packet.h:87
format_ipsec_tun_protect_input_trace
static u8 * format_ipsec_tun_protect_input_trace(u8 *s, va_list *args)
Definition: ipsec_tun_in.c:73
VNET_DEVICE_INPUT_NEXT_IP6_DROP
@ VNET_DEVICE_INPUT_NEXT_IP6_DROP
Definition: devices.h:33
vlib_buffer_t::punt_reason
u32 punt_reason
Definition: buffer.h:158
esp.h
ipsec4_tunnel_kv_t
Definition: ipsec_tun.h:48
clib_bihash_kv_24_16_t::value
u64 value[2]
Definition: bihash_24_16.h:43
vlib_buffer_advance
static void vlib_buffer_advance(vlib_buffer_t *b, word l)
Advance current data pointer by the supplied (signed!) amount.
Definition: buffer.h:276
vlib_buffer_t::error
vlib_error_t error
Error code for buffers to be enqueued to error handler.
Definition: buffer.h:145
VNET_DEVICE_INPUT_NEXT_IP4_DROP
@ VNET_DEVICE_INPUT_NEXT_IP4_DROP
Definition: devices.h:32
ipsec_tun_protect_input_trace_t::kv4
ipsec4_tunnel_kv_t kv4
Definition: ipsec_tun_in.c:65
VLIB_NODE_FN
#define VLIB_NODE_FN(node)
Definition: node.h:202
CLIB_UNUSED
#define CLIB_UNUSED(x)
Definition: clib.h:90
vnet_buffer
#define vnet_buffer(b)
Definition: buffer.h:441
VLIB_NODE_FLAG_TRACE
#define VLIB_NODE_FLAG_TRACE
Definition: node.h:291
PREDICT_FALSE
#define PREDICT_FALSE(x)
Definition: clib.h:124
format_ipsec6_tunnel_kv
u8 * format_ipsec6_tunnel_kv(u8 *s, va_list *args)
Definition: ipsec_format.c:399
ARRAY_LEN
#define ARRAY_LEN(x)
Definition: clib.h:70
vlib_frame_vector_args
static void * vlib_frame_vector_args(vlib_frame_t *f)
Get pointer to frame vector data.
Definition: node_funcs.h:301
ipsec_main_t
Definition: ipsec.h:108
ipsec_punt.h
ipsec_tun_protect_input_trace_t::is_ip6
u8 is_ip6
Definition: ipsec_tun_in.c:68
foreach_ipsec_tun_protect_input_error
#define foreach_ipsec_tun_protect_input_error
Definition: ipsec_tun_in.c:30
uword
u64 uword
Definition: types.h:112
ipsec_main
ipsec_main_t ipsec_main
Definition: ipsec.c:29
vlib_main_t::thread_index
u32 thread_index
Definition: main.h:215
vlib_node_increment_counter
static void vlib_node_increment_counter(vlib_main_t *vm, u32 node_index, u32 counter_index, u64 increment)
Definition: node_funcs.h:1244
ipsec_tun_lkup_result_t_
result of a lookup in the protection bihash
Definition: ipsec_tun.h:39
esp_header_t
Definition: esp.h:22
VNET_DEVICE_INPUT_NEXT_PUNT
@ VNET_DEVICE_INPUT_NEXT_PUNT
Definition: devices.h:34
foreach_ipsec_input_next
#define foreach_ipsec_input_next
Definition: ipsec_io.h:29
feature_main
vnet_feature_main_t feature_main
Definition: pnat_test_stubs.h:27
ipsec6_tunnel_kv_t_
Definition: ipsec_tun.h:77
VNET_INTERFACE_COUNTER_RX
@ VNET_INTERFACE_COUNTER_RX
Definition: interface.h:915
vlib_node_registration_t
struct _vlib_node_registration vlib_node_registration_t
vnet_interface_main_t::combined_sw_if_counters
vlib_combined_counter_main_t * combined_sw_if_counters
Definition: interface.h:1024
vnet_sw_interface_is_admin_up
static uword vnet_sw_interface_is_admin_up(vnet_main_t *vnm, u32 sw_if_index)
Definition: interface_funcs.h:265
data
u8 data[128]
Definition: ipsec_types.api:95
ipsec_tun_next_t
enum ipsec_tun_next_t_ ipsec_tun_next_t
arc
u8 arc
Definition: interface_output.c:426
ipsec4_tunnel_kv_t::key
u64 key
Definition: ipsec_tun.h:54
is_ip6
bool is_ip6
Definition: ip.api:43
ipsec_ip6_if_no_tunnel
static u16 ipsec_ip6_if_no_tunnel(vlib_node_runtime_t *node, vlib_buffer_t *b, const esp_header_t *esp)
Definition: ipsec_tun_in.c:110
vnet_main_t
Definition: vnet.h:76
always_inline
#define always_inline
Definition: rdma_mlx5dv.h:23
ip4_header_t::src_address
ip4_address_t src_address
Definition: ip4_packet.h:125
clib_bihash_kv_8_16_t
8 octet key, 8 octet key value pair
Definition: bihash_8_16.h:41
u64
unsigned long u64
Definition: types.h:89
format
description fragment has unexpected format
Definition: map.api:433
vlib_combined_counter_main_t
A collection of combined counters.
Definition: counter.h:203
ipsec_tun_protect_input_trace_t::kv6
ipsec6_tunnel_kv_t kv6
Definition: ipsec_tun_in.c:66
ip.h
u32
unsigned int u32
Definition: types.h:88
n_bytes
u32 n_bytes
Definition: interface_output.c:421
ipsec_tun_protect_input_trace_t::seq
u32 seq
Definition: ipsec_tun_in.c:69
ipsec6_tunnel_kv_t_::remote_ip
ip6_address_t remote_ip
Definition: ipsec_tun.h:85
ip6_header_t
Definition: ip6_packet.h:294
ip6_header_t::src_address
ip6_address_t src_address
Definition: ip6_packet.h:310
ip4_input.h
clib_memset
clib_memset(h->entries, 0, sizeof(h->entries[0]) *entries)
vlib_main_t
Definition: main.h:102
vlib_node_t
Definition: node.h:247
vlib_add_trace
void * vlib_add_trace(vlib_main_t *vm, vlib_node_runtime_t *r, vlib_buffer_t *b, u32 n_data_bytes)
Definition: trace.c:628
b
vlib_buffer_t ** b
Definition: nat44_ei_out2in.c:717
u8
unsigned char u8
Definition: types.h:56
ipsec6_tunnel_kv_t_::key
struct ipsec6_tunnel_kv_t_::@461 key
ipsec6_tun_input_node
vlib_node_registration_t ipsec6_tun_input_node
(constructor) VLIB_REGISTER_NODE (ipsec6_tun_input_node)
Definition: ipsec_tun_in.c:407
vnet_feature_arc_start
static_always_inline void vnet_feature_arc_start(u8 arc, u32 sw_if_index, u32 *next0, vlib_buffer_t *b0)
Definition: feature.h:302
nexts
u16 nexts[VLIB_FRAME_SIZE]
Definition: nat44_ei_out2in.c:718
ip4_header_bytes
static int ip4_header_bytes(const ip4_header_t *i)
Definition: ip4_packet.h:190
rv
int __clib_unused rv
Definition: application.c:491
vnet.h
api_errno.h
vlib_node_runtime_t
Definition: node.h:454
ipsec_tun_lkup_result_t_::sw_if_index
u32 sw_if_index
Definition: ipsec_tun.h:43
clib_bihash_kv_8_16_t::value
u64 value[2]
the value
Definition: bihash_8_16.h:44
from
from
Definition: nat44_ei_hairpinning.c:415
PREDICT_TRUE
#define PREDICT_TRUE(x)
Definition: clib.h:125
ipsec4_tun_input_node
vlib_node_registration_t ipsec4_tun_input_node
(constructor) VLIB_REGISTER_NODE (ipsec4_tun_input_node)
Definition: ipsec_tun_in.c:388
ipsec_io.h
vnet_feature_main_t::device_input_feature_arc_index
u8 device_input_feature_arc_index
Feature arc index for device-input.
Definition: feature.h:112
ipsec_tun_lkup_result_t_::flags
ipsec_protect_flags_t flags
Definition: ipsec_tun.h:44
n_left_from
n_left_from
Definition: nat44_ei_hairpinning.c:416
ipsec_punt_reason
vlib_punt_reason_t ipsec_punt_reason[IPSEC_PUNT_N_REASONS]
Definition: ipsec_punt.c:25
type
vl_api_fib_path_type_t type
Definition: fib_types.api:123
VNET_INTERFACE_COUNTER_DROP
@ VNET_INTERFACE_COUNTER_DROP
Definition: interface.h:904
ip4_header_t::protocol
u8 protocol
Definition: ip4_packet.h:115
vnet_main_t::interface_main
vnet_interface_main_t interface_main
Definition: vnet.h:81
vlib_increment_combined_counter
vlib_increment_combined_counter(ccm, ti, sw_if_index, n_buffers, n_bytes)
vlib_buffer_t
VLIB buffer representation.
Definition: buffer.h:111
VLIB_REGISTER_NODE
#define VLIB_REGISTER_NODE(x,...)
Definition: node.h:169
flags
vl_api_wireguard_peer_flags_t flags
Definition: wireguard.api:105