Code Review
/
vpp.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
review
|
tree
raw
|
inline
| side by side
fix udp_ping api naming error
[vpp.git]
/
src
/
vnet
/
fib
/
fib_table.c
diff --git
a/src/vnet/fib/fib_table.c
b/src/vnet/fib/fib_table.c
index
d50f17f
..
80e5a0f
100644
(file)
--- 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) &&
}
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;
{
path->frp_addr = prefix->fp_addr;
path->frp_flags |= FIB_ROUTE_PATH_ATTACHED;
@@
-505,7
+506,7
@@
fib_table_entry_path_add (u32 fib_index,
const fib_prefix_t *prefix,
fib_source_t source,
fib_entry_flag_t flags,
const fib_prefix_t *prefix,
fib_source_t source,
fib_entry_flag_t flags,
-
fib_protocol
_t next_hop_proto,
+
dpo_proto
_t next_hop_proto,
const ip46_address_t *next_hop,
u32 next_hop_sw_if_index,
u32 next_hop_fib_index,
const ip46_address_t *next_hop,
u32 next_hop_sw_if_index,
u32 next_hop_fib_index,
@@
-664,7
+665,7
@@
void
fib_table_entry_path_remove (u32 fib_index,
const fib_prefix_t *prefix,
fib_source_t source,
fib_table_entry_path_remove (u32 fib_index,
const fib_prefix_t *prefix,
fib_source_t source,
-
fib_protocol
_t next_hop_proto,
+
dpo_proto
_t next_hop_proto,
const ip46_address_t *next_hop,
u32 next_hop_sw_if_index,
u32 next_hop_fib_index,
const ip46_address_t *next_hop,
u32 next_hop_sw_if_index,
u32 next_hop_fib_index,
@@
-755,7
+756,7
@@
fib_table_entry_update_one_path (u32 fib_index,
const fib_prefix_t *prefix,
fib_source_t source,
fib_entry_flag_t flags,
const fib_prefix_t *prefix,
fib_source_t source,
fib_entry_flag_t flags,
-
fib_protocol
_t next_hop_proto,
+
dpo_proto
_t next_hop_proto,
const ip46_address_t *next_hop,
u32 next_hop_sw_if_index,
u32 next_hop_fib_index,
const ip46_address_t *next_hop,
u32 next_hop_sw_if_index,
u32 next_hop_fib_index,
@@
-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.
*/
* 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
{
}
else
{
@@
-952,6
+954,23
@@
fib_table_get_flow_hash_config (u32 fib_index,
return (fib->ft_flow_hash_config);
}
return (fib->ft_flow_hash_config);
}
+flow_hash_config_t
+fib_table_get_default_flow_hash_config (fib_protocol_t proto)
+{
+ switch (proto)
+ {
+ case FIB_PROTOCOL_IP4:
+ case FIB_PROTOCOL_IP6:
+ return (IP_FLOW_HASH_DEFAULT);
+
+ case FIB_PROTOCOL_MPLS:
+ return (MPLS_FLOW_HASH_DEFAULT);
+ }
+
+ ASSERT(0);
+ return (IP_FLOW_HASH_DEFAULT);
+}
+
/**
* @brief Table set flow hash config context.
*/
/**
* @brief Table set flow hash config context.
*/
@@
-1021,9
+1040,11
@@
fib_table_find (fib_protocol_t proto,
return (~0);
}
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;
{
fib_table_t *fib_table;
fib_node_index_t fi;
@@
-1031,13
+1052,13
@@
fib_table_find_or_create_and_lock (fib_protocol_t proto,
switch (proto)
{
case FIB_PROTOCOL_IP4:
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:
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:
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);
break;
default:
return (~0);
@@
-1045,15
+1066,45
@@
fib_table_find_or_create_and_lock (fib_protocol_t proto,
fib_table = fib_table_get(fi, 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);
}
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,
u32
fib_table_create_and_lock (fib_protocol_t proto,
+ fib_source_t src,
const char *const fmt,
...)
{
const char *const fmt,
...)
{
@@
-1066,13
+1117,13
@@
fib_table_create_and_lock (fib_protocol_t proto,
switch (proto)
{
case FIB_PROTOCOL_IP4:
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:
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:
break;
case FIB_PROTOCOL_MPLS:
- fi = mpls_fib_table_create_and_lock();
+ fi = mpls_fib_table_create_and_lock(
src
);
break;
default:
return (~0);
break;
default:
return (~0);
@@
-1127,26
+1178,43
@@
fib_table_walk (u32 fib_index,
void
fib_table_unlock (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_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);
}
}
fib_table_destroy(fib_table);
}
}
+
void
fib_table_lock (u32 fib_index,
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_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
}
u32
@@
-1162,10
+1230,10
@@
fib_table_get_num_entries (u32 fib_index,
}
u8*
}
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);
fib_table_t *fib_table;
fib_table = fib_table_get(fib_index, proto);
@@
-1228,3
+1296,13
@@
fib_table_flush (u32 fib_index,
vec_free(ctx.ftf_entries);
}
vec_free(ctx.ftf_entries);
}
+
+u8 *
+format_fib_table_memory (u8 *s, va_list *args)
+{
+ s = format(s, "%U", format_ip4_fib_table_memory);
+ s = format(s, "%U", format_ip6_fib_table_memory);
+ s = format(s, "%U", format_mpls_fib_table_memory);
+
+ return (s);
+}