diff options
-rw-r--r-- | src/vnet/fib/fib_entry_src.c | 4 | ||||
-rw-r--r-- | src/vnet/fib/fib_path.c | 5 | ||||
-rw-r--r-- | src/vnet/fib/fib_types.c | 1 | ||||
-rw-r--r-- | src/vnet/fib/fib_types.h | 4 | ||||
-rw-r--r-- | src/vnet/ip/ip_api.c | 5 |
5 files changed, 19 insertions, 0 deletions
diff --git a/src/vnet/fib/fib_entry_src.c b/src/vnet/fib/fib_entry_src.c index 1d73af3bf0d..66f5987a7cf 100644 --- a/src/vnet/fib/fib_entry_src.c +++ b/src/vnet/fib/fib_entry_src.c @@ -1077,6 +1077,10 @@ fib_entry_flags_update (const fib_entry_t *fib_entry, { esrc->fes_entry_flags &= ~FIB_ENTRY_FLAG_ATTACHED; } + if (rpath->frp_flags & FIB_ROUTE_PATH_DEAG) + { + esrc->fes_entry_flags |= FIB_ENTRY_FLAG_LOOSE_URPF_EXEMPT; + } } if (fib_route_attached_cross_table(fib_entry, rpath)) { diff --git a/src/vnet/fib/fib_path.c b/src/vnet/fib/fib_path.c index f7fed26ac9a..fddb8ecdd5a 100644 --- a/src/vnet/fib/fib_path.c +++ b/src/vnet/fib/fib_path.c @@ -1294,6 +1294,11 @@ fib_path_create (fib_node_index_t pl_index, path->fp_type = FIB_PATH_TYPE_BIER_TABLE; path->bier_table.fp_bier_tbl = rpath->frp_bier_tbl; } + else if (rpath->frp_flags & FIB_ROUTE_PATH_DEAG) + { + path->fp_type = FIB_PATH_TYPE_DEAG; + path->deag.fp_tbl_id = rpath->frp_fib_index; + } else if (~0 != rpath->frp_sw_if_index) { if (ip46_address_is_zero(&rpath->frp_addr)) diff --git a/src/vnet/fib/fib_types.c b/src/vnet/fib/fib_types.c index 48f2bd1dc9a..f38c8154e0c 100644 --- a/src/vnet/fib/fib_types.c +++ b/src/vnet/fib/fib_types.c @@ -416,6 +416,7 @@ unformat_fib_route_path (unformat_input_t * input, va_list * args) { rpath->frp_proto = *payload_proto; rpath->frp_sw_if_index = ~0; + rpath->frp_flags |= FIB_ROUTE_PATH_DEAG; } else if (unformat (input, "resolve-via-host")) { diff --git a/src/vnet/fib/fib_types.h b/src/vnet/fib/fib_types.h index 94c94228bb3..5742c69b7c7 100644 --- a/src/vnet/fib/fib_types.h +++ b/src/vnet/fib/fib_types.h @@ -340,6 +340,10 @@ typedef enum fib_route_path_flags_t_ * A path that resolves via a BIER impostion object */ FIB_ROUTE_PATH_BIER_IMP = (1 << 12), + /** + * A path that resolves via another table + */ + FIB_ROUTE_PATH_DEAG = (1 << 13), } fib_route_path_flags_t; /** diff --git a/src/vnet/ip/ip_api.c b/src/vnet/ip/ip_api.c index fefaccf3fd4..db88d7b0161 100644 --- a/src/vnet/ip/ip_api.c +++ b/src/vnet/ip/ip_api.c @@ -911,6 +911,11 @@ add_del_route_t_handler (u8 is_multipath, path_flags |= FIB_ROUTE_PATH_UDP_ENCAP; path.frp_udp_encap_id = next_hop_id; } + if (path.frp_sw_if_index == ~0 && ip46_address_is_zero (&path.frp_addr) + && path.frp_fib_index != ~0) + { + path_flags |= FIB_ROUTE_PATH_DEAG; + } path.frp_flags = path_flags; |