44 #define vl_api_bridge_domain_details_t_endian vl_noop_handler 45 #define vl_api_bridge_domain_details_t_print vl_noop_handler 48 #define vl_print(handle, ...) vlib_cli_output (handle, __VA_ARGS__) 55 #define foreach_vpe_api_msg \ 56 _(L2_XCONNECT_DUMP, l2_xconnect_dump) \ 57 _(L2_FIB_CLEAR_TABLE, l2_fib_clear_table) \ 58 _(L2_FIB_TABLE_DUMP, l2_fib_table_dump) \ 59 _(L2FIB_FLUSH_ALL, l2fib_flush_all) \ 60 _(L2FIB_FLUSH_INT, l2fib_flush_int) \ 61 _(L2FIB_FLUSH_BD, l2fib_flush_bd) \ 62 _(L2FIB_ADD_DEL, l2fib_add_del) \ 63 _(WANT_L2_MACS_EVENTS, want_l2_macs_events) \ 64 _(L2_FLAGS, l2_flags) \ 65 _(SW_INTERFACE_SET_L2_XCONNECT, sw_interface_set_l2_xconnect) \ 66 _(SW_INTERFACE_SET_L2_BRIDGE, sw_interface_set_l2_bridge) \ 67 _(L2_PATCH_ADD_DEL, l2_patch_add_del) \ 68 _(L2_INTERFACE_EFP_FILTER, l2_interface_efp_filter) \ 69 _(BD_IP_MAC_ADD_DEL, bd_ip_mac_add_del) \ 70 _(BD_IP_MAC_FLUSH, bd_ip_mac_flush) \ 71 _(BD_IP_MAC_DUMP, bd_ip_mac_dump) \ 72 _(BRIDGE_DOMAIN_ADD_DEL, bridge_domain_add_del) \ 73 _(BRIDGE_DOMAIN_DUMP, bridge_domain_dump) \ 74 _(BRIDGE_FLAGS, bridge_flags) \ 75 _(L2_INTERFACE_VLAN_TAG_REWRITE, l2_interface_vlan_tag_rewrite) \ 76 _(L2_INTERFACE_PBB_TAG_REWRITE, l2_interface_pbb_tag_rewrite) \ 77 _(BRIDGE_DOMAIN_SET_MAC_AGE, bridge_domain_set_mac_age) \ 78 _(SW_INTERFACE_SET_VPATH, sw_interface_set_vpath) \ 79 _(BVI_CREATE, bvi_create) \ 80 _(BVI_DELETE, bvi_delete) 84 u32 rx_sw_if_index,
u32 tx_sw_if_index)
90 mp->_vl_msg_id = ntohs (VL_API_L2_XCONNECT_DETAILS);
115 config = vec_elt_at_index (l2im->configs, swif->sw_if_index);
116 if (config->xconnect)
117 send_l2_xconnect_details (reg, mp->context, swif->sw_if_index,
118 config->output_sw_if_index);
127 vl_api_l2_fib_clear_table_reply_t *rmp;
145 mp->_vl_msg_id = ntohs (VL_API_L2_FIB_TABLE_DETAILS);
152 mp->
static_mac = (l2fib_entry_result_is_set_STATIC (l2fe_res) ? 1 : 0);
153 mp->
filter_mac = (l2fib_entry_result_is_set_FILTER (l2fe_res) ? 1 : 0);
154 mp->
bvi_mac = (l2fib_entry_result_is_set_BVI (l2fe_res) ? 1 : 0);
204 vl_api_l2fib_add_del_reply_t *rmp;
211 rv = VNET_API_ERROR_NO_SUCH_ENTRY;
212 goto bad_sw_if_index;
230 rv = VNET_API_ERROR_INVALID_SW_IF_INDEX;
231 goto bad_sw_if_index;
239 rv = VNET_API_ERROR_INVALID_SW_IF_INDEX;
240 goto bad_sw_if_index;
244 flags |= L2FIB_ENTRY_RESULT_FLAG_STATIC;
246 flags |= L2FIB_ENTRY_RESULT_FLAG_BVI;
254 rv = VNET_API_ERROR_NO_SUCH_ENTRY;
266 vl_api_want_l2_macs_events_reply_t *rmp;
269 u32 pid = ntohl (mp->
pid);
299 rv = VNET_API_ERROR_L2_MACS_EVENT_CLINET_PRESENT;
322 vl_api_l2fib_flush_int_reply_t *rmp;
337 vl_api_l2fib_flush_all_reply_t *rmp;
349 vl_api_l2fib_flush_bd_reply_t *rmp;
355 rv = VNET_API_ERROR_NO_SUCH_ENTRY;
377 bitmap |= L2INPUT_FEAT_LEARN;
380 bitmap |= L2INPUT_FEAT_FWD;
383 bitmap |= L2INPUT_FEAT_FLOOD;
386 bitmap |= L2INPUT_FEAT_UU_FLOOD;
389 bitmap |= L2INPUT_FEAT_ARP_TERM;
409 vl_api_bridge_domain_set_mac_age_reply_t *rmp;
416 rv = VNET_API_ERROR_BD_NOT_MODIFIABLE;
423 rv = VNET_API_ERROR_NO_SUCH_ENTRY;
428 REPLY_MACRO (VL_API_BRIDGE_DOMAIN_SET_MAC_AGE_REPLY);
443 .bd_id = ntohl (mp->
bd_id),
449 vl_api_bridge_domain_add_del_reply_t *rmp;
467 mp->_vl_msg_id = ntohs (VL_API_BRIDGE_DOMAIN_DETAILS);
480 strncpy ((
char *) mp->
bd_tag, (
char *) bd_config->
bd_tag,
492 sw_ifs->
shg = input_cfg->
shg;
513 bd_id = ntohl (mp->
bd_id);
528 for (; bd_index < end; bd_index++)
533 if (bd_config && (bd_config->
bd_id > 0))
576 rv = VNET_API_ERROR_BD_NOT_MODIFIABLE;
583 rv = VNET_API_ERROR_NO_SUCH_ENTRY;
603 vl_api_l2_interface_vlan_tag_rewrite_reply_t *rmp;
610 vtr_op = ntohl (mp->
vtr_op);
627 rv = VNET_API_ERROR_INVALID_VALUE;
628 goto bad_sw_if_index;
637 REPLY_MACRO (VL_API_L2_INTERFACE_VLAN_TAG_REWRITE_REPLY);
644 vl_api_l2_interface_pbb_tag_rewrite_reply_t *rmp;
652 vtr_op = ntohl (mp->
vtr_op);
663 rv = VNET_API_ERROR_INVALID_VALUE;
664 goto bad_sw_if_index;
673 REPLY_MACRO (VL_API_L2_INTERFACE_PBB_TAG_REWRITE_REPLY);
680 vl_api_sw_interface_set_l2_xconnect_reply_t *rmp;
705 rv = VNET_API_ERROR_NON_ETHERNET;
708 rv = VNET_API_ERROR_BD_ALREADY_HAS_BVI;
715 REPLY_MACRO (VL_API_SW_INTERFACE_SET_L2_XCONNECT_REPLY);
721 v = clib_net_to_host_u32 (v);
736 return (VNET_API_ERROR_INVALID_VALUE);
744 vl_api_sw_interface_set_l2_bridge_reply_t *rmp;
763 rx_sw_if_index, bd_index, pt, mp->
shg, 0);
773 rv = VNET_API_ERROR_NON_ETHERNET;
776 rv = VNET_API_ERROR_BD_ALREADY_HAS_BVI;
783 REPLY_MACRO (VL_API_SW_INTERFACE_SET_L2_BRIDGE_REPLY);
790 const ip46_address_t *
ip,
798 mp->_vl_msg_id = ntohs (VL_API_BD_IP_MAC_DETAILS);
801 mp->
entry.bd_id = ntohl (bd_id);
816 u32 bd_index, start, end;
842 for (bd_index = start; bd_index < end; bd_index++)
851 bd_id = bd_config->
bd_id;
856 ip46_address_t ip = {
867 ip46_address_t ip = {
884 vl_api_bd_ip_mac_add_del_reply_t *rmp;
892 bd_id = ntohl (mp->
entry.bd_id);
896 rv = VNET_API_ERROR_BD_NOT_MODIFIABLE;
903 rv = VNET_API_ERROR_NO_SUCH_ENTRY;
912 rv = VNET_API_ERROR_UNSPECIFIED;
921 vl_api_bd_ip_mac_flush_reply_t *rmp;
927 bd_id = ntohl (mp->
bd_id);
931 rv = VNET_API_ERROR_BD_NOT_MODIFIABLE;
938 rv = VNET_API_ERROR_NO_SUCH_ENTRY;
950 u32 sw_if_index,
u8 enable);
957 vl_api_l2_interface_efp_filter_reply_t *rmp;
967 REPLY_MACRO (VL_API_L2_INTERFACE_EFP_FILTER_REPLY);
975 vl_api_l2_patch_add_del_reply_t *rmp;
996 vl_api_sw_interface_set_vpath_reply_t *rmp;
1004 sw_if_index, mp->
enable, 0, 0);
1006 sw_if_index, mp->
enable, 0, 0);
1008 sw_if_index, mp->
enable, 0, 0);
1010 sw_if_index, mp->
enable, 0, 0);
1014 REPLY_MACRO (VL_API_SW_INTERFACE_SET_VPATH_REPLY);
1040 vl_api_bvi_delete_reply_t *rmp;
1055 #define vl_msg_name_crc_list 1057 #undef vl_msg_name_crc_list 1062 #define _(id,n,crc) vl_msg_api_add_msg_name_crc (am, #n "_" #crc, id); 1063 foreach_vl_msg_name_crc_l2;
1073 vl_msg_api_set_handlers(VL_API_##N, #n, \ 1074 vl_api_##n##_t_handler, \ 1076 vl_api_##n##_t_endian, \ 1077 vl_api_##n##_t_print, \ 1078 sizeof(vl_api_##n##_t), 1); 1083 am->
is_mp_safe[VL_API_BRIDGE_DOMAIN_DUMP] = 1;
#define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment) ...
static void vl_api_l2_fib_table_dump_t_handler(vl_api_l2_fib_table_dump_t *mp)
#define BAD_RX_SW_IF_INDEX_LABEL
static bd_flags_t bd_flags_decode(vl_api_bd_flags_t v)
#define vec_foreach_index(var, v)
Iterate over vector indices.
L2 FIB add entry request.
l2_input_config_t * configs
Set bridge flags response.
#define VALIDATE_TX_SW_IF_INDEX(mp)
l2 fib table details structure
static void vl_api_bvi_delete_t_handler(vl_api_bvi_delete_t *mp)
u32 l2vtr_configure(vlib_main_t *vlib_main, vnet_main_t *vnet_main, u32 sw_if_index, u32 vtr_op, u32 push_dot1q, u32 vtr_tag1, u32 vtr_tag2)
Configure vtag tag rewrite on the given interface.
vl_api_l2_port_type_t port_type
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.
vnet_main_t * vnet_get_main(void)
static void vl_api_sw_interface_set_l2_bridge_t_handler(vl_api_sw_interface_set_l2_bridge_t *mp)
Create BVI interface instance request.
void mac_address_encode(const mac_address_t *in, u8 *out)
static void vl_api_l2_patch_add_del_t_handler(vl_api_l2_patch_add_del_t *mp)
static void vl_api_l2_flags_t_handler(vl_api_l2_flags_t *mp)
vnet_interface_main_t interface_main
u32 resulting_feature_bitmap
#define REPLY_MACRO2(t, body)
clib_memset(h->entries, 0, sizeof(h->entries[0]) *entries)
static void vl_api_send_msg(vl_api_registration_t *rp, u8 *elem)
VLIB_API_INIT_FUNCTION(l2_api_hookup)
struct l2fib_entry_result_t_::@287::@289 fields
L2 bridge domain set mac age.
l2_flood_member_t * members
static void vl_api_bridge_domain_add_del_t_handler(vl_api_bridge_domain_add_del_t *mp)
static void send_l2_xconnect_details(vl_api_registration_t *reg, u32 context, u32 rx_sw_if_index, u32 tx_sw_if_index)
static void vl_api_bd_ip_mac_dump_t_handler(vl_api_bd_ip_mac_dump_t *mp)
enum l2fib_entry_result_flags_t_ l2fib_entry_result_flags_t
L2 bridge domain request operational state details.
int bd_add_del(l2_bridge_domain_add_del_args_t *a)
bridge domain IP to MAC entry details structure
static void vl_api_l2fib_add_del_t_handler(vl_api_l2fib_add_del_t *mp)
void * vl_msg_api_alloc(int nbytes)
#define clib_memcpy(d, s, n)
Reply to l2_xconnect_dump.
L2 bridge domain operational state response.
l2learn_main_t l2learn_main
#define pool_foreach(VAR, POOL, BODY)
Iterate through pool.
static void vl_api_bd_ip_mac_flush_t_handler(vl_api_bd_ip_mac_flush_t *mp)
vl_api_interface_index_t sw_if_index
L2 bridge domain sw interface operational state response.
#define hash_foreach(key_var, value_var, h, body)
#define vec_elt_at_index(v, i)
Get vector value at index i checking that i is in bounds.
static void vl_api_l2_fib_clear_table_t_handler(vl_api_l2_fib_clear_table_t *mp)
L2 FIB flush bridge domain entries.
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.
uword * bd_index_by_bd_id
struct l2fib_entry_key_t::@279::@281 fields
ip46_type_t ip_address_decode(const vl_api_address_t *in, ip46_address_t *out)
Dump l2 fib (aka bridge domain) table.
vl_api_fib_path_type_t type
vnet_api_error_t api_errno
Set interface L2 flags (such as L2_LEARN, L2_FWD, L2_FLOOD, L2_UU_FLOOD, or L2_ARP_TERM bits)...
L2 FIB flush all entries.
L2 fib clear table request, clear all mac entries in the l2 fib.
Set interface L2 flags response.
void l2fib_flush_bd_mac(vlib_main_t *vm, u32 bd_index)
Flush all non static MACs in a bridge domain.
enum l2_bd_port_type_t_ l2_bd_port_type_t
static void vl_api_bd_ip_mac_add_del_t_handler(vl_api_bd_ip_mac_add_del_t *mp)
#define BAD_TX_SW_IF_INDEX_LABEL
void l2fib_flush_all_mac(vlib_main_t *vm)
Flush all non static MACs - flushes all valid BDs.
static_always_inline void mac_address_from_u64(mac_address_t *mac, u64 u)
Create BVI interface instance response.
#define hash_foreach_mem(key_var, value_var, h, body)
static clib_error_t * l2_api_hookup(vlib_main_t *vm)
#define L2FIB_EVENT_MAX_MACS_DEFAULT
static u32 bd_is_valid(l2_bridge_domain_t *bd_config)
#define ip46_address_initializer
API main structure, used by both vpp and binary API clients.
u32 l2pbb_configure(vlib_main_t *vlib_main, vnet_main_t *vnet_main, u32 sw_if_index, u32 vtr_op, u8 *b_dmac, u8 *b_smac, u16 b_vlanid, u32 i_sid, u16 vlan_outer_tag)
void bd_set_mac_age(vlib_main_t *vm, u32 bd_index, u8 age)
Set the mac age for the bridge domain.
An API client registration, only in vpp/vlib.
#define BAD_SW_IF_INDEX_LABEL
static void send_bridge_domain_details(l2input_main_t *l2im, vl_api_registration_t *reg, l2_bridge_domain_t *bd_config, u32 n_sw_ifs, u32 context)
u32 l2fib_del_entry(const u8 *mac, u32 bd_index, u32 sw_if_index)
Delete an entry from the l2fib.
int l2_bvi_delete(u32 sw_if_index)
static void send_bd_ip_mac_entry(vpe_api_main_t *am, vl_api_registration_t *reg, u32 bd_id, const ip46_address_t *ip, ip46_type_t itype, const mac_address_t *mac, u32 context)
static void vl_api_l2_xconnect_dump_t_handler(vl_api_l2_xconnect_dump_t *mp)
#define vec_free(V)
Free vector's memory (no header).
#define foreach_vpe_api_msg
u32 bd_set_flags(vlib_main_t *vm, u32 bd_index, bd_flags_t flags, u32 enable)
Set the learn/forward/flood flags for the bridge domain.
static void setup_message_id_table(api_main_t *am)
void l2fib_clear_table(void)
static vl_api_registration_t * vl_api_client_index_to_registration(u32 index)
#define VALIDATE_RX_SW_IF_INDEX(mp)
Dump bridge domain IP to MAC entries.
void bd_flush_ip_mac(u32 bd_index)
Flush IP address to MAC address mapping tables in a BD.
#define L2FIB_EVENT_SCAN_DELAY_DEFAULT
Set L2 XConnect between two interfaces request.
static u32 bd_find_or_add_bd_index(bd_main_t *bdm, u32 bd_id)
Get or create a bridge domain.
Register to receive L2 MAC events for learned and aged MAC.
#define VALIDATE_BD_ID(mp)
static vlib_main_t * vlib_get_main(void)
u32 resulting_feature_bitmap
static void vl_api_l2_interface_vlan_tag_rewrite_t_handler(vl_api_l2_interface_vlan_tag_rewrite_t *mp)
Interface bridge mode request.
#define L2FIB_EVENT_LEARN_LIMIT_DEFAULT
static void vl_api_sw_interface_set_l2_xconnect_t_handler(vl_api_sw_interface_set_l2_xconnect_t *mp)
static void vl_api_bvi_create_t_handler(vl_api_bvi_create_t *mp)
L2 FIB flush interface entries.
static void vl_api_l2fib_flush_bd_t_handler(vl_api_l2fib_flush_bd_t *mp)
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
static void vl_api_want_l2_macs_events_t_handler(vl_api_want_l2_macs_events_t *mp)
L2 interface ethernet flow point filtering enable/disable request.
static void vl_api_bridge_flags_t_handler(vl_api_bridge_flags_t *mp)
int vnet_l2_patch_add_del(u32 rx_sw_if_index, u32 tx_sw_if_index, int is_add)
vnet_sw_interface_t * sw_interfaces
static void vl_api_l2_interface_efp_filter_t_handler(vl_api_l2_interface_efp_filter_t *mp)
L2 interface vlan tag rewrite configure request.
static void vl_api_l2fib_flush_all_t_handler(vl_api_l2fib_flush_all_t *mp)
l2_bridge_domain_t * bd_configs
static void l2fib_add_filter_entry(const u8 *mac, u32 bd_index)
static void vl_api_bridge_domain_set_mac_age_t_handler(vl_api_bridge_domain_set_mac_age_t *mp)
void ip_address_encode(const ip46_address_t *in, ip46_type_t type, vl_api_address_t *out)
L2 interface patch add / del request.
void l2fib_table_dump(u32 bd_index, l2fib_entry_key_t **l2fe_key, l2fib_entry_result_t **l2fe_res)
static void send_l2fib_table_entry(vpe_api_main_t *am, vl_api_registration_t *reg, l2fib_entry_key_t *l2fe_key, l2fib_entry_result_t *l2fe_res, u32 context)
Interface set vpath request.
static int l2_bd_port_type_decode(vl_api_l2_port_type_t v, l2_bd_port_type_t *l)
u8 * is_mp_safe
Message is mp safe vector.
L2 interface pbb tag rewrite configure request.
#define vec_foreach(var, vec)
Vector iterator.
Set bridge flags request.
Delete BVI interface request.
vl_api_bridge_domain_sw_if_t sw_if_details[n_sw_ifs]
u32 bd_find_index(bd_main_t *bdm, u32 bd_id)
Get a bridge domain.
vpe_api_main_t vpe_api_main
void l2_efp_filter_configure(vnet_main_t *vnet_main, u32 sw_if_index, u8 enable)
Enable/disable the EFP Filter check on the subinterface.
void mac_address_decode(const u8 *in, mac_address_t *out)
Conversion functions to/from (decode/encode) API types to VPP internal types.
void l2fib_flush_int_mac(vlib_main_t *vm, u32 sw_if_index)
Flush all non static MACs from an interface.
static void vl_api_l2fib_flush_int_t_handler(vl_api_l2fib_flush_int_t *mp)
Flush bridge domain IP to MAC entries.
static void vl_api_l2_interface_pbb_tag_rewrite_t_handler(vl_api_l2_interface_pbb_tag_rewrite_t *mp)
#define L2LEARN_DEFAULT_LIMIT
int vnet_feature_enable_disable(const char *arc_name, const char *node_name, u32 sw_if_index, int enable_disable, void *feature_config, u32 n_feature_config_bytes)
int l2_bvi_create(u32 user_instance, const mac_address_t *mac_in, u32 *sw_if_indexp)
#define VALIDATE_SW_IF_INDEX(mp)
enum bd_flags_t_ bd_flags_t
static void vl_api_bridge_domain_dump_t_handler(vl_api_bridge_domain_dump_t *mp)
L2 bridge domain add or delete request.
static void vl_api_sw_interface_set_vpath_t_handler(vl_api_sw_interface_set_vpath_t *mp)