final -- I think -- opencrypto mutex/condvar patch

Thor Lancelot Simon <[email protected]>
Newsgroups gmane.os.netbsd.devel.kernel,gmane.os.netbsd.devel.crypto
Message-ID <[email protected]>
The attached seems to work.  I've made the necessary changes to
netipsec but I'm not really able to test them, so I'd appreciate
that (as well as any other mistakes of mine anyone cares to point
out).

Also, I wonder if I missed anything I'd need to do to mark the thread or
the softint as MPSAFE; I haven't done that (MPSAFE on those) yet.

This should probably use multiple locks as the freebsd code does.  And I
should probably put CBIMM back in.

Patch attached and at http://www.panix.com/~tls/ocf-mtx6.diff

Thor
ocf-mtx6.diff (text/plain, 2.9 KB)
Index: netipsec/xform_ah.c
===================================================================
RCS file: /cvsroot/src/sys/netipsec/xform_ah.c,v
retrieving revision 1.19
diff -u -p -r1.19 xform_ah.c
--- netipsec/xform_ah.c	28 Oct 2007 15:48:23 -0000	1.19
+++ netipsec/xform_ah.c	3 Feb 2008 20:15:56 -0000
@@ -230,8 +230,13 @@ ah_init(struct secasvar *sav, struct xfo
 	int error;
 
 	error = ah_init0(sav, xsp, &cria);
-	return error ? error :
-		 crypto_newsession(&sav->tdb_cryptoid, &cria, crypto_support);
+	if (!error) {
+		mutex_spin_enter(&crypto_mtx);
+		error = crypto_newsession(&sav->tdb_cryptoid,
+					   &cria, crypto_support);
+		mutex_spin_exit(&crypto_mtx);
+	}
+	return error;
 }
 
 /*
@@ -247,7 +252,9 @@ ah_zeroize(struct secasvar *sav)
 	if (sav->key_auth)
 		bzero(_KEYBUF(sav->key_auth), _KEYLEN(sav->key_auth));
 
+	mutex_spin_enter(&crypto_mtx);
 	err = crypto_freesession(sav->tdb_cryptoid);
+	mutex_spin_exit(&crypto_mtx);
 	sav->tdb_cryptoid = 0;
 	sav->tdb_authalgxform = NULL;
 	sav->tdb_xform = NULL;
Index: netipsec/xform_esp.c
===================================================================
RCS file: /cvsroot/src/sys/netipsec/xform_esp.c,v
retrieving revision 1.16
diff -u -p -r1.16 xform_esp.c
--- netipsec/xform_esp.c	27 Jun 2007 20:38:33 -0000	1.16
+++ netipsec/xform_esp.c	3 Feb 2008 20:15:57 -0000
@@ -231,6 +231,7 @@ esp_init(struct secasvar *sav, struct xf
 	crie.cri_key = _KEYBUF(sav->key_enc);
 	/* XXX Rounds ? */
 
+	mutex_spin_enter(&crypto_mtx);
 	if (sav->tdb_authalgxform && sav->tdb_encalgxform) {
 		/* init both auth & enc */
 		crie.cri_next = &cria;
@@ -247,6 +248,7 @@ esp_init(struct secasvar *sav, struct xf
 		DPRINTF(("esp_init: no encoding OR authentication xform!\n"));
 		error = EINVAL;
 	}
+	mutex_spin_exit(&crypto_mtx);
 	return error;
 }
 
Index: netipsec/xform_ipcomp.c
===================================================================
RCS file: /cvsroot/src/sys/netipsec/xform_ipcomp.c,v
retrieving revision 1.16
diff -u -p -r1.16 xform_ipcomp.c
--- netipsec/xform_ipcomp.c	29 Dec 2007 14:56:35 -0000	1.16
+++ netipsec/xform_ipcomp.c	3 Feb 2008 20:15:57 -0000
@@ -106,6 +106,7 @@ ipcomp_init(struct secasvar *sav, struct
 {
 	struct comp_algo *tcomp;
 	struct cryptoini cric;
+	int ses;
 
 	/* NB: algorithm really comes in alg_enc and not alg_comp! */
 	tcomp = ipcomp_algorithm_lookup(sav->alg_enc);
@@ -122,7 +123,10 @@ ipcomp_init(struct secasvar *sav, struct
 	bzero(&cric, sizeof (cric));
 	cric.cri_alg = sav->tdb_compalgxform->type;
 
-	return crypto_newsession(&sav->tdb_cryptoid, &cric, crypto_support);
+	mutex_spin_enter(&crypto_mtx);
+	ses = crypto_newsession(&sav->tdb_cryptoid, &cric, crypto_support);
+	mutex_spin_exit(&crypto_mtx);
+	return ses;
 }
 
 /*
@@ -133,7 +137,9 @@ ipcomp_zeroize(struct secasvar *sav)
 {
 	int err;
 
+	mutex_spin_enter(&crypto_mtx);
 	err = crypto_freesession(sav->tdb_cryptoid);
+	mutex_spin_exit(&crypto_mtx);
 	sav->tdb_cryptoid = 0;
 	return err;
 }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.