X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fplugins%2Fgbp%2Fgbp_bridge_domain.c;h=8896669002c99b475498ab9aae49702b07d57bb8;hb=7363d479655d6dd2b8fc6cd93faded8e76bf4412;hp=261b568390359800ff43b7e7a43e8f1d5880f271;hpb=4689da0c6104435f86fab19e6bb4d1342ce4dcaf;p=vpp.git diff --git a/src/plugins/gbp/gbp_bridge_domain.c b/src/plugins/gbp/gbp_bridge_domain.c index 261b5683903..8896669002c 100644 --- a/src/plugins/gbp/gbp_bridge_domain.c +++ b/src/plugins/gbp/gbp_bridge_domain.c @@ -15,7 +15,7 @@ #include #include -#include +#include #include #include @@ -121,11 +121,17 @@ format_gbp_bridge_domain_flags (u8 * s, va_list * args) if (gf) { if (gf & GBP_BD_FLAG_DO_NOT_LEARN) - s = format (s, "do-not-learn"); + s = format (s, "do-not-learn "); + if (gf & GBP_BD_FLAG_UU_FWD_DROP) + s = format (s, "uu-fwd-drop "); + if (gf & GBP_BD_FLAG_MCAST_DROP) + s = format (s, "mcast-drop "); + if (gf & GBP_BD_FLAG_UCAST_ARP) + s = format (s, "ucast-arp "); } else { - s = format (s, "noe"); + s = format (s, "none"); } return (s); } @@ -183,10 +189,11 @@ gbp_bridge_domain_add_and_lock (u32 bd_id, if (~0 == bd_index) return (VNET_API_ERROR_BD_NOT_MODIFIABLE); - /* - * unset learning in the bridge - */ - bd_set_flags (vlib_get_main (), bd_index, L2_LEARN, 0); + bd_flags_t bd_flags = L2_LEARN; + if (flags & GBP_BD_FLAG_UU_FWD_DROP) + bd_flags |= L2_UU_FLOOD; + if (flags & GBP_BD_FLAG_MCAST_DROP) + bd_flags |= L2_FLOOD; pool_get (gbp_bridge_domain_pool, gb); memset (gb, 0, sizeof (*gb)); @@ -205,21 +212,28 @@ gbp_bridge_domain_add_and_lock (u32 bd_id, set_int_l2_mode (vlib_get_main (), vnet_get_main (), MODE_L2_BRIDGE, gb->gb_bvi_sw_if_index, bd_index, L2_BD_PORT_TYPE_BVI, 0, 0); - if (~0 != gb->gb_uu_fwd_sw_if_index) + + if (!(flags & GBP_BD_FLAG_UU_FWD_DROP) + && ~0 != gb->gb_uu_fwd_sw_if_index) { set_int_l2_mode (vlib_get_main (), vnet_get_main (), MODE_L2_BRIDGE, gb->gb_uu_fwd_sw_if_index, bd_index, L2_BD_PORT_TYPE_UU_FWD, 0, 0); - gbp_sclass_enable_l2 (gb->gb_uu_fwd_sw_if_index); } - if (~0 != gb->gb_bm_flood_sw_if_index) + if (!(flags & GBP_BD_FLAG_MCAST_DROP) + && ~0 != gb->gb_bm_flood_sw_if_index) { set_int_l2_mode (vlib_get_main (), vnet_get_main (), MODE_L2_BRIDGE, gb->gb_bm_flood_sw_if_index, bd_index, L2_BD_PORT_TYPE_NORMAL, 0, 0); - gbp_sclass_enable_l2 (gb->gb_bm_flood_sw_if_index); + gbp_learn_enable (gb->gb_bm_flood_sw_if_index, GBP_LEARN_MODE_L2); } + /* + * unset learning in the bridge + any flag(s) set above + */ + bd_set_flags (vlib_get_main (), bd_index, bd_flags, 0); + /* * Add the BVI's MAC to the L2FIB */ @@ -267,14 +281,13 @@ gbp_bridge_domain_unlock (index_t index) set_int_l2_mode (vlib_get_main (), vnet_get_main (), MODE_L3, gb->gb_uu_fwd_sw_if_index, gb->gb_bd_index, L2_BD_PORT_TYPE_UU_FWD, 0, 0); - gbp_sclass_disable_l2 (gb->gb_uu_fwd_sw_if_index); } if (~0 != gb->gb_bm_flood_sw_if_index) { set_int_l2_mode (vlib_get_main (), vnet_get_main (), MODE_L3, gb->gb_bm_flood_sw_if_index, gb->gb_bd_index, L2_BD_PORT_TYPE_NORMAL, 0, 0); - gbp_sclass_disable_l2 (gb->gb_bm_flood_sw_if_index); + gbp_learn_enable (gb->gb_bm_flood_sw_if_index, GBP_LEARN_MODE_L2); } gbp_bridge_domain_db_remove (gb); @@ -321,12 +334,15 @@ gbp_bridge_domain_cli (vlib_main_t * vm, unformat_input_t * input, vlib_cli_command_t * cmd) { vnet_main_t *vnm = vnet_get_main (); + gbp_bridge_domain_flags_t flags; u32 bm_flood_sw_if_index = ~0; u32 uu_fwd_sw_if_index = ~0; u32 bvi_sw_if_index = ~0; u32 bd_id = ~0; u8 add = 1; + flags = GBP_BD_FLAG_NONE; + while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) { if (unformat (input, "bvi %U", unformat_vnet_sw_interface, @@ -342,6 +358,8 @@ gbp_bridge_domain_cli (vlib_main_t * vm, add = 1; else if (unformat (input, "del")) add = 0; + else if (unformat (input, "flags %d", &flags)) + ; else if (unformat (input, "bd %d", &bd_id)) ; else @@ -349,14 +367,14 @@ gbp_bridge_domain_cli (vlib_main_t * vm, } if (~0 == bd_id) - return clib_error_return (0, "EPG-ID must be specified"); + return clib_error_return (0, "BD-ID must be specified"); if (add) { if (~0 == bvi_sw_if_index) return clib_error_return (0, "interface must be specified"); - gbp_bridge_domain_add_and_lock (bd_id, GBP_BD_FLAG_NONE, + gbp_bridge_domain_add_and_lock (bd_id, flags, bvi_sw_if_index, uu_fwd_sw_if_index, bm_flood_sw_if_index); @@ -377,7 +395,8 @@ gbp_bridge_domain_cli (vlib_main_t * vm, /* *INDENT-OFF* */ VLIB_CLI_COMMAND (gbp_bridge_domain_cli_node, static) = { .path = "gbp bridge-domain", - .short_help = "gbp bridge-domain [del] epg bd bvi uu-flood ", + .short_help = "gbp bridge-domain [del] bd bvi " + " uu-flood [flags ]", .function = gbp_bridge_domain_cli, };