MLXSW_SP_RXL_MARK(IPV6_OSPF, TRAP_TO_CPU, OSPF, false),
        MLXSW_SP_RXL_MARK(IPV6_DHCP, TRAP_TO_CPU, DHCP, false),
        MLXSW_SP_RXL_MARK(RTR_INGRESS0, TRAP_TO_CPU, REMOTE_ROUTE, false),
+       MLXSW_SP_RXL_MARK(DISCARD_ROUTER3, TRAP_EXCEPTION_TO_CPU, REMOTE_ROUTE,
+                         false),
        MLXSW_SP_RXL_MARK(IPV4_BGP, TRAP_TO_CPU, BGP, false),
        MLXSW_SP_RXL_MARK(IPV6_BGP, TRAP_TO_CPU, BGP, false),
        MLXSW_SP_RXL_MARK(L3_IPV6_ROUTER_SOLICITATION, TRAP_TO_CPU, IPV6_ND,
 
        struct notifier_block inet6addr_nb;
        const struct mlxsw_sp_rif_ops **rif_ops_arr;
        const struct mlxsw_sp_ipip_ops **ipip_ops_arr;
+       u32 adj_discard_index;
 };
 
 struct mlxsw_sp_rif {
        }
 }
 
+static int mlxsw_sp_adj_discard_write(struct mlxsw_sp *mlxsw_sp, u16 rif_index)
+{
+       u32 adj_discard_index = mlxsw_sp->router->adj_discard_index;
+       enum mlxsw_reg_ratr_trap_action trap_action;
+       char ratr_pl[MLXSW_REG_RATR_LEN];
+
+       trap_action = MLXSW_REG_RATR_TRAP_ACTION_DISCARD_ERRORS;
+       mlxsw_reg_ratr_pack(ratr_pl, MLXSW_REG_RATR_OP_WRITE_WRITE_ENTRY, true,
+                           MLXSW_REG_RATR_TYPE_ETHERNET, adj_discard_index,
+                           rif_index);
+       mlxsw_reg_ratr_trap_action_set(ratr_pl, trap_action);
+       return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ratr), ratr_pl);
+}
+
 static int mlxsw_sp_fib_entry_op_remote(struct mlxsw_sp *mlxsw_sp,
                                        struct mlxsw_sp_fib_entry *fib_entry,
                                        enum mlxsw_reg_ralue_op op)
 {
+       struct mlxsw_sp_nexthop_group *nh_group = fib_entry->nh_group;
        char ralue_pl[MLXSW_REG_RALUE_LEN];
        enum mlxsw_reg_ralue_trap_action trap_action;
        u16 trap_id = 0;
        u32 adjacency_index = 0;
        u16 ecmp_size = 0;
+       int err;
 
        /* In case the nexthop group adjacency index is valid, use it
         * with provided ECMP size. Otherwise, setup trap and pass
                trap_action = MLXSW_REG_RALUE_TRAP_ACTION_NOP;
                adjacency_index = fib_entry->nh_group->adj_index;
                ecmp_size = fib_entry->nh_group->ecmp_size;
+       } else if (!nh_group->adj_index_valid && nh_group->count &&
+                  nh_group->nh_rif) {
+               err = mlxsw_sp_adj_discard_write(mlxsw_sp,
+                                                nh_group->nh_rif->rif_index);
+               if (err)
+                       return err;
+               trap_action = MLXSW_REG_RALUE_TRAP_ACTION_NOP;
+               adjacency_index = mlxsw_sp->router->adj_discard_index;
+               ecmp_size = 1;
        } else {
                trap_action = MLXSW_REG_RALUE_TRAP_ACTION_TRAP;
                trap_id = MLXSW_TRAP_ID_RTR_INGRESS0;
        if (err)
                goto err_neigh_init;
 
+       err = mlxsw_sp_kvdl_alloc(mlxsw_sp, MLXSW_SP_KVDL_ENTRY_TYPE_ADJ, 1,
+                                 &router->adj_discard_index);
+       if (err)
+               goto err_adj_discard_index_alloc;
+
        mlxsw_sp->router->netevent_nb.notifier_call =
                mlxsw_sp_router_netevent_event;
        err = register_netevent_notifier(&mlxsw_sp->router->netevent_nb);
 err_mp_hash_init:
        unregister_netevent_notifier(&mlxsw_sp->router->netevent_nb);
 err_register_netevent_notifier:
+       mlxsw_sp_kvdl_free(mlxsw_sp, MLXSW_SP_KVDL_ENTRY_TYPE_ADJ, 1,
+                          router->adj_discard_index);
+err_adj_discard_index_alloc:
        mlxsw_sp_neigh_fini(mlxsw_sp);
 err_neigh_init:
        mlxsw_sp_vrs_fini(mlxsw_sp);
        unregister_fib_notifier(mlxsw_sp_net(mlxsw_sp),
                                &mlxsw_sp->router->fib_nb);
        unregister_netevent_notifier(&mlxsw_sp->router->netevent_nb);
+       mlxsw_sp_kvdl_free(mlxsw_sp, MLXSW_SP_KVDL_ENTRY_TYPE_ADJ, 1,
+                          mlxsw_sp->router->adj_discard_index);
        mlxsw_sp_neigh_fini(mlxsw_sp);
        mlxsw_sp_vrs_fini(mlxsw_sp);
        mlxsw_sp_mr_fini(mlxsw_sp);