43 #define vl_print(handle, ...) vlib_cli_output (handle, __VA_ARGS__) 50 #define foreach_vpe_api_msg \ 51 _(MPLS_IP_BIND_UNBIND, mpls_ip_bind_unbind) \ 52 _(MPLS_ROUTE_ADD_DEL, mpls_route_add_del) \ 53 _(MPLS_TUNNEL_ADD_DEL, mpls_tunnel_add_del) \ 54 _(MPLS_TUNNEL_DUMP, mpls_tunnel_dump) \ 55 _(MPLS_FIB_DUMP, mpls_fib_dump) 64 u32 mpls_fib_index, ip_fib_index;
69 if (~0 == mpls_fib_index)
78 return VNET_API_ERROR_NO_SUCH_FIB;
85 if (~0 == ip_fib_index)
86 return VNET_API_ERROR_NO_SUCH_FIB;
118 vl_api_mpls_ip_bind_unbind_reply_t *rmp;
135 u32 fib_index, next_hop_fib_index;
137 int rv, ii, n_labels;;
168 &fib_index, &next_hop_fib_index);
174 memset (&nh, 0,
sizeof (nh));
177 memcpy (&nh.ip4, mp->
mr_next_hop, sizeof (nh.ip4));
179 memcpy (&nh.ip6, mp->
mr_next_hop, sizeof (nh.ip6));
184 else if (1 == n_labels)
189 for (ii = 0; ii < n_labels; ii++)
216 vl_api_mpls_route_add_del_reply_t *rmp;
235 u32 tunnel_sw_if_index;
239 memset (&rpath, 0,
sizeof (rpath));
271 if (~0 == tunnel_sw_if_index)
323 mp->_vl_msg_id = ntohs (VL_API_MPLS_TUNNEL_DETAILS);
334 memset (fp, 0,
sizeof (*fp));
378 path_count =
vec_len (api_rpaths);
382 memset (mp, 0,
sizeof (*mp));
383 mp->_vl_msg_id = ntohs (VL_API_MPLS_FIB_DETAILS);
388 mp->
label = htonl (label);
390 mp->
count = htonl (path_count);
394 memset (fp, 0,
sizeof (*fp));
442 mpls_fib_table_walk (mpls_fib,
443 vl_api_mpls_fib_dump_table_walk,
472 #define vl_msg_name_crc_list 474 #undef vl_msg_name_crc_list 479 #define _(id,n,crc) vl_msg_api_add_msg_name_crc (am, #n "_" #crc, id); 480 foreach_vl_msg_name_crc_mpls;
490 vl_msg_api_set_handlers(VL_API_##N, #n, \ 491 vl_api_##n##_t_handler, \ 493 vl_api_##n##_t_endian, \ 494 vl_api_##n##_t_print, \ 495 sizeof(vl_api_##n##_t), 1);
Bind/Unbind an MPLS local label to an IP prefix.
#define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment) ...
fib_protocol_t fp_proto
protocol type
u32 fib_entry_get_fib_index(fib_node_index_t fib_entry_index)
fib_protocol_t frp_proto
The protocol of the address below.
ip46_address_t frp_addr
The next-hop address.
A representation of a fib path for fib_path_encode to convey the information to the caller...
struct vl_api_mpls_fib_dump_table_walk_ctx_t_ vl_api_mpls_fib_dump_table_walk_ctx_t
int add_del_route_check(fib_protocol_t table_proto, u32 table_id, u32 next_hop_sw_if_index, fib_protocol_t next_hop_table_proto, u32 next_hop_table_id, u8 create_missing_tables, u8 is_rpf_id, u32 *fib_index, u32 *next_hop_fib_index)
A representation of a path as described by a route producer.
vnet_main_t * vnet_get_main(void)
u8 mt_next_hop_n_out_labels
fib_node_index_t mt_path_list
The path-list over which the tunnel's destination is reachable.
u32 mr_next_hop_out_label_stack[mr_next_hop_n_out_labels]
void fib_entry_get_prefix(fib_node_index_t fib_entry_index, fib_prefix_t *pfx)
#define REPLY_MACRO2(t, body)
static void send_mpls_tunnel_entry(u32 mti, void *arg)
struct mpls_tunnel_send_walk_ctx_t_ mpls_tunnel_send_walk_ctx_t
A uni-directional MPLS tunnel.
u32 mpls_label_t
A label value only, i.e.
u32 mr_classify_table_index
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
u8 mb_create_table_if_needed
void fib_path_list_walk(fib_node_index_t path_list_index, fib_path_list_walk_fn_t func, void *ctx)
u8 mr_next_hop_proto_is_ip4
u32 mt_next_hop_sw_if_index
vl_api_fib_path2_t path[count]
const mpls_tunnel_t * mpls_tunnel_get(u32 mti)
#define foreach_vpe_api_msg
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.
trace_cfg_t * api_trace_cfg
int add_del_route_t_handler(u8 is_multipath, u8 is_add, u8 is_drop, u8 is_unreach, u8 is_prohibit, u8 is_local, u8 is_multicast, u8 is_classify, u32 classify_table_index, u8 is_resolve_host, u8 is_resolve_attached, u8 is_interface_rx, u8 is_rpf_id, u32 fib_index, const fib_prefix_t *prefix, u8 next_hop_proto_is_ip4, const ip46_address_t *next_hop, u32 next_hop_sw_if_index, u8 next_hop_fib_index, u32 next_hop_weight, mpls_label_t next_hop_via_label, mpls_label_t *next_hop_out_label_stack)
static void vl_api_mpls_tunnel_add_del_t_handler(vl_api_mpls_tunnel_add_del_t *mp)
void vl_api_mpls_route_add_del_t_handler(vl_api_mpls_route_add_del_t *mp)
dpo_proto_t fp_payload_proto
This protocol determines the payload protocol of packets that will be forwarded by this entry once th...
static void vl_api_mpls_fib_dump_t_handler(vl_api_mpls_fib_dump_t *mp)
static void send_mpls_fib_details(vpe_api_main_t *am, unix_shared_memory_queue_t *q, u32 table_id, u32 label, u32 eos, fib_route_path_encode_t *api_rpaths, u32 context)
#define pool_foreach(VAR, POOL, BODY)
Iterate through pool.
u32 frp_sw_if_index
The interface.
mpls_label_t * frp_label_stack
The outgoing MPLS label Stack.
static clib_error_t * mpls_api_hookup(vlib_main_t *vm)
Aggregrate type for a prefix.
void stats_dsunlock(void)
u32 fib_table_find(fib_protocol_t proto, u32 table_id)
Get the index of the FIB for a Table-ID.
fib_protocol_t dpo_proto_to_fib(dpo_proto_t dpo_proto)
u16 fp_len
The mask length.
Dump mpls eth tunnel table.
int fib_entry_cmp_for_sort(void *i1, void *i2)
u32 mr_next_hop_via_label
void * vl_msg_api_alloc(int nbytes)
vnet_api_error_t api_errno
void vnet_mpls_tunnel_del(u32 sw_if_index)
Delete an MPLS tunnel.
u8 mr_next_hop_n_out_labels
ip46_address_t fp_addr
The address type is not deriveable from the fp_addr member.
u8 mt_next_hop_proto_is_ip4
static int mpls_ip_bind_unbind_handler(vnet_main_t *vnm, vl_api_mpls_ip_bind_unbind_t *mp)
MPLS Route Add / del route.
u32 mt_next_hop_out_label_stack[mt_next_hop_n_out_labels]
static int mpls_route_add_del_t_handler(vnet_main_t *vnm, vl_api_mpls_route_add_del_t *mp)
Reply for MPLS tunnel add / del request.
vl_api_fib_path2_t mt_paths[mt_count]
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.
u32 ft_table_id
Table ID (hash key) for this FIB.
#define vec_free(V)
Free vector's memory (no header).
u32 frp_weight
[un]equal cost path weight
#define clib_memcpy(a, b, c)
unix_shared_memory_queue_t * vl_api_client_index_to_input_queue(u32 index)
u32 fib_path_list_get_n_paths(fib_node_index_t path_list_index)
u32 fib_node_index_t
A typedef of a node index.
void mpls_tunnel_walk(mpls_tunnel_walk_cb_t cb, void *ctx)
Walk all the MPLS tunnels.
unix_shared_memory_queue_t * q
void vl_msg_api_send_shmem(unix_shared_memory_queue_t *q, u8 *elem)
u32 vnet_mpls_tunnel_create(u8 l2_only, u8 is_multicast)
Create a new MPLS tunnel.
int vnet_mpls_tunnel_path_remove(u32 sw_if_index, fib_route_path_t *rpaths)
remove a path from a tunnel.
MPLS tunnel Add / del route.
fib_path_list_walk_rc_t fib_path_encode(fib_node_index_t path_list_index, fib_node_index_t path_index, void *ctx)
static int vl_api_mpls_fib_dump_table_walk(fib_node_index_t fei, void *arg)
u32 fib_table_find_or_create_and_lock(fib_protocol_t proto, u32 table_id)
Get the index of the FIB for a Table-ID.
u8 mr_is_resolve_attached
u32 mr_next_hop_sw_if_index
void fib_entry_encode(fib_node_index_t fib_entry_index, fib_route_path_encode_t **api_rpaths)
void vnet_mpls_tunnel_path_add(u32 sw_if_index, fib_route_path_t *rpaths)
Add a path to an MPLS tunnel.
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
static void vl_api_mpls_tunnel_dump_t_handler(vl_api_mpls_tunnel_dump_t *mp)
VLIB_API_INIT_FUNCTION(mpls_api_hookup)
#define vec_sort_with_function(vec, f)
Sort a vector using the supplied element comparison function.
void stats_dslock_with_hint(int hint, int tag)
void copy_fib_next_hop(fib_route_path_encode_t *api_rpath, void *fp_arg)
fib_table_t * fib_table_get(fib_node_index_t index, fib_protocol_t proto)
Get a pointer to a FIB table.
#define vec_foreach(var, vec)
Vector iterator.
vpe_api_main_t vpe_api_main
static void setup_message_id_table(api_main_t *am)
u8 mr_create_table_if_needed
struct mpls_fib_t_ * mpls_fibs
A pool of all the MPLS FIBs.
void vl_api_mpls_ip_bind_unbind_t_handler(vl_api_mpls_ip_bind_unbind_t *mp)
A protocol Independent FIB table.
struct _unix_shared_memory_queue unix_shared_memory_queue_t