X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Ffib%2Ffib_table.c;h=4dd6e7c542118f13e7ccc9c8c72e1cd7f1f35968;hb=refs%2Fchanges%2F50%2F8950%2F14;hp=6b6cc5cb99a31a443eb4b8b417ddf34213e77af2;hpb=da78f957e46c686434149d332a477d7ea055d76a;p=vpp.git diff --git a/src/vnet/fib/fib_table.c b/src/vnet/fib/fib_table.c index 6b6cc5cb99a..4dd6e7c5421 100644 --- a/src/vnet/fib/fib_table.c +++ b/src/vnet/fib/fib_table.c @@ -481,7 +481,8 @@ fib_table_route_path_fixup (const fib_prefix_t *prefix, } if (fib_prefix_is_host(prefix) && ip46_address_is_zero(&path->frp_addr) && - path->frp_sw_if_index != ~0) + path->frp_sw_if_index != ~0 && + path->frp_proto != DPO_PROTO_ETHERNET) { path->frp_addr = prefix->fp_addr; path->frp_flags |= FIB_ROUTE_PATH_ATTACHED; @@ -846,7 +847,8 @@ fib_table_entry_delete (u32 fib_index, * removing an etry that does not exist. * i'll allow it, but i won't like it. */ - clib_warning("%U not in FIB", format_fib_prefix, prefix); + if (0) + clib_warning("%U not in FIB", format_fib_prefix, prefix); } else { @@ -951,6 +953,7 @@ fib_table_get_flow_hash_config (u32 fib_index, return (fib->ft_flow_hash_config); } + flow_hash_config_t fib_table_get_default_flow_hash_config (fib_protocol_t proto) { @@ -1037,9 +1040,11 @@ fib_table_find (fib_protocol_t proto, return (~0); } -u32 -fib_table_find_or_create_and_lock (fib_protocol_t proto, - u32 table_id) +static u32 +fib_table_find_or_create_and_lock_i (fib_protocol_t proto, + u32 table_id, + fib_source_t src, + const u8 *name) { fib_table_t *fib_table; fib_node_index_t fi; @@ -1047,13 +1052,13 @@ fib_table_find_or_create_and_lock (fib_protocol_t proto, switch (proto) { case FIB_PROTOCOL_IP4: - fi = ip4_fib_table_find_or_create_and_lock(table_id); + fi = ip4_fib_table_find_or_create_and_lock(table_id, src); break; case FIB_PROTOCOL_IP6: - fi = ip6_fib_table_find_or_create_and_lock(table_id); + fi = ip6_fib_table_find_or_create_and_lock(table_id, src); break; case FIB_PROTOCOL_MPLS: - fi = mpls_fib_table_find_or_create_and_lock(table_id); + fi = mpls_fib_table_find_or_create_and_lock(table_id, src); break; default: return (~0); @@ -1061,15 +1066,45 @@ fib_table_find_or_create_and_lock (fib_protocol_t proto, fib_table = fib_table_get(fi, proto); - fib_table->ft_desc = format(NULL, "%U-VRF:%d", - format_fib_protocol, proto, - table_id); + if (NULL == fib_table->ft_desc) + { + if (name && name[0]) + { + fib_table->ft_desc = format(NULL, "%s", name); + } + else + { + fib_table->ft_desc = format(NULL, "%U-VRF:%d", + format_fib_protocol, proto, + table_id); + } + } return (fi); } +u32 +fib_table_find_or_create_and_lock (fib_protocol_t proto, + u32 table_id, + fib_source_t src) +{ + return (fib_table_find_or_create_and_lock_i(proto, table_id, + src, NULL)); +} + +u32 +fib_table_find_or_create_and_lock_w_name (fib_protocol_t proto, + u32 table_id, + fib_source_t src, + const u8 *name) +{ + return (fib_table_find_or_create_and_lock_i(proto, table_id, + src, name)); +} + u32 fib_table_create_and_lock (fib_protocol_t proto, + fib_source_t src, const char *const fmt, ...) { @@ -1082,13 +1117,13 @@ fib_table_create_and_lock (fib_protocol_t proto, switch (proto) { case FIB_PROTOCOL_IP4: - fi = ip4_fib_table_create_and_lock(); + fi = ip4_fib_table_create_and_lock(src); break; case FIB_PROTOCOL_IP6: - fi = ip6_fib_table_create_and_lock(); + fi = ip6_fib_table_create_and_lock(src); break; case FIB_PROTOCOL_MPLS: - fi = mpls_fib_table_create_and_lock(); + fi = mpls_fib_table_create_and_lock(src); break; default: return (~0); @@ -1143,26 +1178,43 @@ fib_table_walk (u32 fib_index, void fib_table_unlock (u32 fib_index, - fib_protocol_t proto) + fib_protocol_t proto, + fib_source_t source) { fib_table_t *fib_table; fib_table = fib_table_get(fib_index, proto); - fib_table->ft_locks--; + fib_table->ft_locks[source]--; + fib_table->ft_locks[FIB_TABLE_TOTAL_LOCKS]--; - if (0 == fib_table->ft_locks) + if (0 == fib_table->ft_locks[source]) { + /* + * The source no longer needs the table. flush any routes + * from it just in case + */ + fib_table_flush(fib_index, proto, source); + } + + if (0 == fib_table->ft_locks[FIB_TABLE_TOTAL_LOCKS]) + { + /* + * no more locak from any source - kill it + */ fib_table_destroy(fib_table); } } + void fib_table_lock (u32 fib_index, - fib_protocol_t proto) + fib_protocol_t proto, + fib_source_t source) { fib_table_t *fib_table; fib_table = fib_table_get(fib_index, proto); - fib_table->ft_locks++; + fib_table->ft_locks[source]++; + fib_table->ft_locks[FIB_TABLE_TOTAL_LOCKS]++; } u32 @@ -1178,10 +1230,10 @@ fib_table_get_num_entries (u32 fib_index, } u8* -format_fib_table_name (u8* s, va_list ap) +format_fib_table_name (u8* s, va_list* ap) { - fib_node_index_t fib_index = va_arg(ap, fib_node_index_t); - fib_protocol_t proto = va_arg(ap, int); // int promotion + fib_node_index_t fib_index = va_arg(*ap, fib_node_index_t); + fib_protocol_t proto = va_arg(*ap, int); // int promotion fib_table_t *fib_table; fib_table = fib_table_get(fib_index, proto);