X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Finterface_api.c;h=bfd2af31a58253c915b284a4d705a8a46e2fb21c;hb=cc078488b4464b4de118c2cde1eb908f5802ae2b;hp=42fd14ee19df423b68540ec73d0b092660e82f80;hpb=7cd468a3d7dee7d6c92f69a0bb7061ae208ec727;p=vpp.git diff --git a/src/vnet/interface_api.c b/src/vnet/interface_api.c index 42fd14ee19d..bfd2af31a58 100644 --- a/src/vnet/interface_api.c +++ b/src/vnet/interface_api.c @@ -25,9 +25,11 @@ #include #include #include +#include #include #include #include +#include #define vl_typedefs /* define message structures */ #include @@ -50,7 +52,6 @@ _(SW_INTERFACE_SET_FLAGS, sw_interface_set_flags) \ _(SW_INTERFACE_SET_MTU, sw_interface_set_mtu) \ _(WANT_INTERFACE_EVENTS, want_interface_events) \ _(SW_INTERFACE_DUMP, sw_interface_dump) \ -_(SW_INTERFACE_DETAILS, sw_interface_details) \ _(SW_INTERFACE_ADD_DEL_ADDRESS, sw_interface_add_del_address) \ _(SW_INTERFACE_SET_TABLE, sw_interface_set_table) \ _(SW_INTERFACE_GET_TABLE, sw_interface_get_table) \ @@ -203,6 +204,26 @@ send_sw_interface_details (vpe_api_main_t * am, } } + /* pbb tag rewrite data */ + u32 vtr_op = L2_VTR_DISABLED; + u16 outer_tag = 0; + u8 b_dmac[6]; + u8 b_smac[6]; + u16 b_vlanid = 0; + u32 i_sid = 0; + memset (b_dmac, 0, sizeof (b_dmac)); + memset (b_smac, 0, sizeof (b_smac)); + + if (!l2pbb_get (am->vlib_main, am->vnet_main, swif->sw_if_index, + &vtr_op, &outer_tag, b_dmac, b_smac, &b_vlanid, &i_sid)) + { + mp->sub_dot1ah = 1; + clib_memcpy (mp->b_dmac, b_dmac, sizeof (b_dmac)); + clib_memcpy (mp->b_smac, b_smac, sizeof (b_smac)); + mp->b_vlanid = b_vlanid; + mp->i_sid = i_sid; + } + tag = vnet_get_sw_interface_tag (vnm, swif->sw_if_index); if (tag) strncpy ((char *) mp->tag, (char *) tag, ARRAY_LEN (mp->tag) - 1); @@ -299,6 +320,7 @@ vl_api_sw_interface_set_table_t_handler (vl_api_sw_interface_set_table_t * mp) u32 table_id = ntohl (mp->vrf_id); u32 sw_if_index = ntohl (mp->sw_if_index); vl_api_sw_interface_set_table_reply_t *rmp; + CLIB_UNUSED (ip_interface_address_t * ia); u32 fib_index; VALIDATE_SW_IF_INDEX (mp); @@ -307,21 +329,50 @@ vl_api_sw_interface_set_table_t_handler (vl_api_sw_interface_set_table_t * mp) if (mp->is_ipv6) { + /* *INDENT-OFF* */ + foreach_ip_interface_address (&ip6_main.lookup_main, + ia, sw_if_index, + 1 /* honor unnumbered */ , + ({ + rv = VNET_API_ERROR_ADDRESS_FOUND_FOR_INTERFACE; + goto done; + })); + /* *INDENT-ON* */ + fib_index = fib_table_find_or_create_and_lock (FIB_PROTOCOL_IP6, table_id); - vec_validate (ip6_main.fib_index_by_sw_if_index, sw_if_index); ip6_main.fib_index_by_sw_if_index[sw_if_index] = fib_index; + + fib_index = mfib_table_find_or_create_and_lock (FIB_PROTOCOL_IP6, + table_id); + vec_validate (ip6_main.mfib_index_by_sw_if_index, sw_if_index); + ip6_main.mfib_index_by_sw_if_index[sw_if_index] = fib_index; } else { + /* *INDENT-OFF* */ + foreach_ip_interface_address (&ip4_main.lookup_main, + ia, sw_if_index, + 1 /* honor unnumbered */ , + ({ + rv = VNET_API_ERROR_ADDRESS_FOUND_FOR_INTERFACE; + goto done; + })); + /* *INDENT-ON* */ fib_index = fib_table_find_or_create_and_lock (FIB_PROTOCOL_IP4, table_id); - vec_validate (ip4_main.fib_index_by_sw_if_index, sw_if_index); ip4_main.fib_index_by_sw_if_index[sw_if_index] = fib_index; + + fib_index = mfib_table_find_or_create_and_lock (FIB_PROTOCOL_IP4, + table_id); + vec_validate (ip4_main.mfib_index_by_sw_if_index, sw_if_index); + ip4_main.mfib_index_by_sw_if_index[sw_if_index] = fib_index; } + +done: stats_dsunlock (); BAD_SW_IF_INDEX_LABEL; @@ -664,12 +715,6 @@ out: REPLY_MACRO (VL_API_SW_INTERFACE_TAG_ADD_DEL_REPLY); } -static void -vl_api_sw_interface_details_t_handler (vl_api_sw_interface_details_t * mp) -{ - clib_warning ("BUG"); -} - /* * vpe_api_hookup * Add vpe's API message handlers to the table.