From 66edaf209fcfa618f42c0e6d21873a31de86b412 Mon Sep 17 00:00:00 2001 From: Neale Ranns Date: Fri, 9 Jul 2021 13:03:52 +0000 Subject: fib: Set the GLEAN flag on attached export routes so that the SAS works correctly. Type: fix Signed-off-by: Neale Ranns Change-Id: I4bc2eb394a8f9d01c5a12de2ce963c22209d5439 --- src/vnet/fib/fib_entry_src.c | 58 +++++++++++++++----------------------------- src/vnet/fib/fib_table.c | 5 ++++ src/vnet/fib/fib_types.c | 33 +++++++++++++++++++++++++ src/vnet/fib/fib_types.h | 5 ++++ 4 files changed, 63 insertions(+), 38 deletions(-) (limited to 'src/vnet/fib') diff --git a/src/vnet/fib/fib_entry_src.c b/src/vnet/fib/fib_entry_src.c index 12857347a9f..a4a4f1ae0b5 100644 --- a/src/vnet/fib/fib_entry_src.c +++ b/src/vnet/fib/fib_entry_src.c @@ -1497,52 +1497,34 @@ static inline int fib_route_attached_cross_table (const fib_entry_t *fib_entry, const fib_route_path_t *rpath) { - /* - * - All zeros next-hop - * - a valid interface - * - entry's fib index not equeal to interface's index - */ - if (ip46_address_is_zero(&rpath->frp_addr) && - (~0 != rpath->frp_sw_if_index) && - !(rpath->frp_flags & (FIB_ROUTE_PATH_DVR | FIB_ROUTE_PATH_UDP_ENCAP)) && - (fib_entry->fe_fib_index != - fib_table_get_index_for_sw_if_index(fib_entry_get_proto(fib_entry), - rpath->frp_sw_if_index))) - { - return (!0); - } - return (0); -} + const fib_prefix_t *pfx = &fib_entry->fe_prefix; -/* - * Return true if the path is attached - */ -static inline int -fib_path_is_attached (const fib_route_path_t *rpath) -{ - /* - * DVR paths are not attached, since we are not playing the - * L3 game with these - */ - if (rpath->frp_flags & FIB_ROUTE_PATH_DVR) + switch (pfx->fp_proto) { - return (0); + case FIB_PROTOCOL_MPLS: + /* MPLS routes are never imported/exported */ + return (0); + case FIB_PROTOCOL_IP6: + /* Ignore link local addresses these also can't be imported/exported */ + if (ip6_address_is_link_local_unicast (&pfx->fp_addr.ip6)) + { + return (!0); + } + break; + case FIB_PROTOCOL_IP4: + break; } /* - * - All zeros next-hop - * - a valid interface + * an attached path and entry's fib index not equal to interface's index */ - if (ip46_address_is_zero(&rpath->frp_addr) && - (~0 != rpath->frp_sw_if_index)) + if (fib_route_path_is_attached(rpath) && + fib_entry->fe_fib_index != + fib_table_get_index_for_sw_if_index(fib_entry_get_proto(fib_entry), + rpath->frp_sw_if_index)) { return (!0); } - else if (rpath->frp_flags & FIB_ROUTE_PATH_ATTACHED || - rpath->frp_flags & FIB_ROUTE_PATH_GLEAN) - { - return (!0); - } return (0); } @@ -1580,7 +1562,7 @@ fib_entry_flags_update (const fib_entry_t *fib_entry, if ((esrc->fes_src == FIB_SOURCE_API) || (esrc->fes_src == FIB_SOURCE_CLI)) { - if (fib_path_is_attached(rpath)) + if (fib_route_path_is_attached(rpath)) { esrc->fes_entry_flags |= FIB_ENTRY_FLAG_ATTACHED; } diff --git a/src/vnet/fib/fib_table.c b/src/vnet/fib/fib_table.c index eaeee5bb921..7cc989d6324 100644 --- a/src/vnet/fib/fib_table.c +++ b/src/vnet/fib/fib_table.c @@ -531,6 +531,11 @@ fib_table_route_path_fixup (const fib_prefix_t *prefix, fib_prefix_normalize(prefix, &path->frp_connected); } } + else if (fib_route_path_is_attached(path)) + { + path->frp_flags |= FIB_ROUTE_PATH_GLEAN; + fib_prefix_normalize(prefix, &path->frp_connected); + } if (*eflags & FIB_ENTRY_FLAG_DROP) { path->frp_flags |= FIB_ROUTE_PATH_DROP; diff --git a/src/vnet/fib/fib_types.c b/src/vnet/fib/fib_types.c index e2b8df79e63..eab5ca22571 100644 --- a/src/vnet/fib/fib_types.c +++ b/src/vnet/fib/fib_types.c @@ -752,3 +752,36 @@ unformat_fib_route_path (unformat_input_t * input, va_list * args) return (1); } + +/* + * Return true if the path is attached + */ +int +fib_route_path_is_attached (const fib_route_path_t *rpath) +{ + /* + * DVR paths are not attached, since we are not playing the + * L3 game with these + */ + if (rpath->frp_flags & (FIB_ROUTE_PATH_DVR | + FIB_ROUTE_PATH_UDP_ENCAP)) + { + return (0); + } + + /* + * - All zeros next-hop + * - a valid interface + */ + if (ip46_address_is_zero(&rpath->frp_addr) && + (~0 != rpath->frp_sw_if_index)) + { + return (!0); + } + else if (rpath->frp_flags & FIB_ROUTE_PATH_ATTACHED || + rpath->frp_flags & FIB_ROUTE_PATH_GLEAN) + { + return (!0); + } + return (0); +} diff --git a/src/vnet/fib/fib_types.h b/src/vnet/fib/fib_types.h index 18362e0965d..55b404b044e 100644 --- a/src/vnet/fib/fib_types.h +++ b/src/vnet/fib/fib_types.h @@ -619,6 +619,11 @@ extern uword unformat_fib_route_path(unformat_input_t * input, va_list * args); */ extern u8 * format_fib_route_path(u8 *s, va_list *ap); +/* + * Return true if the path is attached + */ +extern int fib_route_path_is_attached (const fib_route_path_t *rpath); + /** * A help string to list the FIB path options */ -- cgit 1.2.3-korg