fib: make deag entries urpf extempt
[vpp.git] / src / vnet / fib / fib_entry_src.c
index 667aa48..66f5987 100644 (file)
@@ -259,6 +259,23 @@ fib_entry_chain_type_fixup (const fib_entry_t *entry,
     return (dfct);
 }
 
+static dpo_proto_t
+fib_prefix_get_payload_proto (const fib_prefix_t *pfx)
+{
+    switch (pfx->fp_proto)
+    {
+    case FIB_PROTOCOL_IP4:
+        return (DPO_PROTO_IP4);
+    case FIB_PROTOCOL_IP6:
+        return (DPO_PROTO_IP6);
+    case FIB_PROTOCOL_MPLS:
+        return (pfx->fp_payload_proto);
+    }
+
+    ASSERT(0);
+    return (DPO_PROTO_IP4);
+}
+
 static void
 fib_entry_src_get_path_forwarding (fib_node_index_t path_index,
                                    fib_entry_src_collect_forwarding_ctx_t *ctx)
@@ -313,7 +330,7 @@ fib_entry_src_get_path_forwarding (fib_node_index_t path_index,
                                                                       ctx->fct),
                                            &nh->path_dpo);
             fib_path_stack_mpls_disp(path_index,
-                                     ctx->fib_entry->fe_prefix.fp_payload_proto,
+                                     fib_prefix_get_payload_proto(&ctx->fib_entry->fe_prefix),
                                      &nh->path_dpo);
 
             break;
@@ -1060,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))
     {
@@ -1304,6 +1325,7 @@ fib_entry_get_dpo_for_source (fib_node_index_t fib_entry_index,
            fib_path_list_contribute_forwarding(
                esrc->fes_pl,
                fib_entry_get_default_chain_type(fib_entry),
+                FIB_PATH_LIST_FWD_FLAG_NONE,
                dpo);
 
            return (dpo_id_is_valid(dpo));