forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
2.3 KiB
112 lines
2.3 KiB
/* |
|
* Software async multibuffer crypto daemon headers |
|
* |
|
* Author: |
|
* Tim Chen <[email protected]> |
|
* |
|
* 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_ahash *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 ahash_request areq; |
|
}; |
|
|
|
struct mcryptd_ahash *mcryptd_alloc_ahash(const char *alg_name, |
|
u32 type, u32 mask); |
|
struct crypto_ahash *mcryptd_ahash_child(struct mcryptd_ahash *tfm); |
|
struct ahash_request *mcryptd_ahash_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
|
|
|