FD.io VPP  v21.10.1-2-g0a485f517
Vector Packet Processing
lookup_dpo.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2016 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 <vnet/ip/ip.h>
17 #include <vnet/dpo/lookup_dpo.h>
19 #include <vnet/mpls/mpls_lookup.h>
20 #include <vnet/fib/fib_table.h>
21 #include <vnet/fib/ip4_fib.h>
22 #include <vnet/fib/ip6_fib.h>
23 #include <vnet/fib/mpls_fib.h>
24 #include <vnet/mfib/mfib_table.h>
25 #include <vnet/mfib/ip4_mfib.h>
26 #include <vnet/mfib/ip6_mfib.h>
27 
28 static const char *const lookup_input_names[] = LOOKUP_INPUTS;
29 static const char *const lookup_cast_names[] = LOOKUP_CASTS;
30 
31 /**
32  * If a packet encounters a lookup DPO more than the many times
33  * then we assume there is a loop in the forward graph and drop the packet
34  */
35 #define MAX_LUKPS_PER_PACKET 4
36 
37 /**
38  * @brief Enumeration of the lookup subtypes
39  */
40 typedef enum lookup_sub_type_t_
41 {
47 #define LOOKUP_SUB_TYPE_NUM (LOOKUP_SUB_TYPE_DST_TABLE_FROM_INTERFACE+1)
48 
49 #define FOR_EACH_LOOKUP_SUB_TYPE(_st) \
50  for (_st = LOOKUP_SUB_TYPE_IP4_SRC; _st < LOOKUP_SUB_TYPE_NUM; _st++)
51 
52 /**
53  * @brief pool of all MPLS Label DPOs
54  */
56 
57 /**
58  * @brief An array of registered DPO type values for the sub-types
59  */
61 
62 static lookup_dpo_t *
64 {
65  lookup_dpo_t *lkd;
66  vlib_main_t *vm;
67  u8 did_barrier_sync;
68 
69  dpo_pool_barrier_sync (vm, lookup_dpo_pool, did_barrier_sync);
71  dpo_pool_barrier_release (vm, did_barrier_sync);
72 
73  return (lkd);
74 }
75 
76 static index_t
78 {
79  return (lkd - lookup_dpo_pool);
80 }
81 
82 static void
85  lookup_cast_t cast,
86  lookup_input_t input,
87  lookup_table_t table_config,
88  dpo_id_t *dpo)
89 {
90  lookup_dpo_t *lkd;
92 
93  lkd = lookup_dpo_alloc();
94  lkd->lkd_fib_index = fib_index;
95  lkd->lkd_proto = proto;
96  lkd->lkd_input = input;
97  lkd->lkd_table = table_config;
98  lkd->lkd_cast = cast;
99 
100  /*
101  * use the input type to select the lookup sub-type
102  */
103  type = 0;
104 
105  switch (input)
106  {
109  break;
111  switch (table_config)
112  {
115  break;
118  break;
119  }
120  if (LOOKUP_MULTICAST == cast)
121  {
123  }
124  }
125 
126  if (0 == type)
127  {
128  dpo_reset(dpo);
129  }
130  else
131  {
132  dpo_set(dpo, type, proto, lookup_dpo_get_index(lkd));
133  }
134 }
135 
136 void
139  lookup_cast_t cast,
140  lookup_input_t input,
141  lookup_table_t table_config,
142  dpo_id_t *dpo)
143 {
144  if (LOOKUP_TABLE_FROM_CONFIG == table_config)
145  {
146  if (LOOKUP_UNICAST == cast)
147  {
148  fib_table_lock(fib_index,
150  FIB_SOURCE_RR);
151  }
152  else
153  {
154  mfib_table_lock(fib_index,
157  }
158  }
159  lookup_dpo_add_or_lock_i(fib_index, proto, cast, input, table_config, dpo);
160 }
161 
162 void
165  lookup_cast_t cast,
166  lookup_input_t input,
167  lookup_table_t table_config,
168  dpo_id_t *dpo)
169 {
171 
172  if (LOOKUP_TABLE_FROM_CONFIG == table_config)
173  {
174  if (LOOKUP_UNICAST == cast)
175  {
176  fib_index =
178  table_id,
179  FIB_SOURCE_RR);
180  }
181  else
182  {
183  fib_index =
185  table_id,
187  }
188  }
189 
190  ASSERT(FIB_NODE_INDEX_INVALID != fib_index);
191  lookup_dpo_add_or_lock_i(fib_index, proto, cast, input, table_config, dpo);
192 }
193 
194 u8*
195 format_lookup_dpo (u8 *s, va_list *args)
196 {
197  index_t index = va_arg (*args, index_t);
198  lookup_dpo_t *lkd;
199 
200  lkd = lookup_dpo_get(index);
201 
203  {
204  s = format(s, "%s,%s lookup in interface's %U table",
208  }
209  else
210  {
211  if (LOOKUP_UNICAST == lkd->lkd_cast)
212  {
213  s = format(s, "%s,%s lookup in %U",
218  }
219  else
220  {
221  s = format(s, "%s,%s lookup in %U",
226  }
227  }
228  return (s);
229 }
230 
231 static void
233 {
234  lookup_dpo_t *lkd;
235 
236  lkd = lookup_dpo_get(dpo->dpoi_index);
237 
238  lkd->lkd_locks++;
239 }
240 
241 static void
243 {
244  lookup_dpo_t *lkd;
245 
246  lkd = lookup_dpo_get(dpo->dpoi_index);
247 
248  lkd->lkd_locks--;
249 
250  if (0 == lkd->lkd_locks)
251  {
253  {
254  if (LOOKUP_UNICAST == lkd->lkd_cast)
255  {
258  FIB_SOURCE_RR);
259  }
260  else
261  {
265  }
266  }
268  }
269 }
270 
271 /**
272  * @brief Lookup trace data
273  */
274 typedef struct lookup_trace_t_
275 {
276  union {
277  ip46_address_t addr;
279  };
283 
284 
289  int input_src_addr,
290  int table_from_interface)
291 {
292  u32 n_left_from, next_index, * from, * to_next;
295 
297  n_left_from = from_frame->n_vectors;
298 
299  next_index = node->cached_next_index;
300 
301  while (n_left_from > 0)
302  {
303  u32 n_left_to_next;
304 
305  vlib_get_next_frame(vm, node, next_index, to_next, n_left_to_next);
306 
307  while (n_left_from >= 4 && n_left_to_next > 2)
308  {
309  u32 bi0, lkdi0, lbi0, fib_index0, next0, hash_c0;
310  flow_hash_config_t flow_hash_config0;
311  const ip4_address_t *input_addr0;
312  const load_balance_t *lb0;
313  const lookup_dpo_t * lkd0;
314  const ip4_header_t * ip0;
315  const dpo_id_t *dpo0;
316  vlib_buffer_t * b0;
317  u32 bi1, lkdi1, lbi1, fib_index1, next1, hash_c1;
318  flow_hash_config_t flow_hash_config1;
319  const ip4_address_t *input_addr1;
320  const load_balance_t *lb1;
321  const lookup_dpo_t * lkd1;
322  const ip4_header_t * ip1;
323  const dpo_id_t *dpo1;
324  vlib_buffer_t * b1;
325 
326  /* Prefetch next iteration. */
327  {
328  vlib_buffer_t * p2, * p3;
329 
330  p2 = vlib_get_buffer (vm, from[2]);
331  p3 = vlib_get_buffer (vm, from[3]);
332 
333  vlib_prefetch_buffer_header (p2, LOAD);
334  vlib_prefetch_buffer_header (p3, LOAD);
335 
338  }
339 
340  bi0 = from[0];
341  to_next[0] = bi0;
342  bi1 = from[1];
343  to_next[1] = bi1;
344  from += 2;
345  to_next += 2;
346  n_left_from -= 2;
347  n_left_to_next -= 2;
348 
349  b0 = vlib_get_buffer (vm, bi0);
350  ip0 = vlib_buffer_get_current (b0);
351  b1 = vlib_get_buffer (vm, bi1);
352  ip1 = vlib_buffer_get_current (b1);
353 
354  /* dst lookup was done by ip4 lookup */
355  lkdi0 = vnet_buffer(b0)->ip.adj_index[VLIB_TX];
356  lkdi1 = vnet_buffer(b1)->ip.adj_index[VLIB_TX];
357  lkd0 = lookup_dpo_get(lkdi0);
358  lkd1 = lookup_dpo_get(lkdi1);
359 
360  /*
361  * choose between a lookup using the fib index in the DPO
362  * or getting the FIB index from the interface.
363  */
364  if (table_from_interface)
365  {
366  fib_index0 =
369  fib_index1 =
372  }
373  else
374  {
375  fib_index0 = lkd0->lkd_fib_index;
376  fib_index1 = lkd1->lkd_fib_index;
377  }
378 
379  /*
380  * choose between a source or destination address lookup in the table
381  */
382  if (input_src_addr)
383  {
384  input_addr0 = &ip0->src_address;
385  input_addr1 = &ip1->src_address;
386  }
387  else
388  {
389  input_addr0 = &ip0->dst_address;
390  input_addr1 = &ip1->dst_address;
391  }
392 
393  /* do lookup */
394  ip4_fib_forwarding_lookup_x2 (fib_index0, fib_index1, input_addr0,
395  input_addr1, &lbi0, &lbi1);
396  lb0 = load_balance_get(lbi0);
397  lb1 = load_balance_get(lbi1);
398 
399  vnet_buffer(b0)->sw_if_index[VLIB_TX] = fib_index0;
400  vnet_buffer(b1)->sw_if_index[VLIB_TX] = fib_index1;
401 
402  /* Use flow hash to compute multipath adjacency. */
403  hash_c0 = vnet_buffer (b0)->ip.flow_hash = 0;
404  hash_c1 = vnet_buffer (b1)->ip.flow_hash = 0;
405 
406  if (PREDICT_FALSE (lb0->lb_n_buckets > 1))
407  {
408  flow_hash_config0 = lb0->lb_hash_config;
409  hash_c0 = vnet_buffer (b0)->ip.flow_hash =
410  ip4_compute_flow_hash (ip0, flow_hash_config0);
411  }
412 
413  if (PREDICT_FALSE (lb1->lb_n_buckets > 1))
414  {
415  flow_hash_config1 = lb1->lb_hash_config;
416  hash_c1 = vnet_buffer (b1)->ip.flow_hash =
417  ip4_compute_flow_hash (ip1, flow_hash_config1);
418  }
419 
420  dpo0 = load_balance_get_bucket_i(lb0,
421  (hash_c0 &
422  (lb0->lb_n_buckets_minus_1)));
423  dpo1 = load_balance_get_bucket_i(lb1,
424  (hash_c1 &
425  (lb1->lb_n_buckets_minus_1)));
426 
427  next0 = dpo0->dpoi_next_node;
428  next1 = dpo1->dpoi_next_node;
429  vnet_buffer(b0)->ip.adj_index[VLIB_TX] = dpo0->dpoi_index;
430  vnet_buffer(b1)->ip.adj_index[VLIB_TX] = dpo1->dpoi_index;
431 
433  (cm, thread_index, lbi0, 1,
436  (cm, thread_index, lbi1, 1,
438 
439  if (!(b0->flags & VNET_BUFFER_F_LOOP_COUNTER_VALID)) {
440  vnet_buffer2(b0)->loop_counter = 0;
441  b0->flags |= VNET_BUFFER_F_LOOP_COUNTER_VALID;
442  }
443  if (!(b1->flags & VNET_BUFFER_F_LOOP_COUNTER_VALID)) {
444  vnet_buffer2(b1)->loop_counter = 0;
445  b1->flags |= VNET_BUFFER_F_LOOP_COUNTER_VALID;
446  }
447 
448  vnet_buffer2(b0)->loop_counter++;
449  vnet_buffer2(b1)->loop_counter++;
450 
451  if (PREDICT_FALSE(vnet_buffer2(b0)->loop_counter > MAX_LUKPS_PER_PACKET))
452  next0 = IP_LOOKUP_NEXT_DROP;
453  if (PREDICT_FALSE(vnet_buffer2(b1)->loop_counter > MAX_LUKPS_PER_PACKET))
454  next1 = IP_LOOKUP_NEXT_DROP;
455 
456  if (PREDICT_FALSE(b0->flags & VLIB_BUFFER_IS_TRACED))
457  {
459  b0, sizeof (*tr));
460  tr->fib_index = fib_index0;
461  tr->lbi = lbi0;
462  tr->addr.ip4 = *input_addr0;
463  }
464  if (PREDICT_FALSE(b1->flags & VLIB_BUFFER_IS_TRACED))
465  {
467  b1, sizeof (*tr));
468  tr->fib_index = fib_index1;
469  tr->lbi = lbi1;
470  tr->addr.ip4 = *input_addr1;
471  }
472 
474  to_next, n_left_to_next,
475  bi0, bi1, next0, next1);
476  }
477 
478  while (n_left_from > 0 && n_left_to_next > 0)
479  {
480  u32 bi0, lkdi0, lbi0, fib_index0, next0, hash_c0;
481  flow_hash_config_t flow_hash_config0;
482  const ip4_address_t *input_addr;
483  const load_balance_t *lb0;
484  const lookup_dpo_t * lkd0;
485  const ip4_header_t * ip0;
486  const dpo_id_t *dpo0;
487  vlib_buffer_t * b0;
488 
489  bi0 = from[0];
490  to_next[0] = bi0;
491  from += 1;
492  to_next += 1;
493  n_left_from -= 1;
494  n_left_to_next -= 1;
495 
496  b0 = vlib_get_buffer (vm, bi0);
497  ip0 = vlib_buffer_get_current (b0);
498 
499  /* dst lookup was done by ip4 lookup */
500  lkdi0 = vnet_buffer(b0)->ip.adj_index[VLIB_TX];
501  lkd0 = lookup_dpo_get(lkdi0);
502 
503  /*
504  * choose between a lookup using the fib index in the DPO
505  * or getting the FIB index from the interface.
506  */
507  if (table_from_interface)
508  {
509  fib_index0 =
512  }
513  else
514  {
515  fib_index0 = lkd0->lkd_fib_index;
516  }
517 
518  /*
519  * choose between a source or destination address lookup in the table
520  */
521  if (input_src_addr)
522  {
523  input_addr = &ip0->src_address;
524  }
525  else
526  {
527  input_addr = &ip0->dst_address;
528  }
529 
530  /* do lookup */
531  lbi0 = ip4_fib_forwarding_lookup (fib_index0, input_addr);
532  lb0 = load_balance_get(lbi0);
533 
534  vnet_buffer(b0)->sw_if_index[VLIB_TX] = fib_index0;
535 
536  /* Use flow hash to compute multipath adjacency. */
537  hash_c0 = vnet_buffer (b0)->ip.flow_hash = 0;
538 
539  if (PREDICT_FALSE (lb0->lb_n_buckets > 1))
540  {
541  flow_hash_config0 = lb0->lb_hash_config;
542  hash_c0 = vnet_buffer (b0)->ip.flow_hash =
543  ip4_compute_flow_hash (ip0, flow_hash_config0);
544  }
545 
546  dpo0 = load_balance_get_bucket_i(lb0,
547  (hash_c0 &
548  (lb0->lb_n_buckets_minus_1)));
549 
550  next0 = dpo0->dpoi_next_node;
551  vnet_buffer(b0)->ip.adj_index[VLIB_TX] = dpo0->dpoi_index;
552 
554  (cm, thread_index, lbi0, 1,
556 
557  if (!(b0->flags & VNET_BUFFER_F_LOOP_COUNTER_VALID)) {
558  vnet_buffer2(b0)->loop_counter = 0;
559  b0->flags |= VNET_BUFFER_F_LOOP_COUNTER_VALID;
560  }
561 
562  vnet_buffer2(b0)->loop_counter++;
563 
564  if (PREDICT_FALSE(vnet_buffer2(b0)->loop_counter > MAX_LUKPS_PER_PACKET))
565  next0 = IP_LOOKUP_NEXT_DROP;
566 
567  if (PREDICT_FALSE(b0->flags & VLIB_BUFFER_IS_TRACED))
568  {
570  b0, sizeof (*tr));
571  tr->fib_index = fib_index0;
572  tr->lbi = lbi0;
573  tr->addr.ip4 = *input_addr;
574  }
575 
577  n_left_to_next, bi0, next0);
578  }
579  vlib_put_next_frame (vm, node, next_index, n_left_to_next);
580  }
581  return from_frame->n_vectors;
582 }
583 
584 static u8 *
585 format_lookup_trace (u8 * s, va_list * args)
586 {
587  CLIB_UNUSED (vlib_main_t * vm) = va_arg (*args, vlib_main_t *);
588  CLIB_UNUSED (vlib_node_t * node) = va_arg (*args, vlib_node_t *);
589  lookup_trace_t * t = va_arg (*args, lookup_trace_t *);
590  u32 indent = format_get_indent (s);
591  s = format (s, "%U fib-index:%d addr:%U load-balance:%d",
592  format_white_space, indent,
593  t->fib_index,
595  t->lbi);
596  return s;
597 }
598 
602 {
603  return (lookup_dpo_ip4_inline(vm, node, from_frame, 0, 0));
604 }
605 
607  .name = "lookup-ip4-dst",
608  .vector_size = sizeof (u32),
609  .sibling_of = "ip4-lookup",
610  .format_trace = format_lookup_trace,
611 };
612 
616 {
617  return (lookup_dpo_ip4_inline(vm, node, from_frame, 0, 1));
618 }
619 
621  .name = "lookup-ip4-dst-itf",
622  .vector_size = sizeof (u32),
623  .sibling_of = "ip4-lookup",
624  .format_trace = format_lookup_trace,
625 };
626 
630 {
631  return (lookup_dpo_ip4_inline(vm, node, from_frame, 1, 0));
632 }
633 
635  .name = "lookup-ip4-src",
636  .vector_size = sizeof (u32),
637  .format_trace = format_lookup_trace,
638  .sibling_of = "ip4-lookup",
639 };
640 
645  int input_src_addr,
646  int table_from_interface)
647 {
649  u32 n_left_from, next_index, * from, * to_next;
651 
653  n_left_from = from_frame->n_vectors;
654 
655  next_index = node->cached_next_index;
656 
657  while (n_left_from > 0)
658  {
659  u32 n_left_to_next;
660 
661  vlib_get_next_frame(vm, node, next_index, to_next, n_left_to_next);
662 
663  while (n_left_from >= 4 && n_left_to_next > 2)
664  {
665  u32 bi0, lkdi0, lbi0, fib_index0, next0, hash_c0;
666  flow_hash_config_t flow_hash_config0;
667  const ip6_address_t *input_addr0;
668  const load_balance_t *lb0;
669  const lookup_dpo_t * lkd0;
670  const ip6_header_t * ip0;
671  const dpo_id_t *dpo0;
672  vlib_buffer_t * b0;
673  u32 bi1, lkdi1, lbi1, fib_index1, next1, hash_c1;
674  flow_hash_config_t flow_hash_config1;
675  const ip6_address_t *input_addr1;
676  const load_balance_t *lb1;
677  const lookup_dpo_t * lkd1;
678  const ip6_header_t * ip1;
679  const dpo_id_t *dpo1;
680  vlib_buffer_t * b1;
681 
682  /* Prefetch next iteration. */
683  {
684  vlib_buffer_t * p2, * p3;
685 
686  p2 = vlib_get_buffer (vm, from[2]);
687  p3 = vlib_get_buffer (vm, from[3]);
688 
689  vlib_prefetch_buffer_header (p2, LOAD);
690  vlib_prefetch_buffer_header (p3, LOAD);
691 
694  }
695 
696  bi0 = from[0];
697  to_next[0] = bi0;
698  bi1 = from[1];
699  to_next[1] = bi1;
700  from += 2;
701  to_next += 2;
702  n_left_from -= 2;
703  n_left_to_next -= 2;
704 
705  b0 = vlib_get_buffer (vm, bi0);
706  ip0 = vlib_buffer_get_current (b0);
707  b1 = vlib_get_buffer (vm, bi1);
708  ip1 = vlib_buffer_get_current (b1);
709 
710  /* dst lookup was done by ip6 lookup */
711  lkdi0 = vnet_buffer(b0)->ip.adj_index[VLIB_TX];
712  lkdi1 = vnet_buffer(b1)->ip.adj_index[VLIB_TX];
713  lkd0 = lookup_dpo_get(lkdi0);
714  lkd1 = lookup_dpo_get(lkdi1);
715 
716  /*
717  * choose between a lookup using the fib index in the DPO
718  * or getting the FIB index from the interface.
719  */
720  if (table_from_interface)
721  {
722  fib_index0 =
725  fib_index1 =
728  }
729  else
730  {
731  fib_index0 = lkd0->lkd_fib_index;
732  fib_index1 = lkd1->lkd_fib_index;
733  }
734 
735  /*
736  * choose between a source or destination address lookup in the table
737  */
738  if (input_src_addr)
739  {
740  input_addr0 = &ip0->src_address;
741  input_addr1 = &ip1->src_address;
742  }
743  else
744  {
745  input_addr0 = &ip0->dst_address;
746  input_addr1 = &ip1->dst_address;
747  }
748 
749  /* do src lookup */
751  fib_index0,
752  input_addr0);
754  fib_index1,
755  input_addr1);
756  lb0 = load_balance_get(lbi0);
757  lb1 = load_balance_get(lbi1);
758 
759  vnet_buffer(b0)->sw_if_index[VLIB_TX] = fib_index0;
760  vnet_buffer(b1)->sw_if_index[VLIB_TX] = fib_index1;
761 
762  /* Use flow hash to compute multipath adjacency. */
763  hash_c0 = vnet_buffer (b0)->ip.flow_hash = 0;
764  hash_c1 = vnet_buffer (b1)->ip.flow_hash = 0;
765 
766  if (!(b0->flags & VNET_BUFFER_F_LOOP_COUNTER_VALID)) {
767  vnet_buffer2(b0)->loop_counter = 0;
768  b0->flags |= VNET_BUFFER_F_LOOP_COUNTER_VALID;
769  }
770  if (!(b1->flags & VNET_BUFFER_F_LOOP_COUNTER_VALID)) {
771  vnet_buffer2(b1)->loop_counter = 0;
772  b1->flags |= VNET_BUFFER_F_LOOP_COUNTER_VALID;
773  }
774 
775  vnet_buffer2(b0)->loop_counter++;
776  vnet_buffer2(b1)->loop_counter++;
777 
778  if (PREDICT_FALSE(vnet_buffer2(b0)->loop_counter > MAX_LUKPS_PER_PACKET))
779  next0 = IP_LOOKUP_NEXT_DROP;
780  if (PREDICT_FALSE(vnet_buffer2(b1)->loop_counter > MAX_LUKPS_PER_PACKET))
781  next1 = IP_LOOKUP_NEXT_DROP;
782 
783  if (PREDICT_FALSE (lb0->lb_n_buckets > 1))
784  {
785  flow_hash_config0 = lb0->lb_hash_config;
786  hash_c0 = vnet_buffer (b0)->ip.flow_hash =
787  ip6_compute_flow_hash (ip0, flow_hash_config0);
788  }
789 
790  if (PREDICT_FALSE (lb1->lb_n_buckets > 1))
791  {
792  flow_hash_config1 = lb1->lb_hash_config;
793  hash_c1 = vnet_buffer (b1)->ip.flow_hash =
794  ip6_compute_flow_hash (ip1, flow_hash_config1);
795  }
796 
797  dpo0 = load_balance_get_bucket_i(lb0,
798  (hash_c0 &
799  (lb0->lb_n_buckets_minus_1)));
800  dpo1 = load_balance_get_bucket_i(lb1,
801  (hash_c1 &
802  (lb1->lb_n_buckets_minus_1)));
803 
804  next0 = dpo0->dpoi_next_node;
805  next1 = dpo1->dpoi_next_node;
806  vnet_buffer(b0)->ip.adj_index[VLIB_TX] = dpo0->dpoi_index;
807  vnet_buffer(b1)->ip.adj_index[VLIB_TX] = dpo1->dpoi_index;
808 
810  (cm, thread_index, lbi0, 1,
813  (cm, thread_index, lbi1, 1,
815 
816  if (PREDICT_FALSE(b0->flags & VLIB_BUFFER_IS_TRACED))
817  {
819  b0, sizeof (*tr));
820  tr->fib_index = fib_index0;
821  tr->lbi = lbi0;
822  tr->addr.ip6 = *input_addr0;
823  }
824  if (PREDICT_FALSE(b1->flags & VLIB_BUFFER_IS_TRACED))
825  {
827  b1, sizeof (*tr));
828  tr->fib_index = fib_index1;
829  tr->lbi = lbi1;
830  tr->addr.ip6 = *input_addr1;
831  }
833  n_left_to_next, bi0, bi1,
834  next0, next1);
835  }
836  while (n_left_from > 0 && n_left_to_next > 0)
837  {
838  u32 bi0, lkdi0, lbi0, fib_index0, next0, hash_c0;
839  flow_hash_config_t flow_hash_config0;
840  const ip6_address_t *input_addr0;
841  const load_balance_t *lb0;
842  const lookup_dpo_t * lkd0;
843  const ip6_header_t * ip0;
844  const dpo_id_t *dpo0;
845  vlib_buffer_t * b0;
846 
847  bi0 = from[0];
848  to_next[0] = bi0;
849  from += 1;
850  to_next += 1;
851  n_left_from -= 1;
852  n_left_to_next -= 1;
853 
854  b0 = vlib_get_buffer (vm, bi0);
855  ip0 = vlib_buffer_get_current (b0);
856 
857  /* dst lookup was done by ip6 lookup */
858  lkdi0 = vnet_buffer(b0)->ip.adj_index[VLIB_TX];
859  lkd0 = lookup_dpo_get(lkdi0);
860 
861  /*
862  * choose between a lookup using the fib index in the DPO
863  * or getting the FIB index from the interface.
864  */
865  if (table_from_interface)
866  {
867  fib_index0 =
870  }
871  else
872  {
873  fib_index0 = lkd0->lkd_fib_index;
874  }
875 
876  /*
877  * choose between a source or destination address lookup in the table
878  */
879  if (input_src_addr)
880  {
881  input_addr0 = &ip0->src_address;
882  }
883  else
884  {
885  input_addr0 = &ip0->dst_address;
886  }
887 
888  /* do src lookup */
890  fib_index0,
891  input_addr0);
892  lb0 = load_balance_get(lbi0);
893 
894  vnet_buffer(b0)->sw_if_index[VLIB_TX] = fib_index0;
895 
896  /* Use flow hash to compute multipath adjacency. */
897  hash_c0 = vnet_buffer (b0)->ip.flow_hash = 0;
898 
899  if (PREDICT_FALSE (lb0->lb_n_buckets > 1))
900  {
901  flow_hash_config0 = lb0->lb_hash_config;
902  hash_c0 = vnet_buffer (b0)->ip.flow_hash =
903  ip6_compute_flow_hash (ip0, flow_hash_config0);
904  }
905 
906  dpo0 = load_balance_get_bucket_i(lb0,
907  (hash_c0 &
908  (lb0->lb_n_buckets_minus_1)));
909 
910  next0 = dpo0->dpoi_next_node;
911  vnet_buffer(b0)->ip.adj_index[VLIB_TX] = dpo0->dpoi_index;
912 
913  if (!(b0->flags & VNET_BUFFER_F_LOOP_COUNTER_VALID)) {
914  vnet_buffer2(b0)->loop_counter = 0;
915  b0->flags |= VNET_BUFFER_F_LOOP_COUNTER_VALID;
916  }
917 
918  vnet_buffer2(b0)->loop_counter++;
919 
920  if (PREDICT_FALSE(vnet_buffer2(b0)->loop_counter > MAX_LUKPS_PER_PACKET))
921  next0 = IP_LOOKUP_NEXT_DROP;
922 
924  (cm, thread_index, lbi0, 1,
926 
927  if (PREDICT_FALSE(b0->flags & VLIB_BUFFER_IS_TRACED))
928  {
930  b0, sizeof (*tr));
931  tr->fib_index = fib_index0;
932  tr->lbi = lbi0;
933  tr->addr.ip6 = *input_addr0;
934  }
936  n_left_to_next, bi0, next0);
937  }
938  vlib_put_next_frame (vm, node, next_index, n_left_to_next);
939  }
940  return from_frame->n_vectors;
941 }
942 
946 {
947  return (lookup_dpo_ip6_inline(vm, node, from_frame, 0 /*use src*/, 0));
948 }
949 
951  .name = "lookup-ip6-dst",
952  .vector_size = sizeof (u32),
953  .format_trace = format_lookup_trace,
954  .sibling_of = "ip6-lookup",
955 };
956 
960 {
961  return (lookup_dpo_ip6_inline(vm, node, from_frame, 0 /*use src*/, 1));
962 }
963 
965  .name = "lookup-ip6-dst-itf",
966  .vector_size = sizeof (u32),
967  .format_trace = format_lookup_trace,
968  .sibling_of = "ip6-lookup",
969 };
970 
974 {
975  return (lookup_dpo_ip6_inline(vm, node, from_frame, 1, 0));
976 }
977 
979  .name = "lookup-ip6-src",
980  .vector_size = sizeof (u32),
981  .format_trace = format_lookup_trace,
982  .sibling_of = "ip6-lookup",
983 };
984 
989  int table_from_interface)
990 {
991  u32 n_left_from, next_index, * from, * to_next;
994 
996  n_left_from = from_frame->n_vectors;
997 
998  next_index = node->cached_next_index;
999 
1000  while (n_left_from > 0)
1001  {
1002  u32 n_left_to_next;
1003 
1004  vlib_get_next_frame(vm, node, next_index, to_next, n_left_to_next);
1005 
1006  /* while (n_left_from >= 4 && n_left_to_next >= 2) */
1007  /* } */
1008 
1009  while (n_left_from > 0 && n_left_to_next > 0)
1010  {
1011  u32 bi0, lkdi0, lbi0, fib_index0, next0, hash0;
1012  const mpls_unicast_header_t * hdr0;
1013  const load_balance_t *lb0;
1014  const lookup_dpo_t * lkd0;
1015  const dpo_id_t *dpo0;
1016  vlib_buffer_t * b0;
1017 
1018  bi0 = from[0];
1019  to_next[0] = bi0;
1020  from += 1;
1021  to_next += 1;
1022  n_left_from -= 1;
1023  n_left_to_next -= 1;
1024 
1025  b0 = vlib_get_buffer (vm, bi0);
1026  hdr0 = vlib_buffer_get_current (b0);
1027 
1028  /* dst lookup was done by mpls lookup */
1029  lkdi0 = vnet_buffer(b0)->ip.adj_index[VLIB_TX];
1030  lkd0 = lookup_dpo_get(lkdi0);
1031 
1032  /*
1033  * choose between a lookup using the fib index in the DPO
1034  * or getting the FIB index from the interface.
1035  */
1036  if (table_from_interface)
1037  {
1038  fib_index0 =
1041  }
1042  else
1043  {
1044  fib_index0 = lkd0->lkd_fib_index;
1045  }
1046 
1047  /* do lookup */
1048  lbi0 = mpls_fib_table_forwarding_lookup (fib_index0, hdr0);
1049  lb0 = load_balance_get(lbi0);
1050  dpo0 = load_balance_get_bucket_i(lb0, 0);
1051 
1052  next0 = dpo0->dpoi_next_node;
1053  vnet_buffer(b0)->ip.adj_index[VLIB_TX] = dpo0->dpoi_index;
1054 
1055 
1056  if (MPLS_IS_REPLICATE & lbi0)
1057  {
1059  vnet_buffer (b0)->ip.adj_index[VLIB_TX] =
1060  (lbi0 & ~MPLS_IS_REPLICATE);
1061  }
1062  else
1063  {
1064  lb0 = load_balance_get(lbi0);
1065  ASSERT (lb0->lb_n_buckets > 0);
1066  ASSERT (is_pow2 (lb0->lb_n_buckets));
1067 
1068  if (PREDICT_FALSE(lb0->lb_n_buckets > 1))
1069  {
1070  hash0 = vnet_buffer (b0)->ip.flow_hash =
1073  (lb0,
1074  (hash0 & (lb0->lb_n_buckets_minus_1)));
1075  }
1076  else
1077  {
1078  dpo0 = load_balance_get_bucket_i (lb0, 0);
1079  }
1080  next0 = dpo0->dpoi_next_node;
1081 
1082  vnet_buffer (b0)->ip.adj_index[VLIB_TX] = dpo0->dpoi_index;
1083 
1085  (cm, thread_index, lbi0, 1,
1087  }
1088 
1089  vnet_buffer (b0)->mpls.ttl = ((char*)hdr0)[3];
1090  vnet_buffer (b0)->mpls.exp = (((char*)hdr0)[2] & 0xe) >> 1;
1091  vnet_buffer (b0)->mpls.first = 1;
1092  vlib_buffer_advance(b0, sizeof(*hdr0));
1093 
1094  if (!(b0->flags & VNET_BUFFER_F_LOOP_COUNTER_VALID)) {
1095  vnet_buffer2(b0)->loop_counter = 0;
1096  b0->flags |= VNET_BUFFER_F_LOOP_COUNTER_VALID;
1097  }
1098 
1099  vnet_buffer2(b0)->loop_counter++;
1100 
1101  if (PREDICT_FALSE(vnet_buffer2(b0)->loop_counter > MAX_LUKPS_PER_PACKET))
1102  next0 = MPLS_LOOKUP_NEXT_DROP;
1103 
1104  if (PREDICT_FALSE(b0->flags & VLIB_BUFFER_IS_TRACED))
1105  {
1107  b0, sizeof (*tr));
1108  tr->fib_index = fib_index0;
1109  tr->lbi = lbi0;
1110  tr->hdr = *hdr0;
1111  }
1112 
1114  n_left_to_next, bi0, next0);
1115  }
1116  vlib_put_next_frame (vm, node, next_index, n_left_to_next);
1117  }
1118  return from_frame->n_vectors;
1119 }
1120 
1121 static u8 *
1122 format_lookup_mpls_trace (u8 * s, va_list * args)
1123 {
1124  CLIB_UNUSED (vlib_main_t * vm) = va_arg (*args, vlib_main_t *);
1125  CLIB_UNUSED (vlib_node_t * node) = va_arg (*args, vlib_node_t *);
1126  lookup_trace_t * t = va_arg (*args, lookup_trace_t *);
1127  u32 indent = format_get_indent (s);
1129 
1130  hdr.label_exp_s_ttl = clib_net_to_host_u32(t->hdr.label_exp_s_ttl);
1131 
1132  s = format (s, "%U fib-index:%d hdr:%U load-balance:%d",
1133  format_white_space, indent,
1134  t->fib_index,
1135  format_mpls_header, hdr,
1136  t->lbi);
1137  return s;
1138 }
1139 
1143 {
1144  return (lookup_dpo_mpls_inline(vm, node, from_frame, 0));
1145 }
1146 
1148  .name = "lookup-mpls-dst",
1149  .vector_size = sizeof (u32),
1150  .sibling_of = "mpls-lookup",
1151  .format_trace = format_lookup_mpls_trace,
1152  .n_next_nodes = 0,
1153 };
1154 
1158 {
1159  return (lookup_dpo_mpls_inline(vm, node, from_frame, 1));
1160 }
1161 
1163  .name = "lookup-mpls-dst-itf",
1164  .vector_size = sizeof (u32),
1165  .sibling_of = "mpls-lookup",
1166  .format_trace = format_lookup_mpls_trace,
1167  .n_next_nodes = 0,
1168 };
1169 
1175 
1180  int is_v4)
1181 {
1182  u32 n_left_from, next_index, * from, * to_next;
1183 
1185  n_left_from = from_frame->n_vectors;
1186 
1188 
1189  while (n_left_from > 0)
1190  {
1191  u32 n_left_to_next;
1192 
1193  vlib_get_next_frame(vm, node, next_index, to_next, n_left_to_next);
1194 
1195  /* while (n_left_from >= 4 && n_left_to_next >= 2) */
1196  /* } */
1197 
1198  while (n_left_from > 0 && n_left_to_next > 0)
1199  {
1200  u32 bi0, lkdi0, fib_index0, next0;
1201  const lookup_dpo_t * lkd0;
1202  fib_node_index_t mfei0;
1203  vlib_buffer_t * b0;
1204 
1205  bi0 = from[0];
1206  to_next[0] = bi0;
1207  from += 1;
1208  to_next += 1;
1209  n_left_from -= 1;
1210  n_left_to_next -= 1;
1211 
1212  b0 = vlib_get_buffer (vm, bi0);
1213 
1214  /* dst lookup was done by mpls lookup */
1215  lkdi0 = vnet_buffer(b0)->ip.adj_index[VLIB_TX];
1216  lkd0 = lookup_dpo_get(lkdi0);
1217  fib_index0 = lkd0->lkd_fib_index;
1219 
1220  if (is_v4)
1221  {
1222  ip4_header_t * ip0;
1223 
1224  ip0 = vlib_buffer_get_current (b0);
1225  mfei0 = ip4_mfib_table_lookup(ip4_mfib_get(fib_index0),
1226  &ip0->src_address,
1227  &ip0->dst_address,
1228  64);
1229  if (PREDICT_FALSE(b0->flags & VLIB_BUFFER_IS_TRACED))
1230  {
1232  b0, sizeof (*tr));
1233  tr->fib_index = fib_index0;
1234  tr->lbi = mfei0;
1235  tr->addr.ip4 = ip0->dst_address;
1236  }
1237  }
1238  else
1239  {
1240  ip6_header_t * ip0;
1241 
1242  ip0 = vlib_buffer_get_current (b0);
1243  mfei0 = ip6_mfib_table_fwd_lookup(ip6_mfib_get(fib_index0),
1244  &ip0->src_address,
1245  &ip0->dst_address);
1246  if (PREDICT_FALSE(b0->flags & VLIB_BUFFER_IS_TRACED))
1247  {
1249  b0, sizeof (*tr));
1250  tr->fib_index = fib_index0;
1251  tr->lbi = mfei0;
1252  tr->addr.ip6 = ip0->dst_address;
1253  }
1254  }
1255 
1256  vnet_buffer (b0)->ip.adj_index[VLIB_TX] = mfei0;
1257 
1258  if (!(b0->flags & VNET_BUFFER_F_LOOP_COUNTER_VALID)) {
1259  vnet_buffer2(b0)->loop_counter = 0;
1260  b0->flags |= VNET_BUFFER_F_LOOP_COUNTER_VALID;
1261  }
1262 
1263  vnet_buffer2(b0)->loop_counter++;
1264 
1265  if (PREDICT_FALSE(vnet_buffer2(b0)->loop_counter > MAX_LUKPS_PER_PACKET))
1267 
1269  n_left_to_next, bi0, next0);
1270  }
1271  vlib_put_next_frame (vm, node, next_index, n_left_to_next);
1272  }
1273  return from_frame->n_vectors;
1274 }
1275 
1279 {
1281 }
1282 
1284  .name = "lookup-ip4-dst-mcast",
1285  .vector_size = sizeof (u32),
1286 
1287  .format_trace = format_lookup_trace,
1288  .n_next_nodes = LOOKUP_IP_DST_MCAST_N_NEXT,
1289  .next_nodes = {
1290  [LOOKUP_IP_DST_MCAST_NEXT_DROP] = "ip4-drop",
1291  [LOOKUP_IP_DST_MCAST_NEXT_RPF] = "ip4-mfib-forward-rpf",
1292  },
1293 };
1294 
1298 {
1300 }
1301 
1303  .name = "lookup-ip6-dst-mcast",
1304  .vector_size = sizeof (u32),
1305 
1306  .format_trace = format_lookup_trace,
1307  .n_next_nodes = LOOKUP_IP_DST_MCAST_N_NEXT,
1308  .next_nodes = {
1309  [LOOKUP_IP_DST_MCAST_NEXT_DROP] = "ip6-drop",
1310  [LOOKUP_IP_DST_MCAST_NEXT_RPF] = "ip6-mfib-forward-rpf",
1311  },
1312 };
1313 
1314 static void
1316 {
1317  fib_show_memory_usage("Lookup",
1320  sizeof(lookup_dpo_t));
1321 }
1322 
1323 const static dpo_vft_t lkd_vft = {
1325  .dv_unlock = lookup_dpo_unlock,
1326  .dv_format = format_lookup_dpo,
1327 };
1330  .dv_unlock = lookup_dpo_unlock,
1331  .dv_format = format_lookup_dpo,
1332  .dv_mem_show = lookup_dpo_mem_show,
1333 };
1334 
1335 const static char* const lookup_src_ip4_nodes[] =
1336 {
1337  "lookup-ip4-src",
1338  NULL,
1339 };
1340 const static char* const lookup_src_ip6_nodes[] =
1341 {
1342  "lookup-ip6-src",
1343  NULL,
1344 };
1345 const static char* const * const lookup_src_nodes[DPO_PROTO_NUM] =
1346 {
1349  [DPO_PROTO_MPLS] = NULL,
1350 };
1351 
1352 const static char* const lookup_dst_ip4_nodes[] =
1353 {
1354  "lookup-ip4-dst",
1355  NULL,
1356 };
1357 const static char* const lookup_dst_ip6_nodes[] =
1358 {
1359  "lookup-ip6-dst",
1360  NULL,
1361 };
1362 const static char* const lookup_dst_mpls_nodes[] =
1363 {
1364  "lookup-mpls-dst",
1365  NULL,
1366 };
1367 const static char* const * const lookup_dst_nodes[DPO_PROTO_NUM] =
1368 {
1372 };
1373 
1374 const static char* const lookup_dst_mcast_ip4_nodes[] =
1375 {
1376  "lookup-ip4-dst-mcast",
1377  NULL,
1378 };
1379 const static char* const lookup_dst_mcast_ip6_nodes[] =
1380 {
1381  "lookup-ip6-dst-mcast",
1382  NULL,
1383 };
1384 const static char* const * const lookup_dst_mcast_nodes[DPO_PROTO_NUM] =
1385 {
1388 };
1389 
1390 const static char* const lookup_dst_from_interface_ip4_nodes[] =
1391 {
1392  "lookup-ip4-dst-itf",
1393  NULL,
1394 };
1395 const static char* const lookup_dst_from_interface_ip6_nodes[] =
1396 {
1397  "lookup-ip6-dst-itf",
1398  NULL,
1399 };
1400 const static char* const lookup_dst_from_interface_mpls_nodes[] =
1401 {
1402  "lookup-mpls-dst-itf",
1403  NULL,
1404 };
1405 const static char* const * const lookup_dst_from_interface_nodes[DPO_PROTO_NUM] =
1406 {
1410 };
1411 
1412 static clib_error_t *
1414  unformat_input_t * input,
1415  vlib_cli_command_t * cmd)
1416 {
1417  index_t lkdi = INDEX_INVALID;
1418 
1419  while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
1420  {
1421  if (unformat (input, "%d", &lkdi))
1422  ;
1423  else
1424  break;
1425  }
1426 
1427  if (INDEX_INVALID != lkdi)
1428  {
1430  vlib_cli_output (vm, "no such index %d", lkdi);
1431  else
1432  vlib_cli_output (vm, "%U", format_lookup_dpo, lkdi);
1433  }
1434  else
1435  {
1436  lookup_dpo_t *lkd;
1437 
1439  {
1440  vlib_cli_output (vm, "[@%d] %U",
1441  lookup_dpo_get_index(lkd),
1443  lookup_dpo_get_index(lkd));
1444  }
1445  }
1446 
1447  return 0;
1448 }
1449 
1451  .path = "show lookup-dpo",
1452  .short_help = "show lookup-dpo [<index>]",
1453  .function = lookup_dpo_show,
1454 };
1455 
1456 void
1458 {
1460 
1461  /*
1462  * There are various sorts of lookup; src or dst addr v4 /v6 etc.
1463  * there isn't an object type for each (there is only the lookup_dpo_t),
1464  * but, for performance reasons, there is a data plane function, and hence
1465  * VLIB node for each. VLIB graph node construction is based on DPO types
1466  * so we create sub-types.
1467  */
1476 }
lookup_dst_nodes
const static char *const *const lookup_dst_nodes[DPO_PROTO_NUM]
Definition: lookup_dpo.c:1367
LOOKUP_SUB_TYPE_NUM
#define LOOKUP_SUB_TYPE_NUM
Definition: lookup_dpo.c:47
lookup_dpo_ip4_inline
static uword lookup_dpo_ip4_inline(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame, int input_src_addr, int table_from_interface)
Definition: lookup_dpo.c:286
lookup_mpls_dst_itf_node
vlib_node_registration_t lookup_mpls_dst_itf_node
(constructor) VLIB_REGISTER_NODE (lookup_mpls_dst_itf_node)
Definition: lookup_dpo.c:1162
dpo_id_t_::dpoi_next_node
u16 dpoi_next_node
The next VLIB node to follow.
Definition: dpo.h:186
dpo_register_new_type
dpo_type_t dpo_register_new_type(const dpo_vft_t *vft, const char *const *const *nodes)
Create and register a new DPO type.
Definition: dpo.c:349
load_balance_t_::lb_n_buckets
u16 lb_n_buckets
number of buckets in the load-balance.
Definition: load_balance.h:116
dpo_id_t_::dpoi_index
index_t dpoi_index
the index of objects of that type
Definition: dpo.h:190
thread_index
u32 thread_index
Definition: nat44_ei_hairpinning.c:495
lookup_mpls_dst_node
vlib_node_registration_t lookup_mpls_dst_node
(constructor) VLIB_REGISTER_NODE (lookup_mpls_dst_node)
Definition: lookup_dpo.c:1147
vlib_prefetch_buffer_header
#define vlib_prefetch_buffer_header(b, type)
Prefetch buffer metadata.
Definition: buffer.h:231
ip6_mfib_get
static ip6_mfib_t * ip6_mfib_get(u32 index)
Get the FIB at the given index.
Definition: ip6_mfib.h:101
lookup_src_nodes
const static char *const *const lookup_src_nodes[DPO_PROTO_NUM]
Definition: lookup_dpo.c:1345
lookup_trace_t_::hdr
mpls_unicast_header_t hdr
Definition: lookup_dpo.c:278
lookup_ip4_src_node
vlib_node_registration_t lookup_ip4_src_node
(constructor) VLIB_REGISTER_NODE (lookup_ip4_src_node)
Definition: lookup_dpo.c:634
replicate_show_command
static vlib_cli_command_t replicate_show_command
(constructor) VLIB_CLI_COMMAND (replicate_show_command)
Definition: lookup_dpo.c:1450
next_index
nat44_ei_hairpin_src_next_t next_index
Definition: nat44_ei_hairpinning.c:412
dpo_proto_t
enum dpo_proto_t_ dpo_proto_t
Data path protocol.
lookup_cast_names
static const char *const lookup_cast_names[]
Definition: lookup_dpo.c:29
load_balance_map.h
vlib_get_buffer
static vlib_buffer_t * vlib_get_buffer(vlib_main_t *vm, u32 buffer_index)
Translate buffer index into buffer pointer.
Definition: buffer_funcs.h:111
MFIB_SOURCE_RR
@ MFIB_SOURCE_RR
Definition: mfib_types.h:176
lookup_dpo_get_index
static index_t lookup_dpo_get_index(lookup_dpo_t *lkd)
Definition: lookup_dpo.c:77
lookup_dpo_get
static lookup_dpo_t * lookup_dpo_get(index_t index)
Definition: lookup_dpo.h:127
lookup_dpo_unlock
static void lookup_dpo_unlock(dpo_id_t *dpo)
Definition: lookup_dpo.c:242
pool_get_aligned
#define pool_get_aligned(P, E, A)
Allocate an object E from a pool P with alignment A.
Definition: pool.h:249
LOOKUP_SUB_TYPE_DST_MCAST
@ LOOKUP_SUB_TYPE_DST_MCAST
Definition: lookup_dpo.c:44
node
vlib_main_t vlib_node_runtime_t * node
Definition: nat44_ei.c:3047
load_balance_t_::lb_hash_config
flow_hash_config_t lb_hash_config
the hash config to use when selecting a bucket.
Definition: load_balance.h:161
lookup_ip4_dst_mcast_node
vlib_node_registration_t lookup_ip4_dst_mcast_node
(constructor) VLIB_REGISTER_NODE (lookup_ip4_dst_mcast_node)
Definition: lookup_dpo.c:1283
lookup_dpo_pool
lookup_dpo_t * lookup_dpo_pool
pool of all MPLS Label DPOs
Definition: lookup_dpo.c:55
format_fib_table_name
u8 * format_fib_table_name(u8 *s, va_list *ap)
Format the description/name of the table.
Definition: fib_table.c:1385
lookup_dpo_ip6_inline
static uword lookup_dpo_ip6_inline(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame, int input_src_addr, int table_from_interface)
Definition: lookup_dpo.c:642
mfib_table_find_or_create_and_lock
u32 mfib_table_find_or_create_and_lock(fib_protocol_t proto, u32 table_id, mfib_source_t src)
Get the index of the FIB for a Table-ID.
Definition: mfib_table.c:613
format_lookup_trace
static u8 * format_lookup_trace(u8 *s, va_list *args)
Definition: lookup_dpo.c:585
vlib_cli_command_t::path
char * path
Definition: cli.h:96
lookup_dpo_t
A representation of an MPLS label for imposition in the data-path.
Definition: lookup_dpo.h:65
FIB_NODE_INDEX_INVALID
#define FIB_NODE_INDEX_INVALID
Definition: fib_types.h:30
fib_table.h
lookup_table_t
enum lookup_table_t_ lookup_table_t
Switch to use the packet's source or destination address for lookup.
lkd_vft
const static dpo_vft_t lkd_vft
Definition: lookup_dpo.c:1323
ip4_fib_table_get_index_for_sw_if_index
u32 ip4_fib_table_get_index_for_sw_if_index(u32 sw_if_index)
Definition: pnat_test_stubs.h:21
pool_put
#define pool_put(P, E)
Free an object E in pool P.
Definition: pool.h:305
vm
vlib_main_t * vm
X-connect all packets from the HOST to the PHY.
Definition: nat44_ei.c:3047
mpls_unicast_header_t
Definition: packet.h:28
VLIB_RX
@ VLIB_RX
Definition: defs.h:46
lookup_trace_t_::fib_index
fib_node_index_t fib_index
Definition: lookup_dpo.c:280
from_frame
vlib_main_t vlib_node_runtime_t vlib_frame_t * from_frame
Definition: esp_encrypt.c:1328
lookup_ip6_dst_itf_node
vlib_node_registration_t lookup_ip6_dst_itf_node
(constructor) VLIB_REGISTER_NODE (lookup_ip6_dst_itf_node)
Definition: lookup_dpo.c:964
vnet_buffer2
#define vnet_buffer2(b)
Definition: buffer.h:505
unformat_input_t
struct _unformat_input_t unformat_input_t
dpo_pool_barrier_sync
#define dpo_pool_barrier_sync(VM, P, YESNO)
Barrier sync if a dpo pool is about to expand.
Definition: dpo.h:544
vlib_frame_t
Definition: node.h:372
ip4_mfib.h
LOOKUP_MULTICAST
@ LOOKUP_MULTICAST
Definition: lookup_dpo.h:54
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
LOOKUP_INPUT_SRC_ADDR
@ LOOKUP_INPUT_SRC_ADDR
Definition: lookup_dpo.h:27
ip4_header_t
Definition: ip4_packet.h:87
lookup_dpo_ip_dst_mcast_inline
static uword lookup_dpo_ip_dst_mcast_inline(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame, int is_v4)
Definition: lookup_dpo.c:1177
lookup_dpo_t::lkd_locks
u16 lkd_locks
Number of locks.
Definition: lookup_dpo.h:103
lookup_dst_from_interface_ip6_nodes
const static char *const lookup_dst_from_interface_ip6_nodes[]
Definition: lookup_dpo.c:1395
LOOKUP_IP_DST_MCAST_N_NEXT
@ LOOKUP_IP_DST_MCAST_N_NEXT
Definition: lookup_dpo.c:1173
lookup_ip_dst_mcast_next_t_
lookup_ip_dst_mcast_next_t_
Definition: lookup_dpo.c:1170
lookup_trace_t_::lbi
index_t lbi
Definition: lookup_dpo.c:281
ip6_mfib.h
format_mpls_header
format_function_t format_mpls_header
Definition: mpls.h:73
unformat
uword unformat(unformat_input_t *i, const char *fmt,...)
Definition: unformat.c:978
pool_is_free_index
#define pool_is_free_index(P, I)
Use free bitmap to query whether given index is free.
Definition: pool.h:302
lookup_dst_mcast_ip6_nodes
const static char *const lookup_dst_mcast_ip6_nodes[]
Definition: lookup_dpo.c:1379
mpls_fib.h
mfib_table_lock
void mfib_table_lock(u32 fib_index, fib_protocol_t proto, mfib_source_t source)
Release a reference counting lock on the table.
Definition: mfib_table.c:806
lookup_dpo_show
static clib_error_t * lookup_dpo_show(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
Definition: lookup_dpo.c:1413
pool_foreach
#define pool_foreach(VAR, POOL)
Iterate through pool.
Definition: pool.h:534
load_balance_main
load_balance_main_t load_balance_main
The one instance of load-balance main.
Definition: load_balance.c:59
format_lookup_dpo
u8 * format_lookup_dpo(u8 *s, va_list *args)
Definition: lookup_dpo.c:195
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
load_balance_get_fwd_bucket
static const dpo_id_t * load_balance_get_fwd_bucket(const load_balance_t *lb, u16 bucket)
Definition: load_balance_map.h:94
mpls_fib_table_get_index_for_sw_if_index
static u32 mpls_fib_table_get_index_for_sw_if_index(u32 sw_if_index)
Definition: mpls_fib.h:138
LOOKUP_CASTS
#define LOOKUP_CASTS
Definition: lookup_dpo.h:57
IP_LOOKUP_NEXT_DROP
@ IP_LOOKUP_NEXT_DROP
Adjacency to drop this packet.
Definition: adj.h:53
MPLS_IS_REPLICATE
#define MPLS_IS_REPLICATE
The top bit of the index, which is the result of the MPLS lookup is used to determine if the DPO is a...
Definition: mpls_types.h:66
VLIB_NODE_FN
#define VLIB_NODE_FN(node)
Definition: node.h:202
lookup_dst_from_interface_ip4_nodes
const static char *const lookup_dst_from_interface_ip4_nodes[]
Definition: lookup_dpo.c:1390
ip6_compute_flow_hash
static u32 ip6_compute_flow_hash(const ip6_header_t *ip, flow_hash_config_t flow_hash_config)
Definition: ip6_inlines.h:49
lookup_ip6_src_node
vlib_node_registration_t lookup_ip6_src_node
(constructor) VLIB_REGISTER_NODE (lookup_ip6_src_node)
Definition: lookup_dpo.c:978
CLIB_UNUSED
#define CLIB_UNUSED(x)
Definition: clib.h:90
vnet_buffer
#define vnet_buffer(b)
Definition: buffer.h:441
lookup_src_ip4_nodes
const static char *const lookup_src_ip4_nodes[]
Definition: lookup_dpo.c:1335
fib_table_find_or_create_and_lock
u32 fib_table_find_or_create_and_lock(fib_protocol_t proto, u32 table_id, fib_source_t src)
Get the index of the FIB for a Table-ID.
Definition: fib_table.c:1170
PREDICT_FALSE
#define PREDICT_FALSE(x)
Definition: clib.h:124
lookup_dst_mcast_nodes
const static char *const *const lookup_dst_mcast_nodes[DPO_PROTO_NUM]
Definition: lookup_dpo.c:1384
vlib_get_thread_index
static_always_inline uword vlib_get_thread_index(void)
Definition: threads.h:187
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
flow_hash_config_t
enum flow_hash_config_t_ flow_hash_config_t
A flow hash configuration is a mask of the flow hash options.
lookup_dst_ip6_nodes
const static char *const lookup_dst_ip6_nodes[]
Definition: lookup_dpo.c:1357
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
lookup_dpo_alloc
static lookup_dpo_t * lookup_dpo_alloc(void)
Definition: lookup_dpo.c:63
LOOKUP_UNICAST
@ LOOKUP_UNICAST
Definition: lookup_dpo.h:53
LOOKUP_INPUT_DST_ADDR
@ LOOKUP_INPUT_DST_ADDR
Definition: lookup_dpo.h:28
ip4_mfib_get
static ip4_mfib_t * ip4_mfib_get(u32 index)
Get the FIB at the given index.
Definition: ip4_mfib.h:69
fib_node_index_t
u32 fib_node_index_t
A typedef of a node index.
Definition: fib_types.h:29
fib_show_memory_usage
void fib_show_memory_usage(const char *name, u32 in_use_elts, u32 allocd_elts, size_t size_elt)
Show the memory usage for a type.
Definition: fib_node.c:220
uword
u64 uword
Definition: types.h:112
DPO_LOOKUP
@ DPO_LOOKUP
Definition: dpo.h:113
mpls_lookup_to_replicate_edge
u32 mpls_lookup_to_replicate_edge
The arc/edge from the MPLS lookup node to the MPLS replicate node.
Definition: mpls_lookup.c:28
lookup_dpo_mem_show
static void lookup_dpo_mem_show(void)
Definition: lookup_dpo.c:1315
lookup_dst_mcast_ip4_nodes
const static char *const lookup_dst_mcast_ip4_nodes[]
Definition: lookup_dpo.c:1374
MAX_LUKPS_PER_PACKET
#define MAX_LUKPS_PER_PACKET
If a packet encounters a lookup DPO more than the many times then we assume there is a loop in the fo...
Definition: lookup_dpo.c:35
LOOKUP_SUB_TYPE_DST_TABLE_FROM_INTERFACE
@ LOOKUP_SUB_TYPE_DST_TABLE_FROM_INTERFACE
Definition: lookup_dpo.c:45
dpo_type_t
enum dpo_type_t_ dpo_type_t
Common types of data-path objects New types can be dynamically added using dpo_register_new_type()
lookup_dst_from_interface_mpls_nodes
const static char *const lookup_dst_from_interface_mpls_nodes[]
Definition: lookup_dpo.c:1400
load_balance_get_bucket_i
static const dpo_id_t * load_balance_get_bucket_i(const load_balance_t *lb, u32 bucket)
Definition: load_balance.h:229
lookup_dpo_add_or_lock_i
static void lookup_dpo_add_or_lock_i(fib_node_index_t fib_index, dpo_proto_t proto, lookup_cast_t cast, lookup_input_t input, lookup_table_t table_config, dpo_id_t *dpo)
Definition: lookup_dpo.c:83
LOOKUP_SUB_TYPE_SRC
@ LOOKUP_SUB_TYPE_SRC
Definition: lookup_dpo.c:42
lookup_dpo_module_init
void lookup_dpo_module_init(void)
Definition: lookup_dpo.c:1457
ip6_header_t::dst_address
ip6_address_t dst_address
Definition: ip6_packet.h:310
cm
vnet_feature_config_main_t * cm
Definition: nat44_ei_hairpinning.c:594
mpls_compute_flow_hash
static u32 mpls_compute_flow_hash(const mpls_unicast_header_t *hdr, flow_hash_config_t flow_hash_config)
Definition: mpls_lookup.h:43
lookup_src_ip6_nodes
const static char *const lookup_src_ip6_nodes[]
Definition: lookup_dpo.c:1340
lookup_trace_t_
Lookup trace data.
Definition: lookup_dpo.c:274
lookup_ip6_dst_node
vlib_node_registration_t lookup_ip6_dst_node
(constructor) VLIB_REGISTER_NODE (lookup_ip6_dst_node)
Definition: lookup_dpo.c:950
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
dpo_vft_t_::dv_lock
dpo_lock_fn_t dv_lock
A reference counting lock function.
Definition: dpo.h:428
ip4_address_t
Definition: ip4_packet.h:50
LOOKUP_TABLE_FROM_CONFIG
@ LOOKUP_TABLE_FROM_CONFIG
Definition: lookup_dpo.h:41
lookup_trace_t
struct lookup_trace_t_ lookup_trace_t
Lookup trace data.
mfib_table.h
ip4_fib_forwarding_lookup_x2
static_always_inline void ip4_fib_forwarding_lookup_x2(u32 fib_index0, u32 fib_index1, const ip4_address_t *addr0, const ip4_address_t *addr1, index_t *lb0, index_t *lb1)
Definition: ip4_fib.h:240
format_lookup_mpls_trace
static u8 * format_lookup_mpls_trace(u8 *s, va_list *args)
Definition: lookup_dpo.c:1122
CLIB_CACHE_LINE_BYTES
#define CLIB_CACHE_LINE_BYTES
Definition: cache.h:58
LOOKUP_INPUTS
#define LOOKUP_INPUTS
Definition: lookup_dpo.h:31
mfib_forward_lookup_next_t
enum lookup_ip_dst_mcast_next_t_ mfib_forward_lookup_next_t
vlib_node_registration_t
struct _vlib_node_registration vlib_node_registration_t
vlib_cli_output
void vlib_cli_output(vlib_main_t *vm, char *fmt,...)
Definition: cli.c:716
ip6_fib_table_fwding_lookup
static u32 ip6_fib_table_fwding_lookup(u32 fib_index, const ip6_address_t *dst)
Definition: ip6_fib.h:115
ip4_header_t::dst_address
ip4_address_t dst_address
Definition: ip4_packet.h:125
mfib_table_unlock
void mfib_table_unlock(u32 fib_index, fib_protocol_t proto, mfib_source_t source)
Take a reference counting lock on the table.
Definition: mfib_table.c:777
lookup_dpo_t::lkd_table
lookup_table_t lkd_table
Switch to use the table index passed, or the table of the input interface.
Definition: lookup_dpo.h:93
lookup_dpo_t::lkd_cast
lookup_cast_t lkd_cast
Unicast of rmulticast FIB lookup.
Definition: lookup_dpo.h:98
lookup_input_names
static const char *const lookup_input_names[]
Definition: lookup_dpo.c:28
mpls_lookup.h
lookup_ip4_dst_node
vlib_node_registration_t lookup_ip4_dst_node
(constructor) VLIB_REGISTER_NODE (lookup_ip4_dst_node)
Definition: lookup_dpo.c:606
lookup_sub_type_t
enum lookup_sub_type_t_ lookup_sub_type_t
Enumeration of the lookup subtypes.
pool_len
#define pool_len(p)
Number of elements in pool vector.
Definition: pool.h:139
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
index
u32 index
Definition: flow_types.api:221
always_inline
#define always_inline
Definition: rdma_mlx5dv.h:23
load_balance_main_t_::lbm_to_counters
vlib_combined_counter_main_t lbm_to_counters
Definition: load_balance.h:46
LOOKUP_TABLE_FROM_INPUT_INTERFACE
@ LOOKUP_TABLE_FROM_INPUT_INTERFACE
Definition: lookup_dpo.h:40
ip4_header_t::src_address
ip4_address_t src_address
Definition: ip4_packet.h:125
dpo_proto_to_fib
fib_protocol_t dpo_proto_to_fib(dpo_proto_t dpo_proto)
Definition: fib_types.c:359
format
description fragment has unexpected format
Definition: map.api:433
ASSERT
#define ASSERT(truth)
Definition: error_bootstrap.h:69
vlib_combined_counter_main_t
A collection of combined counters.
Definition: counter.h:203
format_get_indent
static u32 format_get_indent(u8 *s)
Definition: format.h:72
lookup_dst_ip4_nodes
const static char *const lookup_dst_ip4_nodes[]
Definition: lookup_dpo.c:1352
vlib_put_next_frame
vlib_put_next_frame(vm, node, next_index, 0)
format_ip46_address
format_function_t format_ip46_address
Definition: ip46_address.h:50
DPO_PROTO_IP6
@ DPO_PROTO_IP6
Definition: dpo.h:65
fib_table_lock
void fib_table_lock(u32 fib_index, fib_protocol_t proto, fib_source_t source)
Release a reference counting lock on the table.
Definition: fib_table.c:1361
DPO_PROTO_MPLS
@ DPO_PROTO_MPLS
Definition: dpo.h:66
lookup_dpo_sub_types
static dpo_type_t lookup_dpo_sub_types[LOOKUP_SUB_TYPE_NUM]
An array of registered DPO type values for the sub-types.
Definition: lookup_dpo.c:60
ip.h
u32
unsigned int u32
Definition: types.h:88
table_id
u32 table_id
Definition: wireguard.api:102
lookup_ip4_dst_itf_node
vlib_node_registration_t lookup_ip4_dst_itf_node
(constructor) VLIB_REGISTER_NODE (lookup_ip4_dst_itf_node)
Definition: lookup_dpo.c:620
lookup_dpo.h
MPLS_LOOKUP_NEXT_DROP
@ MPLS_LOOKUP_NEXT_DROP
Definition: mpls_lookup.h:35
LOOKUP_SUB_TYPE_DST
@ LOOKUP_SUB_TYPE_DST
Definition: lookup_dpo.c:43
load_balance_get
static load_balance_t * load_balance_get(index_t lbi)
Definition: load_balance.h:220
lookup_dpo_mpls_inline
static uword lookup_dpo_mpls_inline(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *from_frame, int table_from_interface)
Definition: lookup_dpo.c:986
lookup_dpo_lock
static void lookup_dpo_lock(dpo_id_t *dpo)
Definition: lookup_dpo.c:232
lookup_input_t
enum lookup_input_t_ lookup_input_t
Switch to use the packet's source or destination address for lookup.
ip4_mfib_table_lookup
fib_node_index_t ip4_mfib_table_lookup(const ip4_mfib_t *mfib, const ip4_address_t *src, const ip4_address_t *grp, u32 len)
The IPv4 Multicast-FIB.
Definition: ip4_mfib.c:240
pool_elts
static uword pool_elts(void *v)
Number of active elements in a pool.
Definition: pool.h:127
lookup_sub_type_t_
lookup_sub_type_t_
Enumeration of the lookup subtypes.
Definition: lookup_dpo.c:40
LOOKUP_IP_DST_MCAST_NEXT_DROP
@ LOOKUP_IP_DST_MCAST_NEXT_DROP
Definition: lookup_dpo.c:1171
lookup_cast_t
enum lookup_cast_t_ lookup_cast_t
Switch to use the packet's source or destination address for lookup.
ip4_compute_flow_hash
static u32 ip4_compute_flow_hash(const ip4_header_t *ip, flow_hash_config_t flow_hash_config)
Definition: ip4_inlines.h:51
ip6_header_t
Definition: ip6_packet.h:294
LOOKUP_IP_DST_MCAST_NEXT_RPF
@ LOOKUP_IP_DST_MCAST_NEXT_RPF
Definition: lookup_dpo.c:1172
mpls_unicast_header_t::label_exp_s_ttl
mpls_label_t label_exp_s_ttl
Definition: packet.h:33
ip6_mfib_table_fwd_lookup
fib_node_index_t ip6_mfib_table_fwd_lookup(const ip6_mfib_t *mfib, const ip6_address_t *src, const ip6_address_t *grp)
Definition: ip6_mfib.c:351
ip4_fib.h
ip6_fib.h
ip6_header_t::src_address
ip6_address_t src_address
Definition: ip6_packet.h:310
vlib_main_t
Definition: main.h:102
lookup_dst_from_interface_nodes
const static char *const *const lookup_dst_from_interface_nodes[DPO_PROTO_NUM]
Definition: lookup_dpo.c:1405
vlib_node_t
Definition: node.h:247
dpo_vft_t_
A virtual function table regisitered for a DPO type.
Definition: dpo.h:423
format_dpo_proto
u8 * format_dpo_proto(u8 *s, va_list *args)
format a DPO protocol
Definition: dpo.c:180
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
mpls_fib_table_forwarding_lookup
static index_t mpls_fib_table_forwarding_lookup(u32 mpls_fib_index, const mpls_unicast_header_t *hdr)
Lookup a label and EOS bit in the MPLS_FIB table to retrieve the load-balance index to be used for pa...
Definition: mpls_fib.h:122
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
lookup_dpo_add_or_lock_w_table_id
void lookup_dpo_add_or_lock_w_table_id(u32 table_id, dpo_proto_t proto, lookup_cast_t cast, lookup_input_t input, lookup_table_t table_config, dpo_id_t *dpo)
Definition: lookup_dpo.c:163
vlib_buffer_t::data
u8 data[]
Packet data.
Definition: buffer.h:204
fib_table_unlock
void fib_table_unlock(u32 fib_index, fib_protocol_t proto, fib_source_t source)
Take a reference counting lock on the table.
Definition: fib_table.c:1342
DPO_PROTO_IP4
@ DPO_PROTO_IP4
Definition: dpo.h:64
FIB_SOURCE_RR
@ FIB_SOURCE_RR
Recursive resolution source.
Definition: fib_source.h:122
lkd_vft_w_mem_show
const static dpo_vft_t lkd_vft_w_mem_show
Definition: lookup_dpo.c:1328
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
lookup_dpo_t::lkd_proto
dpo_proto_t lkd_proto
The protocol of the FIB for the lookup, and hence the protocol of the packet.
Definition: lookup_dpo.h:83
lookup_ip6_dst_mcast_node
vlib_node_registration_t lookup_ip6_dst_mcast_node
(constructor) VLIB_REGISTER_NODE (lookup_ip6_dst_mcast_node)
Definition: lookup_dpo.c:1302
IP46_TYPE_ANY
@ IP46_TYPE_ANY
Definition: ip46_address.h:24
load_balance_t_::lb_n_buckets_minus_1
u16 lb_n_buckets_minus_1
number of buckets in the load-balance - 1.
Definition: load_balance.h:121
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
ip4_fib_forwarding_lookup
static index_t ip4_fib_forwarding_lookup(u32 fib_index, const ip4_address_t *addr)
Definition: ip4_fib.h:223
lookup_dpo_t::lkd_fib_index
fib_node_index_t lkd_fib_index
The FIB, or interface from which to get a FIB, in which to perform the next lookup;.
Definition: lookup_dpo.h:77
load_balance_t_
The FIB DPO provieds;.
Definition: load_balance.h:106
clib_prefetch_store
static_always_inline void clib_prefetch_store(void *p)
Definition: cache.h:98
dpo_set
void dpo_set(dpo_id_t *dpo, dpo_type_t type, dpo_proto_t proto, index_t index)
Set/create a DPO ID The DPO will be locked.
Definition: dpo.c:188
vlib_node_runtime_t
Definition: node.h:454
proto
vl_api_ip_proto_t proto
Definition: acl_types.api:51
lookup_dpo_t::lkd_input
lookup_input_t lkd_input
Switch to use src or dst address.
Definition: lookup_dpo.h:88
vlib_cli_command_t
Definition: cli.h:92
format_mfib_table_name
u8 * format_mfib_table_name(u8 *s, va_list *ap)
Format the description/name of the table.
Definition: mfib_table.c:868
from
from
Definition: nat44_ei_hairpinning.c:415
INDEX_INVALID
#define INDEX_INVALID
Invalid index - used when no index is known blazoned capitals INVALID speak volumes where ~0 does not...
Definition: dpo.h:49
is_pow2
static uword is_pow2(uword x)
Definition: clib.h:267
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
lookup_dpo_add_or_lock_w_fib_index
void lookup_dpo_add_or_lock_w_fib_index(fib_node_index_t fib_index, dpo_proto_t proto, lookup_cast_t cast, lookup_input_t input, lookup_table_t table_config, dpo_id_t *dpo)
Definition: lookup_dpo.c:137
VLIB_TX
@ VLIB_TX
Definition: defs.h:47
dpo_reset
void dpo_reset(dpo_id_t *dpo)
reset a DPO ID The DPO will be unlocked.
Definition: dpo.c:234
n_left_from
n_left_from
Definition: nat44_ei_hairpinning.c:416
DPO_PROTO_NUM
#define DPO_PROTO_NUM
Definition: dpo.h:72
lookup_trace_t_::addr
ip46_address_t addr
Definition: lookup_dpo.c:277
type
vl_api_fib_path_type_t type
Definition: fib_types.api:123
vlib_increment_combined_counter
vlib_increment_combined_counter(ccm, ti, sw_if_index, n_buffers, n_bytes)
format_white_space
u8 * format_white_space(u8 *s, va_list *va)
Definition: std-formats.c:129
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
lookup_dst_mpls_nodes
const static char *const lookup_dst_mpls_nodes[]
Definition: lookup_dpo.c:1362
dpo_register
void dpo_register(dpo_type_t type, const dpo_vft_t *vft, const char *const *const *nodes)
For a given DPO type Register:
Definition: dpo.c:329
dpo_pool_barrier_release
#define dpo_pool_barrier_release(VM, YESNO)
Release barrier sync after dpo pool expansion.
Definition: dpo.h:568
vlib_buffer_t
VLIB buffer representation.
Definition: buffer.h:111
VLIB_REGISTER_NODE
#define VLIB_REGISTER_NODE(x,...)
Definition: node.h:169