Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/opencrypto refactor crypto_unregister()



details:   https://anonhg.NetBSD.org/src/rev/2f3a5a4e3683
branches:  trunk
changeset: 353504:2f3a5a4e3683
user:      knakahara <knakahara%NetBSD.org@localhost>
date:      Wed May 10 03:23:26 2017 +0000

description:
refactor crypto_unregister()

    - separate logic to crypto_unregister_locked()
    - refactor cryptocap cleanup condition

diffstat:

 sys/opencrypto/crypto.c |  80 ++++++++++++++++++++++++++++--------------------
 1 files changed, 47 insertions(+), 33 deletions(-)

diffs (111 lines):

diff -r 5f2a900996ee -r 2f3a5a4e3683 sys/opencrypto/crypto.c
--- a/sys/opencrypto/crypto.c   Wed May 10 03:15:32 2017 +0000
+++ b/sys/opencrypto/crypto.c   Wed May 10 03:23:26 2017 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: crypto.c,v 1.60 2017/05/10 03:15:32 knakahara Exp $ */
+/*     $NetBSD: crypto.c,v 1.61 2017/05/10 03:23:26 knakahara Exp $ */
 /*     $FreeBSD: src/sys/opencrypto/crypto.c,v 1.4.2.5 2003/02/26 00:14:05 sam Exp $   */
 /*     $OpenBSD: crypto.c,v 1.41 2002/07/17 23:52:38 art Exp $ */
 
@@ -53,7 +53,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: crypto.c,v 1.60 2017/05/10 03:15:32 knakahara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: crypto.c,v 1.61 2017/05/10 03:23:26 knakahara Exp $");
 
 #include <sys/param.h>
 #include <sys/reboot.h>
@@ -612,6 +612,48 @@
        return err;
 }
 
+static int
+crypto_unregister_locked(u_int32_t driverid, int alg)
+{
+       int i;
+       u_int32_t ses;
+       struct cryptocap *cap;
+       bool lastalg = true;
+
+       KASSERT(mutex_owned(&crypto_drv_mtx));
+
+       if (CRYPTO_ALGORITHM_MIN <= alg && alg <= CRYPTO_ALGORITHM_MAX)
+               return EINVAL;
+
+       cap = crypto_checkdriver(driverid);
+       if (cap == NULL || cap->cc_alg[alg] == 0)
+               return EINVAL;
+
+       cap->cc_alg[alg] = 0;
+       cap->cc_max_op_len[alg] = 0;
+
+       /* Was this the last algorithm ? */
+       for (i = CRYPTO_ALGORITHM_MIN; i <= CRYPTO_ALGORITHM_MAX; i++)
+               if (cap->cc_alg[i] != 0) {
+                       lastalg = false;
+                       break;
+               }
+
+       if (lastalg) {
+               ses = cap->cc_sessions;
+               memset(cap, 0, sizeof(struct cryptocap));
+               if (ses != 0) {
+                       /*
+                        * If there are pending sessions, just mark as invalid.
+                        */
+                       cap->cc_flags |= CRYPTOCAP_F_CLEANUP;
+                       cap->cc_sessions = ses;
+               }
+       }
+
+       return 0;
+}
+
 /*
  * Unregister a crypto driver. If there are pending sessions using it,
  * leave enough information around so that subsequent calls using those
@@ -621,40 +663,12 @@
 int
 crypto_unregister(u_int32_t driverid, int alg)
 {
-       int i, err;
-       u_int32_t ses;
-       struct cryptocap *cap;
+       int err;
 
        mutex_enter(&crypto_drv_mtx);
-
-       cap = crypto_checkdriver(driverid);
-       if (cap != NULL &&
-           (CRYPTO_ALGORITHM_MIN <= alg && alg <= CRYPTO_ALGORITHM_MAX) &&
-           cap->cc_alg[alg] != 0) {
-               cap->cc_alg[alg] = 0;
-               cap->cc_max_op_len[alg] = 0;
-
-               /* Was this the last algorithm ? */
-               for (i = CRYPTO_ALGORITHM_MIN; i <= CRYPTO_ALGORITHM_MAX; i++)
-                       if (cap->cc_alg[i] != 0)
-                               break;
+       err = crypto_unregister_locked(driverid, alg);
+       mutex_exit(&crypto_drv_mtx);
 
-               if (i == CRYPTO_ALGORITHM_MAX + 1) {
-                       ses = cap->cc_sessions;
-                       memset(cap, 0, sizeof(struct cryptocap));
-                       if (ses != 0) {
-                               /*
-                                * If there are pending sessions, just mark as invalid.
-                                */
-                               cap->cc_flags |= CRYPTOCAP_F_CLEANUP;
-                               cap->cc_sessions = ses;
-                       }
-               }
-               err = 0;
-       } else
-               err = EINVAL;
-
-       mutex_exit(&crypto_drv_mtx);
        return err;
 }
 



Home | Main Index | Thread Index | Old Index