diff options
Diffstat (limited to 'src/plugins/gbp')
-rw-r--r-- | src/plugins/gbp/gbp.api | 3 | ||||
-rw-r--r-- | src/plugins/gbp/gbp_api.c | 7 | ||||
-rw-r--r-- | src/plugins/gbp/gbp_bridge_domain.c | 36 | ||||
-rw-r--r-- | src/plugins/gbp/gbp_bridge_domain.h | 3 |
4 files changed, 38 insertions, 11 deletions
diff --git a/src/plugins/gbp/gbp.api b/src/plugins/gbp/gbp.api index 31bf3f28970..b55d8a86466 100644 --- a/src/plugins/gbp/gbp.api +++ b/src/plugins/gbp/gbp.api @@ -23,6 +23,9 @@ enum gbp_bridge_domain_flags { GBP_BD_API_FLAG_NONE = 0, GBP_BD_API_FLAG_DO_NOT_LEARN = 1, + GBP_BD_API_FLAG_UU_FWD_DROP = 2, + GBP_BD_API_FLAG_MCAST_DROP = 4, + GBP_BD_API_FLAG_UCAST_ARP = 8, }; typedef gbp_bridge_domain diff --git a/src/plugins/gbp/gbp_api.c b/src/plugins/gbp/gbp_api.c index 8878119d766..76f0b218a19 100644 --- a/src/plugins/gbp/gbp_api.c +++ b/src/plugins/gbp/gbp_api.c @@ -325,7 +325,12 @@ gbp_bridge_domain_flags_from_api (vl_api_gbp_bridge_domain_flags_t a) if (a & GBP_BD_API_FLAG_DO_NOT_LEARN) g |= GBP_BD_FLAG_DO_NOT_LEARN; - + if (a & GBP_BD_API_FLAG_UU_FWD_DROP) + g |= GBP_BD_FLAG_UU_FWD_DROP; + if (a & GBP_BD_API_FLAG_MCAST_DROP) + g |= GBP_BD_FLAG_MCAST_DROP; + if (a & GBP_BD_API_FLAG_UCAST_ARP) + g |= GBP_BD_FLAG_UCAST_ARP; return (g); } diff --git a/src/plugins/gbp/gbp_bridge_domain.c b/src/plugins/gbp/gbp_bridge_domain.c index 17ccc345b66..8896669002c 100644 --- a/src/plugins/gbp/gbp_bridge_domain.c +++ b/src/plugins/gbp/gbp_bridge_domain.c @@ -121,7 +121,13 @@ 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 { @@ -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,13 +212,16 @@ 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); } - 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, @@ -220,6 +230,11 @@ gbp_bridge_domain_add_and_lock (u32 bd_id, } /* + * 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 */ l2fib_add_entry (vnet_sw_interface_get_hw_address @@ -343,8 +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)) - add = 0; + else if (unformat (input, "flags %d", &flags)) + ; else if (unformat (input, "bd %d", &bd_id)) ; else @@ -380,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] bd <ID> bvi <interface> uu-flood <interface>", + .short_help = "gbp bridge-domain [del] bd <ID> bvi <interface>" + " uu-flood <interface> [flags <flags>]", .function = gbp_bridge_domain_cli, }; diff --git a/src/plugins/gbp/gbp_bridge_domain.h b/src/plugins/gbp/gbp_bridge_domain.h index 8e6146c7955..dd2798fdafa 100644 --- a/src/plugins/gbp/gbp_bridge_domain.h +++ b/src/plugins/gbp/gbp_bridge_domain.h @@ -27,6 +27,9 @@ typedef enum gbp_bridge_domain_flags_t_ { GBP_BD_FLAG_NONE = 0, GBP_BD_FLAG_DO_NOT_LEARN = (1 << 0), + GBP_BD_FLAG_UU_FWD_DROP = (1 << 1), + GBP_BD_FLAG_MCAST_DROP = (1 << 2), + GBP_BD_FLAG_UCAST_ARP = (1 << 3), } gbp_bridge_domain_flags_t; /** |