@@ -544,6 +544,58 @@ int af_alg_alloc_tsgl(struct sock *sk)
}
EXPORT_SYMBOL_GPL(af_alg_alloc_tsgl);
+/**
+ * aead_count_tsgl - Count number of TX SG entries
+ *
+ * The counting starts from the beginning of the SGL to @bytes. If
+ * an offset is provided, the counting of the SG entries starts at the offset.
+ *
+ * @sk socket of connection to user space
+ * @bytes Count the number of SG entries holding given number of bytes.
+ * @offset Start the counting of SG entries from the given offset.
+ * @return Number of TX SG entries found given the constraints
+ */
+unsigned int af_alg_count_tsgl(struct sock *sk, size_t bytes, size_t offset)
+{
+ struct alg_sock *ask = alg_sk(sk);
+ struct af_alg_ctx *ctx = ask->private;
+ struct af_alg_tsgl *sgl, *tmp;
+ unsigned int i;
+ unsigned int sgl_count = 0;
+
+ if (!bytes)
+ return 0;
+
+ list_for_each_entry_safe(sgl, tmp, &ctx->tsgl_list, list) {
+ struct scatterlist *sg = sgl->sg;
+
+ for (i = 0; i < sgl->cur; i++) {
+ size_t bytes_count;
+
+ /* Skip offset */
+ if (offset >= sg[i].length) {
+ offset -= sg[i].length;
+ bytes -= sg[i].length;
+ continue;
+ }
+
+ bytes_count = sg[i].length - offset;
+
+ offset = 0;
+ sgl_count++;
+
+ /* If we have seen requested number of bytes, stop */
+ if (bytes_count >= bytes)
+ return sgl_count;
+
+ bytes -= bytes_count;
+ }
+ }
+
+ return sgl_count;
+}
+EXPORT_SYMBOL_GPL(af_alg_count_tsgl);
+
static int __init af_alg_init(void)
{
int err = proto_register(&alg_proto, 0);
@@ -65,58 +65,13 @@ static inline bool aead_sufficient_data(struct sock *sk)
}
/**
- * Count number of SG entries from the beginning of the SGL to @bytes. If
- * an offset is provided, the counting of the SG entries starts at the offset.
- */
-static unsigned int aead_count_tsgl(struct sock *sk, size_t bytes,
- size_t offset)
-{
- struct alg_sock *ask = alg_sk(sk);
- struct af_alg_ctx *ctx = ask->private;
- struct af_alg_tsgl *sgl, *tmp;
- unsigned int i;
- unsigned int sgl_count = 0;
-
- if (!bytes)
- return 0;
-
- list_for_each_entry_safe(sgl, tmp, &ctx->tsgl_list, list) {
- struct scatterlist *sg = sgl->sg;
-
- for (i = 0; i < sgl->cur; i++) {
- size_t bytes_count;
-
- /* Skip offset */
- if (offset >= sg[i].length) {
- offset -= sg[i].length;
- bytes -= sg[i].length;
- continue;
- }
-
- bytes_count = sg[i].length - offset;
-
- offset = 0;
- sgl_count++;
-
- /* If we have seen requested number of bytes, stop */
- if (bytes_count >= bytes)
- return sgl_count;
-
- bytes -= bytes_count;
- }
- }
-
- return sgl_count;
-}
-
-/**
* Release the specified buffers from TX SGL pointed to by ctx->tsgl_list for
* @used bytes.
*
* If @dst is non-null, reassign the pages to dst. The caller must release
* the pages. If @dst_offset is given only reassign the pages to @dst starting
* at the @dst_offset (byte). The caller must ensure that @dst is large
- * enough (e.g. by using aead_count_tsgl with the same offset).
+ * enough (e.g. by using af_alg_count_tsgl with the same offset).
*/
static void aead_pull_tsgl(struct sock *sk, size_t used,
struct scatterlist *dst, size_t dst_offset)
@@ -140,7 +95,7 @@ static void aead_pull_tsgl(struct sock *sk, size_t used,
continue;
/*
- * Assumption: caller created aead_count_tsgl(len)
+ * Assumption: caller created af_alg_count_tsgl(len)
* SG entries in dst.
*/
if (dst) {
@@ -724,8 +679,8 @@ static int _aead_recvmsg(struct socket *sock, struct msghdr *msg,
goto free;
/* Create TX SGL for tag and chain it to RX SGL. */
- areq->tsgl_entries = aead_count_tsgl(sk, processed,
- processed - as);
+ areq->tsgl_entries = af_alg_count_tsgl(sk, processed,
+ processed - as);
if (!areq->tsgl_entries)
areq->tsgl_entries = 1;
areq->tsgl = sock_kmalloc(sk, sizeof(*areq->tsgl) *
@@ -44,32 +44,6 @@ struct skcipher_tfm {
bool has_key;
};
-static unsigned int skcipher_count_tsgl(struct sock *sk, size_t bytes)
-{
- struct alg_sock *ask = alg_sk(sk);
- struct af_alg_ctx *ctx = ask->private;
- struct af_alg_tsgl *sgl, *tmp;
- unsigned int i;
- unsigned int sgl_count = 0;
-
- if (!bytes)
- return 0;
-
- list_for_each_entry_safe(sgl, tmp, &ctx->tsgl_list, list) {
- struct scatterlist *sg = sgl->sg;
-
- for (i = 0; i < sgl->cur; i++) {
- sgl_count++;
- if (sg[i].length >= bytes)
- return sgl_count;
-
- bytes -= sg[i].length;
- }
- }
-
- return sgl_count;
-}
-
static void skcipher_pull_tsgl(struct sock *sk, size_t used,
struct scatterlist *dst)
{
@@ -92,7 +66,7 @@ static void skcipher_pull_tsgl(struct sock *sk, size_t used,
continue;
/*
- * Assumption: caller created skcipher_count_tsgl(len)
+ * Assumption: caller created af_alg_count_tsgl(len)
* SG entries in dst.
*/
if (dst)
@@ -543,7 +517,7 @@ static int _skcipher_recvmsg(struct socket *sock, struct msghdr *msg,
* Create a per request TX SGL for this request which tracks the
* SG entries from the global TX SGL.
*/
- areq->tsgl_entries = skcipher_count_tsgl(sk, len);
+ areq->tsgl_entries = af_alg_count_tsgl(sk, len, 0);
if (!areq->tsgl_entries)
areq->tsgl_entries = 1;
areq->tsgl = sock_kmalloc(sk, sizeof(*areq->tsgl) * areq->tsgl_entries,
@@ -241,5 +241,6 @@ static inline bool af_alg_readable(struct sock *sk)
}
int af_alg_alloc_tsgl(struct sock *sk);
+unsigned int af_alg_count_tsgl(struct sock *sk, size_t bytes, size_t offset);
#endif /* _CRYPTO_IF_ALG_H */
Consoliate aead_count_tsgl, skcipher_count_tsgl ==> af_alg_count_tsgl Signed-off-by: Stephan Mueller <smueller@chronox.de> --- crypto/af_alg.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++ crypto/algif_aead.c | 53 ++++--------------------------------------------- crypto/algif_skcipher.c | 30 ++-------------------------- include/crypto/if_alg.h | 1 + 4 files changed, 59 insertions(+), 77 deletions(-)