|
FD.io VPP
v21.06-3-gbb25fbf28
Vector Packet Processing
|
Go to the documentation of this file.
50 #define GBP_ENDPOINT_DBG(...) \
51 vlib_log_debug (gbp_ep_logger, __VA_ARGS__);
53 #define GBP_ENDPOINT_INFO(...) \
54 vlib_log_notice (gbp_ep_logger, __VA_ARGS__);
66 #define FOR_EACH_GBP_ENDPOINT_ATTR(_item) \
67 for (_item = GBP_ENDPOINT_ATTR_FIRST; \
68 _item < GBP_ENDPOINT_ATTR_LAST; \
79 if ((1 << attr) &
flags)
113 return (
ge->ge_locs[0].gel_src == GBP_ENDPOINT_SRC_DP);
128 ip->as_u64[0] =
key->key[0];
129 ip->as_u64[1] =
key->key[1];
220 const ip46_address_t *
ips,
223 const ip46_address_t *
ip;
230 (
ge->ge_key.gek_grd == grdi));
245 ge->ge_key.gek_grd = grdi;
281 return (
a->gel_src ==
b->gel_src);
287 return (
a->gel_src -
b->gel_src);
302 return (&
ge->ge_locs[pos]);
316 pos = gel -
ge->ge_locs;
372 return (&
ge->ge_locs[pos]);
388 l2_ge = l3_ge = NULL;
397 const ip46_address_t *
ip;
410 else if (NULL == l3_ge)
413 else if (
tmp == l3_ge)
427 if (NULL == l2_ge && NULL == l3_ge)
430 else if (NULL == l2_ge)
433 else if (NULL == l3_ge)
456 return (
ge->ge_locs[0].gel_src);
485 const ip46_address_t * tun_src,
486 const ip46_address_t * tun_dst)
488 int was_learnt, is_learnt;
623 gel = &
ge->ge_locs[0];
652 L2OUTPUT_FEAT_GBP_POLICY_MAC);
658 L2OUTPUT_FEAT_GBP_POLICY_PORT);
663 L2FIB_ENTRY_RESULT_FLAG_STATIC);
790 L2INPUT_FEAT_GBP_LPM_CLASSIFY);
804 feats |= L2INPUT_FEAT_GBP_FWD;
822 const ip46_address_t *
ips,
827 const ip46_address_t * tun_src,
828 const ip46_address_t * tun_dst,
u32 * handle)
840 return (VNET_API_ERROR_INVALID_SW_IF_INDEX);
854 return (VNET_API_ERROR_NO_SUCH_ENTRY);
863 return (VNET_API_ERROR_NO_SUCH_ENTRY);
865 return (VNET_API_ERROR_NO_SUCH_FIB);
1101 else if (
unformat (input,
"handle %d", &handle))
1155 .path =
"gbp endpoint",
1156 .short_help =
"gbp endpoint del <handle> | [add] <interface> sclass <SCLASS> ip <IP> mac <MAC> [flags <flags>]",
1168 #define _(v,a) case GBP_ENDPOINT_SRC_##v: return (format (s, "%s", a));
1173 return (
format (s,
"unknown"));
1225 s =
format (s,
" tun:[");
1228 s =
format (s,
" {%U,%U}]",
1246 s =
format (s,
" last-time:[%f]",
ge->ge_last_time);
1283 return (BIHASH_WALK_CONTINUE);
1301 return (BIHASH_WALK_CONTINUE);
1308 u32 show_dbs, handle;
1315 if (
unformat (input,
"%d", &handle))
1332 clib_bihash_foreach_key_value_pair_16_8
1353 .path =
"show gbp endpoint",
1354 .short_help =
"show gbp endpoint\n",
1373 if ((start_time -
ge->ge_last_time) >
1385 f64 last_start, start_time, delta_t;
1388 if (!gte_table->instantiated)
1394 for (
i = 0;
i < gte_table->nbuckets;
i++)
1396 clib_bihash_bucket_16_8_t *
b;
1397 clib_bihash_value_16_8_t *v;
1401 if (delta_t > 20e-6)
1408 b = clib_bihash_get_bucket_16_8 (gte_table,
i);
1409 if (clib_bihash_bucket_is_empty_16_8 (
b))
1411 v = clib_bihash_get_value_16_8 (gte_table,
b->offset);
1413 for (j = 0; j < (1 <<
b->log2_pages); j++)
1426 if (clib_bihash_bucket_is_empty_16_8 (
b))
1440 f64 last_start, start_time, delta_t;
1443 if (!gte_table->instantiated)
1449 for (
i = 0;
i < gte_table->nbuckets;
i++)
1451 clib_bihash_bucket_24_8_t *
b;
1452 clib_bihash_value_24_8_t *v;
1456 if (delta_t > 20e-6)
1463 b = clib_bihash_get_bucket_24_8 (gte_table,
i);
1464 if (clib_bihash_bucket_is_empty_24_8 (
b))
1466 v = clib_bihash_get_value_24_8 (gte_table,
b->offset);
1468 for (j = 0; j < (1 <<
b->log2_pages); j++)
1481 if (clib_bihash_bucket_is_empty_24_8 (
b))
1505 return (&
ge->ge_node);
1566 #define GBP_EP_HASH_NUM_BUCKETS (2 * 1024)
1567 #define GBP_EP_HASH_MEMORY_SIZE (1 << 20)
1570 "GBP Endpoints - IP/RD",
1574 "GBP Endpoints - MAC/BD",
void gbp_itf_l2_set_input_feature(gbp_itf_hdl_t gh, l2input_feat_masks_t feats)
fib_protocol_t fib_proto_from_ip46(ip46_type_t iproto)
Convert from ip46_type to fib_protocol.
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.
static index_t gbp_endpoint_index(const gbp_endpoint_t *ge)
#define GBP_EP_HASH_NUM_BUCKETS
index_t gbp_endpoint_group_find(sclass_t sclass)
#define DPO_INVALID
An initialiser for DPOs declared on the stack.
enum gbp_endpoint_src_t_ gbp_endpoint_src_t
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 FI...
static void gbp_endpoint_scan_l3(vlib_main_t *vm)
static int gbp_endpoint_walk_ip_itf(clib_bihash_kv_24_8_t *kvp, void *arg)
static walk_rc_t gbp_endpoint_show_one(index_t gei, void *ctx)
enum fib_node_back_walk_rc_t_ fib_node_back_walk_rc_t
Return code from a back walk function.
#define GBP_ENDPOINT_SRC_MAX
@ GBP_ENDPOINT_FLAG_REMOTE
#define clib_memcpy(d, s, n)
sclass_t gef_sclass
Endpoint Group's sclass.
void fib_table_entry_delete(u32 fib_index, const fib_prefix_t *prefix, fib_source_t source)
Delete a FIB entry.
#define BIHASH_KVP_PER_PAGE
u32 grd_fib_index[FIB_PROTOCOL_IP_MAX]
static uword ip46_address_is_multicast(const ip46_address_t *a)
index_t gbp_route_domain_index(const gbp_route_domain_t *grd)
gbp_itf_hdl_t gbp_vxlan_tunnel_clone_and_lock(u32 sw_if_index, const ip46_address_t *src, const ip46_address_t *dst)
#define ip46_address_initializer
void gbp_endpoint_child_remove(index_t gei, u32 sibling)
clib_bihash_24_8_t ged_by_ip_rd
void gbp_endpoint_unlock(gbp_endpoint_src_t src, index_t gei)
static void ip46_address_reset(ip46_address_t *ip46)
u32 gb_vni
The index of the BD's VNI interface on which packets from unkown endpoints arrive.
vlib_log_class_t vlib_log_register_class(char *class, char *subclass)
index_t gg_gbd
Bridge-domain ID the EPG is in.
vlib_main_t vlib_node_runtime_t * node
A FIB graph nodes virtual function table.
static void gbp_endpoint_loc_update(const gbp_endpoint_t *ge, gbp_endpoint_loc_t *gel, const gbp_bridge_domain_t *gb, u32 sw_if_index, index_t ggi, gbp_endpoint_flags_t flags, const ip46_address_t *tun_src, const ip46_address_t *tun_dst)
#define clib_error_return(e, args...)
vlib_node_registration_t gbp_scanner_node
(constructor) VLIB_REGISTER_NODE (gbp_scanner_node)
static void gbp_endpoint_del_ip(const ip46_address_t *ip, u32 fib_index)
static int clib_bihash_is_free_16_8(clib_bihash_kv_16_8_t *v)
gbp_itf_hdl_t gel_itf
The interface on which the EP is connected.
u8 * format_gbp_endpoint_flags(u8 *s, va_list *args)
static gbp_endpoint_src_t gbp_endpoint_get_best_src(const gbp_endpoint_t *ge)
void adj_unlock(adj_index_t adj_index)
Release a reference counting lock on the adjacency.
static gbp_endpoint_loc_t * gbp_endpoint_loc_find_or_add(gbp_endpoint_t *ge, gbp_endpoint_src_t src)
u32 vxlan_gbp_tunnel_get_parent(u32 sw_if_index)
int gbp_endpoint_is_remote(const gbp_endpoint_t *ge)
static vlib_cli_command_t gbp_endpoint_show_node
(constructor) VLIB_CLI_COMMAND (gbp_endpoint_show_node)
index_t * ged_by_sw_if_index
static gbp_endpoint_t * gbp_endpoint_get(index_t gbpei)
Get the endpoint from a port/interface.
u32 gg_uplink_sw_if_index
the uplink interface dedicated to the EPG
#define pool_put(P, E)
Free an object E in pool P.
A route Domain Representation.
vlib_main_t * vm
X-connect all packets from the HOST to the PHY.
const mac_address_t ZERO_MAC_ADDRESS
gbp_vxlan_tunnel_type_t gbp_vxlan_tunnel_get_type(u32 sw_if_index)
gbp_endpoint_flags_t gef_flags
void fib_prefix_from_ip46_addr(const ip46_address_t *addr, fib_prefix_t *pfx)
Host prefix from ip.
static u32 gbp_n_learnt_endpoints
A count of the number of dynamic entries.
And endpoints current forwarding state.
static gbp_bridge_domain_t * gbp_bridge_domain_get(index_t i)
static int gbp_endpoint_loc_unlock(gbp_endpoint_t *ge, gbp_endpoint_loc_t *gel)
ip46_address_t gt_src
The source address to use for child tunnels.
static ip46_type_t ip46_address_get_type(const ip46_address_t *ip)
u32 gb_bvi_sw_if_index
The BD's BVI interface (obligatory)
@ FIB_ENTRY_FLAG_INTERPOSE
static void vlib_process_signal_event(vlib_main_t *vm, uword node_index, uword type_opaque, uword data)
enum fib_node_type_t_ fib_node_type_t
The types of nodes in a FIB graph.
clib_bihash_16_8_t ged_by_mac_bd
gbp_endpoint_src_t gel_src
The source providing this location information.
static gbp_endpoint_loc_t * gbp_endpoint_loc_find(gbp_endpoint_t *ge, gbp_endpoint_src_t src)
enum gbp_endpoint_attr_t_ gbp_endpoint_attr_t
Flags for each endpoint.
void l2fib_add_entry(const u8 *mac, u32 bd_index, u32 sw_if_index, l2fib_entry_result_flags_t flags)
Add an entry to the l2fib.
#define vec_search_with_function(v, E, fn)
Search a vector for the index of the entry that matches.
enum gbp_endpoint_flags_t_ gbp_endpoint_flags_t
static fib_source_t gbp_fib_source_low
static void gbp_endpoint_loc_destroy(gbp_endpoint_loc_t *gel)
void gbp_itf_l2_set_output_feature(gbp_itf_hdl_t gh, l2output_feat_masks_t feats)
gbp_itf_hdl_t vxlan_gbp_tunnel_lock_itf(u32 sw_if_index)
fib_node_bw_reason_flag_t fnbw_reason
The reason/trigger for the backwalk.
@ GBP_VXLAN_TEMPLATE_TUNNEL
This is the object type defined above.
#define pool_is_free_index(P, I)
Use free bitmap to query whether given index is free.
@ FIB_NODE_BW_REASON_FLAG_EVALUATE
vl_api_address_t ips[n_ips]
static void gbp_endpoint_scan_l2(vlib_main_t *vm)
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.
u32 bd_add_del_ip_mac(u32 bd_index, ip46_type_t type, const ip46_address_t *ip, const mac_address_t *mac, u8 is_add)
Add/delete IP address to MAC address mapping.
static_always_inline void mac_address_copy(mac_address_t *dst, const mac_address_t *src)
#define GBP_ENDPOINT_ATTR_NAMES
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
u32 gbp_endpoint_child_add(index_t gei, fib_node_type_t type, fib_node_index_t index)
static u8 ip46_address_is_equal(const ip46_address_t *ip46_1, const ip46_address_t *ip46_2)
static int clib_bihash_is_free_24_8(const clib_bihash_kv_24_8_t *v)
void gbp_itf_hdl_reset(gbp_itf_hdl_t *gh)
static u8 * format_gbp_endpoint_loc(u8 *s, va_list *args)
bool gbp_itf_hdl_is_valid(gbp_itf_hdl_t gh)
#define vec_add2(V, P, N)
Add N elements to end of vector V, return pointer to new elements in P.
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
static void gbb_endpoint_fwd_reset(gbp_endpoint_t *ge)
static gbp_endpoint_t * gbp_endpoint_from_fib_node(fib_node_t *node)
fib_prefix_t * gek_ips
A vector of ip addresses that belong to the endpoint.
static_always_inline gbp_endpoint_t * gbp_endpoint_find_mac(const u8 *mac, u32 bd_index)
static int gbp_endpoint_ip_is_equal(const fib_prefix_t *fp, const ip46_address_t *ip)
gbp_endpoint_flags_t gel_flags
Endpoint flags.
vnet_main_t * vnet_get_main(void)
void gbp_endpoint_scan(vlib_main_t *vm)
static bool gbp_endpoint_add_ip(const ip46_address_t *ip, u32 fib_index, index_t gei)
void ip6_neighbor_advertise(vlib_main_t *vm, vnet_main_t *vnm, u32 sw_if_index, const ip6_address_t *addr)
static fib_node_back_walk_rc_t gbp_endpoint_back_walk_notify(fib_node_t *node, fib_node_back_walk_ctx_t *ctx)
gbp_endpoint_t * gbp_endpoint_pool
Pool of GBP endpoints.
Information about the location of the endpoint provided by a source of endpoints.
static fib_source_t gbp_fib_source_hi
u8 * format_mac_address_t(u8 *s, va_list *args)
static fib_node_t * gbp_endpoint_get_node(fib_node_index_t index)
adj_index_t adj_nbr_add_or_lock_w_rewrite(fib_protocol_t nh_proto, vnet_link_t link_type, const ip46_address_t *nh_addr, u32 sw_if_index, u8 *rewrite)
Add (and lock) a new or lock an existing neighbour adjacency.
u32 index_t
A Data-Path Object is an object that represents actions that are applied to packets are they are swit...
static void gbp_endpoint_check(index_t gei, f64 start_time)
u32 fib_node_index_t
A typedef of a node index.
static_always_inline int mac_address_is_zero(const mac_address_t *mac)
static_always_inline void mac_address_to_bytes(const mac_address_t *mac, u8 *bytes)
u32 gbp_itf_get_sw_if_index(gbp_itf_hdl_t hdl)
static const u8 * vnet_sw_interface_get_hw_address(vnet_main_t *vnm, u32 sw_if_index)
An Endpoint Group representation.
u8 * format_gbp_itf_hdl(u8 *s, va_list *args)
sll srl srl sll sra u16x4 i
vnet_link_t fib_proto_to_link(fib_protocol_t proto)
Convert from a protocol to a link type.
@ GBP_ENDPOINT_FLAG_EXTERNAL
#define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment)
gbp_itf_hdl_t gef_itf
The interface on which the EP is connected.
#define VLIB_CLI_COMMAND(x,...)
static void gbp_endpoint_extract_key_ip_itf(const clib_bihash_kv_24_8_t *key, ip46_address_t *ip, u32 *sw_if_index)
enum fib_protocol_t_ fib_protocol_t
Protocol Type.
u32 gel_locks
number of times this source has locked this
void ip4_neighbor_advertise(vlib_main_t *vm, vnet_main_t *vnm, u32 sw_if_index, const ip4_address_t *addr)
@ FIB_NODE_BACK_WALK_CONTINUE
void vlib_cli_output(vlib_main_t *vm, char *fmt,...)
fib_source_t fib_source_allocate(const char *name, fib_source_priority_t prio, fib_source_behaviour_t bh)
dpo_proto_t fib_proto_to_dpo(fib_protocol_t fib_proto)
static_always_inline void ip46_address_copy(ip46_address_t *dst, const ip46_address_t *src)
ip46_address_t fp_addr
The address type is not deriveable from the fp_addr member.
gbp_endpoint_group_t * gbp_endpoint_group_get(index_t i)
static gbp_endpoint_t * gbp_endpoint_alloc(const ip46_address_t *ips, const gbp_route_domain_t *grd, const mac_address_t *mac, const gbp_bridge_domain_t *gbd)
index_t gel_epg
Endpoint Group.
static void gbp_endpoint_ips_update(gbp_endpoint_t *ge, const ip46_address_t *ips, const gbp_route_domain_t *grd)
static u8 ip46_address_is_zero(const ip46_address_t *ip46)
static u8 * format_gbp_endpoint_key(u8 *s, va_list *args)
void gbp_endpoint_flush(gbp_endpoint_src_t src, u32 sw_if_index)
remove all learnt endpoints using the interface
#define FIB_SOURCE_PRIORITY_HI
Some priority values that plugins might use when they are not to concerned where in the list they'll ...
GBP VXLAN (template) tunnel.
This is the identity of an endpoint, as such it is information about an endpoint that is idempotent.
int gbp_endpoint_is_learnt(const gbp_endpoint_t *ge)
void fib_walk_sync(fib_node_type_t parent_type, fib_node_index_t parent_index, fib_node_back_walk_ctx_t *ctx)
Back walk all the children of a FIB node.
u32 gel_parent_sw_if_index
static int gbp_endpoint_walk_mac_itf(clib_bihash_kv_16_8_t *kvp, void *arg)
const static gbp_itf_hdl_t GBP_ITF_HDL_INVALID
static u8 * format_gbp_endpoint_fwd(u8 *s, va_list *args)
#define vec_free(V)
Free vector's memory (no header).
u8 * format_gbp_endpoint(u8 *s, va_list *args)
@ GBP_ENDPOINT_SCAN_START
static vlib_log_class_t gbp_ep_logger
#define FOR_EACH_GBP_ENDPOINT_ATTR(_item)
mac_address_t gek_mac
MAC address of the endpoint.
#define pool_foreach_index(i, v)
static_always_inline void mac_address_from_u64(mac_address_t *mac, u64 u)
int gbp_endpoint_update_and_lock(gbp_endpoint_src_t src, u32 sw_if_index, const ip46_address_t *ips, const mac_address_t *mac, index_t gbdi, index_t grdi, sclass_t sclass, gbp_endpoint_flags_t flags, const ip46_address_t *tun_src, const ip46_address_t *tun_dst, u32 *handle)
static void gbb_endpoint_fwd_recalc(gbp_endpoint_t *ge)
format_function_t format_vnet_sw_if_index_name
unformat_function_t unformat_vnet_sw_interface
description fragment has unexpected format
#define vec_validate_init_empty(V, I, INIT)
Make sure vector is long enough for given index and initialize empty space (no header,...
void gbp_policy_dpo_add_or_lock(dpo_proto_t dproto, gbp_scope_t scope, sclass_t sclass, u32 sw_if_index, dpo_id_t *dpo)
format_function_t format_ip46_address
static uword vlib_process_suspend(vlib_main_t *vm, f64 dt)
Suspend a vlib cooperative multi-tasking thread for a period of time.
@ FIB_ROUTE_PATH_FLAG_NONE
static void gbp_endpoint_del_mac(const mac_address_t *mac, u32 bd_index)
gbp_endpoint_t * gbp_endpoint_find_ip(const ip46_address_t *ip, u32 fib_index)
#define VLIB_INIT_FUNCTION(x)
gbp_endpoint_retention_t gg_retention
EP retention policy.
void gbp_endpoint_group_lock(index_t ggi)
static_always_inline void gbp_endpoint_mk_key_mac(const u8 *mac, u32 bd_index, clib_bihash_kv_16_8_t *key)
u32 l2fib_del_entry(const u8 *mac, u32 bd_index, u32 sw_if_index)
Delete an entry from the l2fib.
static bool gbp_endpoint_add_mac(const mac_address_t *mac, u32 bd_index, index_t gei)
static void gbp_endpoint_add_itf(u32 sw_if_index, index_t gei)
u8 * format_fib_prefix(u8 *s, va_list *args)
struct gbp_endpoint_flush_ctx_t_ gbp_endpoint_flush_ctx_t
static int gbp_endpoint_find_for_update(const ip46_address_t *ips, const gbp_route_domain_t *grd, const mac_address_t *mac, const gbp_bridge_domain_t *gbd, gbp_endpoint_t **ge)
Find an EP inthe DBs and check that if we find it in the L2 DB it has the same IPs as this update.
void gbp_endpoint_walk(gbp_endpoint_cb_t cb, void *ctx)
#define vec_foreach(var, vec)
Vector iterator.
gbp_itf_hdl_t gbp_itf_l2_add_and_lock(u32 sw_if_index, index_t gbi)
void fib_node_lock(fib_node_t *node)
gbp_route_domain_t * gbp_route_domain_get(index_t i)
static void gbp_endpoint_extract_key_mac_itf(const clib_bihash_kv_16_8_t *key, mac_address_t *mac, u32 *sw_if_index)
fib_protocol_t fp_proto
protocol type
struct gbp_endpoint_loc_t_::@659 tun
Tunnel info for remote endpoints.
A bridge Domain Representation.
static void gbp_endpoint_n_learned(int n)
#define GBP_ENDPOINT_INFO(...)
static const char * gbp_endpoint_attr_names[]
An node in the FIB graph.
#define vec_sort_with_function(vec, f)
Sort a vector using the supplied element comparison function.
static clib_error_t * gbp_endpoint_init(vlib_main_t *vm)
static clib_error_t * gbp_endpoint_show(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
u32 gef_fib_index
FIB index the EP is in.
void fib_node_init(fib_node_t *node, fib_node_type_t type)
index_t * gef_adjs
The L3 adj, if created.
gbp_ep_db_t gbp_ep_db
EP DBs.
static vlib_main_t * vlib_get_main(void)
#define pool_get_zero(P, E)
Allocate an object E from a pool P and zero it.
void fib_node_unlock(fib_node_t *node)
index_t gg_rd
route-domain/IP-table ID the EPG is in
void gbp_endpoint_group_unlock(index_t ggi)
static walk_rc_t gbp_endpoint_flush_cb(index_t gei, void *args)
clib_error_t *() vlib_init_function_t(struct vlib_main_t *vm)
static_always_inline void gbp_endpoint_mk_key_ip(const ip46_address_t *ip, u32 fib_index, clib_bihash_kv_24_8_t *key)
walk_rc_t(* gbp_endpoint_cb_t)(index_t gbpei, void *ctx)
@ FIB_SOURCE_BH_SIMPLE
add paths without path extensions
Context passed between object during a back walk.
#define FIB_SOURCE_PRIORITY_LOW
void fib_node_child_remove(fib_node_type_t parent_type, fib_node_index_t parent_index, fib_node_index_t sibling_index)
@ FIB_NODE_BW_FLAG_FORCE_SYNC
Force the walk to be synchronous.
@ VXLAN_GBP_TUNNEL
A real VXLAN-GBP tunnel (from vnet/vxlan-gbp/...)
The identity of a DPO is a combination of its type and its instance number/index of objects of that t...
enum fib_source_t_ fib_source_t
The different sources that can create a route.
A Group Based Policy Endpoint.
index_t gbp_bridge_domain_index(const gbp_bridge_domain_t *gbd)
static f64 vlib_time_now(vlib_main_t *vm)
@ foreach_gbp_endpoint_src
u32 remote_ep_timeout
Aging timeout for remote endpoints.
#define GBP_EP_HASH_MEMORY_SIZE
#define INDEX_INVALID
Invalid index - used when no index is known blazoned capitals INVALID speak volumes where ~0 does not...
vl_api_mac_event_action_t action
vl_api_interface_index_t sw_if_index
const mac_address_t * gbp_route_domain_get_remote_mac(void)
static clib_error_t * gbp_endpoint_cli(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
static vlib_cli_command_t gbp_endpoint_cli_node
(constructor) VLIB_CLI_COMMAND (gbp_endpoint_cli_node)
u8 * format_gbp_endpoint_src(u8 *s, va_list *args)
static int gbp_endpoint_loc_cmp_for_sort(gbp_endpoint_loc_t *a, gbp_endpoint_loc_t *b)
uword unformat_mac_address(unformat_input_t *input, va_list *args)
enum walk_rc_t_ walk_rc_t
Walk return code.
void dpo_reset(dpo_id_t *dpo)
reset a DPO ID The DPO will be unlocked.
fib_node_type_t fib_node_register_new_type(const fib_node_vft_t *vft)
Create a new FIB node type and Register the function table for it.
ip46_type_t fib_proto_to_ip46(fib_protocol_t fproto)
Convert from fib_protocol to ip46_type.
gbp_vxlan_tunnel_t * gbp_vxlan_tunnel_get(index_t gti)
Aggregate type for a prefix.
u32 fib_node_child_add(fib_node_type_t parent_type, fib_node_index_t parent_index, fib_node_type_t type, fib_node_index_t index)
vl_api_fib_path_type_t type
#define vec_del1(v, i)
Delete the element at index I.
static const fib_node_vft_t gbp_endpoint_vft
int gbp_endpoint_is_external(const gbp_endpoint_t *ge)
static int gbp_endpoint_loc_is_equal(gbp_endpoint_loc_t *a, gbp_endpoint_loc_t *b)
int gbp_endpoint_is_local(const gbp_endpoint_t *ge)
gbp_itf_hdl_t gbp_itf_clone_and_lock(gbp_itf_hdl_t gh)
static fib_node_type_t gbp_endpoint_fib_type
void gbp_itf_unlock(gbp_itf_hdl_t *gh)
const mac_address_t * gbp_route_domain_get_local_mac(void)
static void gbp_endpoint_last_lock_gone(fib_node_t *node)
vl_api_wireguard_peer_flags_t flags