FD.io VPP  v20.01-48-g3e0dafb74
Vector Packet Processing
as.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015 Cisco and/or its affiliates.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at:
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 /*
16  *------------------------------------------------------------------
17  * as.c - SRv6 Static Proxy (AS) function
18  *------------------------------------------------------------------
19  */
20 
21 #include <vnet/vnet.h>
22 #include <vnet/adj/adj.h>
23 #include <vnet/plugin/plugin.h>
24 #include <vpp/app/version.h>
25 #include <srv6-as/as.h>
26 
27 #define SID_CREATE_IFACE_FEATURE_ERROR -1
28 #define SID_CREATE_INVALID_IFACE_TYPE -3
29 #define SID_CREATE_INVALID_IFACE_INDEX -4
30 #define SID_CREATE_INVALID_ADJ_INDEX -5
31 
32 unsigned char function_name[] = "SRv6-AS-plugin";
33 unsigned char keyword_str[] = "End.AS";
34 unsigned char def_str[] =
35  "Endpoint with static proxy to SR-unaware appliance";
36 unsigned char params_str[] =
37  "nh <next-hop> oif <iface-out> iif <iface-in> src <src-addr> next <sid> [next <sid> ...]";
38 
40 
41 static inline u8 *
43  u8 protocol)
44 {
45  u8 *rewrite_str = NULL;
46  u32 rewrite_len = IPv6_DEFAULT_HEADER_LENGTH;
47 
48  u8 num_sids = vec_len (sid_list);
49  u32 sr_hdr_len = 0;
50 
51  if (num_sids > 1)
52  {
53  sr_hdr_len =
54  sizeof (ip6_sr_header_t) + num_sids * sizeof (ip6_address_t);
55  rewrite_len += sr_hdr_len;
56  }
57 
58  vec_validate (rewrite_str, rewrite_len - 1);
59 
60  /* Fill IP header */
61  ip6_header_t *iph = (ip6_header_t *) rewrite_str;
63  clib_host_to_net_u32 (0 | ((6 & 0xF) << 28));
64  iph->src_address = src_addr;
65  iph->dst_address = sid_list[0];
66  iph->payload_length = sr_hdr_len;
67  iph->hop_limit = sr_get_hop_limit ();
68 
69  if (num_sids > 1)
70  {
71  /* Set Next Header value to Routing Extension */
72  iph->protocol = IP_PROTOCOL_IPV6_ROUTE;
73 
74  /* Fill SR header */
75  ip6_sr_header_t *srh = (ip6_sr_header_t *) (iph + 1);
76  srh->protocol = protocol;
77  srh->length = sr_hdr_len / 8 - 1;
79  srh->segments_left = num_sids - 1;
80  srh->last_entry = num_sids - 1;
81  srh->flags = 0x00;
82  srh->tag = 0x0000;
83 
84  /* Fill segment list */
85  ip6_address_t *this_address;
86  ip6_address_t *addrp = srh->segments + srh->last_entry;
87  vec_foreach (this_address, sid_list)
88  {
89  *addrp = *this_address;
90  addrp--;
91  }
92  }
93  else
94  {
95  /* Set Next Header value to inner protocol */
96  iph->protocol = protocol;
97  }
98 
99  return rewrite_str;
100 }
101 
102 static inline void
104 {
105  vec_free (ls_mem->rewrite);
106  vec_free (ls_mem->sid_list);
107  clib_mem_free (ls_mem);
108 }
109 
110 
111 /*****************************************/
112 /* SRv6 LocalSID instantiation and removal functions */
113 static int
115 {
116  ip6_sr_main_t *srm = &sr_main;
118  srv6_as_localsid_t *ls_mem = localsid->plugin_mem;
119  u32 localsid_index = localsid - srm->localsids;
120 
121  /* Step 1: Prepare xconnect adjacency for sending packets to the VNF */
122 
123  /* Retrieve the adjacency corresponding to the (OIF, next_hop) */
124  adj_index_t nh_adj_index = ADJ_INDEX_INVALID;
125  if (ls_mem->inner_type != AS_TYPE_L2)
126  {
127  if (ls_mem->inner_type == AS_TYPE_IP4)
128  nh_adj_index = adj_nbr_add_or_lock (FIB_PROTOCOL_IP4,
129  VNET_LINK_IP4, &ls_mem->nh_addr,
130  ls_mem->sw_if_index_out);
131  else if (ls_mem->inner_type == AS_TYPE_IP6)
132  nh_adj_index = adj_nbr_add_or_lock (FIB_PROTOCOL_IP6,
133  VNET_LINK_IP6, &ls_mem->nh_addr,
134  ls_mem->sw_if_index_out);
135  if (nh_adj_index == ADJ_INDEX_INVALID)
136  {
137  free_ls_mem (ls_mem);
139  }
140  }
141 
142  ls_mem->nh_adj = nh_adj_index;
143 
144 
145  /* Step 2: Prepare inbound policy for packets returning from the VNF */
146 
147  /* Make sure the provided incoming interface index is valid */
149  ls_mem->sw_if_index_in))
150  {
151  adj_unlock (ls_mem->nh_adj);
152  free_ls_mem (ls_mem);
154  }
155 
156  /* Retrieve associated interface structure */
158  ls_mem->sw_if_index_in);
160  {
161  adj_unlock (ls_mem->nh_adj);
162  free_ls_mem (ls_mem);
164  }
165 
166  if (ls_mem->inner_type == AS_TYPE_L2)
167  {
168  /* Enable End.AS2 rewrite node for this interface */
169  int ret =
170  vnet_feature_enable_disable ("device-input", "srv6-as2-rewrite",
171  ls_mem->sw_if_index_in, 1, 0, 0);
172  if (ret != 0)
173  {
174  free_ls_mem (ls_mem);
176  }
177 
178  /* Set interface in promiscuous mode */
179  vnet_main_t *vnm = vnet_get_main ();
180  ethernet_set_flags (vnm, ls_mem->sw_if_index_in,
182 
183  /* Prepare rewrite string */
184  ls_mem->rewrite = prepare_rewrite (ls_mem->src_addr, ls_mem->sid_list,
185  IP_PROTOCOL_IP6_NONXT);
186 
187  /* Associate local SID index to this interface (resize vector if needed) */
188  if (ls_mem->sw_if_index_in >= vec_len (sm->sw_iface_localsid2))
189  {
192  - vec_len (sm->sw_iface_localsid2)));
193  }
194  sm->sw_iface_localsid2[ls_mem->sw_if_index_in] = localsid_index;
195  }
196  else if (ls_mem->inner_type == AS_TYPE_IP4)
197  {
198  /* Enable End.AS4 rewrite node for this interface */
199  int ret =
200  vnet_feature_enable_disable ("ip4-unicast", "srv6-as4-rewrite",
201  ls_mem->sw_if_index_in, 1, 0, 0);
202  if (ret != 0)
203  {
204  adj_unlock (ls_mem->nh_adj);
205  free_ls_mem (ls_mem);
207  }
208 
209  /* Prepare rewrite string */
210  ls_mem->rewrite = prepare_rewrite (ls_mem->src_addr, ls_mem->sid_list,
211  IP_PROTOCOL_IP_IN_IP);
212 
213  /* Associate local SID index to this interface (resize vector if needed) */
214  if (ls_mem->sw_if_index_in >= vec_len (sm->sw_iface_localsid4))
215  {
218  - vec_len (sm->sw_iface_localsid4)));
219  }
220  sm->sw_iface_localsid4[ls_mem->sw_if_index_in] = localsid_index;
221  }
222  else if (ls_mem->inner_type == AS_TYPE_IP6)
223  {
224  /* Enable End.AS6 rewrite node for this interface */
225  int ret =
226  vnet_feature_enable_disable ("ip6-unicast", "srv6-as6-rewrite",
227  ls_mem->sw_if_index_in, 1, 0, 0);
228  if (ret != 0)
229  {
230  adj_unlock (ls_mem->nh_adj);
231  free_ls_mem (ls_mem);
233  }
234 
235  /* Prepare rewrite string */
236  ls_mem->rewrite = prepare_rewrite (ls_mem->src_addr, ls_mem->sid_list,
237  IP_PROTOCOL_IPV6);
238 
239  /* Associate local SID index to this interface (resize vector if needed) */
240  if (ls_mem->sw_if_index_in >= vec_len (sm->sw_iface_localsid6))
241  {
244  - vec_len (sm->sw_iface_localsid6)));
245  }
246  sm->sw_iface_localsid6[ls_mem->sw_if_index_in] = localsid_index;
247  }
248 
249  /* Step 3: Initialize rewrite counters */
250  srv6_as_localsid_t **ls_p;
251  pool_get (sm->sids, ls_p);
252  *ls_p = ls_mem;
253  ls_mem->index = ls_p - sm->sids;
254 
257 
260 
261  return 0;
262 }
263 
264 static int
266 {
268  srv6_as_localsid_t *ls_mem = localsid->plugin_mem;
269 
270  if (ls_mem->inner_type == AS_TYPE_L2)
271  {
272  /* Disable End.AS2 rewrite node for this interface */
273  int ret;
274  ret = vnet_feature_enable_disable ("device-input", "srv6-as2-rewrite",
275  ls_mem->sw_if_index_in, 0, 0, 0);
276  if (ret != 0)
277  return -1;
278 
279  /* Disable promiscuous mode on the interface */
280  vnet_main_t *vnm = vnet_get_main ();
281  ethernet_set_flags (vnm, ls_mem->sw_if_index_in, 0);
282 
283  /* Remove local SID index from interface table */
284  sm->sw_iface_localsid2[ls_mem->sw_if_index_in] = ~(u32) 0;
285  }
286  else if (ls_mem->inner_type == AS_TYPE_IP4)
287  {
288  /* Disable End.AS4 rewrite node for this interface */
289  int ret;
290  ret = vnet_feature_enable_disable ("ip4-unicast", "srv6-as4-rewrite",
291  ls_mem->sw_if_index_in, 0, 0, 0);
292  if (ret != 0)
293  return -1;
294 
295  /* Remove local SID index from interface table */
296  sm->sw_iface_localsid4[ls_mem->sw_if_index_in] = ~(u32) 0;
297  }
298  else if (ls_mem->inner_type == AS_TYPE_IP6)
299  {
300  /* Disable End.AS6 rewrite node for this interface */
301  int ret;
302  ret = vnet_feature_enable_disable ("ip6-unicast", "srv6-as6-rewrite",
303  ls_mem->sw_if_index_in, 0, 0, 0);
304  if (ret != 0)
305  return -1;
306 
307  /* Remove local SID index from interface table */
308  sm->sw_iface_localsid6[ls_mem->sw_if_index_in] = ~(u32) 0;
309  }
310 
311 
312  /* Unlock (OIF, NHOP) adjacency (from sr_localsid.c:103) */
313  adj_unlock (ls_mem->nh_adj);
314 
315  /* Delete SID entry */
316  pool_put (sm->sids, pool_elt_at_index (sm->sids, ls_mem->index));
317 
318  /* Clean up local SID memory */
319  free_ls_mem (ls_mem);
320 
321  return 0;
322 }
323 
324 /**********************************/
325 /* SRv6 LocalSID format functions */
326 /*
327  * Prints nicely the parameters of a localsid
328  * Example: print "Table 5"
329  */
330 u8 *
331 format_srv6_as_localsid (u8 * s, va_list * args)
332 {
333  srv6_as_localsid_t *ls_mem = va_arg (*args, void *);
334 
335  vnet_main_t *vnm = vnet_get_main ();
337 
338  if (ls_mem->inner_type == AS_TYPE_IP4)
339  {
340  s =
341  format (s, "Next-hop:\t%U\n\t", format_ip4_address,
342  &ls_mem->nh_addr.ip4);
343  }
344  else if (ls_mem->inner_type == AS_TYPE_IP6)
345  {
346  s =
347  format (s, "Next-hop:\t%U\n\t", format_ip6_address,
348  &ls_mem->nh_addr.ip6);
349  }
350 
351  s = format (s, "Outgoing iface:\t%U\n", format_vnet_sw_if_index_name, vnm,
352  ls_mem->sw_if_index_out);
353  s = format (s, "\tIncoming iface:\t%U\n", format_vnet_sw_if_index_name, vnm,
354  ls_mem->sw_if_index_in);
355  s = format (s, "\tSource address:\t%U\n", format_ip6_address,
356  &ls_mem->src_addr);
357 
358  s = format (s, "\tSegment list:\t< ");
360  vec_foreach (addr, ls_mem->sid_list)
361  {
362  s = format (s, "%U, ", format_ip6_address, addr);
363  }
364  s = format (s, "\b\b >\n");
365 
366  vlib_counter_t valid, invalid;
367  vlib_get_combined_counter (&(sm->valid_counters), ls_mem->index, &valid);
369  &invalid);
370  s =
371  format (s, "\tGood rewrite traffic: \t[%Ld packets : %Ld bytes]\n",
372  valid.packets, valid.bytes);
373  s =
374  format (s, "\tBad rewrite traffic: \t[%Ld packets : %Ld bytes]\n",
375  invalid.packets, invalid.bytes);
376 
377  return s;
378 }
379 
380 /*
381  * Process the parameters of a localsid
382  * Example: process from:
383  * sr localsid address cafe::1 behavior new_srv6_localsid 5
384  * everything from behavior on... so in this case 'new_srv6_localsid 5'
385  * Notice that it MUST match the keyword_str and params_str defined above.
386  */
387 uword
389 {
390  void **plugin_mem_p = va_arg (*args, void **);
391  srv6_as_localsid_t *ls_mem;
392 
393  vnet_main_t *vnm = vnet_get_main ();
394 
395  u8 inner_type = AS_TYPE_L2;
396  ip46_address_t nh_addr;
397  u32 sw_if_index_out;
398  u32 sw_if_index_in;
399  ip6_address_t src_addr;
400  ip6_address_t next_sid;
401  ip6_address_t *sid_list = NULL;
402 
403  u8 params = 0;
404 #define PARAM_AS_NH (1 << 0)
405 #define PARAM_AS_OIF (1 << 1)
406 #define PARAM_AS_IIF (1 << 2)
407 #define PARAM_AS_SRC (1 << 3)
408 
409  if (!unformat (input, "end.as"))
410  return 0;
411 
413  {
414  if (!(params & PARAM_AS_NH) && unformat (input, "nh %U",
416  &nh_addr.ip4))
417  {
418  inner_type = AS_TYPE_IP4;
419  params |= PARAM_AS_NH;
420  }
421  if (!(params & PARAM_AS_NH) && unformat (input, "nh %U",
423  &nh_addr.ip6))
424  {
425  inner_type = AS_TYPE_IP6;
426  params |= PARAM_AS_NH;
427  }
428  else if (!(params & PARAM_AS_OIF) && unformat (input, "oif %U",
430  vnm, &sw_if_index_out))
431  {
432  params |= PARAM_AS_OIF;
433  }
434  else if (!(params & PARAM_AS_IIF) && unformat (input, "iif %U",
436  vnm, &sw_if_index_in))
437  {
438  params |= PARAM_AS_IIF;
439  }
440  else if (!(params & PARAM_AS_SRC) && unformat (input, "src %U",
442  &src_addr))
443  {
444  params |= PARAM_AS_SRC;
445  }
446  else if (unformat (input, "next %U", unformat_ip6_address, &next_sid))
447  {
448  vec_add1 (sid_list, next_sid);
449  }
450  else
451  {
452  break;
453  }
454  }
455 
456  /* Make sure that all parameters are supplied */
457  u8 params_chk = (PARAM_AS_OIF | PARAM_AS_IIF | PARAM_AS_SRC);
458  if ((params & params_chk) != params_chk || sid_list == NULL)
459  {
460  vec_free (sid_list);
461  return 0;
462  }
463 
464  /* Allocate and initialize memory block for local SID parameters */
465  ls_mem = clib_mem_alloc_aligned_at_offset (sizeof *ls_mem, 0, 0, 1);
466  clib_memset (ls_mem, 0, sizeof *ls_mem);
467  *plugin_mem_p = ls_mem;
468 
469  /* Set local SID parameters */
470  ls_mem->inner_type = inner_type;
471  if (inner_type == AS_TYPE_IP4)
472  ls_mem->nh_addr.ip4 = nh_addr.ip4;
473  else if (inner_type == AS_TYPE_IP6)
474  ls_mem->nh_addr.ip6 = nh_addr.ip6;
475  ls_mem->sw_if_index_out = sw_if_index_out;
476  ls_mem->sw_if_index_in = sw_if_index_in;
477  ls_mem->src_addr = src_addr;
478  ls_mem->sid_list = sid_list;
479 
480  return 1;
481 }
482 
483 /*************************/
484 /* SRv6 LocalSID FIB DPO */
485 static u8 *
486 format_srv6_as_dpo (u8 * s, va_list * args)
487 {
488  index_t index = va_arg (*args, index_t);
489  CLIB_UNUSED (u32 indent) = va_arg (*args, u32);
490 
491  return (format (s, "SR: static_proxy_index:[%u]", index));
492 }
493 
494 void
496 {
497 }
498 
499 void
501 {
502 }
503 
504 const static dpo_vft_t srv6_as_vft = {
506  .dv_unlock = srv6_as_dpo_unlock,
507  .dv_format = format_srv6_as_dpo,
508 };
509 
510 const static char *const srv6_as_ip6_nodes[] = {
511  "srv6-as-localsid",
512  NULL,
513 };
514 
515 const static char *const *const srv6_as_nodes[DPO_PROTO_NUM] = {
517 };
518 
519 /**********************/
520 static clib_error_t *
522 {
524  int rv = 0;
525 
526  sm->vlib_main = vm;
527  sm->vnet_main = vnet_get_main ();
528 
529  /* Create DPO */
531 
532  /* Register SRv6 LocalSID */
535  keyword_str,
536  def_str,
537  params_str,
538  128,
539  &sm->srv6_as_dpo_type,
544  if (rv < 0)
545  clib_error_return (0, "SRv6 LocalSID function could not be registered.");
546  else
547  sm->srv6_localsid_behavior_id = rv;
548 
549  return 0;
550 }
551 
552 /* *INDENT-OFF* */
553 VNET_FEATURE_INIT (srv6_as2_rewrite, static) =
554 {
555  .arc_name = "device-input",
556  .node_name = "srv6-as2-rewrite",
557  .runs_before = VNET_FEATURES ("ethernet-input"),
558 };
559 
560 VNET_FEATURE_INIT (srv6_as4_rewrite, static) =
561 {
562  .arc_name = "ip4-unicast",
563  .node_name = "srv6-as4-rewrite",
564  .runs_before = 0,
565 };
566 
567 VNET_FEATURE_INIT (srv6_as6_rewrite, static) =
568 {
569  .arc_name = "ip6-unicast",
570  .node_name = "srv6-as6-rewrite",
571  .runs_before = 0,
572 };
573 
575 
577  .version = VPP_BUILD_VER,
578  .description = "Static Segment Routing for IPv6 (SRv6) Proxy",
579 };
580 /* *INDENT-ON* */
581 
582 /*
583 * fd.io coding-style-patch-verification: ON
584 *
585 * Local Variables:
586 * eval: (c-set-style "gnu")
587 * End:
588 */
#define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment) ...
Definition: vec.h:440
ip6_sr_main_t sr_main
Definition: sr.c:31
dpo_lock_fn_t dv_lock
A reference counting lock function.
Definition: dpo.h:406
unsigned char function_name[]
Definition: as.c:32
#define PARAM_AS_IIF
#define PARAM_AS_OIF
#define CLIB_UNUSED(x)
Definition: clib.h:82
A virtual function table regisitered for a DPO type.
Definition: dpo.h:401
static u8 * prepare_rewrite(ip6_address_t src_addr, ip6_address_t *sid_list, u8 protocol)
Definition: as.c:42
void vlib_validate_combined_counter(vlib_combined_counter_main_t *cm, u32 index)
validate a combined counter
Definition: counter.c:94
static void * clib_mem_alloc_aligned_at_offset(uword size, uword align, uword align_offset, int os_out_of_memory_on_failure)
Definition: mem.h:113
SR LocalSID.
Definition: sr.h:118
u32 * sw_iface_localsid4
Retrieve local SID from iface.
Definition: as.h:62
vnet_main_t * vnet_get_main(void)
Definition: misc.c:46
u8 sr_get_hop_limit(void)
u32 srv6_localsid_behavior_id
SRv6 LocalSID behavior number.
Definition: as.h:59
vnet_interface_main_t interface_main
Definition: vnet.h:56
#define AS_TYPE_IP6
Definition: as.h:28
#define NULL
Definition: clib.h:58
clib_memset(h->entries, 0, sizeof(h->entries[0]) *entries)
void srv6_as_dpo_lock(dpo_id_t *dpo)
Definition: as.c:495
u32 * sw_iface_localsid2
Retrieve local SID from iface.
Definition: as.h:61
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:41
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
Definition: vec.h:523
Combined counter to hold both packets and byte differences.
Definition: counter_types.h:26
dpo_type_t srv6_as_dpo_type
DPO type.
Definition: as.h:57
static vnet_sw_interface_t * vnet_get_sw_interface(vnet_main_t *vnm, u32 sw_if_index)
#define IPv6_DEFAULT_HEADER_LENGTH
Definition: sr.h:33
u8 * format(u8 *s, const char *fmt,...)
Definition: format.c:424
unformat_function_t unformat_vnet_sw_interface
#define ROUTING_HEADER_TYPE_SR
Definition: sr_packet.h:117
static clib_error_t * srv6_as_init(vlib_main_t *vm)
Definition: as.c:521
#define pool_get(P, E)
Allocate an object E from a pool P (unspecified alignment).
Definition: pool.h:237
vhost_vring_addr_t addr
Definition: vhost_user.h:147
ip6_address_t src_address
Definition: ip6_packet.h:307
format_function_t format_vnet_sw_if_index_name
int sr_localsid_register_function(vlib_main_t *vm, u8 *fn_name, u8 *keyword_str, u8 *def_str, u8 *params_str, u8 prefix_length, dpo_type_t *dpo, format_function_t *ls_format, unformat_function_t *ls_unformat, sr_plugin_callback_t *creation_fn, sr_plugin_callback_t *removal_fn)
SR LocalSID plugin registry.
Definition: sr_localsid.c:1564
unsigned char u8
Definition: types.h:56
#define pool_len(p)
Number of elements in pool vector.
Definition: pool.h:140
u8 * format_srv6_as_localsid(u8 *s, va_list *args)
Definition: as.c:331
static int srv6_as_localsid_removal_fn(ip6_sr_localsid_t *localsid)
Definition: as.c:265
void srv6_as_dpo_unlock(dpo_id_t *dpo)
Definition: as.c:500
vl_api_ip_proto_t protocol
Definition: lb_types.api:71
format_function_t format_ip4_address
Definition: format.h:73
unformat_function_t unformat_ip4_address
Definition: format.h:68
#define VLIB_INIT_FUNCTION(x)
Definition: init.h:173
u8 inner_type
Definition: as.h:39
#define clib_error_return(e, args...)
Definition: error.h:99
void adj_unlock(adj_index_t adj_index)
Release a reference counting lock on the adjacency.
Definition: adj.c:324
#define vec_resize(V, N)
Resize a vector (no header, unspecified alignment) Add N elements to end of given vector V...
Definition: vec.h:243
#define AS_TYPE_IP4
Definition: as.h:27
srv6_as_localsid_t ** sids
Pool of AS SID pointers.
Definition: as.h:65
unsigned int u32
Definition: types.h:88
#define PARAM_AS_SRC
uword unformat_srv6_as_localsid(unformat_input_t *input, va_list *args)
Definition: as.c:388
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:342
static u8 * format_srv6_as_dpo(u8 *s, va_list *args)
Definition: as.c:486
The identity of a DPO is a combination of its type and its instance number/index of objects of that t...
Definition: dpo.h:170
u32 nh_adj
Adjacency index for out.
Definition: as.h:38
#define ADJ_INDEX_INVALID
Invalid ADJ index - used when no adj is known likewise blazoned capitals INVALID speak volumes where ...
Definition: adj_types.h:36
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
Definition: pool.h:519
static void vlib_zero_combined_counter(vlib_combined_counter_main_t *cm, u32 index)
Clear a combined counter Clears the set of per-thread counters.
Definition: counter.h:285
counter_t packets
packet counter
Definition: counter_types.h:28
static const char *const *const srv6_as_nodes[DPO_PROTO_NUM]
Definition: as.c:515
struct _unformat_input_t unformat_input_t
VLIB_PLUGIN_REGISTER()
vnet_main_t * vnet_main
[convenience] vnet main
Definition: as.h:55
#define pool_put(P, E)
Free an object E in pool P.
Definition: pool.h:287
vlib_main_t * vm
Definition: in2out_ed.c:1810
ip6_address_t * sid_list
SID list to be restored.
Definition: as.h:44
unsigned char params_str[]
Definition: as.c:36
unformat_function_t unformat_ip6_address
Definition: format.h:89
ip6_sr_localsid_t * localsids
Definition: sr.h:252
#define UNFORMAT_END_OF_INPUT
Definition: format.h:145
static void free_ls_mem(srv6_as_localsid_t *ls_mem)
Definition: as.c:103
u8 * rewrite
Headers to be rewritten.
Definition: as.h:42
format_function_t format_ip6_address
Definition: format.h:91
static void vlib_get_combined_counter(const vlib_combined_counter_main_t *cm, u32 index, vlib_counter_t *result)
Get the value of a combined counter, never called in the speed path Scrapes the entire set of per-thr...
Definition: counter.h:259
static const char *const srv6_as_ip6_nodes[]
Definition: as.c:510
#define vec_free(V)
Free vector&#39;s memory (no header).
Definition: vec.h:342
unsigned char keyword_str[]
Definition: as.c:33
ip6_address_t src_addr
Source address to be restored.
Definition: as.h:43
unsigned char def_str[]
Definition: as.c:34
#define ETHERNET_INTERFACE_FLAG_ACCEPT_ALL
Definition: ethernet.h:141
#define pool_is_free_index(P, I)
Use free bitmap to query whether given index is free.
Definition: pool.h:284
#define SID_CREATE_IFACE_FEATURE_ERROR
Definition: as.c:27
u32 adj_index_t
An index for adjacencies.
Definition: adj_types.h:30
u32 sw_if_index_out
Outgoing iface to proxied dev.
Definition: as.h:37
void * plugin_mem
Memory to be used by the plugin callback functions.
Definition: sr.h:142
vlib_combined_counter_main_t invalid_counters
Invalid rewrite counters.
Definition: as.h:68
u32 sw_if_index_in
Incoming iface from proxied dev.
Definition: as.h:41
static void clib_mem_free(void *p)
Definition: mem.h:226
u8 nh_addr[16]
Definition: lisp_gpe.api:233
#define SID_CREATE_INVALID_IFACE_TYPE
Definition: as.c:28
#define AS_TYPE_L2
Definition: as.h:26
#define VNET_FEATURES(...)
Definition: feature.h:442
ip46_address_t nh_addr
Proxied device address.
Definition: as.h:36
counter_t bytes
byte counter
Definition: counter_types.h:29
u32 ip_version_traffic_class_and_flow_label
Definition: ip6_packet.h:294
#define SID_CREATE_INVALID_IFACE_INDEX
Definition: as.c:29
VNET_FEATURE_INIT(srv6_as2_rewrite, static)
#define DPO_PROTO_NUM
Definition: dpo.h:70
u16 payload_length
Definition: ip6_packet.h:298
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
ip6_address_t segments[0]
Definition: sr_packet.h:149
u64 uword
Definition: types.h:112
vnet_sw_interface_t * sw_interfaces
Definition: interface.h:854
vlib_main_t * vlib_main
[convenience] vlib main
Definition: as.h:54
u32 * sw_iface_localsid6
Retrieve local SID from iface.
Definition: as.h:63
vlib_combined_counter_main_t valid_counters
Valid rewrite counters.
Definition: as.h:67
Segment Routing main datastructure.
Definition: sr.h:237
vnet_sw_interface_type_t type
Definition: interface.h:718
srv6_as_main_t srv6_as_main
Definition: as.c:39
adj_index_t adj_nbr_add_or_lock(fib_protocol_t nh_proto, vnet_link_t link_type, const ip46_address_t *nh_addr, u32 sw_if_index)
Neighbour Adjacency sub-type.
Definition: adj_nbr.c:218
#define vec_foreach(var, vec)
Vector iterator.
#define SID_CREATE_INVALID_ADJ_INDEX
Definition: as.c:30
#define PARAM_AS_NH
static int srv6_as_localsid_creation_fn(ip6_sr_localsid_t *localsid)
Definition: as.c:114
uword unformat(unformat_input_t *i, const char *fmt,...)
Definition: unformat.c:978
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: feature.c:304
ip6_address_t dst_address
Definition: ip6_packet.h:307
static uword unformat_check_input(unformat_input_t *i)
Definition: format.h:171
u32 ethernet_set_flags(vnet_main_t *vnm, u32 hw_if_index, u32 flags)
Definition: interface.c:426