]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/netkey/keydb.c
xnu-2782.40.9.tar.gz
[apple/xnu.git] / bsd / netkey / keydb.c
index d9bf27f604a8d55bca964df1f86b2250b5338dcd..362ce530fd0ff2a574e4e3d73d3f66d77f4f9953 100644 (file)
  * SUCH DAMAGE.
  */
 
-#if (defined(__FreeBSD__) && __FreeBSD__ >= 3) || defined(__NetBSD__)
-#include "opt_inet.h"
-#ifdef __NetBSD__
-#include "opt_ipsec.h"
-#endif
-#endif
-
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <sys/param.h>
 
 #include <net/net_osdep.h>
 
-#if defined(__FreeBSD__) && __FreeBSD__ >= 3
+extern lck_mtx_t  *sadb_mutex;
+
 MALLOC_DEFINE(M_SECA, "key mgmt", "security associations, key management");
-#endif
 
-static void keydb_delsecasvar __P((struct secasvar *));
+// static void keydb_delsecasvar(struct secasvar *); // not used
 
 /*
  * secpolicy management
@@ -70,6 +63,8 @@ keydb_newsecpolicy()
 {
        struct secpolicy *p;
 
+       lck_mtx_assert(sadb_mutex, LCK_MTX_ASSERT_NOTOWNED);
+
        p = (struct secpolicy *)_MALLOC(sizeof(*p), M_SECA, M_WAITOK);
        if (!p)
                return p;
@@ -94,8 +89,15 @@ keydb_newsecashead()
        struct secashead *p;
        int i;
 
-       p = (struct secashead *)_MALLOC(sizeof(*p), M_SECA, M_WAITOK);
-       if (!p)
+       lck_mtx_assert(sadb_mutex, LCK_MTX_ASSERT_OWNED);
+
+       p = (struct secashead *)_MALLOC(sizeof(*p), M_SECA, M_NOWAIT);
+       if (!p) {
+               lck_mtx_unlock(sadb_mutex);
+               p = (struct secashead *)_MALLOC(sizeof(*p), M_SECA, M_WAITOK);
+               lck_mtx_lock(sadb_mutex);
+       }
+       if (!p) 
                return p;
        bzero(p, sizeof(*p));
        for (i = 0; i < sizeof(p->savtree)/sizeof(p->savtree[0]); i++)
@@ -103,6 +105,7 @@ keydb_newsecashead()
        return p;
 }
 
+#if 0
 void
 keydb_delsecashead(p)
        struct secashead *p;
@@ -111,7 +114,9 @@ keydb_delsecashead(p)
        _FREE(p, M_SECA);
 }
 
-/*
+
+
+/* 
  * secasvar management (reference counted)
  */
 struct secasvar *
@@ -119,6 +124,8 @@ keydb_newsecasvar()
 {
        struct secasvar *p;
 
+       lck_mtx_assert(sadb_mutex, LCK_MTX_ASSERT_NOTOWNED);
+
        p = (struct secasvar *)_MALLOC(sizeof(*p), M_SECA, M_WAITOK);
        if (!p)
                return p;
@@ -131,32 +138,23 @@ void
 keydb_refsecasvar(p)
        struct secasvar *p;
 {
-       int s;
 
-#ifdef __NetBSD__
-       s = splsoftnet();
-#else
-       s = splnet();
-#endif
+       lck_mtx_assert(sadb_mutex, LCK_MTX_ASSERT_OWNED);
+
        p->refcnt++;
-       splx(s);
 }
 
 void
 keydb_freesecasvar(p)
        struct secasvar *p;
 {
-       int s;
 
-#ifdef __NetBSD__
-       s = splsoftnet();
-#else
-       s = splnet();
-#endif
+       lck_mtx_assert(sadb_mutex, LCK_MTX_ASSERT_OWNED);
+
        p->refcnt--;
-       if (p->refcnt == 0)
+       /* negative refcnt will cause panic intentionally */
+       if (p->refcnt <= 0)
                keydb_delsecasvar(p);
-       splx(s);
 }
 
 static void
@@ -169,6 +167,7 @@ keydb_delsecasvar(p)
 
        _FREE(p, M_SECA);
 }
+#endif
 
 /*
  * secreplay management
@@ -178,17 +177,29 @@ keydb_newsecreplay(wsize)
        size_t wsize;
 {
        struct secreplay *p;
-
-       p = (struct secreplay *)_MALLOC(sizeof(*p), M_SECA, M_WAITOK);
+       
+       lck_mtx_assert(sadb_mutex, LCK_MTX_ASSERT_OWNED);
+
+       p = (struct secreplay *)_MALLOC(sizeof(*p), M_SECA, M_NOWAIT);
+       if (!p) {
+               lck_mtx_unlock(sadb_mutex);
+               p = (struct secreplay *)_MALLOC(sizeof(*p), M_SECA, M_WAITOK);
+               lck_mtx_lock(sadb_mutex);
+       }
        if (!p)
                return p;
 
        bzero(p, sizeof(*p));
        if (wsize != 0) {
-               p->bitmap = (caddr_t)_MALLOC(wsize, M_SECA, M_WAITOK);
+               p->bitmap = (caddr_t)_MALLOC(wsize, M_SECA, M_NOWAIT);
                if (!p->bitmap) {
-                       _FREE(p, M_SECA);
-                       return NULL;
+                       lck_mtx_unlock(sadb_mutex);
+                       p->bitmap = (caddr_t)_MALLOC(wsize, M_SECA, M_WAITOK);
+                       lck_mtx_lock(sadb_mutex);
+                       if (!p->bitmap) {
+                               _FREE(p, M_SECA);
+                               return NULL;
+                       }
                }
                bzero(p->bitmap, wsize);
        }
@@ -206,7 +217,8 @@ keydb_delsecreplay(p)
        _FREE(p, M_SECA);
 }
 
-/*
+#if 0
+/*     NOT USED
  * secreg management
  */
 struct secreg *
@@ -227,3 +239,4 @@ keydb_delsecreg(p)
 
        _FREE(p, M_SECA);
 }
+#endif