X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fplugins%2Fgbp%2Fgbp_bridge_domain.c;h=261b568390359800ff43b7e7a43e8f1d5880f271;hb=7693ca524990d3779a44ec36820fe9c0c19eeb92;hp=1a1a7bd33834f2583b1227e65b1d388fe8583db6;hpb=c29c0af40eda76e382a63269bca9ff57c6ecf5d5;p=vpp.git diff --git a/src/plugins/gbp/gbp_bridge_domain.c b/src/plugins/gbp/gbp_bridge_domain.c index 1a1a7bd3383..261b5683903 100644 --- a/src/plugins/gbp/gbp_bridge_domain.c +++ b/src/plugins/gbp/gbp_bridge_domain.c @@ -15,6 +15,7 @@ #include #include +#include #include #include @@ -41,6 +42,12 @@ vlib_log_class_t gb_logger; #define GBP_BD_DBG(...) \ vlib_log_debug (gb_logger, __VA_ARGS__); +index_t +gbp_bridge_domain_index (const gbp_bridge_domain_t * gbd) +{ + return (gbd - gbp_bridge_domain_pool); +} + static void gbp_bridge_domain_lock (index_t i) { @@ -50,6 +57,16 @@ gbp_bridge_domain_lock (index_t i) gb->gb_locks++; } +u32 +gbp_bridge_domain_get_bd_id (index_t gbdi) +{ + gbp_bridge_domain_t *gb; + + gb = gbp_bridge_domain_get (gbdi); + + return (gb->gb_bd_id); +} + static index_t gbp_bridge_domain_find (u32 bd_id) { @@ -96,10 +113,61 @@ gbp_bridge_domain_db_remove (gbp_bridge_domain_t * gb) gbp_bridge_domain_db.gbd_by_bd_index[gb->gb_bd_index] = INDEX_INVALID; } +u8 * +format_gbp_bridge_domain_flags (u8 * s, va_list * args) +{ + gbp_bridge_domain_flags_t gf = va_arg (*args, gbp_bridge_domain_flags_t); + + if (gf) + { + if (gf & GBP_BD_FLAG_DO_NOT_LEARN) + s = format (s, "do-not-learn"); + } + else + { + s = format (s, "noe"); + } + return (s); +} + +static u8 * +format_gbp_bridge_domain_ptr (u8 * s, va_list * args) +{ + gbp_bridge_domain_t *gb = va_arg (*args, gbp_bridge_domain_t *); + vnet_main_t *vnm = vnet_get_main (); + + if (NULL != gb) + s = format (s, "[%d] bd:[%d,%d], bvi:%U uu-flood:%U flags:%U locks:%d", + gb - gbp_bridge_domain_pool, + gb->gb_bd_id, + gb->gb_bd_index, + format_vnet_sw_if_index_name, vnm, gb->gb_bvi_sw_if_index, + format_vnet_sw_if_index_name, vnm, gb->gb_uu_fwd_sw_if_index, + format_gbp_bridge_domain_flags, gb->gb_flags, gb->gb_locks); + else + s = format (s, "NULL"); + + return (s); +} + +u8 * +format_gbp_bridge_domain (u8 * s, va_list * args) +{ + index_t gbi = va_arg (*args, index_t); + + s = + format (s, "%U", format_gbp_bridge_domain_ptr, + gbp_bridge_domain_get (gbi)); + + return (s); +} + int gbp_bridge_domain_add_and_lock (u32 bd_id, gbp_bridge_domain_flags_t flags, - u32 bvi_sw_if_index, u32 uu_fwd_sw_if_index) + u32 bvi_sw_if_index, + u32 uu_fwd_sw_if_index, + u32 bm_flood_sw_if_index) { gbp_bridge_domain_t *gb; index_t gbi; @@ -127,6 +195,7 @@ gbp_bridge_domain_add_and_lock (u32 bd_id, gb->gb_bd_index = bd_index; gb->gb_uu_fwd_sw_if_index = uu_fwd_sw_if_index; gb->gb_bvi_sw_if_index = bvi_sw_if_index; + gb->gb_bm_flood_sw_if_index = bm_flood_sw_if_index; gb->gb_locks = 1; gb->gb_flags = flags; @@ -137,9 +206,19 @@ gbp_bridge_domain_add_and_lock (u32 bd_id, 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) - 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); + { + 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) + { + 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); + } /* * Add the BVI's MAC to the L2FIB @@ -158,7 +237,7 @@ gbp_bridge_domain_add_and_lock (u32 bd_id, gb->gb_locks++; } - GBP_BD_DBG ("add: %U", format_gbp_bridge_domain, gb); + GBP_BD_DBG ("add: %U", format_gbp_bridge_domain_ptr, gb); return (0); } @@ -174,7 +253,7 @@ gbp_bridge_domain_unlock (index_t index) if (0 == gb->gb_locks) { - GBP_BD_DBG ("destroy: %U", format_gbp_bridge_domain, gb); + GBP_BD_DBG ("destroy: %U", format_gbp_bridge_domain_ptr, gb); l2fib_del_entry (vnet_sw_interface_get_hw_address (vnet_get_main (), gb->gb_bvi_sw_if_index), @@ -184,9 +263,19 @@ gbp_bridge_domain_unlock (index_t index) MODE_L3, gb->gb_bvi_sw_if_index, gb->gb_bd_index, L2_BD_PORT_TYPE_BVI, 0, 0); if (~0 != gb->gb_uu_fwd_sw_if_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); + { + 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_bridge_domain_db_remove (gb); @@ -204,8 +293,7 @@ gbp_bridge_domain_delete (u32 bd_id) if (INDEX_INVALID != gbi) { - GBP_BD_DBG ("del: %U", format_gbp_bridge_domain, - gbp_bridge_domain_get (gbi)); + GBP_BD_DBG ("del: %U", format_gbp_bridge_domain, gbi); gbp_bridge_domain_unlock (gbi); return (0); @@ -233,6 +321,7 @@ gbp_bridge_domain_cli (vlib_main_t * vm, unformat_input_t * input, vlib_cli_command_t * cmd) { vnet_main_t *vnm = vnet_get_main (); + u32 bm_flood_sw_if_index = ~0; u32 uu_fwd_sw_if_index = ~0; u32 bvi_sw_if_index = ~0; u32 bd_id = ~0; @@ -243,9 +332,12 @@ gbp_bridge_domain_cli (vlib_main_t * vm, if (unformat (input, "bvi %U", unformat_vnet_sw_interface, vnm, &bvi_sw_if_index)) ; - else if (unformat (input, "uu-flood %U", unformat_vnet_sw_interface, + else if (unformat (input, "uu-fwd %U", unformat_vnet_sw_interface, vnm, &uu_fwd_sw_if_index)) ; + else if (unformat (input, "bm-flood %U", unformat_vnet_sw_interface, + vnm, &bm_flood_sw_if_index)) + ; else if (unformat (input, "add")) add = 1; else if (unformat (input, "del")) @@ -265,7 +357,9 @@ gbp_bridge_domain_cli (vlib_main_t * vm, return clib_error_return (0, "interface must be specified"); gbp_bridge_domain_add_and_lock (bd_id, GBP_BD_FLAG_NONE, - bvi_sw_if_index, uu_fwd_sw_if_index); + bvi_sw_if_index, + uu_fwd_sw_if_index, + bm_flood_sw_if_index); } else gbp_bridge_domain_delete (bd_id); @@ -287,33 +381,13 @@ VLIB_CLI_COMMAND (gbp_bridge_domain_cli_node, static) = { .function = gbp_bridge_domain_cli, }; -u8 * -format_gbp_bridge_domain (u8 * s, va_list * args) -{ - gbp_bridge_domain_t *gb = va_arg (*args, gbp_bridge_domain_t*); - vnet_main_t *vnm = vnet_get_main (); - - if (NULL != gb) - s = format (s, "[%d] bd:[%d,%d], bvi:%U uu-flood:%U locks:%d", - gb - gbp_bridge_domain_pool, - gb->gb_bd_id, - gb->gb_bd_index, - format_vnet_sw_if_index_name, vnm, gb->gb_bvi_sw_if_index, - format_vnet_sw_if_index_name, vnm, gb->gb_uu_fwd_sw_if_index, - gb->gb_locks); - else - s = format (s, "NULL"); - - return (s); -} - static int gbp_bridge_domain_show_one (gbp_bridge_domain_t *gb, void *ctx) { vlib_main_t *vm; vm = ctx; - vlib_cli_output (vm, " %U",format_gbp_bridge_domain, gb); + vlib_cli_output (vm, " %U", format_gbp_bridge_domain_ptr, gb); return (1); }