/* * Software async multibuffer crypto daemon headers * * Author: * Tim Chen <tim.c.chen@linux.intel.com> * * Copyright (c) 2014, Intel Corporation. */ #ifndef _CRYPTO_MCRYPT_H#define _CRYPTO_MCRYPT_H #include <linux/crypto.h>#include <linux/kernel.h>#include <crypto/hash.h> struct mcryptd_ahash { struct crypto_ahash base;}; static inline struct mcryptd_ahash *__mcryptd_ahash_cast( struct crypto_ahash *tfm){ return (struct mcryptd_ahash *)tfm;} struct mcryptd_cpu_queue { struct crypto_queue queue; struct work_struct work;}; struct mcryptd_queue { struct mcryptd_cpu_queue __percpu *cpu_queue;}; struct mcryptd_instance_ctx { struct crypto_spawn spawn; struct mcryptd_queue *queue;}; struct mcryptd_hash_ctx { struct crypto_shash *child; struct mcryptd_alg_state *alg_state;}; struct mcryptd_tag { /* seq number of request */ unsigned seq_num; /* arrival time of request */ unsigned long arrival; unsigned long expire; int cpu;}; struct mcryptd_hash_request_ctx { struct list_head waiter; crypto_completion_t complete; struct mcryptd_tag tag; struct crypto_hash_walk walk; u8 *out; int flag; struct shash_desc desc;}; struct mcryptd_ahash *mcryptd_alloc_ahash(const char *alg_name, u32 type, u32 mask);struct crypto_shash *mcryptd_ahash_child(struct mcryptd_ahash *tfm);struct shash_desc *mcryptd_shash_desc(struct ahash_request *req);void mcryptd_free_ahash(struct mcryptd_ahash *tfm);void mcryptd_flusher(struct work_struct *work); enum mcryptd_req_type { MCRYPTD_NONE, MCRYPTD_UPDATE, MCRYPTD_FINUP, MCRYPTD_DIGEST, MCRYPTD_FINAL}; struct mcryptd_alg_cstate { unsigned long next_flush; unsigned next_seq_num; bool flusher_engaged; struct delayed_work flush; int cpu; struct mcryptd_alg_state *alg_state; void *mgr; spinlock_t work_lock; struct list_head work_list; struct list_head flush_list;}; struct mcryptd_alg_state { struct mcryptd_alg_cstate __percpu *alg_cstate; unsigned long (*flusher)(struct mcryptd_alg_cstate *cstate);}; /* return delay in jiffies from current time */static inline unsigned long get_delay(unsigned long t){ long delay; delay = (long) t - (long) jiffies; if (delay <= 0) return 0; else return (unsigned long) delay;} void mcryptd_arm_flusher(struct mcryptd_alg_cstate *cstate, unsigned long delay); #endif
/*
* Software async multibuffer crypto daemon headers
*
* Author:
* Tim Chen <tim.c.chen@linux.intel.com>
*
* Copyright (c) 2014, Intel Corporation.
*/
#ifndef _CRYPTO_MCRYPT_H
#define _CRYPTO_MCRYPT_H
#include <linux/crypto.h>
#include <linux/kernel.h>
#include <crypto/hash.h>
struct mcryptd_ahash {
struct crypto_ahash base;
};
static inline struct mcryptd_ahash *__mcryptd_ahash_cast(
struct crypto_ahash *tfm)
{
return (struct mcryptd_ahash *)tfm;
}
struct mcryptd_cpu_queue {
struct crypto_queue queue;
struct work_struct work;
};
struct mcryptd_queue {
struct mcryptd_cpu_queue __percpu *cpu_queue;
};
struct mcryptd_instance_ctx {
struct crypto_spawn spawn;
struct mcryptd_queue *queue;
};
struct mcryptd_hash_ctx {
struct crypto_shash *child;
struct mcryptd_alg_state *alg_state;
};
struct mcryptd_tag {
/* seq number of request */
unsigned seq_num;
/* arrival time of request */
unsigned long arrival;
unsigned long expire;
int cpu;
};
struct mcryptd_hash_request_ctx {
struct list_head waiter;
crypto_completion_t complete;
struct mcryptd_tag tag;
struct crypto_hash_walk walk;
u8 *out;
int flag;
struct shash_desc desc;
};
struct mcryptd_ahash *mcryptd_alloc_ahash(const char *alg_name,
u32 type, u32 mask);
struct crypto_shash *mcryptd_ahash_child(struct mcryptd_ahash *tfm);
struct shash_desc *mcryptd_shash_desc(struct ahash_request *req);
void mcryptd_free_ahash(struct mcryptd_ahash *tfm);
void mcryptd_flusher(struct work_struct *work);
enum mcryptd_req_type {
MCRYPTD_NONE,
MCRYPTD_UPDATE,
MCRYPTD_FINUP,
MCRYPTD_DIGEST,
MCRYPTD_FINAL
};
struct mcryptd_alg_cstate {
unsigned long next_flush;
unsigned next_seq_num;
bool flusher_engaged;
struct delayed_work flush;
int cpu;
struct mcryptd_alg_state *alg_state;
void *mgr;
spinlock_t work_lock;
struct list_head work_list;
struct list_head flush_list;
};
struct mcryptd_alg_state {
struct mcryptd_alg_cstate __percpu *alg_cstate;
unsigned long (*flusher)(struct mcryptd_alg_cstate *cstate);
};
/* return delay in jiffies from current time */
static inline unsigned long get_delay(unsigned long t)
{
long delay;
delay = (long) t - (long) jiffies;
if (delay <= 0)
return 0;
else
return (unsigned long) delay;
}
void mcryptd_arm_flusher(struct mcryptd_alg_cstate *cstate, unsigned long delay);
#endif