FD.io VPP  v16.12-rc0-308-g931be3a
Vector Packet Processing
ip6.h
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  * ip/ip6.h: ip6 main include file
17  *
18  * Copyright (c) 2008 Eliot Dresselhaus
19  *
20  * Permission is hereby granted, free of charge, to any person obtaining
21  * a copy of this software and associated documentation files (the
22  * "Software"), to deal in the Software without restriction, including
23  * without limitation the rights to use, copy, modify, merge, publish,
24  * distribute, sublicense, and/or sell copies of the Software, and to
25  * permit persons to whom the Software is furnished to do so, subject to
26  * the following conditions:
27  *
28  * The above copyright notice and this permission notice shall be
29  * included in all copies or substantial portions of the Software.
30  *
31  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
32  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
33  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
34  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
35  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
36  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
37  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
38  */
39 
40 #ifndef included_ip_ip6_h
41 #define included_ip_ip6_h
42 
43 #include <vlib/mc.h>
44 #include <vlib/buffer.h>
45 #include <vnet/ethernet/packet.h>
46 #include <vnet/ip/ip6_packet.h>
48 #include <vnet/ip/lookup.h>
49 #include <vnet/feature/feature.h>
50 #include <stdbool.h>
51 #include <vppinfra/bihash_24_8.h>
53 
54 /*
55  * Default size of the ip6 fib hash table
56  */
57 #define IP6_FIB_DEFAULT_HASH_NUM_BUCKETS (64 * 1024)
58 #define IP6_FIB_DEFAULT_HASH_MEMORY_SIZE (32<<20)
59 
60 typedef struct {
65 
66 typedef struct {
67  /* Table ID (hash key) for this FIB. */
69 
70  /* Index into FIB vector. */
72 
73  /* flow hash configuration */
75 } ip6_fib_t;
76 
77 struct ip6_main_t;
78 
80  (struct ip6_main_t * im,
81  uword opaque,
82  u32 sw_if_index,
83  ip6_address_t * address,
84  u32 address_length,
85  u32 if_address_index,
86  u32 is_del);
87 
88 typedef struct {
92 
93 /**
94  * Enumeration of the FIB table instance types
95  */
97  /**
98  * This table stores the routes that are used to forward traffic.
99  * The key is the prefix, the result the adjacnecy to forward on.
100  */
102  /**
103  * The table that stores ALL routes learned by the DP.
104  * Some of these routes may not be ready to install in forwarding
105  * at a given time.
106  * The key in this table is the prefix, the result is the fib_entry_t
107  */
110 
111 #define IP6_FIB_NUM_TABLES (IP6_FIB_TABLE_NON_FWDING+1)
112 
113 /**
114  * A represenation of a single IP6 table
115  */
117  /* The hash table */
118  BVT(clib_bihash) ip6_hash;
119 
120  /* bitmap / refcounts / vector of mask widths to search */
123  i32 dst_address_length_refcounts[129];
125 
126 typedef struct ip6_main_t {
127  /**
128  * The two FIB tables; fwding and non-fwding
129  */
131 
133 
134  /* Pool of FIBs. */
135  struct fib_table_t_ * fibs;
136 
137  /* Network byte orders subnet mask for each prefix length */
139 
140  /* Table index indexed by software interface. */
142 
143  /* IP6 enabled count by software interface */
145 
146  /* Hash table mapping table id to fib index.
147  ID space is not necessarily dense; index space is dense. */
149 
150  /* Hash table mapping interface rewrite adjacency index by sw if index. */
152 
153  /* Functions to call when interface address changes. */
155 
156  /* Template used to generate IP6 neighbor solicitation packets. */
158 
159  /* ip6 lookup table config parameters */
162 
163  /* feature path configuration lists */
165 
166  /* Built-in unicast feature path indices, see vnet_feature_arc_init(...) */
175 
176  /* Built-in multicast feature path indices */
180 
181  /* Built-in tx feature path index */
183 
184  /* Save results for show command */
186 
187  /* Seed for Jenkins hash used to compute ip6 flow hash. */
189 
190  struct {
191  /* TTL to use for host generated packets. */
193 
194  u8 pad[3];
195  } host_config;
196 
197  /* HBH processing enabled? */
199 } ip6_main_t;
200 
201 /* Global ip6 main structure. */
202 extern ip6_main_t ip6_main;
203 
204 #define VNET_IP6_UNICAST_FEATURE_INIT(x,...) \
205  __VA_ARGS__ vnet_feature_registration_t uc_##x; \
206 static void __vnet_add_feature_registration_uc_##x (void) \
207  __attribute__((__constructor__)) ; \
208 static void __vnet_add_feature_registration_uc_##x (void) \
209 { \
210  ip6_main_t * im = &ip6_main; \
211  uc_##x.next = im->next_feature[VNET_IP_RX_UNICAST_FEAT]; \
212  im->next_feature[VNET_IP_RX_UNICAST_FEAT] = &uc_##x; \
213 } \
214 __VA_ARGS__ vnet_feature_registration_t uc_##x
215 
216 #define VNET_IP6_MULTICAST_FEATURE_INIT(x,...) \
217  __VA_ARGS__ vnet_feature_registration_t mc_##x; \
218 static void __vnet_add_feature_registration_mc_##x (void) \
219  __attribute__((__constructor__)) ; \
220 static void __vnet_add_feature_registration_mc_##x (void) \
221 { \
222  ip6_main_t * im = &ip6_main; \
223  mc_##x.next = im->next_feature[VNET_IP_RX_MULTICAST_FEAT]; \
224  im->next_feature[VNET_IP_RX_MULTICAST_FEAT] = &mc_##x; \
225 } \
226 __VA_ARGS__ vnet_feature_registration_t mc_##x
227 
228 #define VNET_IP6_TX_FEATURE_INIT(x,...) \
229  __VA_ARGS__ vnet_feature_registration_t tx_##x; \
230 static void __vnet_add_feature_registration_tx_##x (void) \
231  __attribute__((__constructor__)) ; \
232 static void __vnet_add_feature_registration_tx_##x (void) \
233 { \
234  ip6_main_t * im = &ip6_main; \
235  tx_##x.next = im->next_feature[VNET_IP_TX_FEAT]; \
236  im->next_feature[VNET_IP_TX_FEAT] = &tx_##x; \
237 } \
238 __VA_ARGS__ vnet_feature_registration_t tx_##x
239 
240 
241 /* Global ip6 input node. Errors get attached to ip6 input node. */
248 
250 
251 /* ipv6 neighbor discovery - timer/event types */
252 typedef enum {
255 
256 typedef union {
258  struct {
261  } up_down_event;
263 
266  const ip6_address_t * key,
267  const ip6_address_t * dest,
268  uword dest_length)
269 {
270  int i;
271  for (i = 0; i < ARRAY_LEN (key->as_uword); i++)
272  {
273  if ((key->as_uword[i] ^ dest->as_uword[i]) & im->fib_masks[dest_length].as_uword[i])
274  return 0;
275  }
276  return 1;
277 }
278 
281  ip6_address_t * key,
283 {
285  return ip6_destination_matches_route (im, key, a, ia->address_length);
286 }
287 
288 /* As above but allows for unaligned destinations (e.g. works right from IP header of packet). */
291  ip6_address_t * key,
292  ip6_address_t * dest,
293  uword dest_length)
294 {
295  int i;
296  for (i = 0; i < ARRAY_LEN (key->as_uword); i++)
297  {
298  if ((clib_mem_unaligned (&key->as_uword[i], uword) ^ dest->as_uword[i]) & im->fib_masks[dest_length].as_uword[i])
299  return 0;
300  }
301  return 1;
302 }
303 
304 always_inline int
306  u32 sw_if_index,
307  ip6_address_t * src)
308 {
309  u32 if_add_index =
310  lm->if_address_pool_index_by_sw_if_index[sw_if_index];
311  if (PREDICT_TRUE(if_add_index != ~0)) {
312  ip_interface_address_t *if_add =
313  pool_elt_at_index(lm->if_address_pool, if_add_index);
314  ip6_address_t *if_ip =
316  *src = *if_ip;
317  return (0);
318  }
319  else
320  {
321  src->as_u64[0] = 0;
322  src->as_u64[1] = 0;
323  }
324  return (!0);
325 }
326 
327 /* Find interface address which matches destination. */
330  ip_interface_address_t ** result_ia)
331 {
332  ip_lookup_main_t * lm = &im->lookup_main;
334  ip6_address_t * result = 0;
335 
336  foreach_ip_interface_address (lm, ia, sw_if_index,
337  1 /* honor unnumbered */,
338  ({
340  if (ip6_destination_matches_route (im, dst, a, ia->address_length))
341  {
342  result = a;
343  break;
344  }
345  }));
346  if (result_ia)
347  *result_ia = result ? ia : 0;
348  return result;
349 }
350 
351 clib_error_t *
353  ip6_address_t * address, u32 address_length,
354  u32 is_del);
355 void
357  u32 is_enable);
358 
360 
361 clib_error_t *
362 ip6_probe_neighbor (vlib_main_t * vm, ip6_address_t * dst, u32 sw_if_index);
363 
364 clib_error_t *
365 ip6_set_neighbor_limit (u32 neighbor_limit);
366 
367 uword
369  u16 dst_port,
370  u32 next_node_index);
371 
372 u16 ip6_tcp_udp_icmp_compute_checksum (vlib_main_t * vm, vlib_buffer_t * p0, ip6_header_t * ip0, int *bogus_lengthp);
373 
374 void ip6_register_protocol (u32 protocol, u32 node_index);
375 
377 
379  u32 sw_if_index,
380  u32 ai);
381 
382 int
384  u32 sw_if_index,
385  ip6_address_t * a,
386  u8 * link_layer_address,
387  uword n_bytes_link_layer_address,
388  int is_static);
389 int
391  u32 sw_if_index,
392  ip6_address_t * a,
393  u8 * link_layer_address,
394  uword n_bytes_link_layer_address);
395 
396 void
398  u8 *mac);
399 
400 void
402  ip6_address_t *ip);
403 
404 int vnet_set_ip6_flow_hash (u32 table_id,
405  flow_hash_config_t flow_hash_config);
406 
407 int
408 ip6_neighbor_ra_config(vlib_main_t * vm, u32 sw_if_index,
409  u8 suppress, u8 managed, u8 other,
410  u8 ll_option, u8 send_unicast, u8 cease,
411  u8 use_lifetime, u32 lifetime,
412  u32 initial_count, u32 initial_interval,
413  u32 max_interval, u32 min_interval,
414  u8 is_no);
415 
416 int
417 ip6_neighbor_ra_prefix(vlib_main_t * vm, u32 sw_if_index,
418  ip6_address_t *prefix_addr, u8 prefix_len,
419  u8 use_default, u32 val_lifetime, u32 pref_lifetime,
420  u8 no_advertise, u8 off_link, u8 no_autoconfig, u8 no_onlink,
421  u8 is_no);
422 
423 
424 clib_error_t *
426  u32 sw_if_index);
427 
428 clib_error_t *
430  u32 sw_if_index);
431 
432 int
434  u32 sw_if_index);
435 
436 clib_error_t *
438  u32 sw_if_index,
439  ip6_address_t *address,
440  u8 address_length);
441 
443  void * address_arg,
444  uword node_index,
445  uword type_opaque,
446  uword data);
447 
449  void * data_callback,
450  u32 pid,
451  void * address_arg,
452  uword node_index,
453  uword type_opaque,
454  uword data,
455  int is_add);
456 
457 int vnet_ip6_nd_term (vlib_main_t * vm,
458  vlib_node_runtime_t * node,
459  vlib_buffer_t * p0,
460  ethernet_header_t * eth,
461  ip6_header_t * ip,
462  u32 sw_if_index,
463  u16 bd_index,
464  u8 shg);
465 
466 int vnet_set_ip6_classify_intfc (vlib_main_t * vm, u32 sw_if_index,
467  u32 table_index);
469 
470 /* Compute flow hash. We'll use it to select which Sponge to use for this
471  flow. And other things. */
474  flow_hash_config_t flow_hash_config)
475 {
476  tcp_header_t * tcp = (void *) (ip + 1);
477  u64 a, b, c;
478  u64 t1, t2;
479  uword is_tcp_udp = (ip->protocol == IP_PROTOCOL_TCP
480  || ip->protocol == IP_PROTOCOL_UDP);
481 
482  t1 = (ip->src_address.as_u64[0] ^ ip->src_address.as_u64[1]);
483  t1 = (flow_hash_config & IP_FLOW_HASH_SRC_ADDR) ? t1 : 0;
484 
485  t2 = (ip->dst_address.as_u64[0] ^ ip->dst_address.as_u64[1]);
486  t2 = (flow_hash_config & IP_FLOW_HASH_DST_ADDR) ? t2 : 0;
487 
488  a = (flow_hash_config & IP_FLOW_HASH_REVERSE_SRC_DST) ? t2 : t1;
489  b = (flow_hash_config & IP_FLOW_HASH_REVERSE_SRC_DST) ? t1 : t2;
490  b ^= (flow_hash_config & IP_FLOW_HASH_PROTO) ? ip->protocol : 0;
491 
492  t1 = is_tcp_udp ? tcp->ports.src : 0;
493  t2 = is_tcp_udp ? tcp->ports.dst : 0;
494 
495  t1 = (flow_hash_config & IP_FLOW_HASH_SRC_PORT) ? t1 : 0;
496  t2 = (flow_hash_config & IP_FLOW_HASH_DST_PORT) ? t2 : 0;
497 
498  c = (flow_hash_config & IP_FLOW_HASH_REVERSE_SRC_DST) ?
499  ((t1<<16) | t2) : ((t2<<16) | t1);
500 
501  hash_mix64 (a, b, c);
502  return (u32) c;
503 }
504 
505 /*
506  * Hop-by-Hop handling
507  */
508 typedef struct {
509  /* Array of function pointers to HBH option handling routines */
510  int (*options[256])(vlib_buffer_t *b, ip6_header_t *ip, ip6_hop_by_hop_option_t *opt);
511  u8 *(*trace[256])(u8 *s, ip6_hop_by_hop_option_t *opt);
514 
516 
517 int ip6_hbh_register_option (u8 option,
518  int options(vlib_buffer_t *b, ip6_header_t *ip, ip6_hop_by_hop_option_t *opt),
519  u8 *trace(u8 *s, ip6_hop_by_hop_option_t *opt));
520 int ip6_hbh_unregister_option (u8 option);
521 void ip6_hbh_set_next_override (uword next);
522 
523 /* Flag used by IOAM code. Classifier sets it pop-hop-by-hop checks it */
524 #define OI_DECAP 0x80000000
525 
526 #endif /* included_ip_ip6_h */
#define foreach_ip_interface_address(lm, a, sw_if_index, loop, body)
Definition: lookup.h:434
void( ip6_add_del_interface_address_function_t)(struct ip6_main_t *im, uword opaque, u32 sw_if_index, ip6_address_t *address, u32 address_length, u32 if_address_index, u32 is_del)
Definition: ip6.h:80
u8 pad[3]
Definition: ip6.h:194
int ip6_address_compare(ip6_address_t *a1, ip6_address_t *a2)
Definition: ip46_cli.c:53
vlib_node_registration_t ip6_midchain_node
(constructor) VLIB_REGISTER_NODE (ip6_midchain_node)
Definition: ip6_forward.c:2176
sll srl srl sll sra u16x4 i
Definition: vector_sse2.h:343
a
Definition: bitmap.h:516
void ip6_register_protocol(u32 protocol, u32 node_index)
Definition: ip6_forward.c:1477
#define IP_FLOW_HASH_SRC_PORT
Definition: lookup.h:139
static vlib_cli_command_t trace
(constructor) VLIB_CLI_COMMAND (trace)
Definition: memory_vlib.c:1211
uword lookup_table_size
Definition: ip6.h:161
ip_interface_address_t * if_address_pool
Pool of addresses that are assigned to interfaces.
Definition: lookup.h:347
void ip6_hbh_set_next_override(uword next)
Definition: ip6_forward.c:2594
u32 ip6_unicast_rx_feature_lookup
Definition: ip6.h:173
int vnet_set_ip6_classify_intfc(vlib_main_t *vm, u32 sw_if_index, u32 table_index)
Definition: ip6_forward.c:3058
The table that stores ALL routes learned by the DP.
Definition: ip6.h:108
#define PREDICT_TRUE(x)
Definition: clib.h:98
u32 flow_hash_seed
Definition: ip6.h:188
u64 as_u64[2]
Definition: ip6_packet.h:50
static ip6_address_t * ip6_interface_address_matching_destination(ip6_main_t *im, ip6_address_t *dst, u32 sw_if_index, ip_interface_address_t **result_ia)
Definition: ip6.h:329
Definitions for all things IP (v4|v6) unicast and multicast lookup related.
int ip6_neighbor_ra_prefix(vlib_main_t *vm, u32 sw_if_index, ip6_address_t *prefix_addr, u8 prefix_len, u8 use_default, u32 val_lifetime, u32 pref_lifetime, u8 no_advertise, u8 off_link, u8 no_autoconfig, u8 no_onlink, u8 is_no)
int vnet_add_del_ip6_nd_change_event(vnet_main_t *vnm, void *data_callback, u32 pid, void *address_arg, uword node_index, uword type_opaque, uword data, int is_add)
int ip6_hbh_register_option(u8 option, int options(vlib_buffer_t *b, ip6_header_t *ip, ip6_hop_by_hop_option_t *opt), u8 *trace(u8 *s, ip6_hop_by_hop_option_t *opt))
Definition: ip6_forward.c:2602
#define IP_FLOW_HASH_REVERSE_SRC_DST
Definition: lookup.h:141
u8 ttl
Definition: ip6.h:192
u8 * ip_enabled_by_sw_if_index
Definition: ip6.h:144
vlib_node_registration_t ip6_rewrite_node
(constructor) VLIB_REGISTER_NODE (ip6_rewrite_node)
Definition: ip6_forward.c:2188
struct _vlib_node_registration vlib_node_registration_t
#define IP_FLOW_HASH_DST_PORT
Definition: lookup.h:140
u32 ip6_unicast_rx_feature_flow_classify
Definition: ip6.h:169
ip6_address_t src_address
Definition: ip6_packet.h:300
u8 * prefix_lengths_in_search_order
Definition: ip6.h:122
uword as_uword[16/sizeof(uword)]
Definition: ip6_packet.h:51
u32 vrf_index
Definition: ip6.h:63
struct ip6_main_t::@158 host_config
flow_hash_config_t flow_hash_config
Definition: ip6.h:74
vlib_packet_template_t discover_neighbor_packet_template
Definition: ip6.h:157
vlib_node_registration_t ip6_discover_neighbor_node
(constructor) VLIB_REGISTER_NODE (ip6_discover_neighbor_node)
Definition: ip6_forward.c:1714
#define IP_FLOW_HASH_DST_ADDR
Definition: lookup.h:137
#define always_inline
Definition: clib.h:84
void ip6_ethernet_update_adjacency(vnet_main_t *vnm, u32 sw_if_index, u32 ai)
Definition: ip6_neighbor.c:484
static BVT(clib_bihash)
Definition: adj_nbr.c:26
ip6_hop_by_hop_main_t ip6_hop_by_hop_main
Definition: ip6_forward.c:2222
static uword ip6_destination_matches_route(const ip6_main_t *im, const ip6_address_t *key, const ip6_address_t *dest, uword dest_length)
Definition: ip6.h:265
u32 ip6_unicast_rx_feature_check_access
Definition: ip6.h:167
int i32
Definition: types.h:81
int ip6_interface_enabled(vlib_main_t *vm, u32 sw_if_index)
u32 ip6_multicast_rx_feature_lookup
Definition: ip6.h:179
unsigned long u64
Definition: types.h:89
clib_error_t * ip6_set_neighbor_limit(u32 neighbor_limit)
uword ip6_udp_register_listener(vlib_main_t *vm, u16 dst_port, u32 next_node_index)
A represenation of a single IP6 table.
Definition: ip6.h:116
clib_error_t * ip6_probe_neighbor(vlib_main_t *vm, ip6_address_t *dst, u32 sw_if_index)
Definition: ip6_forward.c:1749
u32 lookup_table_nbuckets
Definition: ip6.h:160
vlib_node_registration_t ip6_icmp_neighbor_discovery_event_node
int ip6_hbh_unregister_option(u8 option)
Definition: ip6_forward.c:2625
static int ip6_src_address_for_packet(ip_lookup_main_t *lm, u32 sw_if_index, ip6_address_t *src)
Definition: ip6.h:305
int vnet_set_ip6_ethernet_neighbor(vlib_main_t *vm, u32 sw_if_index, ip6_address_t *a, u8 *link_layer_address, uword n_bytes_link_layer_address, int is_static)
Definition: ip6_neighbor.c:526
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
Definition: pool.h:369
ip6_icmp_neighbor_discovery_event_type_t
Definition: ip6.h:252
vlib_node_registration_t ip6_input_node
(constructor) VLIB_REGISTER_NODE (ip6_input_node)
Definition: ip6_input.c:289
clib_error_t * set_ip6_link_local_address(vlib_main_t *vm, u32 sw_if_index, ip6_address_t *address, u8 address_length)
void ip6_ethernet_mac_address_from_link_local_address(u8 *mac, ip6_address_t *ip)
Definition: ip6_forward.c:2825
vlib_node_registration_t ip6_glean_node
(constructor) VLIB_REGISTER_NODE (ip6_glean_node)
Definition: ip6_forward.c:1731
static u32 ip6_compute_flow_hash(const ip6_header_t *ip, flow_hash_config_t flow_hash_config)
Definition: ip6.h:473
u32 index
Definition: ip6.h:71
union tcp_header_t::@169::@171 ports
u32 ip6_unicast_rx_feature_policer_classify
Definition: ip6.h:168
ip6_add_del_interface_address_callback_t * add_del_interface_address_callbacks
Definition: ip6.h:154
int ip6_neighbor_ra_config(vlib_main_t *vm, u32 sw_if_index, u8 suppress, u8 managed, u8 other, u8 ll_option, u8 send_unicast, u8 cease, u8 use_lifetime, u32 lifetime, u32 initial_count, u32 initial_interval, u32 max_interval, u32 min_interval, u8 is_no)
void ip6_link_local_address_from_ethernet_mac_address(ip6_address_t *ip, u8 *mac)
Definition: ip6_forward.c:2809
uword * fib_index_by_table_id
Definition: ip6.h:148
ip6_address_t fib_masks[129]
Definition: ip6.h:138
#define hash_mix64(a0, b0, c0)
Definition: hash.h:507
svmdb_client_t * c
Definition: ip6.h:66
This table stores the routes that are used to forward traffic.
Definition: ip6.h:101
u32 ip6_unicast_rx_feature_drop
Definition: ip6.h:174
u32 dst_address_length
Definition: ip6.h:62
#define ARRAY_LEN(x)
Definition: clib.h:59
clib_error_t * enable_ip6_interface(vlib_main_t *vm, u32 sw_if_index)
u8 hbh_enabled
Definition: ip6.h:198
ip6_address_t addr
Definition: ip6.h:61
u32 ip6_multicast_rx_feature_vpath
Definition: ip6.h:178
u32 * if_address_pool_index_by_sw_if_index
Head of doubly linked list of interface addresses for each software interface.
Definition: lookup.h:354
u16 ip6_tcp_udp_icmp_compute_checksum(vlib_main_t *vm, vlib_buffer_t *p0, ip6_header_t *ip0, int *bogus_lengthp)
Definition: ip6_forward.c:1105
vlib_node_registration_t ip6_lookup_node
(constructor) VLIB_REGISTER_NODE (ip6_lookup_node)
Definition: ip6_forward.c:768
#define IP6_FIB_NUM_TABLES
Definition: ip6.h:111
#define IP_FLOW_HASH_SRC_ADDR
Flow hash configuration.
Definition: lookup.h:136
unsigned int u32
Definition: types.h:88
ip6_fib_table_instance_type_t_
Enumeration of the FIB table instance types.
Definition: ip6.h:96
serialize_function_t serialize_vnet_ip6_main
Definition: ip6.h:376
ip6_main_t ip6_main
Definition: ip6_forward.c:2655
ip_lookup_main_t lookup_main
Definition: ip6.h:132
u32 ip6_tx_feature_interface_output
Definition: ip6.h:182
u32 ip6_unicast_rx_feature_vpath
Definition: ip6.h:172
struct ip6_main_t ip6_main_t
u32 ip6_unicast_rx_feature_l2tp_decap
Definition: ip6.h:171
int vnet_unset_ip6_ethernet_neighbor(vlib_main_t *vm, u32 sw_if_index, ip6_address_t *a, u8 *link_layer_address, uword n_bytes_link_layer_address)
Definition: ip6_neighbor.c:678
u32 flow_hash_config_t
A flow hash configuration is a mask of the flow hash options.
Definition: lookup.h:157
int vnet_set_ip6_flow_hash(u32 table_id, flow_hash_config_t flow_hash_config)
Definition: ip6_forward.c:2877
ip6_fib_table_instance_t ip6_table[IP6_FIB_NUM_TABLES]
The two FIB tables; fwding and non-fwding.
Definition: ip6.h:130
u64 uword
Definition: types.h:112
static uword ip6_destination_matches_interface(ip6_main_t *im, ip6_address_t *key, ip_interface_address_t *ia)
Definition: ip6.h:280
void vnet_register_ip6_neighbor_resolution_event(vnet_main_t *vnm, void *address_arg, uword node_index, uword type_opaque, uword data)
unsigned short u16
Definition: types.h:57
struct ip6_fib_table_instance_t_ ip6_fib_table_instance_t
A represenation of a single IP6 table.
serialize_function_t unserialize_vnet_ip6_main
Definition: ip6.h:376
char ** feature_nodes[VNET_N_IP_FEAT]
Definition: ip6.h:185
void( serialize_function_t)(serialize_main_t *m, va_list *va)
Definition: serialize.h:168
unsigned char u8
Definition: types.h:56
u32 ip6_unicast_rx_feature_ipsec
Definition: ip6.h:170
uword * non_empty_dst_address_length_bitmap
Definition: ip6.h:121
vnet_feature_registration_t * next_feature[VNET_N_IP_FEAT]
Definition: ip6.h:164
int vnet_ip6_nd_term(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_buffer_t *p0, ethernet_header_t *eth, ip6_header_t *ip, u32 sw_if_index, u16 bd_index, u8 shg)
#define clib_mem_unaligned(pointer, type)
Definition: types.h:155
uword * interface_route_adj_index_by_sw_if_index
Definition: ip6.h:151
vlib_node_registration_t ip6_rewrite_local_node
(constructor) VLIB_REGISTER_NODE (ip6_rewrite_local_node)
Definition: ip6_forward.c:2204
u32 ip6_multicast_rx_feature_drop
Definition: ip6.h:177
#define IP_FLOW_HASH_PROTO
Definition: lookup.h:138
u32 table_id
Definition: ip6.h:68
clib_error_t * ip6_add_del_interface_address(vlib_main_t *vm, u32 sw_if_index, ip6_address_t *address, u32 address_length, u32 is_del)
Definition: ip6_forward.c:491
static uword ip6_unaligned_destination_matches_route(ip6_main_t *im, ip6_address_t *key, ip6_address_t *dest, uword dest_length)
Definition: ip6.h:290
static void * ip_interface_address_get_address(ip_lookup_main_t *lm, ip_interface_address_t *a)
Definition: lookup.h:431
clib_error_t * disable_ip6_interface(vlib_main_t *vm, u32 sw_if_index)
vlib buffer structure definition and a few select access methods.
struct fib_table_t_ * fibs
Definition: ip6.h:135
u32 * fib_index_by_sw_if_index
Definition: ip6.h:141
void ip6_sw_interface_enable_disable(u32 sw_if_index, u32 is_enable)
Definition: ip6_forward.c:412
enum ip6_fib_table_instance_type_t_ ip6_fib_table_instance_type_t
Enumeration of the FIB table instance types.
ip6_address_t dst_address
Definition: ip6_packet.h:300
A protocol Independent FIB table.
Definition: fib_table.h:29
struct _vnet_feature_registration vnet_feature_registration_t
feature registration object
uword next_override
Definition: ip6.h:512