FD.io VPP  v21.10.1-2-g0a485f517
Vector Packet Processing
ip6_nd_mirror_proxy.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2021 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 
16 #include <vlib/vlib.h>
17 
18 #include <vnet/vnet.h>
19 #include <vnet/ethernet/ethernet.h>
20 #include <vnet/feature/feature.h>
21 #include <vnet/ip/ip6_packet.h>
26 #include <vnet/fib/ip6_fib.h>
27 #include <vnet/ip/ip6_ll_table.h>
28 
29 #include <vppinfra/error.h>
30 
31 int
33 {
34 
35  if (enable)
36  {
37  vnet_feature_enable_disable ("ip6-unicast", "ip6-unicast-nd-proxy",
38  sw_if_index, 1, NULL, 0);
39  vnet_feature_enable_disable ("ip6-multicast", "ip6-multicast-nd-proxy",
40  sw_if_index, 1, NULL, 0);
41  }
42  else
43  {
44  vnet_feature_enable_disable ("ip6-unicast", "ip6-unicast-nd-proxy",
45  sw_if_index, 0, NULL, 0);
46  vnet_feature_enable_disable ("ip6-multicast", "ip6-multicast-nd-proxy",
47  sw_if_index, 0, NULL, 0);
48  }
49  return 0;
50 }
51 
52 static clib_error_t *
54  vlib_cli_command_t *cmd)
55 {
56  vnet_main_t *vnm = vnet_get_main ();
58  int enable = 0;
59 
60  sw_if_index = ~0;
61 
63  {
64  if (unformat (input, "%U", unformat_vnet_sw_interface, vnm,
65  &sw_if_index))
66  ;
67  else if (unformat (input, "enable"))
68  enable = 1;
69  else if (unformat (input, "disable"))
70  enable = 0;
71  else
72  break;
73  }
74 
75  if (~0 == sw_if_index)
76  return clib_error_return (0, "unknown input '%U'", format_unformat_error,
77  input);
78 
80 
81  return 0;
82 }
83 
85  .path = "set interface ip6-nd proxy",
86  .short_help = "set interface ip6-nd proxy <intfc> [enable|disable]",
88 };
89 
90 typedef struct
91 {
95 
96 static u8 *
97 format_ip6_nd_proxy_trace (u8 *s, va_list *args)
98 {
99  CLIB_UNUSED (vlib_main_t * vm) = va_arg (*args, vlib_main_t *);
100  CLIB_UNUSED (vlib_node_t * node) = va_arg (*args, vlib_node_t *);
101  vnet_main_t *vnm = vnet_get_main ();
103  u32 indent = format_get_indent (s);
104 
105  if (t->is_multicast)
106  s = format (s, "%U %U multicast ", format_white_space, indent,
108  else
109  s = format (s, "%U %U unicast ", format_white_space, indent,
111 
112  return s;
113 }
114 
117  vlib_buffer_t *b0, ip6_header_t *ip6, u32 *next0)
118 {
119  if (PREDICT_FALSE (ip6->protocol == IP_PROTOCOL_ICMP6))
120  {
121  icmp46_header_t *icmp0;
122  icmp6_type_t type0;
123 
124  icmp0 = ip6_next_header (ip6);
125  type0 = icmp0->type;
126  if (type0 == ICMP6_neighbor_solicitation ||
127  type0 == ICMP6_neighbor_advertisement)
128  {
129  icmp6_neighbor_solicitation_or_advertisement_header_t *icmp6_nsa;
130  icmp6_neighbor_discovery_ethernet_link_layer_address_option_t
131  *icmp6_nd_ell_addr;
132  u32 sw_if_index0;
133 
134  icmp6_nsa = (void *) icmp0;
135  icmp6_nd_ell_addr = (void *) (icmp6_nsa + 1);
136 
137  sw_if_index0 = vnet_buffer (b0)->sw_if_index[VLIB_RX];
138 
139  /* unicast neighbor solicitation */
140  fib_node_index_t fei;
141  u32 fib_index;
142 
143  fib_index = ip6_fib_table_get_index_for_sw_if_index (sw_if_index0);
144 
145  if (~0 == fib_index)
146  {
148  }
149  else
150  {
151  if (ip6_address_is_link_local_unicast (&ip6->dst_address))
152  {
154  ip6_ll_fib_get (sw_if_index0), &ip6->dst_address, 128);
155  }
156  else
157  {
159  fib_index, &ip6->dst_address, 128);
160  }
161 
162  if (FIB_NODE_INDEX_INVALID != fei)
163  {
166  vm, b0, ip6, icmp6_nsa, icmp6_nd_ell_addr, sw_if_index0);
167  }
168  }
169  if (b0->flags & VLIB_BUFFER_IS_TRACED)
170  {
172  t = vlib_add_trace (vm, node, b0, sizeof (t[0]));
173  t->sw_if_index = sw_if_index0;
174  t->is_multicast = 0;
175  }
176  }
177  }
178 }
179 
182  vlib_buffer_t *b0, ip6_header_t *ip6, u32 *next0)
183 {
184  if (PREDICT_FALSE (ip6->protocol == IP_PROTOCOL_ICMP6))
185  {
186  icmp46_header_t *icmp0;
187  icmp6_type_t type0;
188 
189  icmp0 = ip6_next_header (ip6);
190  type0 = icmp0->type;
191  if (type0 == ICMP6_neighbor_solicitation ||
192  type0 == ICMP6_neighbor_advertisement)
193  {
194  icmp6_neighbor_solicitation_or_advertisement_header_t *icmp6_nsa;
195  icmp6_neighbor_discovery_ethernet_link_layer_address_option_t
196  *icmp6_nd_ell_addr;
197  u32 sw_if_index0;
198 
199  icmp6_nsa = (void *) icmp0;
200  icmp6_nd_ell_addr = (void *) (icmp6_nsa + 1);
201 
202  sw_if_index0 = vnet_buffer (b0)->sw_if_index[VLIB_RX];
203  if (type0 == ICMP6_neighbor_solicitation)
204  {
205  if (
206  (icmp6_nd_ell_addr->header.type ==
207  ICMP6_NEIGHBOR_DISCOVERY_OPTION_source_link_layer_address) &&
208  (!ip6_address_is_unspecified (&ip6->src_address)) &&
209  (!ip6_address_is_link_local_unicast (&ip6->src_address)))
210  {
211  ip_neighbor_learn_t learn = { .sw_if_index = sw_if_index0,
212  .ip = {
213  .version = AF_IP6,
214  .ip.ip6 = ip6->src_address,
215  } };
216  clib_memcpy (&learn.mac, icmp6_nd_ell_addr->ethernet_address,
217  sizeof (learn.mac));
218  ip_neighbor_learn_dp (&learn);
219 
222  vm, b0, ip6, icmp6_nsa, icmp6_nd_ell_addr, sw_if_index0);
223  }
224  }
225  else // type0 = ICMP6_neighbor_advertisement
226  {
227  icmp6_neighbor_solicitation_or_advertisement_header_t
228  *icmp6_nsa = (void *) icmp0;
229  icmp6_neighbor_discovery_ethernet_link_layer_address_option_t
230  *icmp6_nd_ell_addr = (void *) (icmp6_nsa + 1);
231  if (
232  (icmp6_nd_ell_addr->header.type ==
233  ICMP6_NEIGHBOR_DISCOVERY_OPTION_target_link_layer_address) &&
234  (!ip6_address_is_unspecified (&ip6->src_address)) &&
235  (!ip6_address_is_link_local_unicast (&ip6->src_address)))
236  {
237  ip_neighbor_learn_t learn = { .sw_if_index = sw_if_index0,
238  .ip = {
239  .version = AF_IP6,
240  .ip.ip6 =
241  icmp6_nsa->target_address,
242  } };
243  clib_memcpy (&learn.mac, icmp6_nd_ell_addr->ethernet_address,
244  sizeof (learn.mac));
245  ip_neighbor_learn_dp (&learn);
246 
248  }
249  }
250 
251  if (b0->flags & VLIB_BUFFER_IS_TRACED)
252  {
254  t = vlib_add_trace (vm, node, b0, sizeof (t[0]));
255  t->sw_if_index = sw_if_index0;
256  t->is_multicast = 1;
257  }
258  }
259  }
260 }
261 
264  vlib_frame_t *frame, u8 is_multicast)
265 {
266  u32 n_left_from, *from, *to_next;
267  u32 next_index, n_left_to_next;
269 
271  n_left_from = frame->n_vectors;
272  next_index = node->cached_next_index;
273 
275 
276  while (n_left_from > 0)
277  {
278  vlib_get_next_frame (vm, node, next_index, to_next, n_left_to_next);
279 
280  while (n_left_from > 4 && n_left_to_next > 2)
281  {
282  ip6_header_t *ip6_0, *ip6_1;
283  u32 next0, next1;
284  u32 bi0, bi1;
285 
286  /* Prefetch next iteration. */
287  {
288  vlib_prefetch_buffer_header (b[2], LOAD);
289  vlib_prefetch_buffer_header (b[3], LOAD);
290 
291  vlib_prefetch_buffer_data (b[2], LOAD);
292  vlib_prefetch_buffer_data (b[3], LOAD);
293  }
294 
295  /*
296  * speculatively enqueue b0 and b1 to the current next frame
297  */
298  to_next[0] = bi0 = from[0];
299  to_next[1] = bi1 = from[1];
300  to_next += 2;
301  n_left_to_next -= 2;
302 
303  vnet_feature_next (&next0, b[0]);
304  vnet_feature_next (&next1, b[1]);
305 
306  ip6_0 = vlib_buffer_get_current (b[0]);
307  ip6_1 = vlib_buffer_get_current (b[1]);
308 
309  if (is_multicast)
310  {
311  ip6_nd_proxy_multicast (vm, node, b[0], ip6_0, &next0);
312  ip6_nd_proxy_multicast (vm, node, b[1], ip6_1, &next1);
313  }
314  else
315  {
316  ip6_nd_proxy_unicast (vm, node, b[0], ip6_0, &next0);
317  ip6_nd_proxy_unicast (vm, node, b[1], ip6_1, &next1);
318  }
320  n_left_to_next, bi0, bi1, next0,
321  next1);
322 
323  b += 2;
324  from += 2;
325  n_left_from -= 2;
326  }
327 
328  while (n_left_from > 0 && n_left_to_next > 0)
329  {
330  ip6_header_t *ip6_0;
331  u32 next0, bi0;
332 
333  /* speculatively enqueue b0 to the current next frame */
334  to_next[0] = bi0 = from[0];
335  to_next += 1;
336  n_left_to_next -= 1;
337 
338  vnet_feature_next (&next0, b[0]);
339  ip6_0 = vlib_buffer_get_current (b[0]);
340 
341  if (is_multicast)
342  ip6_nd_proxy_multicast (vm, node, b[0], ip6_0, &next0);
343  else
344  ip6_nd_proxy_unicast (vm, node, b[0], ip6_0, &next0);
345 
347  n_left_to_next, bi0, next0);
348  b += 1;
349  from += 1;
350  n_left_from -= 1;
351  }
352  vlib_put_next_frame (vm, node, next_index, n_left_to_next);
353  }
354 
355  return frame->n_vectors;
356 }
357 
360 {
361  return ip6_nd_proxy_node_inline (vm, node, frame, 0 /* is_multicast */);
362 }
363 
365  .vector_size = sizeof (u32),
366  .format_trace = format_ip6_nd_proxy_trace,
368  .n_errors = 0,
369  .n_next_nodes = ICMP6_NEIGHBOR_SOLICITATION_N_NEXT,
370  .next_nodes = {
372  [ICMP6_NEIGHBOR_SOLICITATION_NEXT_REPLY] = "interface-output",
373  },
374  .name = "ip6-unicast-nd-proxy",
375 };
376 
379 {
380  return ip6_nd_proxy_node_inline (vm, node, frame, 1 /* is_multicast */);
381 }
382 
384  .vector_size = sizeof (u32),
385  .format_trace = format_ip6_nd_proxy_trace,
387  .n_errors = 0,
388  .n_next_nodes = ICMP6_NEIGHBOR_SOLICITATION_N_NEXT,
389  .next_nodes = {
391  [ICMP6_NEIGHBOR_SOLICITATION_NEXT_REPLY] = "interface-output",
392  },
393  .name = "ip6-multicast-nd-proxy",
394 };
395 
397  .arc_name = "ip6-unicast",
398  .node_name = "ip6-unicast-nd-proxy",
399  .runs_before = VNET_FEATURES ("ip6-lookup"),
400 };
401 
403  .arc_name = "ip6-multicast",
404  .node_name = "ip6-multicast-nd-proxy",
405  .runs_before = VNET_FEATURES ("ip6-mfib-forward-lookup"),
406 };
407 
408 /*
409  * fd.io coding-style-patch-verification: ON
410  *
411  * Local Variables:
412  * eval: (c-set-style "gnu")
413  * End:
414  */
vlib.h
ip6_unicast_nd_proxy_node
vlib_node_registration_t ip6_unicast_nd_proxy_node
(constructor) VLIB_REGISTER_NODE (ip6_unicast_nd_proxy_node)
Definition: ip6_nd_mirror_proxy.c:364
ip6_address_is_link_local_unicast
static uword ip6_address_is_link_local_unicast(const ip6_address_t *a)
Definition: ip6_packet.h:253
bufs
vlib_buffer_t * bufs[VLIB_FRAME_SIZE]
Definition: nat44_ei_out2in.c:717
vlib_prefetch_buffer_header
#define vlib_prefetch_buffer_header(b, type)
Prefetch buffer metadata.
Definition: buffer.h:231
ip6_nd_proxy_multicast
static_always_inline void ip6_nd_proxy_multicast(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_buffer_t *b0, ip6_header_t *ip6, u32 *next0)
Definition: ip6_nd_mirror_proxy.c:181
clib_memcpy
#define clib_memcpy(d, s, n)
Definition: string.h:197
next_index
nat44_ei_hairpin_src_next_t next_index
Definition: nat44_ei_hairpinning.c:412
ip6_fib_table_lookup_exact_match
fib_node_index_t ip6_fib_table_lookup_exact_match(u32 fib_index, const ip6_address_t *addr, u32 len)
Definition: ip6_fib.c:229
vlib_get_buffers
vlib_get_buffers(vm, from, b, n_left_from)
VLIB_NODE_TYPE_INTERNAL
@ VLIB_NODE_TYPE_INTERNAL
Definition: node.h:72
VLIB_FRAME_SIZE
#define VLIB_FRAME_SIZE
Definition: node.h:368
clib_error_return
#define clib_error_return(e, args...)
Definition: error.h:99
vlib_cli_command_t::path
char * path
Definition: cli.h:96
FIB_NODE_INDEX_INVALID
#define FIB_NODE_INDEX_INVALID
Definition: fib_types.h:30
set_int_ip6_nd_proxy_command_fn
static clib_error_t * set_int_ip6_nd_proxy_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Definition: ip6_nd_mirror_proxy.c:53
ip6_nd_proxy_node_inline
static_always_inline uword ip6_nd_proxy_node_inline(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame, u8 is_multicast)
Definition: ip6_nd_mirror_proxy.c:263
vnet_ip6_nd_proxy_trace_t
Definition: ip6_nd_mirror_proxy.c:90
ip_neighbor_learn_t_
Definition: ip_neighbor_types.h:97
VLIB_RX
@ VLIB_RX
Definition: defs.h:46
ip6_address_is_unspecified
static uword ip6_address_is_unspecified(const ip6_address_t *a)
Definition: ip6_packet.h:237
unformat_input_t
struct _unformat_input_t unformat_input_t
VNET_FEATURE_INIT
VNET_FEATURE_INIT(ip6_unicast_nd_proxy_node, static)
ip6_next_header
static void * ip6_next_header(ip6_header_t *i)
Definition: ip6_packet.h:407
vlib_frame_t
Definition: node.h:372
ip6_ll_table.h
ethernet.h
vnet_ip6_nd_proxy_trace_t::is_multicast
u8 is_multicast
Definition: ip6_nd_mirror_proxy.c:92
ip6_packet.h
frame
vlib_main_t vlib_node_runtime_t vlib_frame_t * frame
Definition: ip6_nd_mirror_proxy.c:360
unformat
uword unformat(unformat_input_t *i, const char *fmt,...)
Definition: unformat.c:978
ip_neighbor_learn_t_::sw_if_index
u32 sw_if_index
Definition: ip_neighbor_types.h:101
ip6_neighbor.h
error.h
icmp6_type_t
icmp6_type_t
Definition: icmp46_packet.h:176
VLIB_NODE_FN
#define VLIB_NODE_FN(node)
Definition: node.h:202
feature.h
CLIB_UNUSED
#define CLIB_UNUSED(x)
Definition: clib.h:90
vnet_buffer
#define vnet_buffer(b)
Definition: buffer.h:441
vnet_ip6_nd_proxy_trace_t::sw_if_index
u32 sw_if_index
Definition: ip6_nd_mirror_proxy.c:93
vnet_get_main
vnet_main_t * vnet_get_main(void)
Definition: pnat_test_stubs.h:56
ip6_nd_proxy_unicast
static_always_inline void ip6_nd_proxy_unicast(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_buffer_t *b0, ip6_header_t *ip6, u32 *next0)
Definition: ip6_nd_mirror_proxy.c:116
PREDICT_FALSE
#define PREDICT_FALSE(x)
Definition: clib.h:124
vnet_feature_next
static_always_inline void vnet_feature_next(u32 *next0, vlib_buffer_t *b0)
Definition: feature.h:322
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
unformat_check_input
static uword unformat_check_input(unformat_input_t *i)
Definition: format.h:163
static_always_inline
#define static_always_inline
Definition: clib.h:112
ip_neighbor_learn_t_::mac
mac_address_t mac
Definition: ip_neighbor_types.h:100
fib_node_index_t
u32 fib_node_index_t
A typedef of a node index.
Definition: fib_types.h:29
uword
u64 uword
Definition: types.h:112
set_int_ip6_nd_proxy_enable_command
static vlib_cli_command_t set_int_ip6_nd_proxy_enable_command
(constructor) VLIB_CLI_COMMAND (set_int_ip6_nd_proxy_enable_command)
Definition: ip6_nd_mirror_proxy.c:84
ICMP6_NEIGHBOR_SOLICITATION_NEXT_REPLY
@ ICMP6_NEIGHBOR_SOLICITATION_NEXT_REPLY
Definition: ip6_nd_inline.h:29
format_unformat_error
u8 * format_unformat_error(u8 *s, va_list *va)
Definition: unformat.c:91
VLIB_CLI_COMMAND
#define VLIB_CLI_COMMAND(x,...)
Definition: cli.h:163
ip6_fib_table_get_index_for_sw_if_index
u32 ip6_fib_table_get_index_for_sw_if_index(u32 sw_if_index)
Definition: ip6_fib.c:353
vlib_node_registration_t
struct _vlib_node_registration vlib_node_registration_t
icmp6_send_neighbor_advertisement
static_always_inline void icmp6_send_neighbor_advertisement(vlib_main_t *vm, vlib_buffer_t *b, ip6_header_t *ip6_h, icmp6_neighbor_solicitation_or_advertisement_header_t *icmp6_nsa, icmp6_neighbor_discovery_ethernet_link_layer_address_option_t *icmp6_nd_ell_addr, u32 sw_if_index0)
Definition: ip6_nd_inline.h:34
vnet_main_t
Definition: vnet.h:76
ip6_nd_inline.h
vlib_validate_buffer_enqueue_x1
#define vlib_validate_buffer_enqueue_x1(vm, node, next_index, to_next, n_left_to_next, bi0, next0)
Finish enqueueing one buffer forward in the graph.
Definition: buffer_node.h:224
node
vlib_main_t vlib_node_runtime_t * node
Definition: ip6_nd_mirror_proxy.c:359
ip_neighbor.h
format_vnet_sw_if_index_name
format_function_t format_vnet_sw_if_index_name
Definition: interface_funcs.h:458
unformat_vnet_sw_interface
unformat_function_t unformat_vnet_sw_interface
Definition: interface_funcs.h:462
format
description fragment has unexpected format
Definition: map.api:433
format_get_indent
static u32 format_get_indent(u8 *s)
Definition: format.h:72
vlib_put_next_frame
vlib_put_next_frame(vm, node, next_index, 0)
ip_neighbor_learn_dp
void ip_neighbor_learn_dp(const ip_neighbor_learn_t *l)
APIs invoked by neighbor implementation (i.s.
Definition: ip_neighbor_dp.c:28
u32
unsigned int u32
Definition: types.h:88
ip6
vl_api_ip6_address_t ip6
Definition: one.api:424
AF_IP6
@ AF_IP6
Definition: ip_types.h:24
ICMP6_NEIGHBOR_SOLICITATION_N_NEXT
@ ICMP6_NEIGHBOR_SOLICITATION_N_NEXT
Definition: ip6_nd_inline.h:30
ip6_header_t
Definition: ip6_packet.h:294
vnet_feature_enable_disable
int vnet_feature_enable_disable(const char *arc_name, const char *node_name, u32 sw_if_index, int enable_disable, void *feature_config, u32 n_feature_config_bytes)
Definition: pnat_test_stubs.h:50
ip6_fib.h
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
VNET_FEATURES
#define VNET_FEATURES(...)
Definition: feature.h:470
u8
unsigned char u8
Definition: types.h:56
clib_error_t
Definition: clib_error.h:21
vlib_buffer_get_current
static void * vlib_buffer_get_current(vlib_buffer_t *b)
Get pointer to current data to process.
Definition: buffer.h:257
ip6_ll_fib_get
u32 ip6_ll_fib_get(u32 sw_if_index)
For use in the data plane.
Definition: ip6_ll_table.c:28
ip_neighbor_dp.h
ip6_multicast_nd_proxy_node
vlib_node_registration_t ip6_multicast_nd_proxy_node
(constructor) VLIB_REGISTER_NODE (ip6_multicast_nd_proxy_node)
Definition: ip6_nd_mirror_proxy.c:383
ip6_nd_proxy_enable_disable
int ip6_nd_proxy_enable_disable(u32 sw_if_index, u8 enable)
Definition: ip6_nd_mirror_proxy.c:32
vlib_validate_buffer_enqueue_x2
#define vlib_validate_buffer_enqueue_x2(vm, node, next_index, to_next, n_left_to_next, bi0, bi1, next0, next1)
Finish enqueueing two buffers forward in the graph.
Definition: buffer_node.h:70
vnet.h
vlib_node_runtime_t
Definition: node.h:454
vlib_cli_command_t
Definition: cli.h:92
from
from
Definition: nat44_ei_hairpinning.c:415
sw_if_index
vl_api_interface_index_t sw_if_index
Definition: wireguard.api:34
vlib_get_next_frame
#define vlib_get_next_frame(vm, node, next_index, vectors, n_vectors_left)
Get pointer to next frame vector data by (vlib_node_runtime_t, next_index).
Definition: node_funcs.h:395
ICMP6_NEIGHBOR_SOLICITATION_NEXT_DROP
@ ICMP6_NEIGHBOR_SOLICITATION_NEXT_DROP
Definition: ip6_nd_inline.h:28
n_left_from
n_left_from
Definition: nat44_ei_hairpinning.c:416
vm
vlib_main_t * vm
Definition: ip6_nd_mirror_proxy.c:359
type
vl_api_fib_path_type_t type
Definition: fib_types.api:123
format_ip6_nd_proxy_trace
static u8 * format_ip6_nd_proxy_trace(u8 *s, va_list *args)
Definition: ip6_nd_mirror_proxy.c:97
format_white_space
u8 * format_white_space(u8 *s, va_list *va)
Definition: std-formats.c:129
vlib_prefetch_buffer_data
#define vlib_prefetch_buffer_data(b, type)
Definition: buffer.h:232
UNFORMAT_END_OF_INPUT
#define UNFORMAT_END_OF_INPUT
Definition: format.h:137
vlib_buffer_t::flags
u32 flags
buffer flags: VLIB_BUFFER_FREE_LIST_INDEX_MASK: bits used to store free list index,...
Definition: buffer.h:133
vlib_buffer_t
VLIB buffer representation.
Definition: buffer.h:111
VLIB_REGISTER_NODE
#define VLIB_REGISTER_NODE(x,...)
Definition: node.h:169