FD.io VPP  v21.10.1-2-g0a485f517
Vector Packet Processing
fib_table.c File Reference
+ Include dependency graph for fib_table.c:

Go to the source code of this file.

Data Structures

struct  fib_table_set_flow_hash_config_ctx_t_
 Table set flow hash config context. More...
 
struct  fib_table_walk_w_src_ctx_t_
 
struct  fib_table_flush_ctx_t_
 Table flush context. More...
 

Typedefs

typedef struct fib_table_set_flow_hash_config_ctx_t_ fib_table_set_flow_hash_config_ctx_t
 Table set flow hash config context. More...
 
typedef struct fib_table_walk_w_src_ctx_t_ fib_table_walk_w_src_cxt_t
 
typedef struct fib_table_flush_ctx_t_ fib_table_flush_ctx_t
 Table flush context. More...
 

Functions

fib_table_tfib_table_get (fib_node_index_t index, fib_protocol_t proto)
 Get a pointer to a FIB table. More...
 
static fib_node_index_t fib_table_lookup_i (fib_table_t *fib_table, const fib_prefix_t *prefix)
 
fib_node_index_t fib_table_lookup (u32 fib_index, const fib_prefix_t *prefix)
 Perfom a longest prefix match in the non-forwarding table. More...
 
static fib_node_index_t fib_table_lookup_exact_match_i (const fib_table_t *fib_table, const fib_prefix_t *prefix)
 
fib_node_index_t fib_table_lookup_exact_match (u32 fib_index, const fib_prefix_t *prefix)
 Perfom an exact match in the non-forwarding table. More...
 
static fib_node_index_t fib_table_get_less_specific_i (fib_table_t *fib_table, const fib_prefix_t *prefix)
 
fib_node_index_t fib_table_get_less_specific (u32 fib_index, const fib_prefix_t *prefix)
 Get the less specific (covering) prefix. More...
 
static void fib_table_entry_remove (fib_table_t *fib_table, const fib_prefix_t *prefix, fib_node_index_t fib_entry_index)
 
static void fib_table_post_insert_actions (fib_table_t *fib_table, const fib_prefix_t *prefix, fib_node_index_t fib_entry_index)
 
static void fib_table_entry_insert (fib_table_t *fib_table, const fib_prefix_t *prefix, fib_node_index_t fib_entry_index)
 
void fib_table_fwding_dpo_update (u32 fib_index, const fib_prefix_t *prefix, const dpo_id_t *dpo)
 Add or update an entry in the FIB's forwarding table. More...
 
void fib_table_fwding_dpo_remove (u32 fib_index, const fib_prefix_t *prefix, const dpo_id_t *dpo)
 remove an entry in the FIB's forwarding table More...
 
static void fib_table_source_count_inc (fib_table_t *fib_table, fib_source_t source)
 
static void fib_table_source_count_dec (fib_table_t *fib_table, fib_source_t source)
 
fib_node_index_t fib_table_entry_special_dpo_add (u32 fib_index, const fib_prefix_t *prefix, fib_source_t source, fib_entry_flag_t flags, const dpo_id_t *dpo)
 Add a 'special' entry to the FIB that links to the DPO passed A special entry is an entry that the FIB is not expect to resolve via the usual mechanisms (i.e. More...
 
fib_node_index_t fib_table_entry_special_dpo_update (u32 fib_index, const fib_prefix_t *prefix, fib_source_t source, fib_entry_flag_t flags, const dpo_id_t *dpo)
 Update a 'special' entry to the FIB that links to the DPO passed A special entry is an entry that the FIB is not expect to resolve via the usual mechanisms (i.e. More...
 
fib_node_index_t fib_table_entry_special_add (u32 fib_index, const fib_prefix_t *prefix, fib_source_t source, fib_entry_flag_t flags)
 Add a 'special' entry to the FIB. More...
 
void fib_table_entry_special_remove (u32 fib_index, const fib_prefix_t *prefix, fib_source_t source)
 Remove a 'special' entry from the FIB. More...
 
static void fib_table_route_path_fixup (const fib_prefix_t *prefix, fib_entry_flag_t *eflags, fib_route_path_t *path)
 fib_table_route_path_fixup More...
 
fib_node_index_t fib_table_entry_path_add (u32 fib_index, const fib_prefix_t *prefix, fib_source_t source, fib_entry_flag_t flags, dpo_proto_t next_hop_proto, const ip46_address_t *next_hop, u32 next_hop_sw_if_index, u32 next_hop_fib_index, u32 next_hop_weight, fib_mpls_label_t *next_hop_labels, fib_route_path_flags_t path_flags)
 Add one path to an entry (aka route) in the FIB. More...
 
static int fib_route_path_cmp_for_sort (void *v1, void *v2)
 
fib_node_index_t fib_table_entry_path_add2 (u32 fib_index, const fib_prefix_t *prefix, fib_source_t source, fib_entry_flag_t flags, fib_route_path_t *rpaths)
 Add n paths to an entry (aka route) in the FIB. More...
 
void fib_table_entry_path_remove2 (u32 fib_index, const fib_prefix_t *prefix, fib_source_t source, fib_route_path_t *rpaths)
 Remove n paths to an entry (aka route) in the FIB. More...
 
void fib_table_entry_path_remove (u32 fib_index, const fib_prefix_t *prefix, fib_source_t source, dpo_proto_t next_hop_proto, const ip46_address_t *next_hop, u32 next_hop_sw_if_index, u32 next_hop_fib_index, u32 next_hop_weight, fib_route_path_flags_t path_flags)
 remove one path to an entry (aka route) in the FIB. More...
 
fib_node_index_t fib_table_entry_update (u32 fib_index, const fib_prefix_t *prefix, fib_source_t source, fib_entry_flag_t flags, fib_route_path_t *paths)
 Update an entry to have a new set of paths. More...
 
fib_node_index_t fib_table_entry_update_one_path (u32 fib_index, const fib_prefix_t *prefix, fib_source_t source, fib_entry_flag_t flags, dpo_proto_t next_hop_proto, const ip46_address_t *next_hop, u32 next_hop_sw_if_index, u32 next_hop_fib_index, u32 next_hop_weight, fib_mpls_label_t *next_hop_labels, fib_route_path_flags_t path_flags)
 Update the entry to have just one path. More...
 
static void fib_table_entry_delete_i (u32 fib_index, fib_node_index_t fib_entry_index, const fib_prefix_t *prefix, fib_source_t source)
 
void fib_table_entry_delete (u32 fib_index, const fib_prefix_t *prefix, fib_source_t source)
 Delete a FIB entry. More...
 
void fib_table_entry_delete_index (fib_node_index_t fib_entry_index, fib_source_t source)
 Delete a FIB entry. More...
 
u32 fib_table_entry_get_stats_index (u32 fib_index, const fib_prefix_t *prefix)
 Return the stats index for a FIB entry. More...
 
fib_node_index_t fib_table_entry_local_label_add (u32 fib_index, const fib_prefix_t *prefix, mpls_label_t label)
 Add a MPLS local label for the prefix/route. More...
 
void fib_table_entry_local_label_remove (u32 fib_index, const fib_prefix_t *prefix, mpls_label_t label)
 remove a MPLS local label for the prefix/route. More...
 
u32 fib_table_get_index_for_sw_if_index (fib_protocol_t proto, u32 sw_if_index)
 Get the index of the FIB bound to the interface. More...
 
flow_hash_config_t fib_table_get_flow_hash_config (u32 fib_index, fib_protocol_t proto)
 Get the flow hash configured used by the table. More...
 
flow_hash_config_t fib_table_get_default_flow_hash_config (fib_protocol_t proto)
 Get the flow hash configured used by the protocol. More...
 
static fib_table_walk_rc_t fib_table_set_flow_hash_config_cb (fib_node_index_t fib_entry_index, void *arg)
 
void fib_table_set_flow_hash_config (u32 fib_index, fib_protocol_t proto, flow_hash_config_t hash_config)
 Set the flow hash configured used by the table. More...
 
u32 fib_table_get_table_id_for_sw_if_index (fib_protocol_t proto, u32 sw_if_index)
 Get the Table-ID of the FIB bound to the interface. More...
 
u32 fib_table_get_table_id (u32 fib_index, fib_protocol_t proto)
 Get the Table-ID of the FIB from protocol and index. More...
 
u32 fib_table_find (fib_protocol_t proto, u32 table_id)
 Get the index of the FIB for a Table-ID. More...
 
static u32 fib_table_find_or_create_and_lock_i (fib_protocol_t proto, u32 table_id, fib_source_t src, const u8 *name)
 
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. More...
 
u32 fib_table_find_or_create_and_lock_w_name (fib_protocol_t proto, u32 table_id, fib_source_t src, const u8 *name)
 Get the index of the FIB for a Table-ID. More...
 
u32 fib_table_create_and_lock (fib_protocol_t proto, fib_source_t src, const char *const fmt,...)
 Create a new table with no table ID. More...
 
static void fib_table_destroy (fib_table_t *fib_table)
 
void fib_table_walk (u32 fib_index, fib_protocol_t proto, fib_table_walk_fn_t fn, void *ctx)
 Walk all entries in a FIB table N.B: This is NOT safe to deletes. More...
 
static fib_table_walk_rc_t fib_table_walk_w_src_cb (fib_node_index_t fei, void *arg)
 
void fib_table_walk_w_src (u32 fib_index, fib_protocol_t proto, fib_source_t src, fib_table_walk_fn_t fn, void *data)
 Walk all entries in a FIB table N.B: This is NOT safe to deletes. More...
 
void fib_table_sub_tree_walk (u32 fib_index, fib_protocol_t proto, const fib_prefix_t *root, fib_table_walk_fn_t fn, void *ctx)
 Walk all entries in a sub-tree FIB table. More...
 
static void fib_table_lock_dec (fib_table_t *fib_table, fib_source_t source)
 
static void fib_table_lock_inc (fib_table_t *fib_table, fib_source_t source)
 
void fib_table_unlock (u32 fib_index, fib_protocol_t proto, fib_source_t source)
 Take a reference counting lock on the table. More...
 
void fib_table_lock (u32 fib_index, fib_protocol_t proto, fib_source_t source)
 Release a reference counting lock on the table. More...
 
u32 fib_table_get_num_entries (u32 fib_index, fib_protocol_t proto, fib_source_t source)
 Return the number of entries in the FIB added by a given source. More...
 
u8format_fib_table_name (u8 *s, va_list *ap)
 Format the description/name of the table. More...
 
u8format_fib_table_flags (u8 *s, va_list *args)
 
static fib_table_walk_rc_t fib_table_flush_cb (fib_node_index_t fib_entry_index, void *arg)
 
void fib_table_flush (u32 fib_index, fib_protocol_t proto, fib_source_t source)
 Flush all entries from a table for the source. More...
 
static fib_table_walk_rc_t fib_table_mark_cb (fib_node_index_t fib_entry_index, void *arg)
 
void fib_table_mark (u32 fib_index, fib_protocol_t proto, fib_source_t source)
 Resync all entries from a table for the source this is the mark part of the mark and sweep algorithm. More...
 
static fib_table_walk_rc_t fib_table_sweep_cb (fib_node_index_t fib_entry_index, void *arg)
 
void fib_table_sweep (u32 fib_index, fib_protocol_t proto, fib_source_t source)
 Signal that the table has converged, i.e. More...
 
u8format_fib_table_memory (u8 *s, va_list *args)
 format (display) the memory used by the FIB tables More...
 

Variables

const static char * fib_table_flags_strings [] = FIB_TABLE_ATTRIBUTES
 

Typedef Documentation

◆ fib_table_flush_ctx_t

Table flush context.

Store the indicies of matching FIB entries that need to be removed.

◆ fib_table_set_flow_hash_config_ctx_t

Table set flow hash config context.

◆ fib_table_walk_w_src_cxt_t

Function Documentation

◆ fib_route_path_cmp_for_sort()

static int fib_route_path_cmp_for_sort ( void *  v1,
void *  v2 
)
static

Definition at line 598 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_create_and_lock()

u32 fib_table_create_and_lock ( fib_protocol_t  proto,
fib_source_t  source,
const char *const  fmt,
  ... 
)

Create a new table with no table ID.

This means it does not get added to the hash-table and so can only be found by using the index returned.

@paran proto The protocol of the FIB (and thus the entries therein)

Parameters
fmtA string to describe the table
sourceThe ID of the client/source.
Returns
fib_index The index of the FIB

Definition at line 1189 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_destroy()

static void fib_table_destroy ( fib_table_t fib_table)
static

Definition at line 1225 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_entry_delete()

void fib_table_entry_delete ( u32  fib_index,
const fib_prefix_t prefix,
fib_source_t  source 
)

Delete a FIB entry.

If the entry has no more sources, then it is removed from the table.

Parameters
fib_indexThe index of the FIB
prefixThe prefix for the entry to remove
sourceThe ID of the client/source adding the entry.

Definition at line 900 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_entry_delete_i()

static void fib_table_entry_delete_i ( u32  fib_index,
fib_node_index_t  fib_entry_index,
const fib_prefix_t prefix,
fib_source_t  source 
)
static

Definition at line 854 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_entry_delete_index()

void fib_table_entry_delete_index ( fib_node_index_t  entry_index,
fib_source_t  source 
)

Delete a FIB entry.

If the entry has no more sources, then it is removed from the table.

Parameters
entry_indexThe index of the FIB entry
sourceThe ID of the client/source adding the entry.

Definition at line 924 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_entry_get_stats_index()

u32 fib_table_entry_get_stats_index ( u32  fib_index,
const fib_prefix_t prefix 
)

Return the stats index for a FIB entry.

Parameters
fib_indexThe table's FIB index
prefixThe entry's prefix's

Definition at line 936 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_entry_insert()

static void fib_table_entry_insert ( fib_table_t fib_table,
const fib_prefix_t prefix,
fib_node_index_t  fib_entry_index 
)
static

Definition at line 218 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_entry_local_label_add()

fib_node_index_t fib_table_entry_local_label_add ( u32  fib_index,
const fib_prefix_t prefix,
mpls_label_t  label 
)

Add a MPLS local label for the prefix/route.

If the entry does not exist, it will be created. In theory more than one local label can be added, but this is not yet supported.

Parameters
fib_indexThe index of the FIB
prefixThe prefix for the entry to which to add the label
labelThe MPLS label to add
Returns
the index of the fib_entry_t that is created (or existed already).

Definition at line 944 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_entry_local_label_remove()

void fib_table_entry_local_label_remove ( u32  fib_index,
const fib_prefix_t prefix,
mpls_label_t  label 
)

remove a MPLS local label for the prefix/route.

Parameters
fib_indexThe index of the FIB
prefixThe prefix for the entry to which to add the label
labelThe MPLS label to add

Definition at line 971 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_entry_path_add()

fib_node_index_t fib_table_entry_path_add ( u32  fib_index,
const fib_prefix_t prefix,
fib_source_t  source,
fib_entry_flag_t  flags,
dpo_proto_t  next_hop_proto,
const ip46_address_t *  next_hop,
u32  next_hop_sw_if_index,
u32  next_hop_fib_index,
u32  next_hop_weight,
fib_mpls_label_t next_hop_label_stack,
fib_route_path_flags_t  pf 
)

Add one path to an entry (aka route) in the FIB.

If the entry does not exist, it will be created. See the documentation for fib_route_path_t for more descirptions of the path parameters.

Parameters
fib_indexThe index of the FIB
prefixThe prefix for the entry to add
sourceThe ID of the client/source adding the entry.
flagsFlags for the entry.

@paran next_hop_proto The protocol of the next hop. This cannot be derived in the event that the next hop is all zeros.

Parameters
next_hopThe address of the next-hop.
sw_if_indexThe index of the interface.
next_hop_fib_index,Thefib index of the next-hop for recursive resolution
next_hop_weight[un]equal cost path weight
next_hop_label_stackThe path's out-going label stack. NULL is there is none.
pfFlags for the path
Returns
the index of the fib_entry_t that is created (or existed already).

Definition at line 563 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_entry_path_add2()

fib_node_index_t fib_table_entry_path_add2 ( u32  fib_index,
const fib_prefix_t prefix,
fib_source_t  source,
fib_entry_flag_t  flags,
fib_route_path_t rpath 
)

Add n paths to an entry (aka route) in the FIB.

If the entry does not exist, it will be created. See the documentation for fib_route_path_t for more descirptions of the path parameters.

Parameters
fib_indexThe index of the FIB
prefixThe prefix for the entry to add
sourceThe ID of the client/source adding the entry.
flagsFlags for the entry.
rpathsA vector of paths. Not const since they may be modified.
Returns
the index of the fib_entry_t that is created (or existed already).

Definition at line 605 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_entry_path_remove()

void fib_table_entry_path_remove ( u32  fib_index,
const fib_prefix_t prefix,
fib_source_t  source,
dpo_proto_t  next_hop_proto,
const ip46_address_t *  next_hop,
u32  next_hop_sw_if_index,
u32  next_hop_fib_index,
u32  next_hop_weight,
fib_route_path_flags_t  pf 
)

remove one path to an entry (aka route) in the FIB.

If this is the entry's last path, then the entry will be removed, unless it has other sources. See the documentation for fib_route_path_t for more descirptions of the path parameters.

Parameters
fib_indexThe index of the FIB
prefixThe prefix for the entry to add
sourceThe ID of the client/source adding the entry.

@paran next_hop_proto The protocol of the next hop. This cannot be derived in the event that the next hop is all zeros.

Parameters
next_hopThe address of the next-hop.
sw_if_indexThe index of the interface.
next_hop_fib_index,Thefib index of the next-hop for recursive resolution
next_hop_weight[un]equal cost path weight
pfFlags for the path

Definition at line 736 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_entry_path_remove2()

void fib_table_entry_path_remove2 ( u32  fib_index,
const fib_prefix_t prefix,
fib_source_t  source,
fib_route_path_t paths 
)

Remove n paths to an entry (aka route) in the FIB.

If this is the entry's last path, then the entry will be removed, unless it has other sources. See the documentation for fib_route_path_t for more descirptions of the path parameters.

Parameters
fib_indexThe index of the FIB
prefixThe prefix for the entry to add
sourceThe ID of the client/source adding the entry.
rpathsA vector of paths.

Definition at line 654 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_entry_remove()

static void fib_table_entry_remove ( fib_table_t fib_table,
const fib_prefix_t prefix,
fib_node_index_t  fib_entry_index 
)
static

Definition at line 142 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_entry_special_add()

fib_node_index_t fib_table_entry_special_add ( u32  fib_index,
const fib_prefix_t prefix,
fib_source_t  source,
fib_entry_flag_t  flags 
)

Add a 'special' entry to the FIB.

A special entry is an entry that the FIB is not expect to resolve via the usual mechanisms (i.e. recurisve or neighbour adj DB lookup). Instead the will link to a DPO valid for the source and/or the flags. This add is reference counting per-source. So n 'removes' are required for n 'adds', if the entry is no longer required. If the source needs to provide non-default forwarding use: fib_table_entry_special_dpo_add()

Parameters
fib_indexThe index of the FIB
prefixThe prefix to add
sourceThe ID of the client/source adding the entry.
flagsFlags for the entry.
Returns
the index of the fib_entry_t that is created (or exists already).

Definition at line 405 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_entry_special_dpo_add()

fib_node_index_t fib_table_entry_special_dpo_add ( u32  fib_index,
const fib_prefix_t prefix,
fib_source_t  source,
fib_entry_flag_t  stype,
const dpo_id_t dpo 
)

Add a 'special' entry to the FIB that links to the DPO passed A special entry is an entry that the FIB is not expect to resolve via the usual mechanisms (i.e.

recurisve or neighbour adj DB lookup). Instead the client/source provides the DPO to link to. This add is reference counting per-source. So n 'removes' are required for n 'adds', if the entry is no longer required.

Parameters
fib_indexThe index of the FIB
prefixThe prefix to add
sourceThe ID of the client/source adding the entry.
flagsFlags for the entry.
dpoThe DPO to link to.
Returns
the index of the fib_entry_t that is created (or existed already).

Definition at line 324 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_entry_special_dpo_update()

fib_node_index_t fib_table_entry_special_dpo_update ( u32  fib_index,
const fib_prefix_t prefix,
fib_source_t  source,
fib_entry_flag_t  stype,
const dpo_id_t dpo 
)

Update a 'special' entry to the FIB that links to the DPO passed A special entry is an entry that the FIB is not expect to resolve via the usual mechanisms (i.e.

recurisve or neighbour adj DB lookup). Instead the client/source provides the DPO to link to. Special entries are add/remove reference counted per-source. So n 'removes' are required for n 'adds', if the entry is no longer required. An 'update' is an 'add' if no 'add' has already been called, otherwise an 'add' is therefore assumed to act on the reference instance of that add.

Parameters
fib_entry_indexThe index of the FIB entry to update
sourceThe ID of the client/source adding the entry.
flagsFlags for the entry.
dpoThe DPO to link to.
Returns
the index of the fib_entry_t that is created (or existed already).

Definition at line 363 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_entry_special_remove()

void fib_table_entry_special_remove ( u32  fib_index,
const fib_prefix_t prefix,
fib_source_t  source 
)

Remove a 'special' entry from the FIB.

This add is reference counting per-source. So n 'removes' are required for n 'adds', if the entry is no longer required.

Parameters
fib_indexThe index of the FIB
prefixThe prefix to remove
sourceThe ID of the client/source adding the entry.

Definition at line 424 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_entry_update()

fib_node_index_t fib_table_entry_update ( u32  fib_index,
const fib_prefix_t prefix,
fib_source_t  source,
fib_entry_flag_t  flags,
fib_route_path_t paths 
)

Update an entry to have a new set of paths.

If the entry does not exist, it will be created. The difference between an 'path-add' and an update, is that path-add is an incremental addition of paths, whereas an update is a wholesale swap.

Parameters
fib_indexThe index of the FIB
prefixThe prefix for the entry to add
sourceThe ID of the client/source adding the entry.
rpathsA vector of paths. Not const since they may be modified.
Returns
the index of the fib_entry_t that is created (or existed already).

Definition at line 770 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_entry_update_one_path()

fib_node_index_t fib_table_entry_update_one_path ( u32  fib_index,
const fib_prefix_t prefix,
fib_source_t  source,
fib_entry_flag_t  flags,
dpo_proto_t  next_hop_proto,
const ip46_address_t *  next_hop,
u32  next_hop_sw_if_index,
u32  next_hop_fib_index,
u32  next_hop_weight,
fib_mpls_label_t next_hop_label_stack,
fib_route_path_flags_t  pf 
)

Update the entry to have just one path.

If the entry does not exist, it will be created. See the documentation for fib_route_path_t for more descirptions of the path parameters.

Parameters
fib_indexThe index of the FIB
prefixThe prefix for the entry to add
sourceThe ID of the client/source adding the entry.
flagsFlags for the entry.

@paran next_hop_proto The protocol of the next hop. This cannot be derived in the event that the next hop is all zeros.

Parameters
next_hopThe address of the next-hop.
sw_if_indexThe index of the interface.
next_hop_fib_index,Thefib index of the next-hop for recursive resolution
next_hop_weight[un]equal cost path weight
next_hop_label_stackThe path's out-going label stack. NULL is there is none.
pfFlags for the path
Returns
the index of the fib_entry_t that is created (or existed already).

Definition at line 819 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_find()

u32 fib_table_find ( fib_protocol_t  proto,
u32  table_id 
)

Get the index of the FIB for a Table-ID.

This DOES NOT create the FIB if it does not exist.

@paran proto The protocol of the FIB (and thus the entries therein)

Parameters
table-idThe Table-ID
Returns
fib_index The index of the FIB, which may be INVALID.

Definition at line 1111 of file fib_table.c.

+ Here is the call graph for this function:

◆ 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  source 
)

Get the index of the FIB for a Table-ID.

This DOES create the FIB if it does not exist.

@paran proto The protocol of the FIB (and thus the entries therein)

Parameters
table-idThe Table-ID
Returns
fib_index The index of the FIB
Parameters
sourceThe ID of the client/source.

Definition at line 1170 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_find_or_create_and_lock_i()

static u32 fib_table_find_or_create_and_lock_i ( fib_protocol_t  proto,
u32  table_id,
fib_source_t  src,
const u8 name 
)
static

Definition at line 1127 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_find_or_create_and_lock_w_name()

u32 fib_table_find_or_create_and_lock_w_name ( fib_protocol_t  proto,
u32  table_id,
fib_source_t  source,
const u8 name 
)

Get the index of the FIB for a Table-ID.

This DOES create the FIB if it does not exist.

@paran proto The protocol of the FIB (and thus the entries therein)

Parameters
table-idThe Table-ID
Returns
fib_index The index of the FIB
Parameters
sourceThe ID of the client/source.
nameThe client is choosing the name they want the table to have

Definition at line 1179 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_flush()

void fib_table_flush ( u32  fib_index,
fib_protocol_t  proto,
fib_source_t  source 
)

Flush all entries from a table for the source.

Parameters
fib_indexThe index of the FIB

@paran proto The protocol of the entries in the table

Parameters
sourcethe source to flush

Definition at line 1449 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_flush_cb()

static fib_table_walk_rc_t fib_table_flush_cb ( fib_node_index_t  fib_entry_index,
void *  arg 
)
static

Definition at line 1436 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_fwding_dpo_remove()

void fib_table_fwding_dpo_remove ( u32  fib_index,
const fib_prefix_t prefix,
const dpo_id_t dpo 
)

remove an entry in the FIB's forwarding table

Parameters
fib_indexThe index of the FIB
prefixThe prefix for the entry to add/update
dpoThe data-path object to use for forwarding

Definition at line 280 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_fwding_dpo_update()

void fib_table_fwding_dpo_update ( u32  fib_index,
const fib_prefix_t prefix,
const dpo_id_t dpo 
)

Add or update an entry in the FIB's forwarding table.

This is called from the fib_entry code. It is not meant to be used by the client/source.

Parameters
fib_indexThe index of the FIB
prefixThe prefix for the entry to add/update
dpoThe data-path object to use for forwarding

Definition at line 253 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_get()

fib_table_t* fib_table_get ( fib_node_index_t  index,
fib_protocol_t  proto 
)

Get a pointer to a FIB table.

Definition at line 29 of file fib_table.c.

◆ fib_table_get_default_flow_hash_config()

flow_hash_config_t fib_table_get_default_flow_hash_config ( fib_protocol_t  proto)

Get the flow hash configured used by the protocol.

@paran proto The protocol of the FIB (and thus the entries therein)

Returns
The flow hash config

Definition at line 1030 of file fib_table.c.

+ Here is the caller graph for this function:

◆ fib_table_get_flow_hash_config()

flow_hash_config_t fib_table_get_flow_hash_config ( u32  fib_index,
fib_protocol_t  proto 
)

Get the flow hash configured used by the table.

Parameters
fib_indexThe index of the FIB

@paran proto The protocol the packets the flow hash will be calculated for.

Returns
The flow hash config

Definition at line 1019 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_get_index_for_sw_if_index()

u32 fib_table_get_index_for_sw_if_index ( fib_protocol_t  proto,
u32  sw_if_index 
)

Get the index of the FIB bound to the interface.

@paran proto The protocol of the FIB (and thus the entries therein)

Parameters
sw_if_indexThe interface index
Returns
fib_index The index of the FIB

Definition at line 1003 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_get_less_specific()

fib_node_index_t fib_table_get_less_specific ( u32  fib_index,
const fib_prefix_t prefix 
)

Get the less specific (covering) prefix.

Parameters
fib_indexThe index of the FIB
prefixThe prefix to lookup
Returns
The index of the less specific fib_entry_t.

Definition at line 133 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_get_less_specific_i()

static fib_node_index_t fib_table_get_less_specific_i ( fib_table_t fib_table,
const fib_prefix_t prefix 
)
static

Definition at line 106 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_get_num_entries()

u32 fib_table_get_num_entries ( u32  fib_index,
fib_protocol_t  proto,
fib_source_t  source 
)

Return the number of entries in the FIB added by a given source.

Parameters
fib_indexThe index of the FIB

@paran proto The protocol of the FIB (and thus the entries therein)

Returns
number of sourced entries.

Definition at line 1373 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_get_table_id()

u32 fib_table_get_table_id ( u32  fib_index,
fib_protocol_t  proto 
)

Get the Table-ID of the FIB from protocol and index.

Parameters
fib_indexThe FIB index

@paran proto The protocol of the FIB (and thus the entries therein)

Returns
fib_index The tableID of the FIB

Definition at line 1100 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_get_table_id_for_sw_if_index()

u32 fib_table_get_table_id_for_sw_if_index ( fib_protocol_t  proto,
u32  sw_if_index 
)

Get the Table-ID of the FIB bound to the interface.

@paran proto The protocol of the FIB (and thus the entries therein)

Parameters
sw_if_indexThe interface index
Returns
fib_index The tableID of the FIB

Definition at line 1087 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ 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.

When the last lock has gone. the FIB is deleted.

Parameters
fib_indexThe index of the FIB

@paran proto The protocol of the FIB (and thus the entries therein)

Parameters
sourceThe ID of the client/source.

Definition at line 1361 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_lock_dec()

static void fib_table_lock_dec ( fib_table_t fib_table,
fib_source_t  source 
)
static

Definition at line 1320 of file fib_table.c.

+ Here is the caller graph for this function:

◆ fib_table_lock_inc()

static void fib_table_lock_inc ( fib_table_t fib_table,
fib_source_t  source 
)
static

Definition at line 1331 of file fib_table.c.

+ Here is the caller graph for this function:

◆ fib_table_lookup()

fib_node_index_t fib_table_lookup ( u32  fib_index,
const fib_prefix_t prefix 
)

Perfom a longest prefix match in the non-forwarding table.

Parameters
fib_indexThe index of the FIB
prefixThe prefix to lookup
Returns
The index of the fib_entry_t for the best match, which may be the default route

Definition at line 68 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_lookup_exact_match()

fib_node_index_t fib_table_lookup_exact_match ( u32  fib_index,
const fib_prefix_t prefix 
)

Perfom an exact match in the non-forwarding table.

Parameters
fib_indexThe index of the FIB
prefixThe prefix to lookup
Returns
The index of the fib_entry_t for the exact match, or INVALID is there is no match.

Definition at line 97 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_lookup_exact_match_i()

static fib_node_index_t fib_table_lookup_exact_match_i ( const fib_table_t fib_table,
const fib_prefix_t prefix 
)
inlinestatic

Definition at line 75 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_lookup_i()

static fib_node_index_t fib_table_lookup_i ( fib_table_t fib_table,
const fib_prefix_t prefix 
)
inlinestatic

Definition at line 46 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_mark()

void fib_table_mark ( u32  fib_index,
fib_protocol_t  proto,
fib_source_t  source 
)

Resync all entries from a table for the source this is the mark part of the mark and sweep algorithm.

All entries in this FIB that are sourced by 'source' are marked as stale.

Parameters
fib_indexThe index of the FIB

@paran proto The protocol of the entries in the table

Parameters
sourcethe source to flush

Definition at line 1485 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_mark_cb()

static fib_table_walk_rc_t fib_table_mark_cb ( fib_node_index_t  fib_entry_index,
void *  arg 
)
static

Definition at line 1472 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_post_insert_actions()

static void fib_table_post_insert_actions ( fib_table_t fib_table,
const fib_prefix_t prefix,
fib_node_index_t  fib_entry_index 
)
static

Definition at line 173 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_route_path_fixup()

static void fib_table_route_path_fixup ( const fib_prefix_t prefix,
fib_entry_flag_t eflags,
fib_route_path_t path 
)
static

fib_table_route_path_fixup

Convert attached hosts to attached next-hops.

This special case is required because an attached path will link to a glean, and the FIB entry will have the interface or API/CLI source. When the ARP/ND process is completes then that source (which will provide a complete adjacency) will be lower priority and so the FIB entry will remain linked to a glean and traffic will never reach the hosts. For an ATTAHCED_HOST path we can link the path directly to the [incomplete] adjacency.

Definition at line 500 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_set_flow_hash_config()

void fib_table_set_flow_hash_config ( u32  fib_index,
fib_protocol_t  proto,
flow_hash_config_t  hash_config 
)

Set the flow hash configured used by the table.

Parameters
fib_indexThe index of the FIB

@paran proto The protocol of the FIB (and thus the entries therein)

Parameters
hash_configThe flow-hash config to set
Returns
none

Definition at line 1069 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_set_flow_hash_config_cb()

static fib_table_walk_rc_t fib_table_set_flow_hash_config_cb ( fib_node_index_t  fib_entry_index,
void *  arg 
)
static

Definition at line 1058 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_source_count_dec()

static void fib_table_source_count_dec ( fib_table_t fib_table,
fib_source_t  source 
)
static

Definition at line 316 of file fib_table.c.

+ Here is the caller graph for this function:

◆ fib_table_source_count_inc()

static void fib_table_source_count_inc ( fib_table_t fib_table,
fib_source_t  source 
)
static

Definition at line 308 of file fib_table.c.

+ Here is the caller graph for this function:

◆ fib_table_sub_tree_walk()

void fib_table_sub_tree_walk ( u32  fib_index,
fib_protocol_t  proto,
const fib_prefix_t root,
fib_table_walk_fn_t  fn,
void *  ctx 
)

Walk all entries in a sub-tree FIB table.

The 'root' paraneter is the prefix at the root of the sub-tree. N.B: This is NOT safe to deletes. If you need to delete walk the whole table and store elements in a vector, then delete the elements

Definition at line 1300 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_sweep()

void fib_table_sweep ( u32  fib_index,
fib_protocol_t  proto,
fib_source_t  source 
)

Signal that the table has converged, i.e.

all updates are complete. this is the sweep part of the mark and sweep algorithm. All entries in this FIB that are sourced by 'source' and marked as stale are flushed.

Parameters
fib_indexThe index of the FIB

@paran proto The protocol of the entries in the table

Parameters
sourcethe source to flush

Definition at line 1518 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_sweep_cb()

static fib_table_walk_rc_t fib_table_sweep_cb ( fib_node_index_t  fib_entry_index,
void *  arg 
)
static

Definition at line 1505 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ 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.

Parameters
fib_indexThe index of the FIB

@paran proto The protocol of the FIB (and thus the entries therein)

Parameters
sourceThe ID of the client/source.

Definition at line 1342 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_walk()

void fib_table_walk ( u32  fib_index,
fib_protocol_t  proto,
fib_table_walk_fn_t  fn,
void *  ctx 
)

Walk all entries in a FIB table N.B: This is NOT safe to deletes.

If you need to delete walk the whole table and store elements in a vector, then delete the elements

Definition at line 1244 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_walk_w_src()

void fib_table_walk_w_src ( u32  fib_index,
fib_protocol_t  proto,
fib_source_t  src,
fib_table_walk_fn_t  fn,
void *  ctx 
)

Walk all entries in a FIB table N.B: This is NOT safe to deletes.

If you need to delete walk the whole table and store elements in a vector, then delete the elements

Definition at line 1284 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ fib_table_walk_w_src_cb()

static fib_table_walk_rc_t fib_table_walk_w_src_cb ( fib_node_index_t  fei,
void *  arg 
)
static

Definition at line 1271 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ format_fib_table_flags()

u8* format_fib_table_flags ( u8 s,
va_list *  args 
)

Definition at line 1399 of file fib_table.c.

+ Here is the caller graph for this function:

◆ format_fib_table_memory()

u8* format_fib_table_memory ( u8 s,
va_list *  args 
)

format (display) the memory used by the FIB tables

Definition at line 1545 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ format_fib_table_name()

u8* format_fib_table_name ( u8 s,
va_list *  ap 
)

Format the description/name of the table.

Definition at line 1385 of file fib_table.c.

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Variable Documentation

◆ fib_table_flags_strings

const static char* fib_table_flags_strings[] = FIB_TABLE_ATTRIBUTES
static

Definition at line 26 of file fib_table.c.