X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fplugins%2Fgbp%2Fgbp_bridge_domain.c;h=298819f87f18730543d265dc2aaece992eafc3cc;hb=13a08cc09;hp=b7812eb1645781d0903ef18beda1dd3fae0ae1ed;hpb=93cc3ee3b3a9c9224a1446625882205f3282a949;p=vpp.git diff --git a/src/plugins/gbp/gbp_bridge_domain.c b/src/plugins/gbp/gbp_bridge_domain.c index b7812eb1645..298819f87f1 100644 --- a/src/plugins/gbp/gbp_bridge_domain.c +++ b/src/plugins/gbp/gbp_bridge_domain.c @@ -31,12 +31,7 @@ gbp_bridge_domain_t *gbp_bridge_domain_pool; /** * DB of bridge_domains */ -typedef struct gbp_bridge_domain_db_t -{ - uword *gbd_by_bd_id; -} gbp_bridge_domain_db_t; - -static gbp_bridge_domain_db_t gbp_bridge_domain_db; +gbp_bridge_domain_db_t gbp_bridge_domain_db; /** * logger @@ -46,10 +41,10 @@ vlib_log_class_t gb_logger; #define GBP_BD_DBG(...) \ vlib_log_debug (gb_logger, __VA_ARGS__); -gbp_bridge_domain_t * -gbp_bridge_domain_get (index_t i) +index_t +gbp_bridge_domain_index (const gbp_bridge_domain_t * gbd) { - return (pool_elt_at_index (gbp_bridge_domain_pool, i)); + return (gbd - gbp_bridge_domain_pool); } static void @@ -95,16 +90,53 @@ gbp_bridge_domain_db_add (gbp_bridge_domain_t * gb) index_t gbi = gb - gbp_bridge_domain_pool; hash_set (gbp_bridge_domain_db.gbd_by_bd_id, gb->gb_bd_id, gbi); + vec_validate_init_empty (gbp_bridge_domain_db.gbd_by_bd_index, + gb->gb_bd_index, INDEX_INVALID); + gbp_bridge_domain_db.gbd_by_bd_index[gb->gb_bd_index] = gbi; } static void gbp_bridge_domain_db_remove (gbp_bridge_domain_t * gb) { hash_unset (gbp_bridge_domain_db.gbd_by_bd_id, gb->gb_bd_id); + gbp_bridge_domain_db.gbd_by_bd_index[gb->gb_bd_index] = INDEX_INVALID; +} + +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 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); +} + +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) { gbp_bridge_domain_t *gb; @@ -134,6 +166,7 @@ gbp_bridge_domain_add_and_lock (u32 bd_id, gb->gb_uu_fwd_sw_if_index = uu_fwd_sw_if_index; gb->gb_bvi_sw_if_index = bvi_sw_if_index; gb->gb_locks = 1; + gb->gb_flags = flags; /* * Set the BVI and uu-flood interfaces into the BD @@ -163,7 +196,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); } @@ -179,7 +212,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), @@ -209,8 +242,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); @@ -269,7 +301,7 @@ gbp_bridge_domain_cli (vlib_main_t * vm, if (~0 == bvi_sw_if_index) return clib_error_return (0, "interface must be specified"); - gbp_bridge_domain_add_and_lock (bd_id, + gbp_bridge_domain_add_and_lock (bd_id, GBP_BD_FLAG_NONE, bvi_sw_if_index, uu_fwd_sw_if_index); } else @@ -292,33 +324,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); }